Bug 487949 - Land HTML5 parser on trunk preffed off r=mrbkap, sr=jonas
authorHenri Sivonen <hsivonen@iki.fi>
Mon, 29 Jun 2009 00:44:22 +0200
changeset 29805 8b5103cb12a6b62558ba6ad64109f50bb66bd820
parent 29799 f1dc757a5026b366c0470f5206640a415ca7f40e
child 29806 1811499852ccb17fba42864d2fdf71499626ff98
push id1
push userroot
push dateTue, 26 Apr 2011 22:38:44 +0000
treeherdermozilla-beta@bfdb6e623a36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmrbkap, jonas
bugs487949
milestone1.9.2a1pre
Bug 487949 - Land HTML5 parser on trunk preffed off r=mrbkap, sr=jonas
content/base/public/nsINode.h
content/base/src/Makefile.in
content/base/src/nsContentSink.cpp
content/base/src/nsContentSink.h
content/base/src/nsContentUtils.cpp
content/base/src/nsDOMAttribute.cpp
content/base/src/nsDOMAttribute.h
content/base/src/nsDocument.cpp
content/base/src/nsDocument.h
content/base/src/nsGenericDOMDataNode.cpp
content/base/src/nsGenericDOMDataNode.h
content/base/src/nsGenericElement.cpp
content/base/src/nsGenericElement.h
content/base/src/nsHTMLContentSerializer.cpp
content/base/test/test_bug417255.html
content/html/content/src/nsHTMLOptGroupElement.cpp
content/html/content/src/nsHTMLSelectElement.cpp
content/html/content/src/nsHTMLSelectElement.h
content/html/document/reftests/bug448564-2_malformed.html
content/html/document/reftests/bug448564-2_well-formed.html
content/html/document/reftests/bug448564-3_malformed.html
content/html/document/reftests/bug448564-3_well-formed.html
content/html/document/reftests/bug448564-5_malformed.html
content/html/document/reftests/bug448564-5_well-formed.html
content/html/document/reftests/reftests.list
content/html/document/src/Makefile.in
content/html/document/src/nsHTMLContentSink.cpp
content/html/document/src/nsHTMLDocument.cpp
content/html/parser/Makefile.in
content/html/parser/javasrc/AttributeName.java
content/html/parser/javasrc/ElementName.java
content/html/parser/javasrc/HtmlAttributes.java
content/html/parser/javasrc/MetaScanner.java
content/html/parser/javasrc/Portability.java
content/html/parser/javasrc/README.txt
content/html/parser/javasrc/StackNode.java
content/html/parser/javasrc/StateSnapshot.java
content/html/parser/javasrc/Tokenizer.java
content/html/parser/javasrc/TreeBuilder.java
content/html/parser/javasrc/UTF16Buffer.java
content/html/parser/public/Makefile.in
content/svg/content/src/nsSVGSwitchElement.cpp
content/svg/content/src/nsSVGSwitchElement.h
content/xml/document/src/nsXMLContentSink.cpp
content/xml/document/src/nsXMLContentSink.h
content/xtf/src/nsXTFElementWrapper.cpp
content/xtf/src/nsXTFElementWrapper.h
content/xul/content/src/nsXULElement.cpp
content/xul/content/src/nsXULElement.h
layout/build/Makefile.in
layout/build/nsLayoutStatics.cpp
layout/reftests/bugs/394534-1-ref.html
layout/reftests/bugs/394534-1.html
layout/reftests/bugs/444375-1-ref.html
layout/reftests/bugs/482659-1a.html
layout/reftests/bugs/482659-1b.html
layout/reftests/bugs/482659-1c.html
layout/reftests/bugs/482659-1d.html
layout/reftests/bugs/490182-1a.html
layout/reftests/bugs/490182-1b.html
layout/reftests/font-face/ex-unit-1-dynamic.html
layout/reftests/table-dom/deleteCol1.html
layout/reftests/table-dom/deleteCol2.html
layout/reftests/table-dom/deleteCol3.html
layout/reftests/table-dom/insertCols1.html
layout/reftests/table-dom/insertCols2.html
layout/reftests/table-dom/insertCols3.html
layout/reftests/text/justification-1.html
modules/libpref/src/init/all.js
parser/Makefile.in
parser/html/Makefile.in
parser/html/jArray.h
parser/html/nsHtml5ArrayCopy.h
parser/html/nsHtml5AtomList.h
parser/html/nsHtml5Atoms.cpp
parser/html/nsHtml5Atoms.h
parser/html/nsHtml5AttributeName.cpp
parser/html/nsHtml5AttributeName.h
parser/html/nsHtml5ByteReadable.h
parser/html/nsHtml5DocumentMode.h
parser/html/nsHtml5ElementName.cpp
parser/html/nsHtml5ElementName.h
parser/html/nsHtml5HtmlAttributes.cpp
parser/html/nsHtml5HtmlAttributes.h
parser/html/nsHtml5MetaScanner.cpp
parser/html/nsHtml5MetaScanner.h
parser/html/nsHtml5MetaScannerCppSupplement.h
parser/html/nsHtml5MetaScannerHSupplement.h
parser/html/nsHtml5Module.cpp
parser/html/nsHtml5Module.h
parser/html/nsHtml5NamedCharacters.cpp
parser/html/nsHtml5NamedCharacters.h
parser/html/nsHtml5Parser.cpp
parser/html/nsHtml5Parser.h
parser/html/nsHtml5PendingNotification.h
parser/html/nsHtml5Portability.cpp
parser/html/nsHtml5Portability.h
parser/html/nsHtml5ReleasableAttributeName.cpp
parser/html/nsHtml5ReleasableAttributeName.h
parser/html/nsHtml5ReleasableElementName.cpp
parser/html/nsHtml5ReleasableElementName.h
parser/html/nsHtml5StackNode.cpp
parser/html/nsHtml5StackNode.h
parser/html/nsHtml5StackNodeCppSupplement.h
parser/html/nsHtml5StackNodeHSupplement.h
parser/html/nsHtml5StateSnapshot.cpp
parser/html/nsHtml5StateSnapshot.h
parser/html/nsHtml5Tokenizer.cpp
parser/html/nsHtml5Tokenizer.h
parser/html/nsHtml5TreeBuilder.cpp
parser/html/nsHtml5TreeBuilder.h
parser/html/nsHtml5TreeBuilderCppSupplement.h
parser/html/nsHtml5TreeBuilderHSupplement.h
parser/html/nsHtml5TreeOperation.cpp
parser/html/nsHtml5TreeOperation.h
parser/html/nsHtml5UTF16Buffer.cpp
parser/html/nsHtml5UTF16Buffer.h
parser/html/nsHtml5UTF16BufferCppSupplement.h
parser/html/nsHtml5UTF16BufferHSupplement.h
parser/htmlparser/public/nsIParser.h
parser/htmlparser/src/nsParser.cpp
parser/htmlparser/src/nsParser.h
toolkit/toolkit-tiers.mk
--- a/content/base/public/nsINode.h
+++ b/content/base/public/nsINode.h
@@ -434,20 +434,23 @@ public:
   /**
    * Remove a child from this node.  This method handles calling UnbindFromTree
    * on the child appropriately.
    *
    * @param aIndex the index of the child to remove
    * @param aNotify whether to notify the document (current document for
    *        nsIContent, and |this| for nsIDocument) that the remove has
    *        occurred
+   * @param aMutationEvent whether to fire a mutation event
    *
    * Note: If there is no child at aIndex, this method will simply do nothing.
    */
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify) = 0;
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, 
+                                 PRBool aNotify, 
+                                 PRBool aMutationEvent = PR_TRUE) = 0;
 
   /**
    * Get a property associated with this node.
    *
    * @param aPropertyName  name of property to get.
    * @param aStatus        out parameter for storing resulting status.
    *                       Set to NS_PROPTABLE_PROP_NOT_THERE if the property
    *                       is not set.
--- a/content/base/src/Makefile.in
+++ b/content/base/src/Makefile.in
@@ -79,16 +79,17 @@ REQUIRES	= xpcom \
 		  uriloader \
 		  rdf \
 		  xultmpl \
 		  util \
 		  appshell \
 		  shistory \
 		  editor \
 		  windowwatcher \
+		  html5 \
 		  $(NULL)
 
 ifdef ACCESSIBILITY
 REQUIRES	+= accessibility
 endif
 
 EXPORTS		= \
 		nsAtomListUtils.h \
--- a/content/base/src/nsContentSink.cpp
+++ b/content/base/src/nsContentSink.cpp
@@ -789,32 +789,42 @@ nsContentSink::ProcessStyleLink(nsIConte
 
   return NS_OK;
 }
 
 
 nsresult
 nsContentSink::ProcessMETATag(nsIContent* aContent)
 {
-  NS_ASSERTION(aContent, "missing base-element");
+  NS_ASSERTION(aContent, "missing meta-element");
 
   nsresult rv = NS_OK;
 
   // set any HTTP-EQUIV data into document's header data as well as url
   nsAutoString header;
   aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::httpEquiv, header);
   if (!header.IsEmpty()) {
     nsAutoString result;
     aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::content, result);
     if (!result.IsEmpty()) {
       ToLowerCase(header);
       nsCOMPtr<nsIAtom> fieldAtom(do_GetAtom(header));
       rv = ProcessHeaderData(fieldAtom, result, aContent); 
     }
   }
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  /* Look for the viewport meta tag. If we find it, process it and put the
+   * data into the document header. */
+  if (aContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::name,
+                            nsGkAtoms::viewport, eIgnoreCase)) {
+    nsAutoString value;
+    aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::content, value);
+    rv = nsContentUtils::ProcessViewportInfo(mDocument, value);
+  }
 
   return rv;
 }
 
 
 void
 nsContentSink::PrefetchHref(const nsAString &aHref,
                             nsIContent *aSource,
--- a/content/base/src/nsContentSink.h
+++ b/content/base/src/nsContentSink.h
@@ -141,16 +141,18 @@ class nsContentSink : public nsICSSLoade
   void NotifyAppend(nsIContent* aContent, PRUint32 aStartIndex);
 
   // nsIDocumentObserver
   virtual void BeginUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType);
   virtual void EndUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType);
 
   virtual void UpdateChildCounts() = 0;
 
+  PRBool IsTimeToNotify();
+
 protected:
   nsContentSink();
   virtual ~nsContentSink();
 
   enum CacheSelectionAction {
     // There is no offline cache manifest specified by the document,
     // or the document was loaded from a cache other than the one it
     // specifies via its manifest attribute and IS NOT a top-level
@@ -236,34 +238,35 @@ protected:
   //        was selected.
   // @param aAction
   //        Out parameter, returns the action that should be performed
   //        by the calling function.
   nsresult SelectDocAppCacheNoManifest(nsIApplicationCache *aLoadApplicationCache,
                                        nsIURI **aManifestURI,
                                        CacheSelectionAction *aAction);
 
+public:
   // Searches for the offline cache manifest attribute and calls one
   // of the above defined methods to select the document's application
   // cache, let it be associated with the document and eventually
   // schedule the cache update process.
   void ProcessOfflineManifest(nsIContent *aElement);
 
+protected:
   // Tries to scroll to the URI's named anchor. Once we've successfully
   // done that, further calls to this method will be ignored.
   void ScrollToRef();
   nsresult RefreshIfEnabled(nsIViewManager* vm);
 
   // Start layout.  If aIgnorePendingSheets is true, this will happen even if
   // we still have stylesheet loads pending.  Otherwise, we'll wait until the
   // stylesheets are all done loading.
+public:
   void StartLayout(PRBool aIgnorePendingSheets);
-
-  PRBool IsTimeToNotify();
-
+protected:
   void
   FavorPerformanceHint(PRBool perfOverStarvation, PRUint32 starvationDelay);
 
   inline PRInt32 GetNotificationInterval()
   {
     if (mDynamicLowerValue) {
       return 1000;
     }
--- a/content/base/src/nsContentUtils.cpp
+++ b/content/base/src/nsContentUtils.cpp
@@ -159,16 +159,17 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_
 #include "nsIChannelEventSink.h"
 #include "nsIInterfaceRequestor.h"
 #include "nsIOfflineCacheUpdate.h"
 #include "nsCPrefetchService.h"
 #include "nsIChromeRegistry.h"
 #include "nsIMIMEHeaderParam.h"
 #include "nsIDOMDragEvent.h"
 #include "nsDOMDataTransfer.h"
+#include "nsHtml5Module.h"
 
 #ifdef IBMBIDI
 #include "nsIBidiKeyboard.h"
 #endif
 #include "nsCycleCollectionParticipant.h"
 
 // for ReportToConsole
 #include "nsIStringBundle.h"
@@ -3573,16 +3574,68 @@ nsContentUtils::CreateContextualFragment
   nsresult rv;
   nsCOMPtr<nsINode> node = do_QueryInterface(aContextNode);
   NS_ENSURE_TRUE(node, NS_ERROR_NOT_AVAILABLE);
 
   // If we don't have a document here, we can't get the right security context
   // for compiling event handlers... so just bail out.
   nsCOMPtr<nsIDocument> document = node->GetOwnerDoc();
   NS_ENSURE_TRUE(document, NS_ERROR_NOT_AVAILABLE);
+  
+  PRBool bCaseSensitive = document->IsCaseSensitive();
+
+  nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(document));
+  PRBool bHTML = htmlDoc && !bCaseSensitive;
+
+  if (bHTML && nsHtml5Module::Enabled) {
+    // See if the document has a cached fragment parser. nsHTMLDocument is the
+    // only one that should really have one at the moment.
+    nsCOMPtr<nsIParser> parser = document->GetFragmentParser();
+    if (parser) {
+      // Get the parser ready to use.
+      parser->Reset();
+    }
+    else {
+      // Create a new parser for this operation.
+      parser = nsHtml5Module::NewHtml5Parser();
+      if (!parser) {
+        return NS_ERROR_OUT_OF_MEMORY;
+      }
+      document->SetFragmentParser(parser);
+    }
+    nsCOMPtr<nsIDOMDocumentFragment> frag;
+    rv = NS_NewDocumentFragment(getter_AddRefs(frag), document->NodeInfoManager());
+    NS_ENSURE_SUCCESS(rv, rv);
+    
+    nsCOMPtr<nsIContent> contextAsContent = do_QueryInterface(aContextNode);
+    if (contextAsContent && !contextAsContent->IsNodeOfType(nsINode::eELEMENT)) {
+      contextAsContent = contextAsContent->GetParent();
+      if (contextAsContent && !contextAsContent->IsNodeOfType(nsINode::eELEMENT)) {
+        // can this even happen?
+        contextAsContent = nsnull;
+      }
+    }
+    
+    if (contextAsContent) {
+      parser->ParseFragment(aFragment, 
+                            frag, 
+                            contextAsContent->Tag(), 
+                            contextAsContent->GetNameSpaceID(), 
+                            (document->GetCompatibilityMode() == eCompatibility_NavQuirks));    
+    } else {
+      parser->ParseFragment(aFragment, 
+                            frag, 
+                            nsGkAtoms::body, 
+                            kNameSpaceID_XHTML, 
+                            (document->GetCompatibilityMode() == eCompatibility_NavQuirks));
+    }
+  
+    NS_ADDREF(*aReturn = frag);
+    return NS_OK;
+  }
 
   nsAutoTArray<nsString, 32> tagStack;
   nsAutoString uriStr, nameStr;
   nsCOMPtr<nsIContent> content = do_QueryInterface(aContextNode);
   // just in case we have a text node
   if (content && !content->IsNodeOfType(nsINode::eELEMENT))
     content = content->GetParent();
 
@@ -3630,24 +3683,19 @@ nsContentUtils::CreateContextualFragment
                        NS_LITERAL_STRING("\""));
       }
     }
 
     content = content->GetParent();
   }
 
   nsCAutoString contentType;
-  PRBool bCaseSensitive = PR_TRUE;
   nsAutoString buf;
   document->GetContentType(buf);
   LossyCopyUTF16toASCII(buf, contentType);
-  bCaseSensitive = document->IsCaseSensitive();
-
-  nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(document));
-  PRBool bHTML = htmlDoc && !bCaseSensitive;
 
   // See if the document has a cached fragment parser. nsHTMLDocument is the
   // only one that should really have one at the moment.
   nsCOMPtr<nsIParser> parser = document->GetFragmentParser();
   if (parser) {
     // Get the parser ready to use.
     parser->Reset();
   }
--- a/content/base/src/nsDOMAttribute.cpp
+++ b/content/base/src/nsDOMAttribute.cpp
@@ -694,18 +694,19 @@ nsDOMAttribute::InsertChildAt(nsIContent
 
 nsresult
 nsDOMAttribute::AppendChildTo(nsIContent* aKid, PRBool aNotify)
 {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
 nsresult
-nsDOMAttribute::RemoveChildAt(PRUint32 aIndex, PRBool aNotify)
+nsDOMAttribute::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent)
 {
+  NS_ASSERTION(aMutationEvent, "Someone tried to inhibit mutations on attribute child removal.");
   if (aIndex != 0 || !mChild) {
     return NS_OK;
   }
 
   nsCOMPtr<nsIContent> child = mChild;
   nsMutationGuard::DidMutate();
   mozAutoDocUpdate updateBatch(GetOwnerDoc(), UPDATE_CONTENT_MODEL, aNotify);
   nsMutationGuard guard;
--- a/content/base/src/nsDOMAttribute.h
+++ b/content/base/src/nsDOMAttribute.h
@@ -93,17 +93,17 @@ public:
   virtual PRBool IsNodeOfType(PRUint32 aFlags) const;
   virtual PRUint32 GetChildCount() const;
   virtual nsIContent *GetChildAt(PRUint32 aIndex) const;
   virtual nsIContent * const * GetChildArray(PRUint32* aChildCount) const;
   virtual PRInt32 IndexOf(nsINode* aPossibleChild) const;
   virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                  PRBool aNotify);
   virtual nsresult AppendChildTo(nsIContent* aKid, PRBool aNotify);
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify);
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent = PR_TRUE);
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
   virtual nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor);
   virtual nsresult DispatchDOMEvent(nsEvent* aEvent, nsIDOMEvent* aDOMEvent,
                                     nsPresContext* aPresContext,
                                     nsEventStatus* aEventStatus);
   virtual nsIEventListenerManager* GetListenerManager(PRBool aCreateIfNotFound);
   virtual nsresult AddEventListenerByIID(nsIDOMEventListener *aListener,
                                          const nsIID& aIID);
--- a/content/base/src/nsDocument.cpp
+++ b/content/base/src/nsDocument.cpp
@@ -3216,30 +3216,32 @@ nsDocument::AppendChildTo(nsIContent* aK
   // subclasses wanted to hook into this stuff, they would have
   // overridden AppendChildTo.
   // XXXbz maybe this should just be a non-virtual method on nsINode?
   // Feels that way to me...
   return nsDocument::InsertChildAt(aKid, GetChildCount(), aNotify);
 }
 
 nsresult
-nsDocument::RemoveChildAt(PRUint32 aIndex, PRBool aNotify)
-{
+nsDocument::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent)
+{
+  NS_ASSERTION(aMutationEvent, "Someone tried to inhibit mutations on document child removal.");
   nsCOMPtr<nsIContent> oldKid = GetChildAt(aIndex);
   if (!oldKid) {
     return NS_OK;
   }
 
   if (oldKid->IsNodeOfType(nsINode::eELEMENT)) {
     // Destroy the link map up front before we mess with the child list.
     DestroyLinkMap();
   }
 
   nsresult rv = nsGenericElement::doRemoveChildAt(aIndex, aNotify, oldKid,
-                                                  nsnull, this, mChildren);
+                                                  nsnull, this, mChildren, 
+                                                  aMutationEvent);
   mCachedRootContent = nsnull;
   return rv;
 }
 
 PRInt32
 nsDocument::GetNumberOfStyleSheets() const
 {
   return mStyleSheets.Count();
--- a/content/base/src/nsDocument.h
+++ b/content/base/src/nsDocument.h
@@ -805,17 +805,17 @@ public:
   virtual PRBool IsNodeOfType(PRUint32 aFlags) const;
   virtual nsIContent *GetChildAt(PRUint32 aIndex) const;
   virtual nsIContent * const * GetChildArray(PRUint32* aChildCount) const;
   virtual PRInt32 IndexOf(nsINode* aPossibleChild) const;
   virtual PRUint32 GetChildCount() const;
   virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                  PRBool aNotify);
   virtual nsresult AppendChildTo(nsIContent* aKid, PRBool aNotify);
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify);
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent = PR_TRUE);
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
   virtual nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor);
   virtual nsresult DispatchDOMEvent(nsEvent* aEvent, nsIDOMEvent* aDOMEvent,
                                     nsPresContext* aPresContext,
                                     nsEventStatus* aEventStatus);
   virtual nsIEventListenerManager* GetListenerManager(PRBool aCreateIfNotFound);
   virtual nsresult AddEventListenerByIID(nsIDOMEventListener *aListener,
                                          const nsIID& aIID);
--- a/content/base/src/nsGenericDOMDataNode.cpp
+++ b/content/base/src/nsGenericDOMDataNode.cpp
@@ -747,17 +747,17 @@ nsGenericDOMDataNode::IndexOf(nsINode* a
 nsresult
 nsGenericDOMDataNode::InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                     PRBool aNotify)
 {
   return NS_OK;
 }
 
 nsresult
-nsGenericDOMDataNode::RemoveChildAt(PRUint32 aIndex, PRBool aNotify)
+nsGenericDOMDataNode::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent)
 {
   return NS_OK;
 }
 
 // virtual
 PRBool
 nsGenericDOMDataNode::MayHaveFrame() const
 {
--- a/content/base/src/nsGenericDOMDataNode.h
+++ b/content/base/src/nsGenericDOMDataNode.h
@@ -161,17 +161,17 @@ public:
 
   // nsINode methods
   virtual PRUint32 GetChildCount() const;
   virtual nsIContent *GetChildAt(PRUint32 aIndex) const;
   virtual nsIContent * const * GetChildArray(PRUint32* aChildCount) const;
   virtual PRInt32 IndexOf(nsINode* aPossibleChild) const;
   virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                  PRBool aNotify);
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify);
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent = PR_TRUE);
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
   virtual nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor);
   virtual nsresult DispatchDOMEvent(nsEvent* aEvent, nsIDOMEvent* aDOMEvent,
                                     nsPresContext* aPresContext,
                                     nsEventStatus* aEventStatus);
   virtual nsIEventListenerManager* GetListenerManager(PRBool aCreateIfNotFound);
   virtual nsresult AddEventListenerByIID(nsIDOMEventListener *aListener,
                                          const nsIID& aIID);
--- a/content/base/src/nsGenericElement.cpp
+++ b/content/base/src/nsGenericElement.cpp
@@ -3241,35 +3241,36 @@ nsGenericElement::doInsertChildAt(nsICon
       nsEventDispatcher::Dispatch(aKid, nsnull, &mutation);
     }
   }
 
   return NS_OK;
 }
 
 nsresult
-nsGenericElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify)
+nsGenericElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent)
 {
   nsCOMPtr<nsIContent> oldKid = mAttrsAndChildren.GetSafeChildAt(aIndex);
   NS_ASSERTION(oldKid == GetChildAt(aIndex), "Unexpected child in RemoveChildAt");
 
   if (oldKid) {
     return doRemoveChildAt(aIndex, aNotify, oldKid, this, GetCurrentDoc(),
-                           mAttrsAndChildren);
+                           mAttrsAndChildren, aMutationEvent);
   }
 
   return NS_OK;
 }
 
 /* static */
 nsresult
 nsGenericElement::doRemoveChildAt(PRUint32 aIndex, PRBool aNotify,
                                   nsIContent* aKid, nsIContent* aParent,
                                   nsIDocument* aDocument,
-                                  nsAttrAndChildArray& aChildArray)
+                                  nsAttrAndChildArray& aChildArray,
+                                  PRBool aMutationEvent)
 {
   NS_PRECONDITION(aParent || aDocument, "Must have document if no parent!");
   NS_PRECONDITION(!aParent || aParent->GetCurrentDoc() == aDocument,
                   "Incorrect aDocument");
 
 #ifdef ACCESSIBILITY
   // A11y needs to be notified of content removals first, so accessibility
   // events can be fired before any changes occur
@@ -3295,16 +3296,17 @@ nsGenericElement::doRemoveChildAt(PRUint
                   container->IndexOf(aKid) == (PRInt32)aIndex, "Bogus aKid");
 
   mozAutoDocUpdate updateBatch(aDocument, UPDATE_CONTENT_MODEL, aNotify);
 
   nsMutationGuard guard;
 
   mozAutoSubtreeModified subtree(nsnull, nsnull);
   if (aNotify &&
+      aMutationEvent &&
       nsContentUtils::HasMutationListeners(aKid,
         NS_EVENT_BITS_MUTATION_NODEREMOVED, container)) {
     mozAutoRemovableBlockerRemover blockerRemover;
 
     nsMutationEvent mutation(PR_TRUE, NS_MUTATION_NODEREMOVED);
     mutation.mRelatedNode = do_QueryInterface(container);
 
     subtree.UpdateTarget(container->GetOwnerDoc(), container);
--- a/content/base/src/nsGenericElement.h
+++ b/content/base/src/nsGenericElement.h
@@ -349,17 +349,17 @@ public:
 
   // nsINode interface methods
   virtual PRUint32 GetChildCount() const;
   virtual nsIContent *GetChildAt(PRUint32 aIndex) const;
   virtual nsIContent * const * GetChildArray(PRUint32* aChildCount) const;
   virtual PRInt32 IndexOf(nsINode* aPossibleChild) const;
   virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                  PRBool aNotify);
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify);
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent = PR_TRUE);
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
   virtual nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor);
   virtual nsresult DispatchDOMEvent(nsEvent* aEvent, nsIDOMEvent* aDOMEvent,
                                     nsPresContext* aPresContext,
                                     nsEventStatus* aEventStatus);
   virtual nsIEventListenerManager* GetListenerManager(PRBool aCreateIfNotFound);
   virtual nsresult AddEventListenerByIID(nsIDOMEventListener *aListener,
                                          const nsIID& aIID);
@@ -649,17 +649,18 @@ public:
    *                  non-null if aParent is null (in which case aKid is being
    *                  removed as its child) and must match
    *                  aParent->GetCurrentDoc() if aParent is not null.
    * @param aChildArray The child array to work with
    */
   static nsresult doRemoveChildAt(PRUint32 aIndex, PRBool aNotify,
                                   nsIContent* aKid, nsIContent* aParent,
                                   nsIDocument* aDocument,
-                                  nsAttrAndChildArray& aChildArray);
+                                  nsAttrAndChildArray& aChildArray,
+                                  PRBool aMutationEvent);
 
   /**
    * Helper methods for implementing querySelector/querySelectorAll
    */
   static nsresult doQuerySelector(nsINode* aRoot, const nsAString& aSelector,
                                   nsIDOMElement **aReturn);
   static nsresult doQuerySelectorAll(nsINode* aRoot,
                                      const nsAString& aSelector,
--- a/content/base/src/nsHTMLContentSerializer.cpp
+++ b/content/base/src/nsHTMLContentSerializer.cpp
@@ -63,16 +63,17 @@
 #include "nsEscape.h"
 #include "nsITextToSubURI.h"
 #include "nsCRT.h"
 #include "nsIParserService.h"
 #include "nsContentUtils.h"
 #include "nsLWBrkCIID.h"
 #include "nsIScriptElement.h"
 #include "nsAttrName.h"
+#include "nsHtml5Module.h"
 
 static const char kMozStr[] = "moz";
 
 static const PRInt32 kLongLineLen = 128;
 
 nsresult NS_NewHTMLContentSerializer(nsIContentSerializer** aSerializer)
 {
   nsHTMLContentSerializer* it = new nsHTMLContentSerializer();
@@ -95,37 +96,59 @@ nsHTMLContentSerializer::~nsHTMLContentS
 
 NS_IMETHODIMP
 nsHTMLContentSerializer::AppendDocumentStart(nsIDOMDocument *aDocument,
                                              nsAString& aStr)
 {
   return NS_OK;
 }
 
+#include "nsIHTMLDocument.h"
 void 
 nsHTMLContentSerializer::SerializeAttributes(nsIContent* aContent,
                                              nsIDOMElement *aOriginalElement,
                                              nsAString& aTagPrefix,
                                              const nsAString& aTagNamespaceURI,
                                              nsIAtom* aTagName,
                                              nsAString& aStr)
 {
+  PRInt32 count = aContent->GetAttrCount();
+  if (!count)
+    return;
+
   nsresult rv;
-  PRUint32 index, count;
   nsAutoString nameStr, valueStr;
-
-  count = aContent->GetAttrCount();
-
   NS_NAMED_LITERAL_STRING(_mozStr, "_moz");
 
-  // Loop backward over the attributes, since the order they are stored in is
-  // the opposite of the order they were parsed in (see bug 213347 for reason).
-  // index is unsigned, hence index >= 0 is always true.
-  for (index = count; index > 0; ) {
-    --index;
+  // HTML5 parser stored them in the order they were parsed so we want to
+  // loop forward in that case.
+  nsIDocument* doc = aContent->GetOwnerDocument();
+  PRBool caseSensitive = doc && doc->IsCaseSensitive();
+  PRBool loopForward = PR_FALSE;
+  if (!caseSensitive) {
+    nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(doc));
+    if (htmlDoc) {
+      loopForward = nsHtml5Module::Enabled;
+    }
+  }
+  PRInt32 index, limit, step;
+  if (loopForward) {
+    index = 0;
+    limit = count;
+    step = 1;
+  }
+  else {
+    // Loop backward over the attributes, since the order they are stored in is
+    // the opposite of the order they were parsed in (see bug 213347 for reason).
+    index = count - 1;
+    limit = -1;
+    step = -1;
+  }
+  
+  for (; index != limit; index += step) {
     const nsAttrName* name = aContent->GetAttrNameAt(index);
     PRInt32 namespaceID = name->NamespaceID();
     nsIAtom* attrName = name->LocalName();
 
     // Filter out any attribute starting with [-|_]moz
     const char* sharedName;
     attrName->GetUTF8String(&sharedName);
     if ((('_' == *sharedName) || ('-' == *sharedName)) &&
--- a/content/base/test/test_bug417255.html
+++ b/content/base/test/test_bug417255.html
@@ -10,30 +10,30 @@ https://bugzilla.mozilla.org/show_bug.cg
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
   <style>
   .spacer { display:inline-block; height:10px; }
   </style>
 </head>
 <body>
 
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=417255">Mozilla Bug 417255</a>
-<p id="display" style="width:800px"></p>
+<div id="display" style="width:800px"></div>
 
-<p><span id="s1" style="border:2px dotted red;"><span class="spacer" style="width:100px"></span>
+<div><span id="s1" style="border:2px dotted red;"><span class="spacer" style="width:100px"></span>
 <div style="width:500px; height:100px; background:yellow;"></div>
-<span class="spacer" style="width:200px"></span></span>
+<span class="spacer" style="width:200px"></span></span></div>
 
-<p><span id="s2" style="border:2px dotted red;"><span class="spacer" style="width:100px"></span>
+<div><span id="s2" style="border:2px dotted red;"><span class="spacer" style="width:100px"></span>
 <div style="width:150px; height:100px; background:yellow;"></div>
-<span class="spacer" style="width:200px"></span></span>
+<span class="spacer" style="width:200px"></span></span></div>
 
 <!-- test nested spans around the IB split -->
-<p><span id="s3" style="border:2px dotted red;"><span><span class="spacer" style="width:100px"></span>
+<div><span id="s3" style="border:2px dotted red;"><span><span class="spacer" style="width:100px"></span>
 <div style="width:500px; height:100px; background:yellow;"></div>
-<span class="spacer" style="width:200px"></span></span></span>
+<span class="spacer" style="width:200px"></span></span></span></div>
 
 <div id="content" style="display: none">
 
 </div>
 
 <pre id="test">
 <script class="testbody" type="text/javascript">
 
--- a/content/html/content/src/nsHTMLOptGroupElement.cpp
+++ b/content/html/content/src/nsHTMLOptGroupElement.cpp
@@ -73,17 +73,17 @@ public:
   NS_FORWARD_NSIDOMHTMLELEMENT(nsGenericHTMLElement::)
 
   // nsIDOMHTMLOptGroupElement
   NS_DECL_NSIDOMHTMLOPTGROUPELEMENT
 
   // nsGenericElement
   virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                  PRBool aNotify);
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify);
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent = PR_TRUE);
 
   // nsIContent
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
 
   virtual PRInt32 IntrinsicState() const;
  
   virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const;
 
@@ -180,20 +180,21 @@ nsHTMLOptGroupElement::InsertChildAt(nsI
   nsresult rv = nsGenericHTMLElement::InsertChildAt(aKid, aIndex, aNotify);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
 nsresult
-nsHTMLOptGroupElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify)
+nsHTMLOptGroupElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent)
 {
+  NS_ASSERTION(aMutationEvent, "Someone tried to inhibit mutation events on optgroup child removal.");
   nsSafeOptionListMutation safeMutation(GetSelect(), this, nsnull, aIndex);
-  nsresult rv = nsGenericHTMLElement::RemoveChildAt(aIndex, aNotify);
+  nsresult rv = nsGenericHTMLElement::RemoveChildAt(aIndex, aNotify, aMutationEvent);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
 PRInt32
 nsHTMLOptGroupElement::IntrinsicState() const
--- a/content/html/content/src/nsHTMLSelectElement.cpp
+++ b/content/html/content/src/nsHTMLSelectElement.cpp
@@ -203,20 +203,21 @@ nsHTMLSelectElement::InsertChildAt(nsICo
   nsresult rv = nsGenericHTMLFormElement::InsertChildAt(aKid, aIndex, aNotify);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
 nsresult
-nsHTMLSelectElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify)
+nsHTMLSelectElement::RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent)
 {
+  NS_ASSERTION(aMutationEvent, "Someone tried to inhibit mutations on select child removal.");
   nsSafeOptionListMutation safeMutation(this, this, nsnull, aIndex);
-  nsresult rv = nsGenericHTMLFormElement::RemoveChildAt(aIndex, aNotify);
+  nsresult rv = nsGenericHTMLFormElement::RemoveChildAt(aIndex, aNotify, aMutationEvent);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
 
 // SelectElement methods
--- a/content/html/content/src/nsHTMLSelectElement.h
+++ b/content/html/content/src/nsHTMLSelectElement.h
@@ -266,17 +266,17 @@ public:
   NS_DECL_NSIDOMNSHTMLSELECTELEMENT
 
   // nsIContent
   virtual nsresult PreHandleEvent(nsEventChainPreVisitor& aVisitor);
 
   virtual PRBool IsHTMLFocusable(PRBool *aIsFocusable, PRInt32 *aTabIndex);
   virtual nsresult InsertChildAt(nsIContent* aKid, PRUint32 aIndex,
                                  PRBool aNotify);
-  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify);
+  virtual nsresult RemoveChildAt(PRUint32 aIndex, PRBool aNotify, PRBool aMutationEvent = PR_TRUE);
 
   // Overriden nsIFormControl methods
   NS_IMETHOD_(PRInt32) GetType() const { return NS_FORM_SELECT; }
   NS_IMETHOD Reset();
   NS_IMETHOD SubmitNamesValues(nsIFormSubmission* aFormSubmission,
                                nsIContent* aSubmitElement);
   NS_IMETHOD SaveState();
   virtual PRBool RestoreState(nsPresState* aState);
deleted file mode 100644
--- a/content/html/document/reftests/bug448564-2_malformed.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<html>
-<body>
-  <s>
-  <form>a</form>
-  <iframe></iframe>
-  <script src=a></script>
-  <form></form>
-  <table>
-  <optgroup>
-</body>
-</html>
deleted file mode 100644
--- a/content/html/document/reftests/bug448564-2_well-formed.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<html>
-<body>
-  <s>
-    <form>a</form>
-    <iframe></iframe>
-  </s>
-  <form></form>
-  <form>
-    <select>
-      <optgroup></optgroup>
-    </select>
-  </form>
-</body>
-</html>
deleted file mode 100644
--- a/content/html/document/reftests/bug448564-3_malformed.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<table>
-  <th>head</th>
-  <optgroup></optgroup>
-</table>
deleted file mode 100644
--- a/content/html/document/reftests/bug448564-3_well-formed.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<form>
-  <select>
-    <optgroup></optgroup>
-  </select>
-</form>
-<table>
-  <th>head</th>
-</table>
deleted file mode 100644
--- a/content/html/document/reftests/bug448564-5_malformed.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<html>
-<head>
-  <link rel="stylesheet" type="text/css"
-        href="bug448564_forms.css">
-  </link>
-</head>
-<body>
-  <form>
-    <table>
-      <optgroup></optgroup>
-    </table>
-    <input type="button" value="button"></input>
-  </form>
-  <b>asdf</b>
-</body>
-</html>
deleted file mode 100644
--- a/content/html/document/reftests/bug448564-5_well-formed.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
-<head>
-  <link rel="stylesheet" type="text/css"
-        href="bug448564_forms.css">
-  </link>
-</head>
-<body>
-  <form>
-    <select>
-      <optgroup></optgroup>
-    </select>
-    <table></table>
-    <input type="button" value="button"></input>
-  </form>
-  <b>asdf</b>
-</body>
-</html>
--- a/content/html/document/reftests/reftests.list
+++ b/content/html/document/reftests/reftests.list
@@ -1,10 +1,4 @@
 == bug448564-1_malformed.html bug448564-1_well-formed.html
 == bug448564-1_malformed.html bug448564-1_ideal.html
 
-== bug448564-2_malformed.html bug448564-2_well-formed.html
-
-== bug448564-3_malformed.html bug448564-3_well-formed.html
-
 == bug448564-4a.html          bug448564-4b.html
-
-== bug448564-5_malformed.html bug448564-5_well-formed.html
--- a/content/html/document/src/Makefile.in
+++ b/content/html/document/src/Makefile.in
@@ -71,16 +71,17 @@ REQUIRES	= xpcom \
 		  xpconnect \
 		  unicharutil \
 		  commandhandler \
 		  composer \
 		  editor \
 		  plugin \
 		  txtsvc \
 		  uriloader \
+		  html5 \
 		  $(NULL)
 
 CPPSRCS		= \
 		nsHTMLContentSink.cpp \
 		nsHTMLFragmentContentSink.cpp \
 		nsHTMLDocument.cpp \
 		nsImageDocument.cpp \
 		nsMediaDocument.cpp \
--- a/content/html/document/src/nsHTMLContentSink.cpp
+++ b/content/html/document/src/nsHTMLContentSink.cpp
@@ -206,18 +206,16 @@ public:
   NS_IMETHOD DidProcessAToken(void);
   NS_IMETHOD NotifyTagObservers(nsIParserNode* aNode);
   NS_IMETHOD BeginContext(PRInt32 aID);
   NS_IMETHOD EndContext(PRInt32 aID);
   NS_IMETHOD OpenHead();
   NS_IMETHOD IsEnabled(PRInt32 aTag, PRBool* aReturn);
   NS_IMETHOD_(PRBool) IsFormOnStack();
 
-  virtual nsresult ProcessMETATag(nsIContent* aContent);
-
 #ifdef DEBUG
   // nsIDebugDumpContent
   NS_IMETHOD DumpContentModel();
 #endif
 
 protected:
   // If aCheckIfPresent is true, will only set an attribute in cases
   // when it's not already set.
@@ -2950,43 +2948,16 @@ HTMLContentSink::ProcessLINKTag(const ns
         }
       }
     }
   }
 
   return result;
 }
 
-/* 
- * Extends nsContentSink::ProcessMETATag to grab the 'viewport' meta tag. This
- * information is ignored by the generic content sink because it only stores
- * http-equiv meta tags.
- *
- * Initially implemented for bug #436083
- */
-nsresult
-HTMLContentSink::ProcessMETATag(nsIContent *aContent) {
-
-  /* Call the superclass method. */
-  nsContentSink::ProcessMETATag(aContent);
-
-  nsresult rv = NS_OK;
-
-  /* Look for the viewport meta tag. If we find it, process it and put the
-   * data into the document header. */
-  if (aContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::name,
-                            nsGkAtoms::viewport, eIgnoreCase)) {
-    nsAutoString value;
-    aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::content, value);
-    rv = nsContentUtils::ProcessViewportInfo(mDocument, value);
-  }
-
-  return rv;
-}
-
 #ifdef DEBUG
 void
 HTMLContentSink::ForceReflow()
 {
   mCurrentContext->FlushTags();
 }
 #endif
 
--- a/content/html/document/src/nsHTMLDocument.cpp
+++ b/content/html/document/src/nsHTMLDocument.cpp
@@ -136,16 +136,17 @@
 #include "nsNodeInfoManager.h"
 #include "nsIEditor.h"
 #include "nsIEditorDocShell.h"
 #include "nsIEditorStyleSheets.h"
 #include "nsIInlineSpellChecker.h"
 #include "nsRange.h"
 #include "mozAutoDocUpdate.h"
 #include "nsCCUncollectableMarker.h"
+#include "nsHtml5Module.h"
 #include "prprf.h"
 
 #define NS_MAX_DOCUMENT_WRITE_DEPTH 20
 
 #define DETECTOR_CONTRACTID_MAX 127
 static char g_detector_contractid[DETECTOR_CONTRACTID_MAX + 1];
 static PRBool gInitDetector = PR_FALSE;
 static PRBool gPlugDetector = PR_FALSE;
@@ -649,25 +650,35 @@ nsresult
 nsHTMLDocument::StartDocumentLoad(const char* aCommand,
                                   nsIChannel* aChannel,
                                   nsILoadGroup* aLoadGroup,
                                   nsISupports* aContainer,
                                   nsIStreamListener **aDocListener,
                                   PRBool aReset,
                                   nsIContentSink* aSink)
 {
+  PRBool loadAsHtml5 = nsHtml5Module::Enabled;
+  if (aSink) {
+    loadAsHtml5 = PR_FALSE;
+  }
+
   nsCAutoString contentType;
   aChannel->GetContentType(contentType);
 
   if (contentType.Equals("application/xhtml+xml") &&
       (!aCommand || nsCRT::strcmp(aCommand, "view-source") != 0)) {
     // We're parsing XHTML as XML, remember that.
 
     mIsRegularHTML = PR_FALSE;
     mCompatMode = eCompatibility_FullStandards;
+    loadAsHtml5 = PR_FALSE;
+  }
+  
+  if (!(contentType.Equals("text/html") && aCommand && !nsCRT::strcmp(aCommand, "view"))) {
+    loadAsHtml5 = PR_FALSE;
   }
 #ifdef DEBUG
   else {
     NS_ASSERTION(mIsRegularHTML,
                  "Hey, someone forgot to reset mIsRegularHTML!!!");
   }
 #endif
 
@@ -704,18 +715,22 @@ nsHTMLDocument::StartDocumentLoad(const 
   if (cachingChan) {
     nsCOMPtr<nsISupports> cacheToken;
     cachingChan->GetCacheToken(getter_AddRefs(cacheToken));
     if (cacheToken)
       cacheDescriptor = do_QueryInterface(cacheToken);
   }
 
   if (needsParser) {
-    mParser = do_CreateInstance(kCParserCID, &rv);
-    NS_ENSURE_SUCCESS(rv, rv);
+    if (loadAsHtml5) {
+      mParser = nsHtml5Module::NewHtml5Parser();
+    } else {
+      mParser = do_CreateInstance(kCParserCID, &rv);
+      NS_ENSURE_SUCCESS(rv, rv);
+    }
   }
 
   PRInt32 textType = GET_BIDI_OPTION_TEXTTYPE(GetBidiOptions());
 
   // Look for the parent document.  Note that at this point we don't have our
   // content viewer set up yet, and therefore do not have a useful
   // mParentDocument.
 
@@ -920,32 +935,38 @@ nsHTMLDocument::StartDocumentLoad(const 
           charset.get(), charsetSource);
 #endif
     mParser->SetDocumentCharset(parserCharset, parserCharsetSource);
     mParser->SetCommand(aCommand);
 
     // create the content sink
     nsCOMPtr<nsIContentSink> sink;
 
-    if (aSink)
+    if (aSink) {
+      NS_ASSERTION((!loadAsHtml5), "Panic: We are loading as HTML5 and someone tries to set an external sink!");
       sink = aSink;
-    else {
+    } else {
       if (IsXHTML()) {
         nsCOMPtr<nsIXMLContentSink> xmlsink;
         rv = NS_NewXMLContentSink(getter_AddRefs(xmlsink), this, uri,
                                   docShell, aChannel);
 
         sink = xmlsink;
       } else {
-        nsCOMPtr<nsIHTMLContentSink> htmlsink;
-
-        rv = NS_NewHTMLContentSink(getter_AddRefs(htmlsink), this, uri,
-                                   docShell, aChannel);
-
-        sink = htmlsink;
+        if (loadAsHtml5) {
+          nsHtml5Module::Initialize(mParser, this, uri, docShell, aChannel);
+          sink = mParser->GetContentSink();
+        } else {
+          nsCOMPtr<nsIHTMLContentSink> htmlsink;
+
+          rv = NS_NewHTMLContentSink(getter_AddRefs(htmlsink), this, uri,
+                                     docShell, aChannel);
+
+          sink = htmlsink;
+        }
       }
       NS_ENSURE_SUCCESS(rv, rv);
 
       NS_ASSERTION(sink,
                    "null sink with successful result from factory method");
     }
 
     mParser->SetContentSink(sink);
@@ -1779,16 +1800,18 @@ nsresult
 nsHTMLDocument::OpenCommon(const nsACString& aContentType, PRBool aReplace)
 {
   if (IsXHTML()) {
     // No calling document.open() on XHTML
 
     return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
   }
 
+  PRBool loadAsHtml5 = nsHtml5Module::Enabled;
+
   nsresult rv = NS_OK;
 
   // If we already have a parser we ignore the document.open call.
   if (mParser) {
 
     return NS_OK;
   }
 
@@ -1930,36 +1953,45 @@ nsHTMLDocument::OpenCommon(const nsACStr
     TurnEditingOff();
     EditingStateChanged();
   }
 
   // Store the security info of the caller now that we're done
   // resetting the document.
   mSecurityInfo = securityInfo;
 
-  mParser = do_CreateInstance(kCParserCID, &rv);
+  if (loadAsHtml5) {
+    mParser = nsHtml5Module::NewHtml5Parser();
+    rv = NS_OK;
+  } else {
+    mParser = do_CreateInstance(kCParserCID, &rv);  
+  }
 
   // This will be propagated to the parser when someone actually calls write()
   mContentType = aContentType;
 
   mWriteState = eDocumentOpened;
 
   if (NS_SUCCEEDED(rv)) {
-    nsCOMPtr<nsIHTMLContentSink> sink;
-
-    rv = NS_NewHTMLContentSink(getter_AddRefs(sink), this, uri, shell,
-                               channel);
-    if (NS_FAILED(rv)) {
-      // Don't use a parser without a content sink.
-      mParser = nsnull;
-      mWriteState = eNotWriting;
-      return rv;
+    if (loadAsHtml5) {
+      nsHtml5Module::Initialize(mParser, this, uri, shell, channel);
+    } else {
+      nsCOMPtr<nsIHTMLContentSink> sink;
+
+      rv = NS_NewHTMLContentSink(getter_AddRefs(sink), this, uri, shell,
+                                 channel);
+      if (NS_FAILED(rv)) {
+        // Don't use a parser without a content sink.
+        mParser = nsnull;
+        mWriteState = eNotWriting;
+        return rv;
+      }
+
+      mParser->SetContentSink(sink);
     }
-
-    mParser->SetContentSink(sink);
   }
 
   // Prepare the docshell and the document viewer for the impending
   // out of band document.write()
   shell->PrepareForNewContentModel();
 
   // Now check whether we were opened with a "replace" argument.  If
   // so, we need to tell the docshell to not create a new history
new file mode 100644
--- /dev/null
+++ b/content/html/parser/Makefile.in
@@ -0,0 +1,52 @@
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH		= ../../..
+topsrcdir	= @top_srcdir@
+srcdir		= @srcdir@
+VPATH		= @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+DIRS		= public src
+
+# ifdef ENABLE_TESTS
+# DIRS		+= test
+# endif
+
+include $(topsrcdir)/config/rules.mk
+
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/AttributeName.java
@@ -0,0 +1,2793 @@
+/*
+ * Copyright (c) 2008-2009 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+import java.util.Arrays;
+
+import nu.validator.htmlparser.annotation.IdType;
+import nu.validator.htmlparser.annotation.Local;
+import nu.validator.htmlparser.annotation.NoLength;
+import nu.validator.htmlparser.annotation.NsUri;
+import nu.validator.htmlparser.annotation.Prefix;
+import nu.validator.htmlparser.annotation.QName;
+import nu.validator.htmlparser.annotation.Virtual;
+
+public final class AttributeName
+// Uncomment to regenerate
+//        implements Comparable<AttributeName> 
+{
+
+    private static final @NoLength @NsUri String[] ALL_NO_NS = { "", "", "",
+    // [NOCPP[
+            ""
+    // ]NOCPP]
+    };
+
+    private static final @NoLength @NsUri String[] XMLNS_NS = { "",
+            "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2000/xmlns/",
+            // [NOCPP[
+            ""
+    // ]NOCPP]
+    };
+
+    private static final @NoLength @NsUri String[] XML_NS = { "",
+            "http://www.w3.org/XML/1998/namespace",
+            "http://www.w3.org/XML/1998/namespace",
+            // [NOCPP[
+            ""
+    // ]NOCPP]
+    };
+
+    private static final @NoLength @NsUri String[] XLINK_NS = { "",
+            "http://www.w3.org/1999/xlink", "http://www.w3.org/1999/xlink",
+            // [NOCPP[
+            ""
+    // ]NOCPP]
+    };
+
+    // [NOCPP[
+    private static final @NoLength @NsUri String[] LANG_NS = { "", "", "",
+            "http://www.w3.org/XML/1998/namespace" };
+
+    // ]NOCPP]
+
+    private static final @NoLength @Prefix String[] ALL_NO_PREFIX = { null,
+            null, null,
+            // [NOCPP[
+            null
+    // ]NOCPP]
+    };
+
+    private static final @NoLength @Prefix String[] XMLNS_PREFIX = { null,
+            "xmlns", "xmlns",
+            // [NOCPP[
+            null
+    // ]NOCPP]
+    };
+
+    private static final @NoLength @Prefix String[] XLINK_PREFIX = { null,
+            "xlink", "xlink",
+            // [NOCPP[
+            null
+    // ]NOCPP]
+    };
+
+    private static final @NoLength @Prefix String[] XML_PREFIX = { null, "xml",
+            "xml",
+            // [NOCPP[
+            null
+    // ]NOCPP]
+    };
+
+    // [NOCPP[
+
+    private static final @NoLength @Prefix String[] LANG_PREFIX = { null, null,
+            null, "xml" };
+
+    private static final boolean[] ALL_NCNAME = { true, true, true, true };
+
+    private static final boolean[] ALL_NO_NCNAME = { false, false, false, false };
+
+    private static @QName String[] COMPUTE_QNAME(String[] local, String[] prefix) {
+        @QName String[] rv = new String[4];
+        for (int i = 0; i < rv.length; i++) {
+            if (prefix[i] == null) {
+                rv[i] = local[i];
+            } else {
+                rv[i] = (prefix[i] + ':' + local[i]).intern();
+            }
+        }
+        return rv;
+    }
+
+    // ]NOCPP]
+
+    private static @NoLength @Local String[] SVG_DIFFERENT(@Local String name,
+            @Local String camel) {
+        @NoLength @Local String[] rv = new String[4];
+        rv[0] = name;
+        rv[1] = name;
+        rv[2] = camel;
+        // [NOCPP[
+        rv[3] = name;
+        // ]NOCPP]
+        return rv;
+    }
+
+    private static @NoLength @Local String[] MATH_DIFFERENT(@Local String name,
+            @Local String camel) {
+        @NoLength @Local String[] rv = new String[4];
+        rv[0] = name;
+        rv[1] = camel;
+        rv[2] = name;
+        // [NOCPP[
+        rv[3] = name;
+        // ]NOCPP]
+        return rv;
+    }
+
+    private static @NoLength @Local String[] COLONIFIED_LOCAL(
+            @Local String name, @Local String suffix) {
+        @NoLength @Local String[] rv = new String[4];
+        rv[0] = name;
+        rv[1] = suffix;
+        rv[2] = suffix;
+        // [NOCPP[
+        rv[3] = name;
+        // ]NOCPP]
+        return rv;
+    }
+
+    private static @NoLength @Local String[] SAME_LOCAL(@Local String name) {
+        @NoLength @Local String[] rv = new String[4];
+        rv[0] = name;
+        rv[1] = name;
+        rv[2] = name;
+        // [NOCPP[
+        rv[3] = name;
+        // ]NOCPP]
+        return rv;
+    }
+
+    /**
+     * Returns an attribute name by buffer.
+     * 
+     * <p>
+     * C++ ownership: The return value is either released by the caller if the
+     * attribute is a duplicate or the ownership is transferred to
+     * HtmlAttributes and released upon clearing or destroying that object.
+     * 
+     * @param buf
+     * @param offset
+     * @param length
+     * @param checkNcName
+     * @return
+     */
+    static AttributeName nameByBuffer(@NoLength char[] buf, int offset,
+            int length
+            // [NOCPP[
+            , boolean checkNcName
+    // ]NOCPP]
+    ) {
+        // XXX deal with offset
+        int hash = AttributeName.bufToHash(buf, length);
+        int index = Arrays.binarySearch(AttributeName.ATTRIBUTE_HASHES, hash);
+        if (index < 0) {
+            return AttributeName.createAttributeName(
+                    Portability.newLocalNameFromBuffer(buf, offset, length)
+                    // [NOCPP[
+                    , checkNcName
+            // ]NOCPP]
+            );
+        } else {
+            AttributeName rv = AttributeName.ATTRIBUTE_NAMES[index];
+            @Local String name = rv.getLocal(AttributeName.HTML);
+            if (!Portability.localEqualsBuffer(name, buf, offset, length)) {
+                return AttributeName.createAttributeName(
+                        Portability.newLocalNameFromBuffer(buf, offset, length)
+                        // [NOCPP[
+                        , checkNcName
+                // ]NOCPP]
+                );
+            }
+            return rv;
+        }
+    }
+
+    /**
+     * This method has to return a unique integer for each well-known
+     * lower-cased attribute name.
+     * 
+     * @param buf
+     * @param len
+     * @return
+     */
+    private static int bufToHash(@NoLength char[] buf, int len) {
+        int hash2 = 0;
+        int hash = len;
+        hash <<= 5;
+        hash += buf[0] - 0x60;
+        int j = len;
+        for (int i = 0; i < 4 && j > 0; i++) {
+            j--;
+            hash <<= 5;
+            hash += buf[j] - 0x60;
+            hash2 <<= 6;
+            hash2 += buf[i] - 0x5F;
+        }
+        return hash ^ hash2;
+    }
+
+    public static final int HTML = 0;
+
+    public static final int MATHML = 1;
+
+    public static final int SVG = 2;
+
+    // [NOCPP[
+
+    public static final int HTML_LANG = 3;
+
+    private final @IdType String type;
+
+    // ]NOCPP]
+
+    private final @NsUri @NoLength String[] uri;
+
+    private final @Local @NoLength String[] local;
+
+    private final @Prefix @NoLength String[] prefix;
+
+    // [NOCPP[
+
+    private final @QName @NoLength String[] qName;
+
+    // XXX convert to bitfield
+    private final @NoLength boolean[] ncname;
+
+    private final boolean xmlns;
+
+    /**
+     * @param type
+     * @param uri
+     * @param local
+     * @param name
+     * @param ncname
+     * @param xmlns
+     */
+    private AttributeName(@NsUri @NoLength String[] uri,
+            @Local @NoLength String[] local, @Prefix @NoLength String[] prefix,
+            @NoLength boolean[] ncname, boolean xmlns, @IdType String type) {
+        this.type = type;
+        this.uri = uri;
+        this.local = local;
+        this.prefix = prefix;
+
+        this.qName = COMPUTE_QNAME(local, prefix);
+        this.ncname = ncname;
+        this.xmlns = xmlns;
+    }
+
+    // ]NOCPP]
+
+    protected AttributeName(@NsUri @NoLength String[] uri,
+            @Local @NoLength String[] local, @Prefix @NoLength String[] prefix
+            // [NOCPP[
+            , @NoLength boolean[] ncname, boolean xmlns
+    // ]NOCPP]
+    ) {
+        // [NOCPP[
+        this.type = "CDATA";
+        // ]NOCPP]
+        this.uri = uri;
+        this.local = local;
+        this.prefix = prefix;
+        // [NOCPP[
+        this.qName = COMPUTE_QNAME(local, prefix);
+        this.ncname = ncname;
+        this.xmlns = xmlns;
+        // ]NOCPP]
+    }
+
+    private static AttributeName createAttributeName(@Local String name
+    // [NOCPP[
+            , boolean checkNcName
+    // ]NOCPP]
+    ) {
+        // [NOCPP[
+        boolean ncName = true;
+        boolean xmlns = name.startsWith("xmlns:");
+        if (checkNcName) {
+            if (xmlns) {
+                ncName = false;
+            } else {
+                ncName = NCName.isNCName(name);
+            }
+        }
+        // ]NOCPP]
+        return new AttributeName(AttributeName.ALL_NO_NS,
+                AttributeName.SAME_LOCAL(name), ALL_NO_PREFIX
+                // ]NOCPP]
+                , (ncName ? AttributeName.ALL_NCNAME
+                        : AttributeName.ALL_NO_NCNAME), xmlns
+        // ]NOCPP]
+        );
+    }
+
+    @Virtual void release() {
+        // No-op in Java.
+        // Implement as |delete this;| in subclass.
+    }
+
+    @SuppressWarnings("unused") private void destructor() {
+        Portability.releaseLocal(local[0]); // this must be a no-op for static
+        // locals
+        // for non-static cases the other array slots contain the same pointer
+        // as weak references.
+        Portability.deleteArray(local);
+    }
+
+    // [NOCPP[
+    static AttributeName create(@Local String name) {
+        return new AttributeName(AttributeName.ALL_NO_NS,
+                AttributeName.SAME_LOCAL(name), ALL_NO_PREFIX,
+                AttributeName.ALL_NCNAME, false);
+    }
+
+    public boolean isNcName(int mode) {
+        return ncname[mode];
+    }
+
+    public boolean isXmlns() {
+        return xmlns;
+    }
+
+    boolean isCaseFolded() {
+        return this == AttributeName.ACTIVE || this == AttributeName.ALIGN
+                || this == AttributeName.ASYNC
+                || this == AttributeName.AUTOCOMPLETE
+                || this == AttributeName.AUTOFOCUS
+                || this == AttributeName.AUTOSUBMIT
+                || this == AttributeName.CHECKED || this == AttributeName.CLEAR
+                || this == AttributeName.COMPACT
+                || this == AttributeName.DATAFORMATAS
+                || this == AttributeName.DECLARE
+                || this == AttributeName.DEFAULT || this == AttributeName.DEFER
+                || this == AttributeName.DIR || this == AttributeName.DISABLED
+                || this == AttributeName.ENCTYPE || this == AttributeName.FRAME
+                || this == AttributeName.ISMAP || this == AttributeName.METHOD
+                || this == AttributeName.MULTIPLE
+                || this == AttributeName.NOHREF
+                || this == AttributeName.NORESIZE
+                || this == AttributeName.NOSHADE
+                || this == AttributeName.NOWRAP
+                || this == AttributeName.READONLY
+                || this == AttributeName.REPLACE
+                || this == AttributeName.REQUIRED
+                || this == AttributeName.RULES || this == AttributeName.SCOPE
+                || this == AttributeName.SCROLLING
+                || this == AttributeName.SELECTED
+                || this == AttributeName.SHAPE || this == AttributeName.STEP
+                || this == AttributeName.TYPE || this == AttributeName.VALIGN
+                || this == AttributeName.VALUETYPE;
+    }
+
+    boolean isBoolean() {
+        return this == AttributeName.ACTIVE || this == AttributeName.ASYNC
+                || this == AttributeName.AUTOFOCUS
+                || this == AttributeName.AUTOSUBMIT
+                || this == AttributeName.CHECKED
+                || this == AttributeName.COMPACT
+                || this == AttributeName.DECLARE
+                || this == AttributeName.DEFAULT || this == AttributeName.DEFER
+                || this == AttributeName.DISABLED
+                || this == AttributeName.ISMAP
+                || this == AttributeName.MULTIPLE
+                || this == AttributeName.NOHREF
+                || this == AttributeName.NORESIZE
+                || this == AttributeName.NOSHADE
+                || this == AttributeName.NOWRAP
+                || this == AttributeName.READONLY
+                || this == AttributeName.REQUIRED
+                || this == AttributeName.SELECTED;
+    }
+
+    public @QName String getQName(int mode) {
+        return qName[mode];
+    }
+
+    public @IdType String getType(int mode) {
+        return type;
+    }
+
+    // ]NOCPP]
+
+    public @NsUri String getUri(int mode) {
+        return uri[mode];
+    }
+
+    public @Local String getLocal(int mode) {
+        return local[mode];
+    }
+
+    public @Prefix String getPrefix(int mode) {
+        return prefix[mode];
+    }
+
+    boolean equalsAnother(AttributeName another) {
+        return this.getLocal(AttributeName.HTML) == another.getLocal(AttributeName.HTML);
+    }
+
+    // START CODE ONLY USED FOR GENERATING CODE uncomment to regenerate
+//
+//    /**
+//     * @see java.lang.Object#toString()
+//     */
+//    @Override public String toString() {
+//        return "(" + formatNs() + ", " + formatLocal() + ", " + formatPrefix()
+//                + ", " + formatNcname() + ", " + (xmlns ? "true" : "false")
+//                + ("ID" == type ? ", \"ID\"" : "") + ")";
+//    }
+//
+//    public int compareTo(AttributeName other) {
+//        int thisHash = this.hash();
+//        int otherHash = other.hash();
+//        if (thisHash < otherHash) {
+//            return -1;
+//        } else if (thisHash == otherHash) {
+//            return 0;
+//        } else {
+//            return 1;
+//        }
+//    }
+//
+//    private String formatPrefix() {
+//        if (prefix[0] == null && prefix[1] == null && prefix[2] == null
+//                && prefix[3] == null) {
+//            return "ALL_NO_PREFIX";
+//        } else if (prefix[0] == null && prefix[1] == prefix[2]
+//                && prefix[3] == null) {
+//            if ("xmlns".equals(prefix[1])) {
+//                return "XMLNS_PREFIX";
+//            } else if ("xml".equals(prefix[1])) {
+//                return "XML_PREFIX";
+//            } else if ("xlink".equals(prefix[1])) {
+//                return "XLINK_PREFIX";
+//            } else {
+//                throw new IllegalStateException();
+//            }
+//        } else if (prefix[0] == null && prefix[1] == null && prefix[2] == null
+//                && prefix[3] == "xml") {
+//            return "LANG_PREFIX";
+//        } else {
+//            throw new IllegalStateException();
+//        }
+//    }
+//
+//    private String formatLocal() {
+//        if (local[0] == local[1] && local[0] == local[3]
+//                && local[0] != local[2]) {
+//            return "SVG_DIFFERENT(\"" + local[0] + "\", \"" + local[2] + "\")";
+//        }
+//        if (local[0] == local[2] && local[0] == local[3]
+//                && local[0] != local[1]) {
+//            return "MATH_DIFFERENT(\"" + local[0] + "\", \"" + local[1] + "\")";
+//        }
+//        if (local[0] == local[3] && local[1] == local[2]
+//                && local[0] != local[1]) {
+//            return "COLONIFIED_LOCAL(\"" + local[0] + "\", \"" + local[1]
+//                    + "\")";
+//        }
+//        for (int i = 1; i < local.length; i++) {
+//            if (local[0] != local[i]) {
+//                throw new IllegalStateException();
+//            }
+//        }
+//        return "SAME_LOCAL(\"" + local[0] + "\")";
+//    }
+//
+//    private String formatNs() {
+//        if (uri[0] == "" && uri[1] == "" && uri[2] == "" && uri[3] == "") {
+//            return "ALL_NO_NS";
+//        } else if (uri[0] == "" && uri[1] == uri[2] && uri[3] == "") {
+//            if ("http://www.w3.org/2000/xmlns/".equals(uri[1])) {
+//                return "XMLNS_NS";
+//            } else if ("http://www.w3.org/XML/1998/namespace".equals(uri[1])) {
+//                return "XML_NS";
+//            } else if ("http://www.w3.org/1999/xlink".equals(uri[1])) {
+//                return "XLINK_NS";
+//            } else {
+//                throw new IllegalStateException();
+//            }
+//        } else if (uri[0] == "" && uri[1] == "" && uri[2] == ""
+//                && uri[3] == "http://www.w3.org/XML/1998/namespace") {
+//            return "LANG_NS";
+//        } else {
+//            throw new IllegalStateException();
+//        }
+//    }
+//
+//    private String formatNcname() {
+//        for (int i = 0; i < ncname.length; i++) {
+//            if (!ncname[i]) {
+//                return "new boolean[]{" + ncname[0] + ", " + ncname[1] + ", "
+//                        + ncname[2] + ", " + ncname[3] + "}";
+//            }
+//        }
+//        return "ALL_NCNAME";
+//    }
+//
+//    private String constName() {
+//        String name = getLocal(HTML);
+//        char[] buf = new char[name.length()];
+//        for (int i = 0; i < name.length(); i++) {
+//            char c = name.charAt(i);
+//            if (c == '-' || c == ':') {
+//                buf[i] = '_';
+//            } else if (c >= 'a' && c <= 'z') {
+//                buf[i] = (char) (c - 0x20);
+//            } else {
+//                buf[i] = c;
+//            }
+//        }
+//        String rv = new String(buf);
+//        if ("UNICODE".equals(rv)) {
+//            return "UNI_CODE"; 
+//        }
+//        return rv;
+//    }
+//
+//    private int hash() {
+//        String name = getLocal(HTML);
+//        return bufToHash(name.toCharArray(), name.length());
+//    }
+//
+//    /**
+//     * Regenerate self
+//     * 
+//     * @param args
+//     */
+//    public static void main(String[] args) {
+//        Arrays.sort(ATTRIBUTE_NAMES);
+//        for (int i = 1; i < ATTRIBUTE_NAMES.length; i++) {
+//            if (ATTRIBUTE_NAMES[i].hash() == ATTRIBUTE_NAMES[i - 1].hash()) {
+//                System.err.println("Hash collision: "
+//                        + ATTRIBUTE_NAMES[i].getLocal(HTML) + ", "
+//                        + ATTRIBUTE_NAMES[i - 1].getLocal(HTML));
+//                return;
+//            }
+//        }
+//        for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
+//            AttributeName att = ATTRIBUTE_NAMES[i];
+//            System.out.println("public static final AttributeName "
+//                    + att.constName() + " = new AttributeName" + att.toString()
+//                    + ";");
+//        }
+//        System.out.println("private final static @NoLength AttributeName[] ATTRIBUTE_NAMES = {");
+//        for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
+//            AttributeName att = ATTRIBUTE_NAMES[i];
+//            System.out.println(att.constName() + ",");
+//        }
+//        System.out.println("};");
+//        System.out.println("private final static int[] ATTRIBUTE_HASHES = {");
+//        for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
+//            AttributeName att = ATTRIBUTE_NAMES[i];
+//            System.out.println(Integer.toString(att.hash()) + ",");
+//        }
+//        System.out.println("};");
+//    }
+
+    // START GENERATED CODE
+    public static final AttributeName D = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("d"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName K = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("k"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName R = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("r"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName X = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("x"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName Y = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("y"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName Z = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("z"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("by"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("cx"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("cy"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("dx"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("dy"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName G2 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("g2"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName G1 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("g1"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fx"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fy"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName K4 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("k4"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName K2 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("k2"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName K3 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("k3"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName K1 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("k1"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ID = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("id"), ALL_NO_PREFIX, ALL_NCNAME, false, "ID");
+
+    public static final AttributeName IN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("in"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName U2 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("u2"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName U1 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("u1"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rt"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rx"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ry"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TO = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("to"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName Y2 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("y2"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName Y1 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("y1"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName X1 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("x1"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName X2 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("x2"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ALT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("alt"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DIR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("dir"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DUR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("dur"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName END = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("end"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("for"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName IN2 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("in2"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MAX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("max"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MIN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("min"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LOW = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("low"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REL = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rel"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REV = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rev"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SRC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("src"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName AXIS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("axis"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ABBR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("abbr"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BBOX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("bbox"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CITE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("cite"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CODE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("code"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BIAS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("bias"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COLS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("cols"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLIP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("clip"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CHAR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("char"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BASE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("base"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName EDGE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("edge"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DATA = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("data"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FILL = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fill"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FROM = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("from"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FORM = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("form"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FACE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("face"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HIGH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("high"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HREF = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("href"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OPEN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("open"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ICON = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("icon"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NAME = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("name"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MODE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("mode"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MASK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("mask"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LINK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("link"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LANG = new AttributeName(LANG_NS,
+            SAME_LOCAL("lang"), LANG_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LIST = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("list"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TYPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("type"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName WHEN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("when"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName WRAP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("wrap"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TEXT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("text"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PATH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("path"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ping"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REFX = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("refx", "refX"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REFY = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("refy", "refY"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("size"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SEED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("seed"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROWS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rows"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SPAN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("span"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STEP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("step"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("role"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName XREF = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("xref"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ASYNC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("async"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ALINK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("alink"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ALIGN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("align"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLOSE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("close"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COLOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("color"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLASS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("class"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLEAR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("clear"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BEGIN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("begin"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DEPTH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("depth"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DEFER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("defer"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FENCE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fence"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FRAME = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("frame"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ISMAP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ismap"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONEND = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onend"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName INDEX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("index"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ORDER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("order"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OTHER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("other"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONCUT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("oncut"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NARGS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("nargs"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MEDIA = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("media"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LABEL = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("label"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LOCAL = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("local"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName WIDTH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("width"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TITLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("title"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VLINK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("vlink"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VALUE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("value"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SLOPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("slope"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SHAPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("shape"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCOPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("scope"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCALE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("scale"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SPEED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("speed"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STYLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("style"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RULES = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rules"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STEMH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("stemh"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STEMV = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("stemv"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName START = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("start"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName XMLNS = new AttributeName(XMLNS_NS,
+            SAME_LOCAL("xmlns"), ALL_NO_PREFIX, new boolean[] { false, false,
+                    false, false }, true);
+
+    public static final AttributeName ACCEPT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("accept"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ACCENT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("accent"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ASCENT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ascent"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ACTIVE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("active"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ALTIMG = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("altimg"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ACTION = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("action"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BORDER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("border"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CURSOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("cursor"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COORDS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("coords"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FILTER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("filter"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FORMAT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("format"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HIDDEN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("hidden"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HSPACE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("hspace"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HEIGHT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("height"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONMOVE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onmove"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONLOAD = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onload"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDRAG = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ondrag"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ORIGIN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("origin"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONZOOM = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onzoom"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONHELP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onhelp"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONSTOP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onstop"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDROP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ondrop"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONBLUR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onblur"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OBJECT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("object"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OFFSET = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("offset"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ORIENT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("orient"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONCOPY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("oncopy"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NOWRAP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("nowrap"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NOHREF = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("nohref"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MACROS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("macros"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName METHOD = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("method"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LOWSRC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("lowsrc"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LSPACE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("lspace"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LQUOTE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("lquote"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName USEMAP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("usemap"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName WIDTHS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("widths"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TARGET = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("target"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VALUES = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("values"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VALIGN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("valign"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VSPACE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("vspace"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName POSTER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("poster"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName POINTS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("points"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PROMPT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("prompt"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCOPED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("scoped"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STRING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("string"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCHEME = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("scheme"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STROKE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("stroke"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RADIUS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("radius"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RESULT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("result"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REPEAT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("repeat"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RSPACE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rspace"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROTATE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rotate"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RQUOTE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rquote"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ALTTEXT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("alttext"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARCHIVE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("archive"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName AZIMUTH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("azimuth"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLOSURE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("closure"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CHECKED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("checked"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLASSID = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("classid"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CHAROFF = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("charoff"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BGCOLOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("bgcolor"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COLSPAN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("colspan"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CHARSET = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("charset"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COMPACT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("compact"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CONTENT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("content"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ENCTYPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("enctype"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DATASRC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("datasrc"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DATAFLD = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("datafld"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DECLARE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("declare"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DISPLAY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("display"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DIVISOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("divisor"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DEFAULT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("default"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DESCENT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("descent"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName KERNING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("kerning"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HANGING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("hanging"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HEADERS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("headers"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONPASTE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onpaste"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONCLICK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onclick"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OPTIMUM = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("optimum"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONBEGIN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onbegin"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONKEYUP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onkeyup"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONFOCUS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onfocus"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONERROR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onerror"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONINPUT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("oninput"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONABORT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onabort"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONSTART = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onstart"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONRESET = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onreset"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OPACITY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("opacity"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NOSHADE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("noshade"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MINSIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("minsize"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MAXSIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("maxsize"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LOOPEND = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("loopend"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LARGEOP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("largeop"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName UNI_CODE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("unicode"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TARGETX = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("targetx", "targetX"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName TARGETY = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("targety", "targetY"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName VIEWBOX = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("viewbox", "viewBox"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName VERSION = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("version"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PATTERN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("pattern"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PROFILE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("profile"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SPACING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("spacing"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RESTART = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("restart"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROWSPAN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rowspan"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SANDBOX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("sandbox"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SUMMARY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("summary"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STANDBY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("standby"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REPLACE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("replace"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName AUTOPLAY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("autoplay"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ADDITIVE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("additive"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CALCMODE = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("calcmode", "calcMode"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName CODETYPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("codetype"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CODEBASE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("codebase"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CONTROLS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("controls"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BEVELLED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("bevelled"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BASELINE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("baseline"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName EXPONENT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("exponent"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName EDGEMODE = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("edgemode", "edgeMode"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ENCODING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("encoding"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName GLYPHREF = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("glyphref", "glyphRef"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName DATETIME = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("datetime"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DISABLED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("disabled"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONTSIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fontsize"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName KEYTIMES = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("keytimes", "keyTimes"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName PANOSE_1 = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("panose-1"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName HREFLANG = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("hreflang"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONRESIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onresize"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONCHANGE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onchange"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONBOUNCE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onbounce"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONUNLOAD = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onunload"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONFINISH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onfinish"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONSCROLL = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onscroll"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OPERATOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("operator"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OVERFLOW = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("overflow"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONSUBMIT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onsubmit"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONREPEAT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onrepeat"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONSELECT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onselect"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NOTATION = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("notation"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NORESIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("noresize"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MANIFEST = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("manifest"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MATHSIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("mathsize"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MULTIPLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("multiple"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LONGDESC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("longdesc"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LANGUAGE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("language"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TEMPLATE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("template"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TABINDEX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("tabindex"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName READONLY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("readonly"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SELECTED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("selected"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROWLINES = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rowlines"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SEAMLESS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("seamless"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROWALIGN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rowalign"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STRETCHY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("stretchy"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REQUIRED = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("required"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName XML_BASE = new AttributeName(XML_NS,
+            COLONIFIED_LOCAL("xml:base", "base"), XML_PREFIX, new boolean[] {
+                    false, true, true, false }, false);
+
+    public static final AttributeName XML_LANG = new AttributeName(XML_NS,
+            COLONIFIED_LOCAL("xml:lang", "lang"), XML_PREFIX, new boolean[] {
+                    false, true, true, false }, false);
+
+    public static final AttributeName X_HEIGHT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("x-height"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_OWNS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("aria-owns"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName AUTOFOCUS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("autofocus"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_SORT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("aria-sort"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ACCESSKEY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("accesskey"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_BUSY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("aria-busy"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_GRAB = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("aria-grab"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName AMPLITUDE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("amplitude"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_LIVE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("aria-live"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLIP_RULE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("clip-rule"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CLIP_PATH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("clip-path"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName EQUALROWS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("equalrows"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ELEVATION = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("elevation"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DIRECTION = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("direction"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DRAGGABLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("draggable"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FILTERRES = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("filterres", "filterRes"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FILL_RULE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fill-rule"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONTSTYLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fontstyle"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONT_SIZE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("font-size"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName KEYPOINTS = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("keypoints", "keyPoints"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName HIDEFOCUS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("hidefocus"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONMESSAGE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onmessage"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName INTERCEPT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("intercept"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDRAGEND = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ondragend"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONMOVEEND = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onmoveend"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONINVALID = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("oninvalid"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONKEYDOWN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onkeydown"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONFOCUSIN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onfocusin"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONMOUSEUP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onmouseup"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName INPUTMODE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("inputmode"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONROWEXIT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onrowexit"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MATHCOLOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("mathcolor"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MASKUNITS = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("maskunits", "maskUnits"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MAXLENGTH = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("maxlength"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LINEBREAK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("linebreak"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName LOOPSTART = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("loopstart"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TRANSFORM = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("transform"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName V_HANGING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("v-hanging"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VALUETYPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("valuetype"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName POINTSATZ = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("pointsatz", "pointsAtZ"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName POINTSATX = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("pointsatx", "pointsAtX"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName POINTSATY = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("pointsaty", "pointsAtY"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName PLAYCOUNT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("playcount"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SYMMETRIC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("symmetric"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCROLLING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("scrolling"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REPEATDUR = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("repeatdur", "repeatDur"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName SELECTION = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("selection"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SEPARATOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("separator"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName XML_SPACE = new AttributeName(XML_NS,
+            COLONIFIED_LOCAL("xml:space", "space"), XML_PREFIX, new boolean[] {
+                    false, true, true, false }, false);
+
+    public static final AttributeName AUTOSUBMIT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("autosubmit"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ALPHABETIC = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("alphabetic"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ACTIONTYPE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("actiontype"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ACCUMULATE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("accumulate"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_LEVEL = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("aria-level"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COLUMNSPAN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("columnspan"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName CAP_HEIGHT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("cap-height"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName BACKGROUND = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("background"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName GLYPH_NAME = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("glyph-name"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName GROUPALIGN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("groupalign"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONTFAMILY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fontfamily"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONTWEIGHT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("fontweight"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONT_STYLE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("font-style"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName KEYSPLINES = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("keysplines", "keySplines"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName HTTP_EQUIV = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("http-equiv"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONACTIVATE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onactivate"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName OCCURRENCE = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("occurrence"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName IRRELEVANT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("irrelevant"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDBLCLICK = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ondblclick"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDRAGDROP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ondragdrop"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONKEYPRESS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onkeypress"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONROWENTER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onrowenter"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDRAGOVER = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("ondragover"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONFOCUSOUT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onfocusout"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONMOUSEOUT = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("onmouseout"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName NUMOCTAVES = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("numoctaves", "numOctaves"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName MARKER_MID = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("marker-mid"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MARKER_END = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("marker-end"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TEXTLENGTH = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("textlength", "textLength"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName VISIBILITY = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("visibility"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VIEWTARGET = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("viewtarget", "viewTarget"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName VERT_ADV_Y = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("vert-adv-y"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PATHLENGTH = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("pathlength", "pathLength"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName REPEAT_MAX = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("repeat-max"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RADIOGROUP = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("radiogroup"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STOP_COLOR = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("stop-color"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SEPARATORS = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("separators"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REPEAT_MIN = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("repeat-min"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ROWSPACING = new AttributeName(ALL_NO_NS,
+            SAME_LOCAL("rowspacing"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ZOOMANDPAN = new AttributeName(ALL_NO_NS,
+            SVG_DIFFERENT("zoomandpan", "zoomAndPan"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName XLINK_TYPE = new AttributeName(XLINK_NS,
+            COLONIFIED_LOCAL("xlink:type", "type"), XLINK_PREFIX,
+            new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName XLINK_ROLE = new AttributeName(XLINK_NS,
+            COLONIFIED_LOCAL("xlink:role", "role"), XLINK_PREFIX,
+            new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName XLINK_HREF = new AttributeName(XLINK_NS,
+            COLONIFIED_LOCAL("xlink:href", "href"), XLINK_PREFIX,
+            new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName XLINK_SHOW = new AttributeName(XLINK_NS,
+            COLONIFIED_LOCAL("xlink:show", "show"), XLINK_PREFIX,
+            new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName ACCENTUNDER = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("accentunder"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_SECRET = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-secret"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_ATOMIC = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-atomic"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_HIDDEN = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-hidden"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_FLOWTO = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-flowto"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARABIC_FORM = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("arabic-form"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName CELLPADDING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("cellpadding"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName CELLSPACING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("cellspacing"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName COLUMNWIDTH = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("columnwidth"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName COLUMNALIGN = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("columnalign"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName COLUMNLINES = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("columnlines"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName CONTEXTMENU = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("contextmenu"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName BASEPROFILE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("baseprofile", "baseProfile"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONT_FAMILY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("font-family"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FRAMEBORDER = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("frameborder"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FILTERUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("filterunits", "filterUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FLOOD_COLOR = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("flood-color"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FONT_WEIGHT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("font-weight"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName HORIZ_ADV_X = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("horiz-adv-x"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONDRAGLEAVE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondragleave"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOUSEMOVE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmousemove"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ORIENTATION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("orientation"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOUSEDOWN = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmousedown"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOUSEOVER = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmouseover"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONDRAGENTER = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondragenter"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName IDEOGRAPHIC = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ideographic"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONBEFORECUT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforecut"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONFORMINPUT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onforminput"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONDRAGSTART = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondragstart"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOVESTART = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmovestart"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MARKERUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("markerunits", "markerUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MATHVARIANT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("mathvariant"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MARGINWIDTH = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("marginwidth"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MARKERWIDTH = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("markerwidth", "markerWidth"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName TEXT_ANCHOR = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("text-anchor"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName TABLEVALUES = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("tablevalues", "tableValues"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCRIPTLEVEL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("scriptlevel"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName REPEATCOUNT = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("repeatcount", "repeatCount"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STITCHTILES = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("stitchtiles", "stitchTiles"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STARTOFFSET = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("startoffset", "startOffset"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCROLLDELAY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("scrolldelay"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName XMLNS_XLINK = new AttributeName(XMLNS_NS,
+            COLONIFIED_LOCAL("xmlns:xlink", "xlink"), XMLNS_PREFIX,
+            new boolean[] { false, false, false, false }, true);
+
+    public static final AttributeName XLINK_TITLE = new AttributeName(XLINK_NS,
+            COLONIFIED_LOCAL("xlink:title", "title"), XLINK_PREFIX,
+            new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName ARIA_INVALID = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-invalid"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_PRESSED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-pressed"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_CHECKED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-checked"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName AUTOCOMPLETE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("autocomplete"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_SETSIZE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-setsize"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_CHANNEL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-channel"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName EQUALCOLUMNS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("equalcolumns"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName DISPLAYSTYLE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("displaystyle"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName DATAFORMATAS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("dataformatas"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FILL_OPACITY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("fill-opacity"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FONT_VARIANT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("font-variant"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FONT_STRETCH = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("font-stretch"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName FRAMESPACING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("framespacing"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName KERNELMATRIX = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("kernelmatrix", "kernelMatrix"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDEACTIVATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondeactivate"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONROWSDELETE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onrowsdelete"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOUSELEAVE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmouseleave"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONFORMCHANGE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onformchange"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONCELLCHANGE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("oncellchange"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOUSEWHEEL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmousewheel"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONMOUSEENTER = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onmouseenter"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONAFTERPRINT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onafterprint"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONBEFORECOPY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforecopy"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MARGINHEIGHT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("marginheight"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MARKERHEIGHT = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("markerheight", "markerHeight"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName MARKER_START = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("marker-start"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MATHEMATICAL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("mathematical"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName LENGTHADJUST = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("lengthadjust", "lengthAdjust"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName UNSELECTABLE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("unselectable"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName UNICODE_BIDI = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("unicode-bidi"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName UNITS_PER_EM = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("units-per-em"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName WORD_SPACING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("word-spacing"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName WRITING_MODE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("writing-mode"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName V_ALPHABETIC = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("v-alphabetic"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName PATTERNUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("patternunits", "patternUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SPREADMETHOD = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("spreadmethod", "spreadMethod"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SURFACESCALE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("surfacescale", "surfaceScale"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STROKE_WIDTH = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-width"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName REPEAT_START = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("repeat-start"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName STDDEVIATION = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("stddeviation", "stdDeviation"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STOP_OPACITY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stop-opacity"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_CONTROLS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-controls"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_HASPOPUP = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-haspopup"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ACCENT_HEIGHT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("accent-height"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_VALUENOW = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-valuenow"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_RELEVANT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-relevant"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_POSINSET = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-posinset"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_VALUEMAX = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-valuemax"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_READONLY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-readonly"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_SELECTED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-selected"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_REQUIRED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-required"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_EXPANDED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-expanded"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_DISABLED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-disabled"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ATTRIBUTETYPE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("attributetype", "attributeType"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ATTRIBUTENAME = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("attributename", "attributeName"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_DATATYPE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-datatype"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_VALUEMIN = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-valuemin"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName BASEFREQUENCY = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("basefrequency", "baseFrequency"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COLUMNSPACING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("columnspacing"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName COLOR_PROFILE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("color-profile"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName CLIPPATHUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("clippathunits", "clipPathUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName DEFINITIONURL = new AttributeName(
+            ALL_NO_NS, MATH_DIFFERENT("definitionurl", "definitionURL"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName GRADIENTUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("gradientunits", "gradientUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FLOOD_OPACITY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("flood-opacity"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONAFTERUPDATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onafterupdate"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONERRORUPDATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onerrorupdate"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONBEFOREPASTE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforepaste"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONLOSECAPTURE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onlosecapture"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONCONTEXTMENU = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("oncontextmenu"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONSELECTSTART = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onselectstart"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONBEFOREPRINT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforeprint"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MOVABLELIMITS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("movablelimits"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName LINETHICKNESS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("linethickness"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName UNICODE_RANGE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("unicode-range"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName THINMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("thinmathspace"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName VERT_ORIGIN_X = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("vert-origin-x"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName VERT_ORIGIN_Y = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("vert-origin-y"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName V_IDEOGRAPHIC = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("v-ideographic"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName PRESERVEALPHA = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("preservealpha", "preserveAlpha"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SCRIPTMINSIZE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("scriptminsize"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName SPECIFICATION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("specification"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName XLINK_ACTUATE = new AttributeName(
+            XLINK_NS, COLONIFIED_LOCAL("xlink:actuate", "actuate"),
+            XLINK_PREFIX, new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName XLINK_ARCROLE = new AttributeName(
+            XLINK_NS, COLONIFIED_LOCAL("xlink:arcrole", "arcrole"),
+            XLINK_PREFIX, new boolean[] { false, true, true, false }, false);
+
+    public static final AttributeName ACCEPT_CHARSET = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("accept-charset"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ALIGNMENTSCOPE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("alignmentscope"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_MULTILINE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-multiline"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName BASELINE_SHIFT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("baseline-shift"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName HORIZ_ORIGIN_X = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("horiz-origin-x"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName HORIZ_ORIGIN_Y = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("horiz-origin-y"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONBEFOREUPDATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforeupdate"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONFILTERCHANGE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onfilterchange"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONROWSINSERTED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onrowsinserted"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ONBEFOREUNLOAD = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforeunload"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName MATHBACKGROUND = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("mathbackground"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName LETTER_SPACING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("letter-spacing"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName LIGHTING_COLOR = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("lighting-color"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName THICKMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("thickmathspace"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName TEXT_RENDERING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("text-rendering"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName V_MATHEMATICAL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("v-mathematical"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName POINTER_EVENTS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("pointer-events"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName PRIMITIVEUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("primitiveunits", "primitiveUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SYSTEMLANGUAGE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("systemlanguage", "systemLanguage"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName STROKE_LINECAP = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-linecap"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName SUBSCRIPTSHIFT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("subscriptshift"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName STROKE_OPACITY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-opacity"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName ARIA_DROPEFFECT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-dropeffect"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_LABELLEDBY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-labelledby"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_TEMPLATEID = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-templateid"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName COLOR_RENDERING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("color-rendering"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName CONTENTEDITABLE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("contenteditable"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName DIFFUSECONSTANT = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("diffuseconstant", "diffuseConstant"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONDATAAVAILABLE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondataavailable"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ONCONTROLSELECT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("oncontrolselect"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName IMAGE_RENDERING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("image-rendering"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName MEDIUMMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("mediummathspace"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName TEXT_DECORATION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("text-decoration"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName SHAPE_RENDERING = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("shape-rendering"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName STROKE_LINEJOIN = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-linejoin"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName REPEAT_TEMPLATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("repeat-template"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_DESCRIBEDBY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-describedby"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName CONTENTSTYLETYPE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("contentstyletype", "contentStyleType"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName FONT_SIZE_ADJUST = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("font-size-adjust"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName KERNELUNITLENGTH = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("kernelunitlength", "kernelUnitLength"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONBEFOREACTIVATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforeactivate"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ONPROPERTYCHANGE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onpropertychange"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ONDATASETCHANGED = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondatasetchanged"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName MASKCONTENTUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("maskcontentunits", "maskContentUnits"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PATTERNTRANSFORM = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("patterntransform", "patternTransform"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName REQUIREDFEATURES = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("requiredfeatures", "requiredFeatures"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName RENDERING_INTENT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("rendering-intent"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName SPECULAREXPONENT = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("specularexponent", "specularExponent"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SPECULARCONSTANT = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("specularconstant", "specularConstant"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName SUPERSCRIPTSHIFT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("superscriptshift"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName STROKE_DASHARRAY = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-dasharray"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName XCHANNELSELECTOR = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("xchannelselector", "xChannelSelector"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName YCHANNELSELECTOR = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("ychannelselector", "yChannelSelector"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_AUTOCOMPLETE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-autocomplete"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName CONTENTSCRIPTTYPE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("contentscripttype", "contentScriptType"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ENABLE_BACKGROUND = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("enable-background"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName DOMINANT_BASELINE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("dominant-baseline"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName GRADIENTTRANSFORM = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("gradienttransform", "gradientTransform"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ONBEFORDEACTIVATE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbefordeactivate"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ONDATASETCOMPLETE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("ondatasetcomplete"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName OVERLINE_POSITION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("overline-position"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ONBEFOREEDITFOCUS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onbeforeeditfocus"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName LIMITINGCONEANGLE = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("limitingconeangle", "limitingConeAngle"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName VERYTHINMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("verythinmathspace"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName STROKE_DASHOFFSET = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-dashoffset"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName STROKE_MITERLIMIT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("stroke-miterlimit"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ALIGNMENT_BASELINE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("alignment-baseline"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ONREADYSTATECHANGE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("onreadystatechange"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName OVERLINE_THICKNESS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("overline-thickness"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName UNDERLINE_POSITION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("underline-position"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName VERYTHICKMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("verythickmathspace"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName REQUIREDEXTENSIONS = new AttributeName(
+            ALL_NO_NS,
+            SVG_DIFFERENT("requiredextensions", "requiredExtensions"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName COLOR_INTERPOLATION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("color-interpolation"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName UNDERLINE_THICKNESS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("underline-thickness"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName PRESERVEASPECTRATIO = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("preserveaspectratio",
+                    "preserveAspectRatio"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName PATTERNCONTENTUNITS = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("patterncontentunits",
+                    "patternContentUnits"), ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_MULTISELECTABLE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-multiselectable"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName SCRIPTSIZEMULTIPLIER = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("scriptsizemultiplier"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName ARIA_ACTIVEDESCENDANT = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("aria-activedescendant"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName VERYVERYTHINMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("veryverythinmathspace"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName VERYVERYTHICKMATHSPACE = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("veryverythickmathspace"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName STRIKETHROUGH_POSITION = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("strikethrough-position"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName STRIKETHROUGH_THICKNESS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("strikethrough-thickness"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName EXTERNALRESOURCESREQUIRED = new AttributeName(
+            ALL_NO_NS, SVG_DIFFERENT("externalresourcesrequired",
+                    "externalResourcesRequired"), ALL_NO_PREFIX, ALL_NCNAME,
+            false);
+
+    public static final AttributeName GLYPH_ORIENTATION_VERTICAL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("glyph-orientation-vertical"), ALL_NO_PREFIX,
+            ALL_NCNAME, false);
+
+    public static final AttributeName COLOR_INTERPOLATION_FILTERS = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("color-interpolation-filters"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    public static final AttributeName GLYPH_ORIENTATION_HORIZONTAL = new AttributeName(
+            ALL_NO_NS, SAME_LOCAL("glyph-orientation-horizontal"),
+            ALL_NO_PREFIX, ALL_NCNAME, false);
+
+    private final static @NoLength AttributeName[] ATTRIBUTE_NAMES = { D, K, R,
+            X, Y, Z, BY, CX, CY, DX, DY, G2, G1, FX, FY, K4, K2, K3, K1, ID,
+            IN, U2, U1, RT, RX, RY, TO, Y2, Y1, X1, X2, ALT, DIR, DUR, END,
+            FOR, IN2, MAX, MIN, LOW, REL, REV, SRC, AXIS, ABBR, BBOX, CITE,
+            CODE, BIAS, COLS, CLIP, CHAR, BASE, EDGE, DATA, FILL, FROM, FORM,
+            FACE, HIGH, HREF, OPEN, ICON, NAME, MODE, MASK, LINK, LANG, LIST,
+            TYPE, WHEN, WRAP, TEXT, PATH, PING, REFX, REFY, SIZE, SEED, ROWS,
+            SPAN, STEP, ROLE, XREF, ASYNC, ALINK, ALIGN, CLOSE, COLOR, CLASS,
+            CLEAR, BEGIN, DEPTH, DEFER, FENCE, FRAME, ISMAP, ONEND, INDEX,
+            ORDER, OTHER, ONCUT, NARGS, MEDIA, LABEL, LOCAL, WIDTH, TITLE,
+            VLINK, VALUE, SLOPE, SHAPE, SCOPE, SCALE, SPEED, STYLE, RULES,
+            STEMH, STEMV, START, XMLNS, ACCEPT, ACCENT, ASCENT, ACTIVE, ALTIMG,
+            ACTION, BORDER, CURSOR, COORDS, FILTER, FORMAT, HIDDEN, HSPACE,
+            HEIGHT, ONMOVE, ONLOAD, ONDRAG, ORIGIN, ONZOOM, ONHELP, ONSTOP,
+            ONDROP, ONBLUR, OBJECT, OFFSET, ORIENT, ONCOPY, NOWRAP, NOHREF,
+            MACROS, METHOD, LOWSRC, LSPACE, LQUOTE, USEMAP, WIDTHS, TARGET,
+            VALUES, VALIGN, VSPACE, POSTER, POINTS, PROMPT, SCOPED, STRING,
+            SCHEME, STROKE, RADIUS, RESULT, REPEAT, RSPACE, ROTATE, RQUOTE,
+            ALTTEXT, ARCHIVE, AZIMUTH, CLOSURE, CHECKED, CLASSID, CHAROFF,
+            BGCOLOR, COLSPAN, CHARSET, COMPACT, CONTENT, ENCTYPE, DATASRC,
+            DATAFLD, DECLARE, DISPLAY, DIVISOR, DEFAULT, DESCENT, KERNING,
+            HANGING, HEADERS, ONPASTE, ONCLICK, OPTIMUM, ONBEGIN, ONKEYUP,
+            ONFOCUS, ONERROR, ONINPUT, ONABORT, ONSTART, ONRESET, OPACITY,
+            NOSHADE, MINSIZE, MAXSIZE, LOOPEND, LARGEOP, UNI_CODE, TARGETX,
+            TARGETY, VIEWBOX, VERSION, PATTERN, PROFILE, SPACING, RESTART,
+            ROWSPAN, SANDBOX, SUMMARY, STANDBY, REPLACE, AUTOPLAY, ADDITIVE,
+            CALCMODE, CODETYPE, CODEBASE, CONTROLS, BEVELLED, BASELINE,
+            EXPONENT, EDGEMODE, ENCODING, GLYPHREF, DATETIME, DISABLED,
+            FONTSIZE, KEYTIMES, PANOSE_1, HREFLANG, ONRESIZE, ONCHANGE,
+            ONBOUNCE, ONUNLOAD, ONFINISH, ONSCROLL, OPERATOR, OVERFLOW,
+            ONSUBMIT, ONREPEAT, ONSELECT, NOTATION, NORESIZE, MANIFEST,
+            MATHSIZE, MULTIPLE, LONGDESC, LANGUAGE, TEMPLATE, TABINDEX,
+            READONLY, SELECTED, ROWLINES, SEAMLESS, ROWALIGN, STRETCHY,
+            REQUIRED, XML_BASE, XML_LANG, X_HEIGHT, ARIA_OWNS, AUTOFOCUS,
+            ARIA_SORT, ACCESSKEY, ARIA_BUSY, ARIA_GRAB, AMPLITUDE, ARIA_LIVE,
+            CLIP_RULE, CLIP_PATH, EQUALROWS, ELEVATION, DIRECTION, DRAGGABLE,
+            FILTERRES, FILL_RULE, FONTSTYLE, FONT_SIZE, KEYPOINTS, HIDEFOCUS,
+            ONMESSAGE, INTERCEPT, ONDRAGEND, ONMOVEEND, ONINVALID, ONKEYDOWN,
+            ONFOCUSIN, ONMOUSEUP, INPUTMODE, ONROWEXIT, MATHCOLOR, MASKUNITS,
+            MAXLENGTH, LINEBREAK, LOOPSTART, TRANSFORM, V_HANGING, VALUETYPE,
+            POINTSATZ, POINTSATX, POINTSATY, PLAYCOUNT, SYMMETRIC, SCROLLING,
+            REPEATDUR, SELECTION, SEPARATOR, XML_SPACE, AUTOSUBMIT, ALPHABETIC,
+            ACTIONTYPE, ACCUMULATE, ARIA_LEVEL, COLUMNSPAN, CAP_HEIGHT,
+            BACKGROUND, GLYPH_NAME, GROUPALIGN, FONTFAMILY, FONTWEIGHT,
+            FONT_STYLE, KEYSPLINES, HTTP_EQUIV, ONACTIVATE, OCCURRENCE,
+            IRRELEVANT, ONDBLCLICK, ONDRAGDROP, ONKEYPRESS, ONROWENTER,
+            ONDRAGOVER, ONFOCUSOUT, ONMOUSEOUT, NUMOCTAVES, MARKER_MID,
+            MARKER_END, TEXTLENGTH, VISIBILITY, VIEWTARGET, VERT_ADV_Y,
+            PATHLENGTH, REPEAT_MAX, RADIOGROUP, STOP_COLOR, SEPARATORS,
+            REPEAT_MIN, ROWSPACING, ZOOMANDPAN, XLINK_TYPE, XLINK_ROLE,
+            XLINK_HREF, XLINK_SHOW, ACCENTUNDER, ARIA_SECRET, ARIA_ATOMIC,
+            ARIA_HIDDEN, ARIA_FLOWTO, ARABIC_FORM, CELLPADDING, CELLSPACING,
+            COLUMNWIDTH, COLUMNALIGN, COLUMNLINES, CONTEXTMENU, BASEPROFILE,
+            FONT_FAMILY, FRAMEBORDER, FILTERUNITS, FLOOD_COLOR, FONT_WEIGHT,
+            HORIZ_ADV_X, ONDRAGLEAVE, ONMOUSEMOVE, ORIENTATION, ONMOUSEDOWN,
+            ONMOUSEOVER, ONDRAGENTER, IDEOGRAPHIC, ONBEFORECUT, ONFORMINPUT,
+            ONDRAGSTART, ONMOVESTART, MARKERUNITS, MATHVARIANT, MARGINWIDTH,
+            MARKERWIDTH, TEXT_ANCHOR, TABLEVALUES, SCRIPTLEVEL, REPEATCOUNT,
+            STITCHTILES, STARTOFFSET, SCROLLDELAY, XMLNS_XLINK, XLINK_TITLE,
+            ARIA_INVALID, ARIA_PRESSED, ARIA_CHECKED, AUTOCOMPLETE,
+            ARIA_SETSIZE, ARIA_CHANNEL, EQUALCOLUMNS, DISPLAYSTYLE,
+            DATAFORMATAS, FILL_OPACITY, FONT_VARIANT, FONT_STRETCH,
+            FRAMESPACING, KERNELMATRIX, ONDEACTIVATE, ONROWSDELETE,
+            ONMOUSELEAVE, ONFORMCHANGE, ONCELLCHANGE, ONMOUSEWHEEL,
+            ONMOUSEENTER, ONAFTERPRINT, ONBEFORECOPY, MARGINHEIGHT,
+            MARKERHEIGHT, MARKER_START, MATHEMATICAL, LENGTHADJUST,
+            UNSELECTABLE, UNICODE_BIDI, UNITS_PER_EM, WORD_SPACING,
+            WRITING_MODE, V_ALPHABETIC, PATTERNUNITS, SPREADMETHOD,
+            SURFACESCALE, STROKE_WIDTH, REPEAT_START, STDDEVIATION,
+            STOP_OPACITY, ARIA_CONTROLS, ARIA_HASPOPUP, ACCENT_HEIGHT,
+            ARIA_VALUENOW, ARIA_RELEVANT, ARIA_POSINSET, ARIA_VALUEMAX,
+            ARIA_READONLY, ARIA_SELECTED, ARIA_REQUIRED, ARIA_EXPANDED,
+            ARIA_DISABLED, ATTRIBUTETYPE, ATTRIBUTENAME, ARIA_DATATYPE,
+            ARIA_VALUEMIN, BASEFREQUENCY, COLUMNSPACING, COLOR_PROFILE,
+            CLIPPATHUNITS, DEFINITIONURL, GRADIENTUNITS, FLOOD_OPACITY,
+            ONAFTERUPDATE, ONERRORUPDATE, ONBEFOREPASTE, ONLOSECAPTURE,
+            ONCONTEXTMENU, ONSELECTSTART, ONBEFOREPRINT, MOVABLELIMITS,
+            LINETHICKNESS, UNICODE_RANGE, THINMATHSPACE, VERT_ORIGIN_X,
+            VERT_ORIGIN_Y, V_IDEOGRAPHIC, PRESERVEALPHA, SCRIPTMINSIZE,
+            SPECIFICATION, XLINK_ACTUATE, XLINK_ARCROLE, ACCEPT_CHARSET,
+            ALIGNMENTSCOPE, ARIA_MULTILINE, BASELINE_SHIFT, HORIZ_ORIGIN_X,
+            HORIZ_ORIGIN_Y, ONBEFOREUPDATE, ONFILTERCHANGE, ONROWSINSERTED,
+            ONBEFOREUNLOAD, MATHBACKGROUND, LETTER_SPACING, LIGHTING_COLOR,
+            THICKMATHSPACE, TEXT_RENDERING, V_MATHEMATICAL, POINTER_EVENTS,
+            PRIMITIVEUNITS, SYSTEMLANGUAGE, STROKE_LINECAP, SUBSCRIPTSHIFT,
+            STROKE_OPACITY, ARIA_DROPEFFECT, ARIA_LABELLEDBY, ARIA_TEMPLATEID,
+            COLOR_RENDERING, CONTENTEDITABLE, DIFFUSECONSTANT, ONDATAAVAILABLE,
+            ONCONTROLSELECT, IMAGE_RENDERING, MEDIUMMATHSPACE, TEXT_DECORATION,
+            SHAPE_RENDERING, STROKE_LINEJOIN, REPEAT_TEMPLATE,
+            ARIA_DESCRIBEDBY, CONTENTSTYLETYPE, FONT_SIZE_ADJUST,
+            KERNELUNITLENGTH, ONBEFOREACTIVATE, ONPROPERTYCHANGE,
+            ONDATASETCHANGED, MASKCONTENTUNITS, PATTERNTRANSFORM,
+            REQUIREDFEATURES, RENDERING_INTENT, SPECULAREXPONENT,
+            SPECULARCONSTANT, SUPERSCRIPTSHIFT, STROKE_DASHARRAY,
+            XCHANNELSELECTOR, YCHANNELSELECTOR, ARIA_AUTOCOMPLETE,
+            CONTENTSCRIPTTYPE, ENABLE_BACKGROUND, DOMINANT_BASELINE,
+            GRADIENTTRANSFORM, ONBEFORDEACTIVATE, ONDATASETCOMPLETE,
+            OVERLINE_POSITION, ONBEFOREEDITFOCUS, LIMITINGCONEANGLE,
+            VERYTHINMATHSPACE, STROKE_DASHOFFSET, STROKE_MITERLIMIT,
+            ALIGNMENT_BASELINE, ONREADYSTATECHANGE, OVERLINE_THICKNESS,
+            UNDERLINE_POSITION, VERYTHICKMATHSPACE, REQUIREDEXTENSIONS,
+            COLOR_INTERPOLATION, UNDERLINE_THICKNESS, PRESERVEASPECTRATIO,
+            PATTERNCONTENTUNITS, ARIA_MULTISELECTABLE, SCRIPTSIZEMULTIPLIER,
+            ARIA_ACTIVEDESCENDANT, VERYVERYTHINMATHSPACE,
+            VERYVERYTHICKMATHSPACE, STRIKETHROUGH_POSITION,
+            STRIKETHROUGH_THICKNESS, EXTERNALRESOURCESREQUIRED,
+            GLYPH_ORIENTATION_VERTICAL, COLOR_INTERPOLATION_FILTERS,
+            GLYPH_ORIENTATION_HORIZONTAL, };
+
+    private final static int[] ATTRIBUTE_HASHES = { 1153, 1383, 1601, 1793,
+            1827, 1857, 68600, 69146, 69177, 70237, 70270, 71572, 71669, 72415,
+            72444, 74846, 74904, 74943, 75001, 75276, 75590, 84742, 84839,
+            85575, 85963, 85992, 87204, 88074, 88171, 89130, 89163, 3207892,
+            3283895, 3284791, 3338752, 3358197, 3369562, 3539124, 3562402,
+            3574260, 3670335, 3696933, 3721879, 135280021, 135346322,
+            136317019, 136475749, 136548517, 136652214, 136884919, 136902418,
+            136942992, 137292068, 139120259, 139785574, 142250603, 142314056,
+            142331176, 142519584, 144752417, 145106895, 146147200, 146765926,
+            148805544, 149655723, 149809441, 150018784, 150445028, 150923321,
+            152528754, 152536216, 152647366, 152962785, 155219321, 155654904,
+            157317483, 157350248, 157437941, 157447478, 157604838, 157685404,
+            157894402, 158315188, 166078431, 169409980, 169700259, 169856932,
+            170007032, 170409695, 170466488, 170513710, 170608367, 173028944,
+            173896963, 176090625, 176129212, 179390001, 179489057, 179627464,
+            179840468, 179849042, 180004216, 181779081, 183027151, 183645319,
+            183698797, 185922012, 185997252, 188312483, 188675799, 190977533,
+            190992569, 191006194, 191033518, 191038774, 191096249, 191166163,
+            191194426, 191522106, 191568039, 200104642, 202506661, 202537381,
+            202602917, 203070590, 203120766, 203389054, 203690071, 203971238,
+            203986524, 209040857, 209125756, 212055489, 212322418, 212746849,
+            213002877, 213055164, 213088023, 213259873, 213273386, 213435118,
+            213437318, 213438231, 213493071, 213532268, 213542834, 213584431,
+            213659891, 215285828, 215880731, 216112976, 216684637, 217369699,
+            217565298, 217576549, 218186795, 219743185, 220082234, 221623802,
+            221986406, 222283890, 223089542, 223138630, 223311265, 224547358,
+            224587256, 224589550, 224655650, 224785518, 224810917, 224813302,
+            225429618, 225432950, 225440869, 236107233, 236709921, 236838947,
+            237117095, 237143271, 237172455, 237209953, 237354143, 237372743,
+            237668065, 237703073, 237714273, 239743521, 240512803, 240522627,
+            240560417, 240656513, 241015715, 241062755, 241065383, 243523041,
+            245865199, 246261793, 246556195, 246774817, 246923491, 246928419,
+            246981667, 247014847, 247058369, 247112833, 247118177, 247119137,
+            247128739, 247316903, 249533729, 250235623, 250269543, 251083937,
+            251402351, 252339047, 253260911, 253293679, 254844367, 255547879,
+            256077281, 256345377, 258124199, 258354465, 258605063, 258744193,
+            258845603, 258856961, 258926689, 269869248, 270174334, 270709417,
+            270778994, 270781796, 271102503, 271478858, 271490090, 272870654,
+            273335275, 273369140, 273924313, 274108530, 274116736, 276818662,
+            277476156, 279156579, 279349675, 280108533, 280128712, 280132869,
+            280162403, 280280292, 280413430, 280506130, 280677397, 280678580,
+            280686710, 280689066, 282736758, 283110901, 283275116, 283823226,
+            283890012, 284479340, 284606461, 286700477, 286798916, 291557706,
+            291665349, 291804100, 292138018, 292166446, 292418738, 292451039,
+            300298041, 300374839, 300597935, 303073389, 303083839, 303266673,
+            303354997, 303430688, 303576261, 303724281, 303819694, 304242723,
+            304382625, 306247792, 307227811, 307468786, 307724489, 309671175,
+            310252031, 310358241, 310373094, 311015256, 313357609, 313683893,
+            313701861, 313706996, 313707317, 313710350, 314027746, 314038181,
+            314091299, 314205627, 314233813, 316741830, 316797986, 317486755,
+            317794164, 318721061, 320076137, 322657125, 322887778, 323506876,
+            323572412, 323605180, 323938869, 325060058, 325320188, 325398738,
+            325541490, 325671619, 333868843, 336806130, 337212108, 337282686,
+            337285434, 337585223, 338036037, 338298087, 338566051, 340943551,
+            341190970, 342995704, 343352124, 343912673, 344585053, 346977248,
+            347218098, 347262163, 347278576, 347438191, 347655959, 347684788,
+            347726430, 347727772, 347776035, 347776629, 349500753, 350880161,
+            350887073, 353384123, 355496998, 355906922, 355979793, 356545959,
+            358637867, 358905016, 359164318, 359247286, 359350571, 359579447,
+            365560330, 367399355, 367420285, 367510727, 368013212, 370234760,
+            370353345, 370710317, 371074566, 371122285, 371194213, 371448425,
+            371448430, 371545055, 371596922, 371758751, 371964792, 372151328,
+            376550136, 376710172, 376795771, 376826271, 376906556, 380514830,
+            380774774, 380775037, 381030322, 381136500, 381281631, 381282269,
+            381285504, 381330595, 381331422, 381335911, 381336484, 383907298,
+            383917408, 384595009, 384595013, 387799894, 387823201, 392581647,
+            392584937, 392742684, 392906485, 393003349, 400644707, 400973830,
+            404428547, 404432113, 404432865, 404469244, 404478897, 404694860,
+            406887479, 408294949, 408789955, 410022510, 410467324, 410586448,
+            410945965, 411845275, 414327152, 414327932, 414329781, 414346257,
+            414346439, 414639928, 414835998, 414894517, 414986533, 417465377,
+            417465381, 417492216, 418259232, 419310946, 420103495, 420242342,
+            420380455, 420658662, 420717432, 423183880, 424539259, 425929170,
+            425972964, 426050649, 426126450, 426142833, 426607922, 437289840,
+            437347469, 437412335, 437423943, 437455540, 437462252, 437597991,
+            437617485, 437986305, 437986507, 437986828, 437987072, 438015591,
+            438034813, 438038966, 438179623, 438347971, 438483573, 438547062,
+            438895551, 441592676, 442032555, 443548979, 447881379, 447881655,
+            447881895, 447887844, 448416189, 448445746, 448449012, 450942191,
+            452816744, 453668677, 454434495, 456610076, 456642844, 456738709,
+            457544600, 459451897, 459680944, 468058810, 468083581, 470964084,
+            471470955, 471567278, 472267822, 481177859, 481210627, 481435874,
+            481455115, 481485378, 481490218, 485105638, 486005878, 486383494,
+            487988916, 488103783, 490661867, 491574090, 491578272, 493041952,
+            493441205, 493582844, 493716979, 504577572, 504740359, 505091638,
+            505592418, 505656212, 509516275, 514998531, 515571132, 515594682,
+            518712698, 521362273, 526592419, 526807354, 527348842, 538294791,
+            539214049, 544689535, 545535009, 548544752, 548563346, 548595116,
+            551679010, 558034099, 560329411, 560356209, 560671018, 560671152,
+            560692590, 560845442, 569212097, 569474241, 572252718, 572768481,
+            575326764, 576174758, 576190819, 582099184, 582099438, 582372519,
+            582558889, 586552164, 591325418, 594231990, 594243961, 605711268,
+            615672071, 616086845, 621792370, 624879850, 627432831, 640040548,
+            654392808, 658675477, 659420283, 672891587, 694768102, 705890982,
+            725543146, 759097578, 761686526, 795383908, 843809551, 878105336,
+            908643300, 945213471, };
+
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/ElementName.java
@@ -0,0 +1,1513 @@
+/*
+ * Copyright (c) 2008 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+import java.util.Arrays;
+
+import nu.validator.htmlparser.annotation.Local;
+import nu.validator.htmlparser.annotation.NoLength;
+import nu.validator.htmlparser.annotation.Virtual;
+
+public final class ElementName
+// uncomment when regenerating self
+//        implements Comparable<ElementName> 
+{
+
+    public final static ElementName NULL_ELEMENT_NAME = new ElementName(null);
+
+    public final @Local String name;
+
+    public final @Local String camelCaseName;
+    
+    public final int group;
+
+    public final boolean special;
+
+    public final boolean scoping;
+
+    public final boolean fosterParenting;
+
+    // [NOCPP[
+    
+    public final boolean custom;
+
+    // ]NOCPP]
+    
+    static ElementName elementNameByBuffer(char[] buf, int offset, int length) {
+        int hash = ElementName.bufToHash(buf, length);
+        int index = Arrays.binarySearch(ElementName.ELEMENT_HASHES, hash);
+        if (index < 0) {
+            return new ElementName(Portability.newLocalNameFromBuffer(buf, offset, length));
+        } else {
+            ElementName rv = ElementName.ELEMENT_NAMES[index];
+            @Local String name = rv.name;
+            if (!Portability.localEqualsBuffer(name, buf, offset, length)) {
+                return new ElementName(Portability.newLocalNameFromBuffer(buf,
+                        offset, length));                
+            }
+            return rv;
+        }
+    }
+
+    /**
+     * This method has to return a unique integer for each well-known
+     * lower-cased element name.
+     * 
+     * @param buf
+     * @param len
+     * @return
+     */
+    private static int bufToHash(char[] buf, int len) {
+        int hash = len;
+        hash <<= 5;
+        hash += buf[0] - 0x60;
+        int j = len;
+        for (int i = 0; i < 4 && j > 0; i++) {
+            j--;
+            hash <<= 5;
+            hash += buf[j] - 0x60;
+        }
+        return hash;
+    }
+
+    private ElementName(@Local String name, @Local String camelCaseName,
+            int group, boolean special, boolean scoping, boolean fosterParenting) {
+        this.name = name;
+        this.camelCaseName = camelCaseName;
+        this.group = group;
+        this.special = special;
+        this.scoping = scoping;
+        this.fosterParenting = fosterParenting;
+        // [NOCPP[
+        this.custom = false;
+        // ]NOCPP]
+    }
+
+    protected ElementName(@Local String name) {
+        this.name = name;
+        this.camelCaseName = name;
+        this.group = TreeBuilder.OTHER;
+        this.special = false;
+        this.scoping = false;
+        this.fosterParenting = false;
+        // [NOCPP[
+        this.custom = true;
+        // ]NOCPP]
+    }
+    
+    @Virtual void release() {
+        // No-op in Java. 
+        // Implement as delete this in subclass.
+        // Be sure to release the local name
+    }
+    
+    @SuppressWarnings("unused") private void destructor() {
+        Portability.releaseLocal(name); // this must be a no-op for static locals
+        // for non-static cases the camel case contains the same pointer as a weak reference.
+    }
+
+    // START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate
+
+//    /**
+//     * @see java.lang.Object#toString()
+//     */
+//    @Override public String toString() {
+//        return "(\"" + name + "\", \"" + camelCaseName + "\", TreeBuilder."
+//                + treeBuilderGroupToName() + ", "
+//                + (special ? "true" : "false") + ", "
+//                + (scoping ? "true" : "false") + ", "
+//                + (fosterParenting ? "true" : "false") + ")";
+//    }
+//
+//    private String constName() {
+//        char[] buf = new char[name.length()];
+//        for (int i = 0; i < name.length(); i++) {
+//            char c = name.charAt(i);
+//            if (c == '-') {
+//                buf[i] = '_';
+//            } else if (c >= '0' && c <= '9') {
+//                buf[i] = c;
+//            } else {
+//                buf[i] = (char) (c - 0x20);
+//            }
+//        }
+//        return new String(buf);
+//    }
+//
+//    private int hash() {
+//        return bufToHash(name.toCharArray(), name.length());
+//    }
+//
+//    public int compareTo(ElementName other) {
+//        int thisHash = this.hash();
+//        int otherHash = other.hash();
+//        if (thisHash < otherHash) {
+//            return -1;
+//        } else if (thisHash == otherHash) {
+//            return 0;
+//        } else {
+//            return 1;
+//        }
+//    }
+//
+//    private String treeBuilderGroupToName() {
+//        switch (group) {
+//            case TreeBuilder.OTHER:
+//                return "OTHER";
+//            case TreeBuilder.A:
+//                return "A";
+//            case TreeBuilder.BASE:
+//                return "BASE";
+//            case TreeBuilder.BODY:
+//                return "BODY";
+//            case TreeBuilder.BR:
+//                return "BR";
+//            case TreeBuilder.BUTTON:
+//                return "BUTTON";
+//            case TreeBuilder.CAPTION:
+//                return "CAPTION";
+//            case TreeBuilder.COL:
+//                return "COL";
+//            case TreeBuilder.COLGROUP:
+//                return "COLGROUP";
+//            case TreeBuilder.FORM:
+//                return "FORM";
+//            case TreeBuilder.FRAME:
+//                return "FRAME";
+//            case TreeBuilder.FRAMESET:
+//                return "FRAMESET";
+//            case TreeBuilder.IMAGE:
+//                return "IMAGE";
+//            case TreeBuilder.INPUT:
+//                return "INPUT";
+//            case TreeBuilder.ISINDEX:
+//                return "ISINDEX";
+//            case TreeBuilder.LI:
+//                return "LI";
+//            case TreeBuilder.LINK:
+//                return "LINK";
+//            case TreeBuilder.MATH:
+//                return "MATH";
+//            case TreeBuilder.META:
+//                return "META";
+//            case TreeBuilder.SVG:
+//                return "SVG";
+//            case TreeBuilder.HEAD:
+//                return "HEAD";
+//            case TreeBuilder.HR:
+//                return "HR";
+//            case TreeBuilder.HTML:
+//                return "HTML";
+//            case TreeBuilder.NOBR:
+//                return "NOBR";
+//            case TreeBuilder.NOFRAMES:
+//                return "NOFRAMES";
+//            case TreeBuilder.NOSCRIPT:
+//                return "NOSCRIPT";
+//            case TreeBuilder.OPTGROUP:
+//                return "OPTGROUP";
+//            case TreeBuilder.OPTION:
+//                return "OPTION";
+//            case TreeBuilder.P:
+//                return "P";
+//            case TreeBuilder.PLAINTEXT:
+//                return "PLAINTEXT";
+//            case TreeBuilder.SCRIPT:
+//                return "SCRIPT";
+//            case TreeBuilder.SELECT:
+//                return "SELECT";
+//            case TreeBuilder.STYLE:
+//                return "STYLE";
+//            case TreeBuilder.TABLE:
+//                return "TABLE";
+//            case TreeBuilder.TEXTAREA:
+//                return "TEXTAREA";
+//            case TreeBuilder.TITLE:
+//                return "TITLE";
+//            case TreeBuilder.TR:
+//                return "TR";
+//            case TreeBuilder.XMP:
+//                return "XMP";
+//            case TreeBuilder.TBODY_OR_THEAD_OR_TFOOT:
+//                return "TBODY_OR_THEAD_OR_TFOOT";
+//            case TreeBuilder.TD_OR_TH:
+//                return "TD_OR_TH";
+//            case TreeBuilder.DD_OR_DT:
+//                return "DD_OR_DT";
+//            case TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
+//                return "H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6";
+//            case TreeBuilder.OBJECT_OR_MARQUEE_OR_APPLET:
+//                return "OBJECT_OR_MARQUEE_OR_APPLET";
+//            case TreeBuilder.PRE_OR_LISTING:
+//                return "PRE_OR_LISTING";
+//            case TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
+//                return "B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U";
+//            case TreeBuilder.UL_OR_OL_OR_DL:
+//                return "UL_OR_OL_OR_DL";
+//            case TreeBuilder.IFRAME:
+//                return "IFRAME";
+//  case TreeBuilder.NOEMBED:
+//  return "NOEMBED";
+//            case TreeBuilder.EMBED_OR_IMG:
+//                return "EMBED_OR_IMG";
+//            case TreeBuilder.AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR:
+//                return "AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR";
+//            case TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
+//                return "DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU";
+//            case TreeBuilder.FIELDSET_OR_ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION:
+//                return "FIELDSET_OR_ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION";
+//            case TreeBuilder.CODE_OR_RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR:
+//                return "CODE_OR_RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR";
+//            case TreeBuilder.RT_OR_RP:
+//                return "RT_OR_RP";
+//            case TreeBuilder.COMMAND_OR_EVENT_SOURCE:
+//                return "COMMAND_OR_EVENT_SOURCE";
+//            case TreeBuilder.PARAM_OR_SOURCE:
+//                return "PARAM_OR_SOURCE";
+//            case TreeBuilder.MGLYPH_OR_MALIGNMARK:
+//                return "MGLYPH_OR_MALIGNMARK";
+//            case TreeBuilder.MI_MO_MN_MS_MTEXT:
+//                return "MI_MO_MN_MS_MTEXT";
+//            case TreeBuilder.ANNOTATION_XML:
+//                return "ANNOTATION_XML";
+//            case TreeBuilder.FOREIGNOBJECT_OR_DESC:
+//                return "FOREIGNOBJECT_OR_DESC";
+//        }
+//        return null;
+//    }
+//
+//    /**
+//     * Regenerate self
+//     * 
+//     * @param args
+//     */
+//    public static void main(String[] args) {
+//        Arrays.sort(ELEMENT_NAMES);
+//        for (int i = 1; i < ELEMENT_NAMES.length; i++) {
+//            if (ELEMENT_NAMES[i].hash() == ELEMENT_NAMES[i - 1].hash()) {
+//                System.err.println("Hash collision: " + ELEMENT_NAMES[i].name
+//                        + ", " + ELEMENT_NAMES[i - 1].name);
+//                return;
+//            }
+//        }
+//        for (int i = 0; i < ELEMENT_NAMES.length; i++) {
+//            ElementName el = ELEMENT_NAMES[i];
+//            System.out.println("public static final ElementName "
+//                    + el.constName() + " = new ElementName" + el.toString()
+//                    + ";");
+//        }
+//        System.out.println("private final static @NoLength ElementName[] ELEMENT_NAMES = {");
+//        for (int i = 0; i < ELEMENT_NAMES.length; i++) {
+//            ElementName el = ELEMENT_NAMES[i];
+//            System.out.println(el.constName() + ",");
+//        }
+//        System.out.println("};");
+//        System.out.println("private final static int[] ELEMENT_HASHES = {");
+//        for (int i = 0; i < ELEMENT_NAMES.length; i++) {
+//            ElementName el = ELEMENT_NAMES[i];
+//            System.out.println(Integer.toString(el.hash()) + ",");
+//        }
+//        System.out.println("};");
+//    }
+
+    // START GENERATED CODE
+    public static final ElementName A = new ElementName("a", "a", TreeBuilder.A, false, false, false);
+    public static final ElementName B = new ElementName("b", "b", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName G = new ElementName("g", "g", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName I = new ElementName("i", "i", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName P = new ElementName("p", "p", TreeBuilder.P, true, false, false);
+    public static final ElementName Q = new ElementName("q", "q", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName S = new ElementName("s", "s", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName U = new ElementName("u", "u", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName BR = new ElementName("br", "br", TreeBuilder.BR, true, false, false);
+    public static final ElementName CI = new ElementName("ci", "ci", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CN = new ElementName("cn", "cn", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DD = new ElementName("dd", "dd", TreeBuilder.DD_OR_DT, true, false, false);
+    public static final ElementName DL = new ElementName("dl", "dl", TreeBuilder.UL_OR_OL_OR_DL, true, false, false);
+    public static final ElementName DT = new ElementName("dt", "dt", TreeBuilder.DD_OR_DT, true, false, false);
+    public static final ElementName EM = new ElementName("em", "em", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName EQ = new ElementName("eq", "eq", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FN = new ElementName("fn", "fn", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName H1 = new ElementName("h1", "h1", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6, true, false, false);
+    public static final ElementName H2 = new ElementName("h2", "h2", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6, true, false, false);
+    public static final ElementName H3 = new ElementName("h3", "h3", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6, true, false, false);
+    public static final ElementName H4 = new ElementName("h4", "h4", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6, true, false, false);
+    public static final ElementName H5 = new ElementName("h5", "h5", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6, true, false, false);
+    public static final ElementName H6 = new ElementName("h6", "h6", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6, true, false, false);
+    public static final ElementName GT = new ElementName("gt", "gt", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName HR = new ElementName("hr", "hr", TreeBuilder.HR, true, false, false);
+    public static final ElementName IN = new ElementName("in", "in", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LI = new ElementName("li", "li", TreeBuilder.LI, true, false, false);
+    public static final ElementName LN = new ElementName("ln", "ln", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LT = new ElementName("lt", "lt", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MI = new ElementName("mi", "mi", TreeBuilder.MI_MO_MN_MS_MTEXT, false, false, false);
+    public static final ElementName MN = new ElementName("mn", "mn", TreeBuilder.MI_MO_MN_MS_MTEXT, false, false, false);
+    public static final ElementName MO = new ElementName("mo", "mo", TreeBuilder.MI_MO_MN_MS_MTEXT, false, false, false);
+    public static final ElementName MS = new ElementName("ms", "ms", TreeBuilder.MI_MO_MN_MS_MTEXT, false, false, false);
+    public static final ElementName OL = new ElementName("ol", "ol", TreeBuilder.UL_OR_OL_OR_DL, true, false, false);
+    public static final ElementName OR = new ElementName("or", "or", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PI = new ElementName("pi", "pi", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName RP = new ElementName("rp", "rp", TreeBuilder.RT_OR_RP, false, false, false);
+    public static final ElementName RT = new ElementName("rt", "rt", TreeBuilder.RT_OR_RP, false, false, false);
+    public static final ElementName TD = new ElementName("td", "td", TreeBuilder.TD_OR_TH, false, true, false);
+    public static final ElementName TH = new ElementName("th", "th", TreeBuilder.TD_OR_TH, false, true, false);
+    public static final ElementName TR = new ElementName("tr", "tr", TreeBuilder.TR, true, false, true);
+    public static final ElementName TT = new ElementName("tt", "tt", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName UL = new ElementName("ul", "ul", TreeBuilder.UL_OR_OL_OR_DL, true, false, false);
+    public static final ElementName AND = new ElementName("and", "and", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARG = new ElementName("arg", "arg", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ABS = new ElementName("abs", "abs", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName BIG = new ElementName("big", "big", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName BDO = new ElementName("bdo", "bdo", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CSC = new ElementName("csc", "csc", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COL = new ElementName("col", "col", TreeBuilder.COL, true, false, false);
+    public static final ElementName COS = new ElementName("cos", "cos", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COT = new ElementName("cot", "cot", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DEL = new ElementName("del", "del", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DFN = new ElementName("dfn", "dfn", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DIR = new ElementName("dir", "dir", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName DIV = new ElementName("div", "div", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU, true, false, false);
+    public static final ElementName EXP = new ElementName("exp", "exp", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName GCD = new ElementName("gcd", "gcd", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName GEQ = new ElementName("geq", "geq", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName IMG = new ElementName("img", "img", TreeBuilder.EMBED_OR_IMG, true, false, false);
+    public static final ElementName INS = new ElementName("ins", "ins", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INT = new ElementName("int", "int", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName KBD = new ElementName("kbd", "kbd", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LOG = new ElementName("log", "log", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LCM = new ElementName("lcm", "lcm", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LEQ = new ElementName("leq", "leq", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MTD = new ElementName("mtd", "mtd", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MIN = new ElementName("min", "min", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MAP = new ElementName("map", "map", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MTR = new ElementName("mtr", "mtr", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MAX = new ElementName("max", "max", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NEQ = new ElementName("neq", "neq", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOT = new ElementName("not", "not", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NAV = new ElementName("nav", "nav", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName PRE = new ElementName("pre", "pre", TreeBuilder.PRE_OR_LISTING, true, false, false);
+    public static final ElementName REM = new ElementName("rem", "rem", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SUB = new ElementName("sub", "sub", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR, false, false, false);
+    public static final ElementName SEC = new ElementName("sec", "sec", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SVG = new ElementName("svg", "svg", TreeBuilder.SVG, false, false, false);
+    public static final ElementName SUM = new ElementName("sum", "sum", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SIN = new ElementName("sin", "sin", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SEP = new ElementName("sep", "sep", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SUP = new ElementName("sup", "sup", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR, false, false, false);
+    public static final ElementName SET = new ElementName("set", "set", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TAN = new ElementName("tan", "tan", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName USE = new ElementName("use", "use", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VAR = new ElementName("var", "var", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR, false, false, false);
+    public static final ElementName WBR = new ElementName("wbr", "wbr", TreeBuilder.AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR, true, false, false);
+    public static final ElementName XMP = new ElementName("xmp", "xmp", TreeBuilder.XMP, false, false, false);
+    public static final ElementName XOR = new ElementName("xor", "xor", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName AREA = new ElementName("area", "area", TreeBuilder.AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR, true, false, false);
+    public static final ElementName ABBR = new ElementName("abbr", "abbr", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName BASE = new ElementName("base", "base", TreeBuilder.BASE, true, false, false);
+    public static final ElementName BVAR = new ElementName("bvar", "bvar", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName BODY = new ElementName("body", "body", TreeBuilder.BODY, true, false, false);
+    public static final ElementName CARD = new ElementName("card", "card", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CODE = new ElementName("code", "code", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName CITE = new ElementName("cite", "cite", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CSCH = new ElementName("csch", "csch", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COSH = new ElementName("cosh", "cosh", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COTH = new ElementName("coth", "coth", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CURL = new ElementName("curl", "curl", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DESC = new ElementName("desc", "desc", TreeBuilder.FOREIGNOBJECT_OR_DESC, false, false, false);
+    public static final ElementName DIFF = new ElementName("diff", "diff", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DEFS = new ElementName("defs", "defs", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FORM = new ElementName("form", "form", TreeBuilder.FORM, true, false, false);
+    public static final ElementName FONT = new ElementName("font", "font", TreeBuilder.FONT, false, false, false);
+    public static final ElementName GRAD = new ElementName("grad", "grad", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName HEAD = new ElementName("head", "head", TreeBuilder.HEAD, true, false, false);
+    public static final ElementName HTML = new ElementName("html", "html", TreeBuilder.HTML, false, true, false);
+    public static final ElementName LINE = new ElementName("line", "line", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LINK = new ElementName("link", "link", TreeBuilder.LINK, true, false, false);
+    public static final ElementName LIST = new ElementName("list", "list", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName META = new ElementName("meta", "meta", TreeBuilder.META, true, false, false);
+    public static final ElementName MSUB = new ElementName("msub", "msub", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MODE = new ElementName("mode", "mode", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MATH = new ElementName("math", "math", TreeBuilder.MATH, false, false, false);
+    public static final ElementName MARK = new ElementName("mark", "mark", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MASK = new ElementName("mask", "mask", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MEAN = new ElementName("mean", "mean", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MSUP = new ElementName("msup", "msup", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MENU = new ElementName("menu", "menu", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU, true, false, false);
+    public static final ElementName MROW = new ElementName("mrow", "mrow", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NONE = new ElementName("none", "none", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOBR = new ElementName("nobr", "nobr", TreeBuilder.NOBR, false, false, false);
+    public static final ElementName NEST = new ElementName("nest", "nest", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PATH = new ElementName("path", "path", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PLUS = new ElementName("plus", "plus", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName RULE = new ElementName("rule", "rule", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName REAL = new ElementName("real", "real", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName RELN = new ElementName("reln", "reln", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName RECT = new ElementName("rect", "rect", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ROOT = new ElementName("root", "root", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName RUBY = new ElementName("ruby", "ruby", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR, false, false, false);
+    public static final ElementName SECH = new ElementName("sech", "sech", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SINH = new ElementName("sinh", "sinh", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SPAN = new ElementName("span", "span", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR, false, false, false);
+    public static final ElementName SAMP = new ElementName("samp", "samp", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName STOP = new ElementName("stop", "stop", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SDEV = new ElementName("sdev", "sdev", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TIME = new ElementName("time", "time", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TRUE = new ElementName("true", "true", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TREF = new ElementName("tref", "tref", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TANH = new ElementName("tanh", "tanh", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TEXT = new ElementName("text", "text", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VIEW = new ElementName("view", "view", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ASIDE = new ElementName("aside", "aside", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName AUDIO = new ElementName("audio", "audio", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName APPLY = new ElementName("apply", "apply", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName EMBED = new ElementName("embed", "embed", TreeBuilder.EMBED_OR_IMG, true, false, false);
+    public static final ElementName FRAME = new ElementName("frame", "frame", TreeBuilder.FRAME, true, false, false);
+    public static final ElementName FALSE = new ElementName("false", "false", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FLOOR = new ElementName("floor", "floor", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName GLYPH = new ElementName("glyph", "glyph", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName HKERN = new ElementName("hkern", "hkern", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName IMAGE = new ElementName("image", "image", TreeBuilder.IMAGE, true, false, false);
+    public static final ElementName IDENT = new ElementName("ident", "ident", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INPUT = new ElementName("input", "input", TreeBuilder.INPUT, true, false, false);
+    public static final ElementName LABEL = new ElementName("label", "label", TreeBuilder.OUTPUT_OR_LABEL, false, false, false);
+    public static final ElementName LIMIT = new ElementName("limit", "limit", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MFRAC = new ElementName("mfrac", "mfrac", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MPATH = new ElementName("mpath", "mpath", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName METER = new ElementName("meter", "meter", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MOVER = new ElementName("mover", "mover", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MINUS = new ElementName("minus", "minus", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MROOT = new ElementName("mroot", "mroot", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MSQRT = new ElementName("msqrt", "msqrt", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MTEXT = new ElementName("mtext", "mtext", TreeBuilder.MI_MO_MN_MS_MTEXT, false, false, false);
+    public static final ElementName NOTIN = new ElementName("notin", "notin", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PIECE = new ElementName("piece", "piece", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PARAM = new ElementName("param", "param", TreeBuilder.PARAM_OR_SOURCE, true, false, false);
+    public static final ElementName POWER = new ElementName("power", "power", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName REALS = new ElementName("reals", "reals", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName STYLE = new ElementName("style", "style", TreeBuilder.STYLE, true, false, false);
+    public static final ElementName SMALL = new ElementName("small", "small", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName THEAD = new ElementName("thead", "thead", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT, true, false, true);
+    public static final ElementName TABLE = new ElementName("table", "table", TreeBuilder.TABLE, false, true, true);
+    public static final ElementName TITLE = new ElementName("title", "title", TreeBuilder.TITLE, true, false, false);
+    public static final ElementName TSPAN = new ElementName("tspan", "tspan", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TIMES = new ElementName("times", "times", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TFOOT = new ElementName("tfoot", "tfoot", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT, true, false, true);
+    public static final ElementName TBODY = new ElementName("tbody", "tbody", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT, true, false, true);
+    public static final ElementName UNION = new ElementName("union", "union", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VKERN = new ElementName("vkern", "vkern", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VIDEO = new ElementName("video", "video", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCSEC = new ElementName("arcsec", "arcsec", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCCSC = new ElementName("arccsc", "arccsc", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCTAN = new ElementName("arctan", "arctan", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCSIN = new ElementName("arcsin", "arcsin", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCCOS = new ElementName("arccos", "arccos", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName APPLET = new ElementName("applet", "applet", TreeBuilder.MARQUEE_OR_APPLET, false, true, false);
+    public static final ElementName ARCCOT = new ElementName("arccot", "arccot", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName APPROX = new ElementName("approx", "approx", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName BUTTON = new ElementName("button", "button", TreeBuilder.BUTTON, false, true, false);
+    public static final ElementName CIRCLE = new ElementName("circle", "circle", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CENTER = new ElementName("center", "center", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU, true, false, false);
+    public static final ElementName CURSOR = new ElementName("cursor", "cursor", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CANVAS = new ElementName("canvas", "canvas", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DIVIDE = new ElementName("divide", "divide", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DEGREE = new ElementName("degree", "degree", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DIALOG = new ElementName("dialog", "dialog", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName DOMAIN = new ElementName("domain", "domain", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName EXISTS = new ElementName("exists", "exists", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FETILE = new ElementName("fetile", "feTile", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FIGURE = new ElementName("figure", "figure", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName FORALL = new ElementName("forall", "forall", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FILTER = new ElementName("filter", "filter", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FOOTER = new ElementName("footer", "footer", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName HEADER = new ElementName("header", "header", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName IFRAME = new ElementName("iframe", "iframe", TreeBuilder.IFRAME, true, false, false);
+    public static final ElementName KEYGEN = new ElementName("keygen", "keygen", TreeBuilder.KEYGEN, true, false, false);
+    public static final ElementName LAMBDA = new ElementName("lambda", "lambda", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LEGEND = new ElementName("legend", "legend", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MSPACE = new ElementName("mspace", "mspace", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MTABLE = new ElementName("mtable", "mtable", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MSTYLE = new ElementName("mstyle", "mstyle", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MGLYPH = new ElementName("mglyph", "mglyph", TreeBuilder.MGLYPH_OR_MALIGNMARK, false, false, false);
+    public static final ElementName MEDIAN = new ElementName("median", "median", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MUNDER = new ElementName("munder", "munder", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MARKER = new ElementName("marker", "marker", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MERROR = new ElementName("merror", "merror", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MOMENT = new ElementName("moment", "moment", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MATRIX = new ElementName("matrix", "matrix", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName OPTION = new ElementName("option", "option", TreeBuilder.OPTION, true, false, false);
+    public static final ElementName OBJECT = new ElementName("object", "object", TreeBuilder.OBJECT, false, true, false);
+    public static final ElementName OUTPUT = new ElementName("output", "output", TreeBuilder.OUTPUT_OR_LABEL, false, false, false);
+    public static final ElementName PRIMES = new ElementName("primes", "primes", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SOURCE = new ElementName("source", "source", TreeBuilder.PARAM_OR_SOURCE, false, false, false);
+    public static final ElementName STRIKE = new ElementName("strike", "strike", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName STRONG = new ElementName("strong", "strong", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U, false, false, false);
+    public static final ElementName SWITCH = new ElementName("switch", "switch", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SYMBOL = new ElementName("symbol", "symbol", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SPACER = new ElementName("spacer", "spacer", TreeBuilder.AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR, true, false, false);
+    public static final ElementName SELECT = new ElementName("select", "select", TreeBuilder.SELECT, true, false, false);
+    public static final ElementName SUBSET = new ElementName("subset", "subset", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SCRIPT = new ElementName("script", "script", TreeBuilder.SCRIPT, true, false, false);
+    public static final ElementName TBREAK = new ElementName("tbreak", "tbreak", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VECTOR = new ElementName("vector", "vector", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARTICLE = new ElementName("article", "article", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName ANIMATE = new ElementName("animate", "animate", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCSECH = new ElementName("arcsech", "arcsech", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCCSCH = new ElementName("arccsch", "arccsch", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCTANH = new ElementName("arctanh", "arctanh", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCSINH = new ElementName("arcsinh", "arcsinh", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCCOSH = new ElementName("arccosh", "arccosh", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ARCCOTH = new ElementName("arccoth", "arccoth", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ACRONYM = new ElementName("acronym", "acronym", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ADDRESS = new ElementName("address", "address", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName BGSOUND = new ElementName("bgsound", "bgsound", TreeBuilder.AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR, true, false, false);
+    public static final ElementName COMMAND = new ElementName("command", "command", TreeBuilder.COMMAND_OR_EVENT_SOURCE, true, false, false);
+    public static final ElementName COMPOSE = new ElementName("compose", "compose", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CEILING = new ElementName("ceiling", "ceiling", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CSYMBOL = new ElementName("csymbol", "csymbol", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CAPTION = new ElementName("caption", "caption", TreeBuilder.CAPTION, false, true, false);
+    public static final ElementName DISCARD = new ElementName("discard", "discard", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DECLARE = new ElementName("declare", "declare", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DETAILS = new ElementName("details", "details", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName ELLIPSE = new ElementName("ellipse", "ellipse", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEFUNCA = new ElementName("fefunca", "feFuncA", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEFUNCB = new ElementName("fefuncb", "feFuncB", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEBLEND = new ElementName("feblend", "feBlend", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEFLOOD = new ElementName("feflood", "feFlood", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEIMAGE = new ElementName("feimage", "feImage", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEMERGE = new ElementName("femerge", "feMerge", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEFUNCG = new ElementName("fefuncg", "feFuncG", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEFUNCR = new ElementName("fefuncr", "feFuncR", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName HANDLER = new ElementName("handler", "handler", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INVERSE = new ElementName("inverse", "inverse", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName IMPLIES = new ElementName("implies", "implies", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ISINDEX = new ElementName("isindex", "isindex", TreeBuilder.ISINDEX, true, false, false);
+    public static final ElementName LOGBASE = new ElementName("logbase", "logbase", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LISTING = new ElementName("listing", "listing", TreeBuilder.PRE_OR_LISTING, true, false, false);
+    public static final ElementName MFENCED = new ElementName("mfenced", "mfenced", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MPADDED = new ElementName("mpadded", "mpadded", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MARQUEE = new ElementName("marquee", "marquee", TreeBuilder.MARQUEE_OR_APPLET, false, true, false);
+    public static final ElementName MACTION = new ElementName("maction", "maction", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MSUBSUP = new ElementName("msubsup", "msubsup", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOEMBED = new ElementName("noembed", "noembed", TreeBuilder.NOEMBED, true, false, false);
+    public static final ElementName POLYGON = new ElementName("polygon", "polygon", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PATTERN = new ElementName("pattern", "pattern", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PRODUCT = new ElementName("product", "product", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SETDIFF = new ElementName("setdiff", "setdiff", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SECTION = new ElementName("section", "section", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName TENDSTO = new ElementName("tendsto", "tendsto", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName UPLIMIT = new ElementName("uplimit", "uplimit", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ALTGLYPH = new ElementName("altglyph", "altGlyph", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName BASEFONT = new ElementName("basefont", "basefont", TreeBuilder.AREA_OR_BASEFONT_OR_BGSOUND_OR_SPACER_OR_WBR, true, false, false);
+    public static final ElementName CLIPPATH = new ElementName("clippath", "clipPath", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CODOMAIN = new ElementName("codomain", "codomain", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COLGROUP = new ElementName("colgroup", "colgroup", TreeBuilder.COLGROUP, true, false, false);
+    public static final ElementName DATAGRID = new ElementName("datagrid", "datagrid", TreeBuilder.ADDRESS_OR_DIR_OR_ARTICLE_OR_ASIDE_OR_DATAGRID_OR_DETAILS_OR_DIALOG_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_NAV_OR_SECTION, true, false, false);
+    public static final ElementName EMPTYSET = new ElementName("emptyset", "emptyset", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FACTOROF = new ElementName("factorof", "factorof", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FIELDSET = new ElementName("fieldset", "fieldset", TreeBuilder.FIELDSET, true, false, false);
+    public static final ElementName FRAMESET = new ElementName("frameset", "frameset", TreeBuilder.FRAMESET, true, false, false);
+    public static final ElementName FEOFFSET = new ElementName("feoffset", "feOffset", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName GLYPHREF = new ElementName("glyphref", "glyphRef", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INTERVAL = new ElementName("interval", "interval", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INTEGERS = new ElementName("integers", "integers", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INFINITY = new ElementName("infinity", "infinity", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LISTENER = new ElementName("listener", "listener", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LOWLIMIT = new ElementName("lowlimit", "lowlimit", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName METADATA = new ElementName("metadata", "metadata", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MENCLOSE = new ElementName("menclose", "menclose", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MPHANTOM = new ElementName("mphantom", "mphantom", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOFRAMES = new ElementName("noframes", "noframes", TreeBuilder.NOFRAMES, true, false, false);
+    public static final ElementName NOSCRIPT = new ElementName("noscript", "noscript", TreeBuilder.NOSCRIPT, true, false, false);
+    public static final ElementName OPTGROUP = new ElementName("optgroup", "optgroup", TreeBuilder.OPTGROUP, true, false, false);
+    public static final ElementName POLYLINE = new ElementName("polyline", "polyline", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PREFETCH = new ElementName("prefetch", "prefetch", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PROGRESS = new ElementName("progress", "progress", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PRSUBSET = new ElementName("prsubset", "prsubset", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName QUOTIENT = new ElementName("quotient", "quotient", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SELECTOR = new ElementName("selector", "selector", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TEXTAREA = new ElementName("textarea", "textarea", TreeBuilder.TEXTAREA, true, false, false);
+    public static final ElementName TEXTPATH = new ElementName("textpath", "textPath", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VARIANCE = new ElementName("variance", "variance", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ANIMATION = new ElementName("animation", "animation", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CONJUGATE = new ElementName("conjugate", "conjugate", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CONDITION = new ElementName("condition", "condition", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COMPLEXES = new ElementName("complexes", "complexes", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FONT_FACE = new ElementName("font-face", "font-face", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FACTORIAL = new ElementName("factorial", "factorial", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName INTERSECT = new ElementName("intersect", "intersect", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName IMAGINARY = new ElementName("imaginary", "imaginary", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LAPLACIAN = new ElementName("laplacian", "laplacian", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MATRIXROW = new ElementName("matrixrow", "matrixrow", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOTSUBSET = new ElementName("notsubset", "notsubset", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName OTHERWISE = new ElementName("otherwise", "otherwise", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PIECEWISE = new ElementName("piecewise", "piecewise", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PLAINTEXT = new ElementName("plaintext", "plaintext", TreeBuilder.PLAINTEXT, true, false, false);
+    public static final ElementName RATIONALS = new ElementName("rationals", "rationals", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SEMANTICS = new ElementName("semantics", "semantics", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName TRANSPOSE = new ElementName("transpose", "transpose", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ANNOTATION = new ElementName("annotation", "annotation", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName BLOCKQUOTE = new ElementName("blockquote", "blockquote", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU, true, false, false);
+    public static final ElementName DIVERGENCE = new ElementName("divergence", "divergence", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName EULERGAMMA = new ElementName("eulergamma", "eulergamma", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName EQUIVALENT = new ElementName("equivalent", "equivalent", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName IMAGINARYI = new ElementName("imaginaryi", "imaginaryi", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MALIGNMARK = new ElementName("malignmark", "malignmark", TreeBuilder.MGLYPH_OR_MALIGNMARK, false, false, false);
+    public static final ElementName MUNDEROVER = new ElementName("munderover", "munderover", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MLABELEDTR = new ElementName("mlabeledtr", "mlabeledtr", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOTANUMBER = new ElementName("notanumber", "notanumber", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SOLIDCOLOR = new ElementName("solidcolor", "solidcolor", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ALTGLYPHDEF = new ElementName("altglyphdef", "altGlyphDef", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DETERMINANT = new ElementName("determinant", "determinant", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName EVENTSOURCE = new ElementName("eventsource", "eventsource", TreeBuilder.COMMAND_OR_EVENT_SOURCE, true, false, false);
+    public static final ElementName FEMERGENODE = new ElementName("femergenode", "feMergeNode", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FECOMPOSITE = new ElementName("fecomposite", "feComposite", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FESPOTLIGHT = new ElementName("fespotlight", "feSpotLight", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MALIGNGROUP = new ElementName("maligngroup", "maligngroup", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MPRESCRIPTS = new ElementName("mprescripts", "mprescripts", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MOMENTABOUT = new ElementName("momentabout", "momentabout", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NOTPRSUBSET = new ElementName("notprsubset", "notprsubset", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName PARTIALDIFF = new ElementName("partialdiff", "partialdiff", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ALTGLYPHITEM = new ElementName("altglyphitem", "altGlyphItem", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ANIMATECOLOR = new ElementName("animatecolor", "animateColor", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DATATEMPLATE = new ElementName("datatemplate", "datatemplate", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName EXPONENTIALE = new ElementName("exponentiale", "exponentiale", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FETURBULENCE = new ElementName("feturbulence", "feTurbulence", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEPOINTLIGHT = new ElementName("fepointlight", "fePointLight", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEMORPHOLOGY = new ElementName("femorphology", "feMorphology", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName OUTERPRODUCT = new ElementName("outerproduct", "outerproduct", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ANIMATEMOTION = new ElementName("animatemotion", "animateMotion", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName COLOR_PROFILE = new ElementName("color-profile", "color-profile", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FONT_FACE_SRC = new ElementName("font-face-src", "font-face-src", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FONT_FACE_URI = new ElementName("font-face-uri", "font-face-uri", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FOREIGNOBJECT = new ElementName("foreignobject", "foreignObject", TreeBuilder.FOREIGNOBJECT_OR_DESC, false, false, false);
+    public static final ElementName FECOLORMATRIX = new ElementName("fecolormatrix", "feColorMatrix", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MISSING_GLYPH = new ElementName("missing-glyph", "missing-glyph", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName MMULTISCRIPTS = new ElementName("mmultiscripts", "mmultiscripts", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName SCALARPRODUCT = new ElementName("scalarproduct", "scalarproduct", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName VECTORPRODUCT = new ElementName("vectorproduct", "vectorproduct", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ANNOTATION_XML = new ElementName("annotation-xml", "annotation-xml", TreeBuilder.ANNOTATION_XML, false, false, false);
+    public static final ElementName DEFINITION_SRC = new ElementName("definition-src", "definition-src", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FONT_FACE_NAME = new ElementName("font-face-name", "font-face-name", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEGAUSSIANBLUR = new ElementName("fegaussianblur", "feGaussianBlur", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEDISTANTLIGHT = new ElementName("fedistantlight", "feDistantLight", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName LINEARGRADIENT = new ElementName("lineargradient", "linearGradient", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName NATURALNUMBERS = new ElementName("naturalnumbers", "naturalnumbers", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName RADIALGRADIENT = new ElementName("radialgradient", "radialGradient", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName ANIMATETRANSFORM = new ElementName("animatetransform", "animateTransform", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName CARTESIANPRODUCT = new ElementName("cartesianproduct", "cartesianproduct", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FONT_FACE_FORMAT = new ElementName("font-face-format", "font-face-format", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FECONVOLVEMATRIX = new ElementName("feconvolvematrix", "feConvolveMatrix", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEDIFFUSELIGHTING = new ElementName("fediffuselighting", "feDiffuseLighting", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FEDISPLACEMENTMAP = new ElementName("fedisplacementmap", "feDisplacementMap", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FESPECULARLIGHTING = new ElementName("fespecularlighting", "feSpecularLighting", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName DOMAINOFAPPLICATION = new ElementName("domainofapplication", "domainofapplication", TreeBuilder.OTHER, false, false, false);
+    public static final ElementName FECOMPONENTTRANSFER = new ElementName("fecomponenttransfer", "feComponentTransfer", TreeBuilder.OTHER, false, false, false);
+    private final static @NoLength ElementName[] ELEMENT_NAMES = {
+    A,
+    B,
+    G,
+    I,
+    P,
+    Q,
+    S,
+    U,
+    BR,
+    CI,
+    CN,
+    DD,
+    DL,
+    DT,
+    EM,
+    EQ,
+    FN,
+    H1,
+    H2,
+    H3,
+    H4,
+    H5,
+    H6,
+    GT,
+    HR,
+    IN,
+    LI,
+    LN,
+    LT,
+    MI,
+    MN,
+    MO,
+    MS,
+    OL,
+    OR,
+    PI,
+    RP,
+    RT,
+    TD,
+    TH,
+    TR,
+    TT,
+    UL,
+    AND,
+    ARG,
+    ABS,
+    BIG,
+    BDO,
+    CSC,
+    COL,
+    COS,
+    COT,
+    DEL,
+    DFN,
+    DIR,
+    DIV,
+    EXP,
+    GCD,
+    GEQ,
+    IMG,
+    INS,
+    INT,
+    KBD,
+    LOG,
+    LCM,
+    LEQ,
+    MTD,
+    MIN,
+    MAP,
+    MTR,
+    MAX,
+    NEQ,
+    NOT,
+    NAV,
+    PRE,
+    REM,
+    SUB,
+    SEC,
+    SVG,
+    SUM,
+    SIN,
+    SEP,
+    SUP,
+    SET,
+    TAN,
+    USE,
+    VAR,
+    WBR,
+    XMP,
+    XOR,
+    AREA,
+    ABBR,
+    BASE,
+    BVAR,
+    BODY,
+    CARD,
+    CODE,
+    CITE,
+    CSCH,
+    COSH,
+    COTH,
+    CURL,
+    DESC,
+    DIFF,
+    DEFS,
+    FORM,
+    FONT,
+    GRAD,
+    HEAD,
+    HTML,
+    LINE,
+    LINK,
+    LIST,
+    META,
+    MSUB,
+    MODE,
+    MATH,
+    MARK,
+    MASK,
+    MEAN,
+    MSUP,
+    MENU,
+    MROW,
+    NONE,
+    NOBR,
+    NEST,
+    PATH,
+    PLUS,
+    RULE,
+    REAL,
+    RELN,
+    RECT,
+    ROOT,
+    RUBY,
+    SECH,
+    SINH,
+    SPAN,
+    SAMP,
+    STOP,
+    SDEV,
+    TIME,
+    TRUE,
+    TREF,
+    TANH,
+    TEXT,
+    VIEW,
+    ASIDE,
+    AUDIO,
+    APPLY,
+    EMBED,
+    FRAME,
+    FALSE,
+    FLOOR,
+    GLYPH,
+    HKERN,
+    IMAGE,
+    IDENT,
+    INPUT,
+    LABEL,
+    LIMIT,
+    MFRAC,
+    MPATH,
+    METER,
+    MOVER,
+    MINUS,
+    MROOT,
+    MSQRT,
+    MTEXT,
+    NOTIN,
+    PIECE,
+    PARAM,
+    POWER,
+    REALS,
+    STYLE,
+    SMALL,
+    THEAD,
+    TABLE,
+    TITLE,
+    TSPAN,
+    TIMES,
+    TFOOT,
+    TBODY,
+    UNION,
+    VKERN,
+    VIDEO,
+    ARCSEC,
+    ARCCSC,
+    ARCTAN,
+    ARCSIN,
+    ARCCOS,
+    APPLET,
+    ARCCOT,
+    APPROX,
+    BUTTON,
+    CIRCLE,
+    CENTER,
+    CURSOR,
+    CANVAS,
+    DIVIDE,
+    DEGREE,
+    DIALOG,
+    DOMAIN,
+    EXISTS,
+    FETILE,
+    FIGURE,
+    FORALL,
+    FILTER,
+    FOOTER,
+    HEADER,
+    IFRAME,
+    KEYGEN,
+    LAMBDA,
+    LEGEND,
+    MSPACE,
+    MTABLE,
+    MSTYLE,
+    MGLYPH,
+    MEDIAN,
+    MUNDER,
+    MARKER,
+    MERROR,
+    MOMENT,
+    MATRIX,
+    OPTION,
+    OBJECT,
+    OUTPUT,
+    PRIMES,
+    SOURCE,
+    STRIKE,
+    STRONG,
+    SWITCH,
+    SYMBOL,
+    SPACER,
+    SELECT,
+    SUBSET,
+    SCRIPT,
+    TBREAK,
+    VECTOR,
+    ARTICLE,
+    ANIMATE,
+    ARCSECH,
+    ARCCSCH,
+    ARCTANH,
+    ARCSINH,
+    ARCCOSH,
+    ARCCOTH,
+    ACRONYM,
+    ADDRESS,
+    BGSOUND,
+    COMMAND,
+    COMPOSE,
+    CEILING,
+    CSYMBOL,
+    CAPTION,
+    DISCARD,
+    DECLARE,
+    DETAILS,
+    ELLIPSE,
+    FEFUNCA,
+    FEFUNCB,
+    FEBLEND,
+    FEFLOOD,
+    FEIMAGE,
+    FEMERGE,
+    FEFUNCG,
+    FEFUNCR,
+    HANDLER,
+    INVERSE,
+    IMPLIES,
+    ISINDEX,
+    LOGBASE,
+    LISTING,
+    MFENCED,
+    MPADDED,
+    MARQUEE,
+    MACTION,
+    MSUBSUP,
+    NOEMBED,
+    POLYGON,
+    PATTERN,
+    PRODUCT,
+    SETDIFF,
+    SECTION,
+    TENDSTO,
+    UPLIMIT,
+    ALTGLYPH,
+    BASEFONT,
+    CLIPPATH,
+    CODOMAIN,
+    COLGROUP,
+    DATAGRID,
+    EMPTYSET,
+    FACTOROF,
+    FIELDSET,
+    FRAMESET,
+    FEOFFSET,
+    GLYPHREF,
+    INTERVAL,
+    INTEGERS,
+    INFINITY,
+    LISTENER,
+    LOWLIMIT,
+    METADATA,
+    MENCLOSE,
+    MPHANTOM,
+    NOFRAMES,
+    NOSCRIPT,
+    OPTGROUP,
+    POLYLINE,
+    PREFETCH,
+    PROGRESS,
+    PRSUBSET,
+    QUOTIENT,
+    SELECTOR,
+    TEXTAREA,
+    TEXTPATH,
+    VARIANCE,
+    ANIMATION,
+    CONJUGATE,
+    CONDITION,
+    COMPLEXES,
+    FONT_FACE,
+    FACTORIAL,
+    INTERSECT,
+    IMAGINARY,
+    LAPLACIAN,
+    MATRIXROW,
+    NOTSUBSET,
+    OTHERWISE,
+    PIECEWISE,
+    PLAINTEXT,
+    RATIONALS,
+    SEMANTICS,
+    TRANSPOSE,
+    ANNOTATION,
+    BLOCKQUOTE,
+    DIVERGENCE,
+    EULERGAMMA,
+    EQUIVALENT,
+    IMAGINARYI,
+    MALIGNMARK,
+    MUNDEROVER,
+    MLABELEDTR,
+    NOTANUMBER,
+    SOLIDCOLOR,
+    ALTGLYPHDEF,
+    DETERMINANT,
+    EVENTSOURCE,
+    FEMERGENODE,
+    FECOMPOSITE,
+    FESPOTLIGHT,
+    MALIGNGROUP,
+    MPRESCRIPTS,
+    MOMENTABOUT,
+    NOTPRSUBSET,
+    PARTIALDIFF,
+    ALTGLYPHITEM,
+    ANIMATECOLOR,
+    DATATEMPLATE,
+    EXPONENTIALE,
+    FETURBULENCE,
+    FEPOINTLIGHT,
+    FEMORPHOLOGY,
+    OUTERPRODUCT,
+    ANIMATEMOTION,
+    COLOR_PROFILE,
+    FONT_FACE_SRC,
+    FONT_FACE_URI,
+    FOREIGNOBJECT,
+    FECOLORMATRIX,
+    MISSING_GLYPH,
+    MMULTISCRIPTS,
+    SCALARPRODUCT,
+    VECTORPRODUCT,
+    ANNOTATION_XML,
+    DEFINITION_SRC,
+    FONT_FACE_NAME,
+    FEGAUSSIANBLUR,
+    FEDISTANTLIGHT,
+    LINEARGRADIENT,
+    NATURALNUMBERS,
+    RADIALGRADIENT,
+    ANIMATETRANSFORM,
+    CARTESIANPRODUCT,
+    FONT_FACE_FORMAT,
+    FECONVOLVEMATRIX,
+    FEDIFFUSELIGHTING,
+    FEDISPLACEMENTMAP,
+    FESPECULARLIGHTING,
+    DOMAINOFAPPLICATION,
+    FECOMPONENTTRANSFER,
+    };
+    private final static int[] ELEMENT_HASHES = {
+    1057,
+    1090,
+    1255,
+    1321,
+    1552,
+    1585,
+    1651,
+    1717,
+    68162,
+    68899,
+    69059,
+    69764,
+    70020,
+    70276,
+    71077,
+    71205,
+    72134,
+    72232,
+    72264,
+    72296,
+    72328,
+    72360,
+    72392,
+    73351,
+    74312,
+    75209,
+    78124,
+    78284,
+    78476,
+    79149,
+    79309,
+    79341,
+    79469,
+    81295,
+    81487,
+    82224,
+    84498,
+    84626,
+    86164,
+    86292,
+    86612,
+    86676,
+    87445,
+    3183041,
+    3186241,
+    3198017,
+    3218722,
+    3226754,
+    3247715,
+    3256803,
+    3263971,
+    3264995,
+    3289252,
+    3291332,
+    3295524,
+    3299620,
+    3326725,
+    3379303,
+    3392679,
+    3448233,
+    3460553,
+    3461577,
+    3510347,
+    3546604,
+    3552364,
+    3556524,
+    3576461,
+    3586349,
+    3588141,
+    3590797,
+    3596333,
+    3622062,
+    3625454,
+    3627054,
+    3675728,
+    3749042,
+    3771059,
+    3771571,
+    3776211,
+    3782323,
+    3782963,
+    3784883,
+    3785395,
+    3788979,
+    3815476,
+    3839605,
+    3885110,
+    3917911,
+    3948984,
+    3951096,
+    135304769,
+    135858241,
+    136498210,
+    136906434,
+    137138658,
+    137512995,
+    137531875,
+    137548067,
+    137629283,
+    137645539,
+    137646563,
+    137775779,
+    138529956,
+    138615076,
+    139040932,
+    140954086,
+    141179366,
+    141690439,
+    142738600,
+    143013512,
+    146979116,
+    147175724,
+    147475756,
+    147902637,
+    147936877,
+    148017645,
+    148131885,
+    148228141,
+    148229165,
+    148309165,
+    148395629,
+    148551853,
+    148618829,
+    149076462,
+    149490158,
+    149572782,
+    151277616,
+    151639440,
+    153268914,
+    153486514,
+    153563314,
+    153750706,
+    153763314,
+    153914034,
+    154406067,
+    154417459,
+    154600979,
+    154678323,
+    154680979,
+    154866835,
+    155366708,
+    155375188,
+    155391572,
+    155465780,
+    155869364,
+    158045494,
+    168988979,
+    169321621,
+    169652752,
+    173151309,
+    174240818,
+    174247297,
+    174669292,
+    175391532,
+    176638123,
+    177380397,
+    177879204,
+    177886734,
+    180753473,
+    181020073,
+    181503558,
+    181686320,
+    181999237,
+    181999311,
+    182048201,
+    182074866,
+    182078003,
+    182083764,
+    182920847,
+    184716457,
+    184976961,
+    185145071,
+    187281445,
+    187872052,
+    188100653,
+    188875944,
+    188919873,
+    188920457,
+    189203987,
+    189371817,
+    189414886,
+    189567458,
+    190266670,
+    191318187,
+    191337609,
+    202479203,
+    202493027,
+    202835587,
+    202843747,
+    203013219,
+    203036048,
+    203045987,
+    203177552,
+    203898516,
+    204648562,
+    205067918,
+    205078130,
+    205096654,
+    205689142,
+    205690439,
+    205766017,
+    205988909,
+    207213161,
+    207794484,
+    207800999,
+    208023602,
+    208213644,
+    208213647,
+    210310273,
+    210940978,
+    213325049,
+    213946445,
+    214055079,
+    215125040,
+    215134273,
+    215135028,
+    215237420,
+    215418148,
+    215553166,
+    215553394,
+    215563858,
+    215627949,
+    215754324,
+    217529652,
+    217713834,
+    217732628,
+    218731945,
+    221417045,
+    221424946,
+    221493746,
+    221515401,
+    221658189,
+    221844577,
+    221908140,
+    221910626,
+    221921586,
+    222659762,
+    225001091,
+    236105833,
+    236113965,
+    236194995,
+    236195427,
+    236206132,
+    236206387,
+    236211683,
+    236212707,
+    236381647,
+    236571826,
+    237124271,
+    238172205,
+    238210544,
+    238270764,
+    238435405,
+    238501172,
+    239224867,
+    239257644,
+    239710497,
+    240307721,
+    241208789,
+    241241557,
+    241318060,
+    241319404,
+    241343533,
+    241344069,
+    241405397,
+    241765845,
+    243864964,
+    244502085,
+    244946220,
+    245109902,
+    247647266,
+    247707956,
+    248648814,
+    248648836,
+    248682161,
+    248986932,
+    249058914,
+    249697357,
+    252132601,
+    252135604,
+    252317348,
+    255007012,
+    255278388,
+    256365156,
+    257566121,
+    269763372,
+    271202790,
+    271863856,
+    272049197,
+    272127474,
+    272770631,
+    274339449,
+    274939471,
+    275388004,
+    275388005,
+    275388006,
+    275977800,
+    278267602,
+    278513831,
+    278712622,
+    281613765,
+    281683369,
+    282120228,
+    282250732,
+    282508942,
+    283743649,
+    283787570,
+    284710386,
+    285391148,
+    285478533,
+    285854898,
+    285873762,
+    286931113,
+    288964227,
+    289445441,
+    289689648,
+    291671489,
+    303512884,
+    305319975,
+    305610036,
+    305764101,
+    308448294,
+    308675890,
+    312085683,
+    312264750,
+    315032867,
+    316391000,
+    317331042,
+    317902135,
+    318950711,
+    319447220,
+    321499182,
+    322538804,
+    323145200,
+    337067316,
+    337826293,
+    339905989,
+    340833697,
+    341457068,
+    345302593,
+    349554733,
+    349771471,
+    349786245,
+    350819405,
+    356072847,
+    370349192,
+    373962798,
+    374509141,
+    375558638,
+    375574835,
+    376053993,
+    383276530,
+    383373833,
+    383407586,
+    384439906,
+    386079012,
+    404133513,
+    404307343,
+    407031852,
+    408072233,
+    409112005,
+    409608425,
+    409771500,
+    419040932,
+    437730612,
+    439529766,
+    442616365,
+    442813037,
+    443157674,
+    443295316,
+    450118444,
+    450482697,
+    456789668,
+    459935396,
+    471217869,
+    474073645,
+    476230702,
+    476665218,
+    476717289,
+    483014825,
+    485083298,
+    489306281,
+    538364390,
+    540675748,
+    543819186,
+    543958612,
+    576960820,
+    577242548,
+    610515252,
+    642202932,
+    644420819,
+    };
+
+
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/HtmlAttributes.java
@@ -0,0 +1,484 @@
+/*
+ * Copyright (c) 2007 Henri Sivonen
+ * Copyright (c) 2008-2009 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+import nu.validator.htmlparser.annotation.IdType;
+import nu.validator.htmlparser.annotation.Local;
+import nu.validator.htmlparser.annotation.NsUri;
+import nu.validator.htmlparser.annotation.Prefix;
+import nu.validator.htmlparser.annotation.QName;
+import nu.validator.htmlparser.common.XmlViolationPolicy;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * Be careful with this class. QName is the name in from HTML tokenization.
+ * Otherwise, please refer to the interface doc.
+ * 
+ * @version $Id: AttributesImpl.java 206 2008-03-20 14:09:29Z hsivonen $
+ * @author hsivonen
+ */
+public final class HtmlAttributes implements Attributes {
+
+    // [NOCPP[
+
+    private static final AttributeName[] EMPTY_ATTRIBUTENAMES = new AttributeName[0];
+
+    private static final String[] EMPTY_STRINGS = new String[0];
+
+    // ]NOCPP]
+
+    public static final HtmlAttributes EMPTY_ATTRIBUTES = new HtmlAttributes(
+            AttributeName.HTML);
+
+    private int mode;
+
+    private int length;
+
+    private AttributeName[] names;
+
+    private String[] values; // XXX perhaps make this @NoLength?
+
+    // [NOCPP[
+
+    private String idValue;
+
+    private int xmlnsLength;
+
+    private AttributeName[] xmlnsNames;
+
+    private String[] xmlnsValues;
+
+    // ]NOCPP]
+
+    public HtmlAttributes(int mode) {
+        this.mode = mode;
+        this.length = 0;
+        this.names = new AttributeName[5]; // covers 98.3% of elements
+                                            // according to
+        // Hixie
+        this.values = new String[5];
+
+        // [NOCPP[
+
+        this.idValue = null;
+
+        this.xmlnsLength = 0;
+
+        this.xmlnsNames = HtmlAttributes.EMPTY_ATTRIBUTENAMES;
+
+        this.xmlnsValues = HtmlAttributes.EMPTY_STRINGS;
+
+        // ]NOCPP]
+    }
+    /*
+    public HtmlAttributes(HtmlAttributes other) {
+        this.mode = other.mode;
+        this.length = other.length;
+        this.names = new AttributeName[other.length];
+        this.values = new String[other.length];
+        // [NOCPP[
+        this.idValue = other.idValue;
+        this.xmlnsLength = other.xmlnsLength;
+        this.xmlnsNames = new AttributeName[other.xmlnsLength];
+        this.xmlnsValues = new String[other.xmlnsLength];
+        // ]NOCPP]
+    }
+    */
+
+    void destructor() {
+        clear(0);
+        Portability.releaseArray(names);
+        Portability.releaseArray(values);
+    }
+    
+    /**
+     * Only use with a static argument
+     * 
+     * @param name
+     * @return
+     */
+    public int getIndex(AttributeName name) {
+        for (int i = 0; i < length; i++) {
+            if (names[i] == name) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    // [NOCPP[
+    
+    public int getIndex(String qName) {
+        for (int i = 0; i < length; i++) {
+            if (names[i].getQName(mode).equals(qName)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+    
+    public int getIndex(String uri, String localName) {
+        for (int i = 0; i < length; i++) {
+            if (names[i].getLocal(mode).equals(localName)
+                    && names[i].getUri(mode).equals(uri)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    public @IdType String getType(String qName) {
+        int index = getIndex(qName);
+        if (index == -1) {
+            return null;
+        } else {
+            return getType(index);
+        }
+    }
+
+    public @IdType String getType(String uri, String localName) {
+        int index = getIndex(uri, localName);
+        if (index == -1) {
+            return null;
+        } else {
+            return getType(index);
+        }
+    }
+    
+    public String getValue(String qName) {
+        int index = getIndex(qName);
+        if (index == -1) {
+            return null;
+        } else {
+            return getValue(index);
+        }
+    }
+
+    public String getValue(String uri, String localName) {
+        int index = getIndex(uri, localName);
+        if (index == -1) {
+            return null;
+        } else {
+            return getValue(index);
+        }
+    }
+    
+    // ]NOCPP]
+    
+    public int getLength() {
+        return length;
+    }
+
+    public @Local String getLocalName(int index) {
+        if (index < length && index >= 0) {
+            return names[index].getLocal(mode);
+        } else {
+            return null;
+        }
+    }
+
+    // [NOCPP[
+    
+    public @QName String getQName(int index) {
+        if (index < length && index >= 0) {
+            return names[index].getQName(mode);
+        } else {
+            return null;
+        }
+    }
+
+    public @IdType String getType(int index) {
+        if (index < length && index >= 0) {
+            return names[index].getType(mode);
+        } else {
+            return null;
+        }
+    }
+
+    // ]NOCPP]
+    
+    public AttributeName getAttributeName(int index) {
+        if (index < length && index >= 0) {
+            return names[index];
+        } else {
+            return null;
+        }
+    }
+
+    public @NsUri String getURI(int index) {
+        if (index < length && index >= 0) {
+            return names[index].getUri(mode);
+        } else {
+            return null;
+        }
+    }
+
+    public @Prefix String getPrefix(int index) {
+        if (index < length && index >= 0) {
+            return names[index].getPrefix(mode);
+        } else {
+            return null;
+        }
+    }
+
+    public String getValue(int index) {
+        if (index < length && index >= 0) {
+            return values[index];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Only use with static argument.
+     * 
+     * @see org.xml.sax.Attributes#getValue(java.lang.String)
+     */
+    public String getValue(AttributeName name) {
+        int index = getIndex(name);
+        if (index == -1) {
+            return null;
+        } else {
+            return getValue(index);
+        }
+    }
+    
+    // [NOCPP[
+
+    public String getId() {
+        return idValue;
+    }
+
+    public int getXmlnsLength() {
+        return xmlnsLength;
+    }
+
+    public @Local String getXmlnsLocalName(int index) {
+        if (index < xmlnsLength && index >= 0) {
+            return xmlnsNames[index].getLocal(mode);
+        } else {
+            return null;
+        }
+    }
+
+    public @NsUri String getXmlnsURI(int index) {
+        if (index < xmlnsLength && index >= 0) {
+            return xmlnsNames[index].getUri(mode);
+        } else {
+            return null;
+        }
+    }
+
+    public String getXmlnsValue(int index) {
+        if (index < xmlnsLength && index >= 0) {
+            return xmlnsValues[index];
+        } else {
+            return null;
+        }
+    }
+    
+    public int getXmlnsIndex(AttributeName name) {
+        for (int i = 0; i < xmlnsLength; i++) {
+            if (xmlnsNames[i] == name) {
+                return i;
+            }
+        }
+        return -1;
+    }
+    
+    public String getXmlnsValue(AttributeName name) {
+        int index = getXmlnsIndex(name);
+        if (index == -1) {
+            return null;
+        } else {
+            return getXmlnsValue(index);
+        }
+    }
+    
+    public AttributeName getXmlnsAttributeName(int index) {
+        if (index < xmlnsLength && index >= 0) {
+            return xmlnsNames[index];
+        } else {
+            return null;
+        }
+    }
+
+    // ]NOCPP]
+
+    void addAttribute(AttributeName name, String value
+            // [NOCPP[
+            , XmlViolationPolicy xmlnsPolicy
+    // ]NOCPP]        
+    ) throws SAXException {
+        // [NOCPP[
+        if (name == AttributeName.ID) {
+            idValue = value;
+        }
+
+        if (name.isXmlns()) {
+            if (xmlnsNames.length == xmlnsLength) {
+                int newLen = xmlnsLength == 0 ? 2 : xmlnsLength << 1;
+                AttributeName[] newNames = new AttributeName[newLen];
+                System.arraycopy(xmlnsNames, 0, newNames, 0, xmlnsNames.length);
+                xmlnsNames = newNames;
+                String[] newValues = new String[newLen];
+                System.arraycopy(xmlnsValues, 0, newValues, 0, xmlnsValues.length);
+                xmlnsValues = newValues;
+            }
+            xmlnsNames[xmlnsLength] = name;
+            xmlnsValues[xmlnsLength] = value;
+            xmlnsLength++;
+            switch (xmlnsPolicy) {
+                case FATAL:
+                    // this is ugly
+                    throw new SAXException("Saw an xmlns attribute.");
+                case ALTER_INFOSET:
+                    return;
+                case ALLOW:
+                    // fall through
+            }
+        }
+
+        // ]NOCPP]
+
+        if (names.length == length) {
+            int newLen = length << 1; // The first growth covers virtually
+            // 100% of elements according to
+            // Hixie
+            AttributeName[] newNames = new AttributeName[newLen];
+            System.arraycopy(names, 0, newNames, 0, names.length);
+            Portability.releaseArray(names);
+            names = newNames;
+            String[] newValues = new String[newLen];
+            System.arraycopy(values, 0, newValues, 0, values.length);
+            Portability.releaseArray(values);
+            values = newValues;
+        }
+        names[length] = name;
+        values[length] = value;
+        length++;
+    }
+
+    void clear(int m) {
+        for (int i = 0; i < length; i++) {
+            names[i].release();
+            names[i] = null;
+            Portability.releaseString(values[i]);
+            values[i] = null;
+        }
+        length = 0;
+        mode = m;
+        // [NOCPP[
+        idValue = null;
+        for (int i = 0; i < xmlnsLength; i++) {
+            xmlnsNames[i] = null;
+            xmlnsValues[i] = null;
+        }
+        xmlnsLength = 0;
+        // ]NOCPP]
+    }
+    
+    /**
+     * This is used in C++ to release special <code>isindex</code>
+     * attribute values whose ownership is not transferred.
+     */
+    void releaseValue(int i) {
+        Portability.releaseString(values[i]);        
+    }
+    
+    /**
+     * This is only used for <code>AttributeName</code> ownership transfer
+     * in the isindex case to avoid freeing custom names twice in C++.
+     */
+    void clearWithoutReleasingContents() {
+        for (int i = 0; i < length; i++) {
+            names[i] = null;
+            values[i] = null;
+        }
+        length = 0;
+    }
+
+    boolean contains(AttributeName name) {
+        for (int i = 0; i < length; i++) {
+            if (name.equalsAnother(names[i])) {
+                return true;
+            }
+        }
+        // [NOCPP[
+        for (int i = 0; i < xmlnsLength; i++) {
+            if (name.equalsAnother(xmlnsNames[i])) {
+                return true;
+            }
+        }
+        // ]NOCPP]
+        return false;
+    }
+
+    public void adjustForMath() {
+        mode = AttributeName.MATHML;
+    }
+
+    public void adjustForSvg() {
+        mode = AttributeName.SVG;
+    }
+
+    // [NOCPP[
+    
+    void processNonNcNames(TreeBuilder<?> treeBuilder, XmlViolationPolicy namePolicy) throws SAXException {
+        for (int i = 0; i < length; i++) {
+            AttributeName attName = names[i];
+            if (!attName.isNcName(mode)) {
+                String name = attName.getLocal(mode);
+                switch (namePolicy) {
+                    case ALTER_INFOSET:
+                        names[i] = AttributeName.create(NCName.escapeName(name));
+                        // fall through
+                    case ALLOW:
+                        if (attName != AttributeName.XML_LANG) {
+                            treeBuilder.warn("Attribute \u201C" + name + "\u201D is not serializable as XML 1.0.");
+                        }
+                        break;
+                    case FATAL:
+                        treeBuilder.fatal("Attribute \u201C" + name + "\u201D is not serializable as XML 1.0.");
+                        break;
+                }
+            }
+        }
+    }
+    
+    public void merge(HtmlAttributes attributes) throws SAXException {
+        int len = attributes.getLength();
+        for (int i = 0; i < len; i++) {
+            AttributeName name = attributes.getAttributeName(i);
+            if (!contains(name)) {
+                addAttribute(name, attributes.getValue(i), XmlViolationPolicy.ALLOW);
+            }
+        }
+    }
+
+    // ]NOCPP]
+    
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/MetaScanner.java
@@ -0,0 +1,696 @@
+/*
+ * Copyright (c) 2007 Henri Sivonen
+ * Copyright (c) 2008-2009 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+import java.io.IOException;
+
+import nu.validator.htmlparser.annotation.NoLength;
+import nu.validator.htmlparser.common.ByteReadable;
+
+import org.xml.sax.SAXException;
+
+public abstract class MetaScanner {
+
+    private static final @NoLength char[] CHARSET = "charset".toCharArray();
+    
+    private static final @NoLength char[] CONTENT = "content".toCharArray();
+
+    private static final int NO = 0;
+
+    private static final int M = 1;
+    
+    private static final int E = 2;
+    
+    private static final int T = 3;
+
+    private static final int A = 4;
+    
+    private static final int DATA = 0;
+
+    private static final int TAG_OPEN = 1;
+
+    private static final int SCAN_UNTIL_GT = 2;
+
+    private static final int TAG_NAME = 3;
+
+    private static final int BEFORE_ATTRIBUTE_NAME = 4;
+
+    private static final int ATTRIBUTE_NAME = 5;
+
+    private static final int AFTER_ATTRIBUTE_NAME = 6;
+
+    private static final int BEFORE_ATTRIBUTE_VALUE = 7;
+
+    private static final int ATTRIBUTE_VALUE_DOUBLE_QUOTED = 8;
+
+    private static final int ATTRIBUTE_VALUE_SINGLE_QUOTED = 9;
+
+    private static final int ATTRIBUTE_VALUE_UNQUOTED = 10;
+
+    private static final int AFTER_ATTRIBUTE_VALUE_QUOTED = 11;
+
+    private static final int MARKUP_DECLARATION_OPEN = 13;
+    
+    private static final int MARKUP_DECLARATION_HYPHEN = 14;
+
+    private static final int COMMENT_START = 15;
+
+    private static final int COMMENT_START_DASH = 16;
+
+    private static final int COMMENT = 17;
+
+    private static final int COMMENT_END_DASH = 18;
+
+    private static final int COMMENT_END = 19;
+    
+    private static final int SELF_CLOSING_START_TAG = 20;
+    
+    protected ByteReadable readable;
+    
+    private int metaState = NO;
+
+    private int contentIndex = -1;
+    
+    private int charsetIndex = -1;
+
+    protected int stateSave = DATA;
+
+    private int strBufLen;
+
+    private char[] strBuf;
+    
+    // [NOCPP[
+    
+    /**
+     * @param source
+     * @param errorHandler
+     * @param publicId
+     * @param systemId
+     */
+    public MetaScanner() {
+        this.readable = null;
+        this.metaState = NO;
+        this.contentIndex = -1;
+        this.charsetIndex = -1;
+        this.stateSave = DATA;
+        strBufLen = 0;
+        strBuf = new char[36];
+    }
+    
+    /**
+     * -1 means end.
+     * @return
+     * @throws IOException
+     */
+    protected int read() throws IOException {
+        return readable.readByte();
+    }
+
+    // ]NOCPP]
+
+    // WARNING When editing this, makes sure the bytecode length shown by javap
+    // stays under 8000 bytes!
+    protected final void stateLoop(int state)
+            throws SAXException, IOException {
+        int c = -1;
+        boolean reconsume = false;
+        stateloop: for (;;) {
+            switch (state) {
+                case DATA:
+                    dataloop: for (;;) {
+                        if (reconsume) {
+                            reconsume = false;
+                        } else {
+                            c = read();
+                        }
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '<':
+                                state = MetaScanner.TAG_OPEN;
+                                break dataloop; // FALL THROUGH continue
+                            // stateloop;
+                            default:
+                                continue;
+                        }
+                    }
+                    // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
+                case TAG_OPEN:
+                    tagopenloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case 'm':
+                            case 'M':
+                                metaState = M;
+                                state = MetaScanner.TAG_NAME;
+                                break tagopenloop;
+                                // continue stateloop;                                
+                            case '!':
+                                state = MetaScanner.MARKUP_DECLARATION_OPEN;
+                                continue stateloop;
+                            case '?':
+                            case '/':
+                                state = MetaScanner.SCAN_UNTIL_GT;
+                                continue stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
+                                    metaState = NO;
+                                    state = MetaScanner.TAG_NAME;
+                                    break tagopenloop;
+                                    // continue stateloop;
+                                }
+                                state = MetaScanner.DATA;
+                                reconsume = true;
+                                continue stateloop;
+                        }
+                    }
+                    // FALL THROUGH DON'T REORDER
+                case TAG_NAME:
+                    tagnameloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+                            case '\u000C':
+                                state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
+                                break tagnameloop;
+                            // continue stateloop;
+                            case '/':
+                                state = MetaScanner.SELF_CLOSING_START_TAG;
+                                continue stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            case 'e':
+                            case 'E':
+                                if (metaState == M) {
+                                    metaState = E;
+                                } else {
+                                    metaState = NO;
+                                }
+                                continue;
+                            case 't':
+                            case 'T':
+                                if (metaState == E) {
+                                    metaState = T;
+                                } else {
+                                    metaState = NO;
+                                }
+                                continue;
+                            case 'a':
+                            case 'A':
+                                if (metaState == T) {
+                                    metaState = A;
+                                } else {
+                                    metaState = NO;
+                                }
+                                continue;
+                            default:
+                                metaState = NO;
+                                continue;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case BEFORE_ATTRIBUTE_NAME:
+                    beforeattributenameloop: for (;;) {
+                        if (reconsume) {
+                            reconsume = false;
+                        } else {
+                            c = read();
+                        }
+                        /*
+                         * Consume the next input character:
+                         */
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+                            case '\u000C':
+                                continue;
+                            case '/':
+                                state = MetaScanner.SELF_CLOSING_START_TAG;
+                                continue stateloop;
+                            case '>':
+                                state = DATA;
+                                continue stateloop;
+                            case 'c':
+                            case 'C':
+                                contentIndex = 0;
+                                charsetIndex = 0;
+                                state = MetaScanner.ATTRIBUTE_NAME;
+                                break beforeattributenameloop;                                
+                            default:
+                                contentIndex = -1;
+                                charsetIndex = -1;
+                                state = MetaScanner.ATTRIBUTE_NAME;
+                                break beforeattributenameloop;
+                            // continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case ATTRIBUTE_NAME:
+                    attributenameloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+                            case '\u000C':
+                                state = MetaScanner.AFTER_ATTRIBUTE_NAME;
+                                continue stateloop;
+                            case '/':
+                                state = MetaScanner.SELF_CLOSING_START_TAG;
+                                continue stateloop;
+                            case '=':
+                                strBufLen = 0;
+                                state = MetaScanner.BEFORE_ATTRIBUTE_VALUE;
+                                break attributenameloop;
+                            // continue stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                if (metaState == A) {
+                                    if (c >= 'A' && c <= 'Z') {
+                                        c += 0x20;
+                                    }
+                                    if (contentIndex == 6) {
+                                        contentIndex = -1;
+                                    } else if (contentIndex > -1
+                                            && contentIndex < 6
+                                            && (c == CONTENT[contentIndex + 1])) {
+                                        contentIndex++;
+                                    }
+                                    if (charsetIndex == 6) {
+                                        charsetIndex = -1;
+                                    } else if (charsetIndex > -1
+                                            && charsetIndex < 6
+                                            && (c == CHARSET[charsetIndex + 1])) {
+                                        charsetIndex++;
+                                    }
+                                }
+                                continue;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case BEFORE_ATTRIBUTE_VALUE:
+                    beforeattributevalueloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+                            case '\u000C':
+                                continue;
+                            case '"':
+                                state = MetaScanner.ATTRIBUTE_VALUE_DOUBLE_QUOTED;
+                                break beforeattributevalueloop;
+                            // continue stateloop;
+                            case '\'':
+                                state = MetaScanner.ATTRIBUTE_VALUE_SINGLE_QUOTED;
+                                continue stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                if (charsetIndex == 6 || contentIndex == 6) {
+                                    addToBuffer(c);
+                                }
+                                state = MetaScanner.ATTRIBUTE_VALUE_UNQUOTED;
+                                continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
+                    attributevaluedoublequotedloop: for (;;) {
+                        if (reconsume) {
+                            reconsume = false;
+                        } else {
+                            c = read();
+                        }
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '"':
+                                if (tryCharset()) {
+                                    break stateloop;
+                                }
+                                state = MetaScanner.AFTER_ATTRIBUTE_VALUE_QUOTED;
+                                break attributevaluedoublequotedloop;
+                            // continue stateloop;
+                            default:
+                                if (metaState == A && (contentIndex == 6 || charsetIndex == 6)) {
+                                    addToBuffer(c);
+                                }
+                                continue;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case AFTER_ATTRIBUTE_VALUE_QUOTED:
+                    afterattributevaluequotedloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+                            case '\u000C':
+                                state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
+                                continue stateloop;
+                            case '/':
+                                state = MetaScanner.SELF_CLOSING_START_TAG;
+                                break afterattributevaluequotedloop;
+                            // continue stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
+                                reconsume = true;
+                                continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case SELF_CLOSING_START_TAG:
+                    c = read();
+                    switch (c) {
+                        case -1:
+                            break stateloop;
+                        case '>':
+                            state = MetaScanner.DATA;
+                            continue stateloop;
+                        default:
+                            state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
+                            reconsume = true;
+                            continue stateloop;
+                    }
+                    // XXX reorder point
+                case ATTRIBUTE_VALUE_UNQUOTED:
+                    for (;;) {
+                        if (reconsume) {
+                            reconsume = false;
+                        } else {
+                            c = read();
+                        }
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+
+                            case '\u000C':
+                                if (tryCharset()) {
+                                    break stateloop;
+                                }
+                                state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
+                                continue stateloop;
+                            case '>':
+                                if (tryCharset()) {
+                                    break stateloop;
+                                }
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                if (metaState == A && (contentIndex == 6 || charsetIndex == 6)) {
+                                    addToBuffer(c);
+                                }
+                                continue;
+                        }
+                    }
+                    // XXX reorder point
+                case AFTER_ATTRIBUTE_NAME:
+                    for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case ' ':
+                            case '\t':
+                            case '\n':
+                            case '\u000C':
+                                continue;
+                            case '/':
+                                if (tryCharset()) {
+                                    break stateloop;
+                                }
+                                state = MetaScanner.SELF_CLOSING_START_TAG;
+                                continue stateloop;
+                            case '=':
+                                state = MetaScanner.BEFORE_ATTRIBUTE_VALUE;
+                                continue stateloop;
+                            case '>':
+                                if (tryCharset()) {
+                                    break stateloop;
+                                }
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            case 'c':
+                            case 'C':
+                                contentIndex = 0;
+                                charsetIndex = 0;
+                                state = MetaScanner.ATTRIBUTE_NAME;
+                                continue stateloop;
+                            default:
+                                contentIndex = -1;
+                                charsetIndex = -1;
+                                state = MetaScanner.ATTRIBUTE_NAME;
+                                continue stateloop;
+                        }
+                    }
+                    // XXX reorder point
+                case MARKUP_DECLARATION_OPEN:
+                    markupdeclarationopenloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '-':
+                                state = MetaScanner.MARKUP_DECLARATION_HYPHEN;
+                                break markupdeclarationopenloop;
+                            // continue stateloop;
+                            default:
+                                state = MetaScanner.SCAN_UNTIL_GT;
+                                reconsume = true;
+                                continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case MARKUP_DECLARATION_HYPHEN:
+                    markupdeclarationhyphenloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '-':
+                                state = MetaScanner.COMMENT_START;
+                                break markupdeclarationhyphenloop;
+                            // continue stateloop;
+                            default:
+                                state = MetaScanner.SCAN_UNTIL_GT;
+                                reconsume = true;
+                                continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case COMMENT_START:
+                    commentstartloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '-':
+                                state = MetaScanner.COMMENT_START_DASH;
+                                continue stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                state = MetaScanner.COMMENT;
+                                break commentstartloop;
+                            // continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case COMMENT:
+                    commentloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '-':
+                                state = MetaScanner.COMMENT_END_DASH;
+                                break commentloop;
+                            // continue stateloop;
+                            default:
+                                continue;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case COMMENT_END_DASH:
+                    commentenddashloop: for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '-':
+                                state = MetaScanner.COMMENT_END;
+                                break commentenddashloop;
+                            // continue stateloop;
+                            default:
+                                state = MetaScanner.COMMENT;
+                                continue stateloop;
+                        }
+                    }
+                    // FALLTHRU DON'T REORDER
+                case COMMENT_END:
+                    for (;;) {
+                        c = read();
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            case '-':
+                                continue;
+                            default:
+                                state = MetaScanner.COMMENT;
+                                continue stateloop;
+                        }
+                    }
+                    // XXX reorder point
+                case COMMENT_START_DASH:
+                    c = read();
+                    switch (c) {
+                        case -1:
+                            break stateloop;
+                        case '-':
+                            state = MetaScanner.COMMENT_END;
+                            continue stateloop;
+                        case '>':
+                            state = MetaScanner.DATA;
+                            continue stateloop;
+                        default:
+                            state = MetaScanner.COMMENT;
+                            continue stateloop;
+                    }
+                    // XXX reorder point
+                case ATTRIBUTE_VALUE_SINGLE_QUOTED:
+                    for (;;) {
+                        if (reconsume) {
+                            reconsume = false;
+                        } else {
+                            c = read();
+                        }
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '\'':
+                                if (tryCharset()) {
+                                    break stateloop;
+                                }
+                                state = MetaScanner.AFTER_ATTRIBUTE_VALUE_QUOTED;
+                                continue stateloop;
+                            default:
+                                if (metaState == A && (contentIndex == 6 || charsetIndex == 6)) {
+                                    addToBuffer(c);
+                                }
+                                continue;
+                        }
+                    }
+                    // XXX reorder point
+                case SCAN_UNTIL_GT:
+                    for (;;) {
+                        if (reconsume) {
+                            reconsume = false;
+                        } else {
+                            c = read();
+                        }
+                        switch (c) {
+                            case -1:
+                                break stateloop;
+                            case '>':
+                                state = MetaScanner.DATA;
+                                continue stateloop;
+                            default:
+                                continue;
+                        }
+                    }
+            }
+        }
+        stateSave  = state;
+    }
+
+    private void addToBuffer(int c) {
+        if (strBufLen == strBuf.length) {
+            char[] newBuf = new char[strBuf.length + (strBuf.length << 1)];
+            System.arraycopy(strBuf, 0, newBuf, 0, strBuf.length);
+            Portability.releaseArray(strBuf);
+            strBuf = newBuf;
+        }
+        strBuf[strBufLen++] = (char)c;
+    }
+
+    private boolean tryCharset() throws SAXException {
+        if (metaState != A || !(contentIndex == 6 || charsetIndex == 6)) {
+            return false;
+        }
+        String attVal = Portability.newStringFromBuffer(strBuf, 0, strBufLen);
+        String candidateEncoding;
+        if (contentIndex == 6) {
+            candidateEncoding = TreeBuilder.extractCharsetFromContent(attVal);
+            Portability.releaseString(attVal);
+        } else {
+            candidateEncoding = attVal;
+        }
+        if (candidateEncoding == null) {
+            return false;
+        }
+        boolean rv = tryCharset(candidateEncoding);
+        Portability.releaseString(candidateEncoding);
+        contentIndex = -1;
+        charsetIndex = -1;
+        return rv;
+    }
+    
+    protected abstract boolean tryCharset(String encoding) throws SAXException;
+
+    
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/Portability.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2008-2009 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+import nu.validator.htmlparser.annotation.Literal;
+import nu.validator.htmlparser.annotation.Local;
+import nu.validator.htmlparser.annotation.NoLength;
+
+public final class Portability {
+
+    // Allocating methods
+
+    /**
+     * Allocates a new local name object. In C++, the refcount must be set up in such a way that 
+     * calling <code>releaseLocal</code> on the return value balances the refcount set by this method.
+     */
+    public static @Local String newLocalNameFromBuffer(@NoLength char[] buf, int offset, int length) {
+        return new String(buf, offset, length).intern();
+    }
+
+    public static String newStringFromBuffer(@NoLength char[] buf, int offset, int length) {
+        return new String(buf, offset, length);
+    }
+
+    public static String newEmptyString() {
+        return "";
+    }
+
+    public static String newStringFromLiteral(@Literal String literal) {
+        return literal;
+    }
+    
+    // XXX get rid of this
+    public static char[] newCharArrayFromLocal(@Local String local) {
+        return local.toCharArray();
+    }
+
+    public static char[] newCharArrayFromString(String string) {
+        return string.toCharArray();
+    }
+    
+    // Deallocation methods
+    
+    public static void releaseString(String str) {
+        // No-op in Java
+    }
+    
+    public static void retainLocal(@Local String local) {
+        // No-op in Java
+    }
+
+    /**
+     * This MUST be a no-op on locals that are known at compile time.
+     * @param local
+     */
+    public static void releaseLocal(@Local String local) {
+        // No-op in Java
+    }
+    
+    /**
+     * Releases a Java array. This method is magically replaced by a macro in C++.
+     * @param arr
+     */
+    public static void releaseArray(Object arr) {
+        // No-op in Java
+    }    
+    
+    public static void retainElement(Object elt) {
+        // No-op in Java
+    }
+
+    public static void releaseElement(Object elt) {
+        // No-op in Java
+    }
+    
+    // Comparison methods
+    
+    public static boolean localEqualsBuffer(@Local String local, @NoLength char[] buf, int offset, int length) {
+        if (local.length() != length) {
+            return false;
+        }
+        for (int i = 0; i < length; i++) {
+            if (local.charAt(i) != buf[offset + i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static boolean lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(@Literal String lowerCaseLiteral,
+            String string) {
+        if (string == null) {
+            return false;
+        }
+        if (lowerCaseLiteral.length() > string.length()) {
+            return false;
+        }
+        for (int i = 0; i < lowerCaseLiteral.length(); i++) {
+            char c0 = lowerCaseLiteral.charAt(i);
+            char c1 = string.charAt(i);
+            if (c1 >= 'A' && c1 <= 'Z') {
+                c1 += 0x20;
+            }
+            if (c0 != c1) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    public static boolean lowerCaseLiteralEqualsIgnoreAsciiCaseString(@Literal String lowerCaseLiteral,
+            String string) {
+        if (string == null) {
+            return false;
+        }
+        if (lowerCaseLiteral.length() != string.length()) {
+            return false;
+        }
+        for (int i = 0; i < lowerCaseLiteral.length(); i++) {
+            char c0 = lowerCaseLiteral.charAt(i);
+            char c1 = string.charAt(i);
+            if (c1 >= 'A' && c1 <= 'Z') {
+                c1 += 0x20;
+            }
+            if (c0 != c1) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    public static boolean literalEqualsString(@Literal String literal, String string) {
+        return literal.equals(string);
+    }
+
+    public static char[] isIndexPrompt() {
+        return "This is a searchable index. Insert your search keywords here: ".toCharArray();
+    }
+
+    public static void delete(Object o) {
+        
+    }
+
+    public static void deleteArray(Object o) {
+        
+    }
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/README.txt
@@ -0,0 +1,9 @@
+The *.java files in this directory are the source files from which the 
+corresponding nsHtml5*.cpp and nsHtml5*.h files were generated in
+../src/.
+
+You can obtain the full Java version of the parser and the translator
+program from
+svn co http://svn.versiondude.net/whattf/htmlparser/trunk/ htmlparser
+
+See run-cpp-translate.sh at the top level of the SVN checkout.
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/StackNode.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2007 Henri Sivonen
+ * Copyright (c) 2007-2009 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+import nu.validator.htmlparser.annotation.Local;
+import nu.validator.htmlparser.annotation.NsUri;
+
+final class StackNode<T> {
+    final int group;
+
+    final @Local String name;
+
+    final @Local String popName;
+
+    final @NsUri String ns;
+
+    final T node;
+
+    final boolean scoping;
+
+    final boolean special;
+
+    final boolean fosterParenting;
+    
+    private int refcount = 1;
+
+    /**
+     * @param group
+     *            TODO
+     * @param name
+     * @param node
+     * @param scoping
+     * @param special
+     * @param popName
+     *            TODO
+     */
+    StackNode(int group, final @NsUri String ns, final @Local String name, final T node,
+            final boolean scoping, final boolean special,
+            final boolean fosterParenting, final @Local String popName) {
+        this.group = group;
+        this.name = name;
+        this.popName = popName;
+        this.ns = ns;
+        this.node = node;
+        this.scoping = scoping;
+        this.special = special;
+        this.fosterParenting = fosterParenting;
+        this.refcount = 1;
+        Portability.retainLocal(name);
+        Portability.retainLocal(popName);
+        Portability.retainElement(node);
+        // not retaining namespace for now        
+    }
+
+    /**
+     * @param elementName
+     *            TODO
+     * @param node
+     */
+    StackNode(final @NsUri String ns, ElementName elementName, final T node) {
+        this.group = elementName.group;
+        this.name = elementName.name;
+        this.popName = elementName.name;
+        this.ns = ns;
+        this.node = node;
+        this.scoping = elementName.scoping;
+        this.special = elementName.special;
+        this.fosterParenting = elementName.fosterParenting;
+        this.refcount = 1;
+        Portability.retainLocal(name);
+        Portability.retainLocal(popName);
+        Portability.retainElement(node);
+        // not retaining namespace for now        
+    }
+
+    StackNode(final @NsUri String ns, ElementName elementName, final T node, @Local String popName) {
+        this.group = elementName.group;
+        this.name = elementName.name;
+        this.popName = popName;
+        this.ns = ns;
+        this.node = node;
+        this.scoping = elementName.scoping;
+        this.special = elementName.special;
+        this.fosterParenting = elementName.fosterParenting;
+        this.refcount = 1;
+        Portability.retainLocal(name);
+        Portability.retainLocal(popName);
+        Portability.retainElement(node);
+        // not retaining namespace for now        
+    }
+
+    StackNode(final @NsUri String ns, ElementName elementName, final T node, @Local String popName, boolean scoping) {
+        this.group = elementName.group;
+        this.name = elementName.name;
+        this.popName = popName;
+        this.ns = ns;
+        this.node = node;
+        this.scoping = scoping;
+        this.special = false;
+        this.fosterParenting = false;
+        this.refcount = 1;
+        Portability.retainLocal(name);
+        Portability.retainLocal(popName);
+        Portability.retainElement(node);
+        // not retaining namespace for now        
+    }
+    
+    @SuppressWarnings("unused") private void destructor() {
+        Portability.releaseLocal(name);
+        Portability.releaseLocal(popName);
+        Portability.releaseElement(node);
+        // not releasing namespace for now        
+    }
+    
+    // [NOCPP[
+    /**
+     * @see java.lang.Object#toString()
+     */
+    @Override public @Local String toString() {
+        return name;
+    }
+    // ]NOCPP]
+    
+    public void retain() {   
+        refcount++;
+    }
+    
+    public void release() {
+        refcount--;
+        if (refcount == 0) {
+            Portability.delete(this);
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/StateSnapshot.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2009 Mozilla Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+package nu.validator.htmlparser.impl;
+
+
+public class StateSnapshot<T> {
+
+    /**
+     * @param stack
+     * @param listOfActiveFormattingElements
+     * @param formPointer
+     */
+    StateSnapshot(StackNode<T>[] stack,
+            StackNode<T>[] listOfActiveFormattingElements, T formPointer) {
+        this.stack = stack;
+        this.listOfActiveFormattingElements = listOfActiveFormattingElements;
+        this.formPointer = formPointer;
+    }
+
+    final StackNode<T>[] stack;
+
+    final StackNode<T>[] listOfActiveFormattingElements;
+
+    final T formPointer;
+    
+    @SuppressWarnings("unused") private void destructor() {
+        for (int i = 0; i < stack.length; i++) {
+            stack[i].release();
+        }
+        Portability.releaseArray(stack);
+        for (int i = 0; i < listOfActiveFormattingElements.length; i++) {
+            if (listOfActiveFormattingElements[i] != null) {
+                listOfActiveFormattingElements[i].release();                
+            }
+        }
+        Portability.releaseArray(listOfActiveFormattingElements);
+        Portability.retainElement(formPointer);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/content/html/parser/javasrc/Tokenizer.java
@@ -0,0 +1,5709 @@
+/*
+ * Copyright (c) 2005-2007 Henri Sivonen
+ * Copyright (c) 2007-2009 Mozilla Foundation
+ * Portions of comments Copyright 2004-2008 Apple Computer, Inc., Mozilla 
+ * Foundation, and Opera Software ASA.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a 
+ * copy of this software and associated documentation files (the "Software"), 
+ * to deal in the Software without restriction, including without limitation 
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+ * and/or sell copies of the Software, and to permit persons to whom the 
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in 
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * The comments following this one that use the same comment syntax as this 
+ * comment are quotes from the WHATWG HTML 5 spec as of 2 June 2007 
+ * amended as of June 18 2008.
+ * That document came with this statement:
+ * "© Copyright 2004-2008 Apple Computer, Inc., Mozilla Foundation, and 
+ * Opera Software ASA. You are granted a license to use, reproduce and 
+ * create derivative works of this document."
+ */
+
+package nu.validator.htmlparser.impl;
+
+import nu.validator.htmlparser.annotation.Inline;
+import nu.validator.htmlparser.annotation.Local;
+import nu.validator.htmlparser.annotation.NoLength;
+import nu.validator.htmlparser.common.EncodingDeclarationHandler;
+import nu.validator.htmlparser.common.TokenHandler;
+import nu.validator.htmlparser.common.XmlViolationPolicy;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * An implementation of
+ * http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html
+ * 
+ * This class implements the <code>Locator</code> interface. This is not an
+ * incidental implementation detail: Users of this class are encouraged to make
+ * use of the <code>Locator</code> nature.
+ * 
+ * By default, the tokenizer may report data that XML 1.0 bans. The tokenizer
+ * can be configured to treat these conditions as fatal or to coerce the infoset
+ * to something that XML 1.0 allows.
+ * 
+ * @version $Id: Tokenizer.java 555 2009-06-25 07:17:28Z hsivonen $
+ * @author hsivonen
+ */
+public class Tokenizer implements Locator {
+
+    public static final int DATA = 0;
+
+    public static final int RCDATA = 1;
+
+    public static final int CDATA = 2;
+
+    public static final int PLAINTEXT = 3;
+
+    private static final int TAG_OPEN = 49;
+
+    private static final int CLOSE_TAG_OPEN_PCDATA = 50;
+
+    private static final int TAG_NAME = 58;
+
+    private static final int BEFORE_ATTRIBUTE_NAME = 4;
+
+    private static final int ATTRIBUTE_NAME = 5;
+
+    private static final int AFTER_ATTRIBUTE_NAME = 6;
+
+    private static final int BEFORE_ATTRIBUTE_VALUE = 7;
+
+    private static final int ATTRIBUTE_VALUE_DOUBLE_QUOTED = 8;
+
+    private static final int ATTRIBUTE_VALUE_SINGLE_QUOTED = 9;
+
+    private static final int ATTRIBUTE_VALUE_UNQUOTED = 10;
+
+    private static final int AFTER_ATTRIBUTE_VALUE_QUOTED = 11;
+
+    private static final int BOGUS_COMMENT = 12;
+
+    private static final int MARKUP_DECLARATION_OPEN = 13;
+
+    private static final int DOCTYPE = 14;
+
+    private static final int BEFORE_DOCTYPE_NAME = 15;
+
+    private static final int DOCTYPE_NAME = 16;
+
+    private static final int AFTER_DOCTYPE_NAME = 17;
+
+    private static final int BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 18;
+
+    private static final int DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 19;
+
+    private static final int DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 20;
+
+    private static final int AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 21;
+
+    private static final int BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 22;
+
+    private static final int DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 23;
+
+    private static final int DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 24;
+
+    private static final int AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 25;
+
+    private static final int BOGUS_DOCTYPE = 26;
+
+    private static final int COMMENT_START = 27;
+
+    private static final int COMMENT_START_DASH = 28;
+
+    private static final int COMMENT = 29;
+
+    private static final int COMMENT_END_DASH = 30;
+
+    private static final int COMMENT_END = 31;
+
+    private static final int CLOSE_TAG_OPEN_NOT_PCDATA = 32;
+
+    private static final int MARKUP_DECLARATION_HYPHEN = 33;
+
+    private static final int MARKUP_DECLARATION_OCTYPE = 34;
+
+    private static final int DOCTYPE_UBLIC = 35;
+
+    private static final int DOCTYPE_YSTEM = 36;
+
+    private static final int CONSUME_CHARACTER_REFERENCE = 37;
+
+    private static final int CONSUME_NCR = 38;
+
+    private static final int CHARACTER_REFERENCE_LOOP = 39;
+
+    private static final int HEX_NCR_LOOP = 41;
+
+    private static final int DECIMAL_NRC_LOOP = 42;
+
+    private static final int HANDLE_NCR_VALUE = 43;
+
+    private static final int SELF_CLOSING_START_TAG = 44;
+
+    private static final int CDATA_START = 45;
+
+    private static final int CDATA_SECTION = 46;
+
+    private static final int CDATA_RSQB = 47;
+
+    private static final int CDATA_RSQB_RSQB = 48;
+
+    private static final int TAG_OPEN_NON_PCDATA = 51;
+
+    private static final int ESCAPE_EXCLAMATION = 52;
+
+    private static final int ESCAPE_EXCLAMATION_HYPHEN = 53;
+
+    private static final int ESCAPE = 54;
+
+    private static final int ESCAPE_HYPHEN = 55;
+
+    private static final int ESCAPE_HYPHEN_HYPHEN = 56;
+
+    private static final int BOGUS_COMMENT_HYPHEN = 57;
+
+    /**
+     * Magic value for UTF-16 operations.
+     */
+    private static final int LEAD_OFFSET = (0xD800 - (0x10000 >> 10));
+
+    /**
+     * UTF-16 code unit array containing less than and greater than for emitting
+     * those characters on certain parse errors.
+     */
+    private static final @NoLength char[] LT_GT = { '<', '>' };
+
+    /**
+     * UTF-16 code unit array containing less than and solidus for emitting
+     * those characters on certain parse errors.
+     */
+    private static final @NoLength char[] LT_SOLIDUS = { '<', '/' };
+
+    /**
+     * UTF-16 code unit array containing ]] for emitting those characters on
+     * state transitions.
+     */
+    private static final @NoLength char[] RSQB_RSQB = { ']', ']' };
+
+    /**
+     * Array version of U+FFFD.
+     */
+    private static final @NoLength char[] REPLACEMENT_CHARACTER = { '\uFFFD' };
+
+    // [NOCPP[
+
+    /**
+     * Array version of space.
+     */
+    private static final @NoLength char[] SPACE = { ' ' };
+
+    // ]NOCPP]
+
+    /**
+     * Array version of line feed.
+     */
+    private static final @NoLength char[] LF = { '\n' };
+
+    /**
+     * Buffer growth parameter.
+     */
+    private static final int BUFFER_GROW_BY = 1024;
+
+    /**
+     * "CDATA[" as <code>char[]</code>
+     */
+    private static final @NoLength char[] CDATA_LSQB = "CDATA[".toCharArray();
+
+    /**
+     * "octype" as <code>char[]</code>
+     */
+    private static final @NoLength char[] OCTYPE = "octype".toCharArray();
+
+    /**
+     * "ublic" as <code>char[]</code>
+     */
+    private static final @NoLength char[] UBLIC = "ublic".toCharArray();
+
+    /**
+     * "ystem" as <code>char[]</code>
+     */
+    private static final @NoLength char[] YSTEM = "ystem".toCharArray();
+
+    private static final char[] TITLE_ARR = { 't', 'i', 't', 'l', 'e' };
+
+    private static final char[] SCRIPT_ARR = { 's', 'c', 'r', 'i', 'p', 't' };
+
+    private static final char[] STYLE_ARR = { 's', 't', 'y', 'l', 'e' };
+
+    private static final char[] PLAINTEXT_ARR = { 'p', 'l', 'a', 'i', 'n', 't',
+            'e', 'x', 't' };
+
+    private static final char[] XMP_ARR = { 'x', 'm', 'p' };
+
+    private static final char[] TEXTAREA_ARR = { 't', 'e', 'x', 't', 'a', 'r',
+            'e', 'a' };
+
+    private static final char[] IFRAME_ARR = { 'i', 'f', 'r', 'a', 'm', 'e' };
+
+    private static final char[] NOEMBED_ARR = { 'n', 'o', 'e', 'm', 'b', 'e',
+            'd' };
+
+    private static final char[] NOSCRIPT_ARR = { 'n', 'o', 's', 'c', 'r', 'i',
+            'p', 't' };
+
+    private static final char[] NOFRAMES_ARR = { 'n', 'o', 'f', 'r', 'a', 'm',
+            'e', 's' };
+
+    /**
+     * The token handler.
+     */
+    protected final TokenHandler tokenHandler;
+
+    protected EncodingDeclarationHandler encodingDeclarationHandler;
+
+    // [NOCPP[
+
+    /**
+     * The error handler.
+     */
+    protected ErrorHandler errorHandler;
+
+    // ]NOCPP]
+
+    /**
+     * Whether the previous char read was CR.
+     */
+    protected boolean lastCR;
+
+    protected int stateSave;
+
+    private int returnStateSave;
+
+    protected int index;
+
+    private boolean forceQuirks;
+
+    private char additional;
+
+    private int entCol;
+
+    private int lo;
+
+    private int hi;
+
+    private int candidate;
+
+    private int strBufMark;
+
+    private int prevValue;
+
+    protected int value;
+
+    private boolean seenDigits;
+
+    protected int cstart;
+
+    /**
+     * The SAX public id for the resource being tokenized. (Only passed to back
+     * as part of locator data.)
+     */
+    private String publicId;
+
+    /**
+     * The SAX system id for the resource being tokenized. (Only passed to back
+     * as part of locator data.)
+     */
+    private String systemId;
+
+    /**
+     * Buffer for short identifiers.
+     */
+    private char[] strBuf;
+
+    /**
+     * Number of significant <code>char</code>s in <code>strBuf</code>.
+     */
+    private int strBufLen;
+
+    /**
+     * <code>-1</code> to indicate that <code>strBuf</code> is used or otherwise
+     * an offset to the main buffer.
+     */
+    // private int strBufOffset = -1;
+    /**
+     * Buffer for long strings.
+     */
+    private char[] longStrBuf;
+
+    /**
+     * Number of significant <code>char</code>s in <code>longStrBuf</code>.
+     */
+    private int longStrBufLen;
+
+    /**
+     * <code>-1</code> to indicate that <code>longStrBuf</code> is used or
+     * otherwise an offset to the main buffer.
+     */
+    // private int longStrBufOffset = -1;
+    /**
+     * The attribute holder.
+     */
+    private HtmlAttributes attributes;
+
+    /**
+     * Buffer for expanding NCRs falling into the Basic Multilingual Plane.
+     */
+    private final char[] bmpChar;
+
+    /**
+     * Buffer for expanding astral NCRs.
+     */
+    private final char[] astralChar;
+
+    /**
+     * The element whose end tag closes the current CDATA or RCDATA element.
+     */
+    protected ElementName contentModelElement = null;
+
+    private char[] contentModelElementNameAsArray;
+
+    /**
+     * <code>true</code> if tokenizing an end tag
+     */
+    protected boolean endTag;
+
+    /**
+     * The current tag token name.
+     */
+    private ElementName tagName = null;
+
+    /**
+     * The current attribute name.
+     */
+    protected AttributeName attributeName = null;
+
+    // [NOCPP[
+
+    /**
+     * Whether comment tokens are emitted.
+     */
+    private boolean wantsComments = false;
+
+    /**
+     * <code>true</code> when HTML4-specific additional errors are requested.
+     */
+    protected boolean html4;
+
+    /**
+     * Whether the stream is past the first 512 bytes.
+     */
+    private boolean metaBoundaryPassed;
+
+    // ]NOCPP]
+
+    /**
+     * The name of the current doctype token.
+     */
+    private @Local String doctypeName;
+
+    /**
+     * The public id of the current doctype token.
+     */
+    private String publicIdentifier;
+
+    /**
+     * The system id of the current doctype token.
+     */
+    private String systemIdentifier;
+
+    // [NOCPP[
+
+    /**
+     * The policy for vertical tab and form feed.
+     */
+    private XmlViolationPolicy contentSpacePolicy = XmlViolationPolicy.ALTER_INFOSET;
+
+    /**
+     * The policy for comments.
+     */
+    private XmlViolationPolicy commentPolicy = XmlViolationPolicy.ALTER_INFOSET;
+
+    private XmlViolationPolicy xmlnsPolicy = XmlViolationPolicy.ALTER_INFOSET;
+
+    private XmlViolationPolicy namePolicy = XmlViolationPolicy.ALTER_INFOSET;
+
+    private boolean html4ModeCompatibleWithXhtml1Schemata;
+
+    private final boolean newAttributesEachTime;
+
+    // ]NOCPP]
+
+    private int mappingLangToXmlLang;
+
+    private boolean shouldSuspend;
+
+    protected boolean confident;
+    
+    private int line;
+
+    // [NOCPP[
+
+    protected LocatorImpl ampersandLocation;
+
+    public Tokenizer(TokenHandler tokenHandler,
+            boolean newAttributesEachTime) {
+        this.tokenHandler = tokenHandler;
+        this.encodingDeclarationHandler = null;
+        this.newAttributesEachTime = newAttributesEachTime;
+        this.bmpChar = new char[1];
+        this.astralChar = new char[2];
+    }
+
+    // ]NOCPP]
+
+    /**
+     * The constructor.
+     * 
+     * @param tokenHandler
+     *            the handler for receiving tokens
+     */
+    public Tokenizer(TokenHandler tokenHandler) {
+        this.tokenHandler = tokenHandler;
+        this.encodingDeclarationHandler = null;
+        // [NOCPP[
+        this.newAttributesEachTime = false;
+        // ]NOCPP]
+        this.bmpChar = new char[1];
+        this.astralChar = new char[2];
+    }
+
+    public void initLocation(String newPublicId, String newSystemId) {
+        this.systemId = newSystemId;
+        this.publicId = newPublicId;
+
+    }
+
+    void destructor() {
+        Portability.releaseArray(bmpChar);
+        Portability.releaseArray(astralChar);
+    }
+
+    // [NOCPP[
+
+    /**
+     * Returns the mappingLangToXmlLang.
+     * 
+     * @return the mappingLangToXmlLang
+     */
+    public boolean isMappingLangToXmlLang() {
+        return mappingLangToXmlLang == AttributeName.HTML_LANG;
+    }
+
+    /**
+     * Sets the mappingLangToXmlLang.
+     * 
+     * @param mappingLangToXmlLang
+     *            the mappingLangToXmlLang to set
+     */
+    public void setMappingLangToXmlLang(boolean mappingLangToXmlLang) {
+        this.mappingLangToXmlLang = mappingLangToXmlLang ? AttributeName.HTML_LANG
+                : AttributeName.HTML;
+    }
+
+    /**
+     * Sets the error handler.
+     * 
+     * @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
+     */
+    public void setErrorHandler(ErrorHandler eh) {
+        this.errorHandler = eh;
+    }
+
+    public ErrorHandler getErrorHandler() {
+        return this.errorHandler;
+    }
+
+    /**
+     * Sets the commentPolicy.
+     * 
+     * @param commentPolicy
+     *            the commentPolicy to set
+     */
+    public void setCommentPolicy(XmlViolationPolicy commentPolicy) {
+        this.commentPolicy = commentPolicy;
+    }
+
+    /**
+     * Sets the contentNonXmlCharPolicy.
+     * 
+     * @param contentNonXmlCharPolicy
+     *            the contentNonXmlCharPolicy to set
+     */
+    public void setContentNonXmlCharPolicy(
+            XmlViolationPolicy contentNonXmlCharPolicy) {
+        if (contentNonXmlCharPolicy != XmlViolationPolicy.ALLOW) {
+            throw new IllegalArgumentException("Must use ErrorReportingTokenizer to set contentNonXmlCharPolicy to non-ALLOW.");
+        }
+    }
+
+    /**
+     * Sets the contentSpacePolicy.
+     * 
+     * @param contentSpacePolicy
+     *            the contentSpacePolicy to set
+     */
+    public void setContentSpacePolicy(XmlViolationPolicy contentSpacePolicy) {
+        this.contentSpacePolicy = contentSpacePolicy;
+    }
+
+    /**
+     * Sets the xmlnsPolicy.
+     * 
+     * @param xmlnsPolicy
+     *            the xmlnsPolicy to set
+     */
+    public void setXmlnsPolicy(XmlViolationPolicy xmlnsPolicy) {
+        if (xmlnsPolicy == XmlViolationPolicy.FATAL) {
+            throw new IllegalArgumentException("Can't use FATAL here.");
+        }
+        this.xmlnsPolicy = xmlnsPolicy;
+    }
+
+    public void setNamePolicy(XmlViolationPolicy namePolicy) {
+        this.namePolicy = namePolicy;
+    }
+
+    /**
+     * Sets the html4ModeCompatibleWithXhtml1Schemata.
+     * 
+     * @param html4ModeCompatibleWithXhtml1Schemata
+     *            the html4ModeCompatibleWithXhtml1Schemata to set
+     */
+    public void setHtml4ModeCompatibleWithXhtml1Schemata(
+            boolean html4ModeCompatibleWithXhtml1Schemata) {
+        this.html4ModeCompatibleWithXhtml1Schemata = html4ModeCompatibleWithXhtml1Schemata;
+    }
+
+    // ]NOCPP]
+
+    // For the token handler to call
+    /**
+     * Sets the content model flag and the associated element name.
+     * 
+     * @param contentModelFlag
+     *            the flag
+     * @param contentModelElement
+     *            the element causing the flag to be set
+     */
+    public void setContentModelFlag(int contentModelFlag,
+            @Local String contentModelElement) {
+        this.stateSave = contentModelFlag;
+        if (contentModelFlag == Tokenizer.DATA) {
+            return;
+        }
+        // XXX does this make any sense?
+        char[] asArray = Portability.newCharArrayFromLocal(contentModelElement);
+        this.contentModelElement = ElementName.elementNameByBuffer(asArray, 0,
+                asArray.length);
+        Portability.releaseArray(asArray);
+        contentModelElementToArray();
+    }
+
+    /**
+     * Sets the content model flag and the associated element name.
+     * 
+     * @param contentModelFlag
+     *            the flag
+     * @param contentModelElement
+     *            the element causing the flag to be set
+     */
+    public void setContentModelFlag(int contentModelFlag,
+            ElementName contentModelElement) {
+        this.stateSave = contentModelFlag;
+        this.contentModelElement = contentModelElement;
+        contentModelElementToArray();
+    }
+
+    private void contentModelElementToArray() {
+        switch (contentModelElement.group) {
+            case TreeBuilder.TITLE:
+                contentModelElementNameAsArray = TITLE_ARR;
+                return;
+            case TreeBuilder.SCRIPT:
+                contentModelElementNameAsArray = SCRIPT_ARR;
+                return;
+            case TreeBuilder.STYLE:
+                contentModelElementNameAsArray = STYLE_ARR;
+                return;
+            case TreeBuilder.PLAINTEXT:
+                contentModelElementNameAsArray = PLAINTEXT_ARR;
+                return;
+            case TreeBuilder.XMP:
+                contentModelElementNameAsArray = XMP_ARR;
+                return;
+            case TreeBuilder.TEXTAREA:
+                contentModelElementNameAsArray = TEXTAREA_ARR;
+                return;
+            case TreeBuilder.IFRAME:
+                contentModelElementNameAsArray = IFRAME_ARR;
+                return;
+            case TreeBuilder.NOEMBED:
+                contentModelElementNameAsArray = NOEMBED_ARR;
+                return;
+            case TreeBuilder.NOSCRIPT:
+                contentModelElementNameAsArray = NOSCRIPT_ARR;
+                return;
+            case TreeBuilder.NOFRAMES:
+                contentModelElementNameAsArray = NOFRAMES_ARR;
+                return;
+            default:
+                assert false;
+                return;
+        }
+    }
+
+    /**
+     * For C++ use only.
+     */
+    public void setLineNumber(int line) {
+        this.line = line;
+    }
+    
+    // start Locator impl
+
+    /**
+     * @see org.xml.sax.Locator#getLineNumber()
+     */
+    @Inline public int getLineNumber() {
+        return line;
+    }
+
+    // [NOCPP[
+
+    /**
+     * @see org.xml.sax.Locator#getColumnNumber()
+     */
+    @Inline public int getColumnNumber() {
+        return -1;
+    }
+
+    /**
+     * @see org.xml.sax.Locator#getPublicId()
+     */
+    public String getPublicId() {
+        return publicId;
+    }
+
+    /**
+     * @see org.xml.sax.Locator#getSystemId()
+     */
+    public String getSystemId() {
+        return systemId;
+    }
+
+    // end Locator impl
+
+    // end public API
+
+
+    public void notifyAboutMetaBoundary() {
+        metaBoundaryPassed = true;
+    }
+
+    void turnOnAdditionalHtml4Errors() {
+        html4 = true;
+    }
+
+    // ]NOCPP]
+
+    HtmlAttributes emptyAttributes() {
+        // [NOCPP[
+        if (newAttributesEachTime) {
+            return new HtmlAttributes(mappingLangToXmlLang);
+        } else {
+            // ]NOCPP]
+            return HtmlAttributes.EMPTY_ATTRIBUTES;
+            // [NOCPP[
+        }
+        // ]NOCPP]
+    }
+
+    private void clearStrBufAndAppendCurrentC(char c) {
+        strBuf[0] = c;
+
+        strBufLen = 1;
+        // strBufOffset = pos;
+    }
+
+    private void clearStrBufAndAppendForceWrite(char c) {
+        strBuf[0] = c; // test
+
+        strBufLen = 1;
+        // strBufOffset = pos;
+        // buf[pos] = c;
+    }
+
+    private void clearStrBufForNextState() {
+        strBufLen = 0;
+        // strBufOffset = pos + 1;
+    }
+
+    /**
+     * Appends to the smaller buffer.
+     * 
+     * @param c
+     *            the UTF-16 code unit to append
+     */
+    private void appendStrBuf(char c) {
+        // if (strBufOffset != -1) {
+        // strBufLen++;
+        // } else {
+        if (strBufLen == strBuf.length) {
+            char[] newBuf = new char[strBuf.length + Tokenizer.BUFFER_GROW_BY];
+            System.arraycopy(strBuf, 0, newBuf, 0, strBuf.length);
+            Portability.releaseArray(strBuf);
+            strBuf = newBuf;
+        }
+        strBuf[strBufLen++] = c;
+        // }
+    }
+
+    /**
+     * Appends to the smaller buffer.
+     * 
+     * @param c
+     *            the UTF-16 code unit to append
+     */
+    private void appendStrBufForceWrite(char c) {
+        // if (strBufOffset != -1) {
+        // strBufLen++;
+        // buf[pos] = c;
+        // } else {
+        if (strBufLen == strBuf.length) {
+            char[] newBuf = new char[strBuf.length + Tokenizer.BUFFER_GROW_BY];
+            System.arraycopy(strBuf, 0, newBuf, 0, strBuf.length);
+            Portability.releaseArray(strBuf);
+            strBuf = newBuf;
+        }
+        strBuf[strBufLen++] = c;
+        // }
+    }
+
+    /**
+     * The smaller buffer as a String. Currently only used for error reporting.
+     * 
+     * <p>
+     * C++ memory note: The return value must be released.
+     * 
+     * @return the smaller buffer as a string
+     */
+    protected String strBufToString() {
+        // if (strBufOffset != -1) {
+        // return Portability.newStringFromBuffer(buf, strBufOffset, strBufLen);
+        // } else {
+        return Portability.newStringFromBuffer(strBuf, 0, strBufLen);
+        // }
+    }
+
+    /**
+     * Returns the short buffer as a local name. The return value is released in
+     * emitDoctypeToken().
+     * 
+     * @return the smaller buffer as local name
+     */
+    private void strBufToDoctypeName() {
+        doctypeName = Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen);
+    }
+
+    /**
+     * Emits the smaller buffer as character tokens.
+     * 
+     * @throws SAXException
+     *             if the token handler threw
+     */
+    private void emitStrBuf() throws SAXException {
+        if (strBufLen > 0) {
+            // if (strBufOffset != -1) {
+            // tokenHandler.characters(buf, strBufOffset, strBufLen);
+            // } else {
+            tokenHandler.characters(strBuf, 0, strBufLen);
+            // }
+        }
+    }
+
+    private void clearLongStrBufForNextState() {
+        // longStrBufOffset = pos + 1;
+        longStrBufLen = 0;
+    }
+
+    private void clearLongStrBuf() {
+        // longStrBufOffset = pos;
+        longStrBufLen = 0;
+    }
+
+    private void clearLongStrBufAndAppendCurrentC(char c) {
+        longStrBuf[0] = c;
+        longStrBufLen = 1;
+        // longStrBufOffset = pos;
+    }
+
+    private void clearLongStrBufAndAppendToComment(char c) {
+        longStrBuf[0] = c;
+        // longStrBufOffset = pos;
+        longStrBufLen = 1;
+    }
+
+    /**
+     * Appends to the larger buffer.
+     * 
+     * @param c
+     *            the UTF-16 code unit to append
+     */
+    private void appendLongStrBuf(char c) {
+        // if (longStrBufOffset != -1) {
+        // longStrBufLen++;
+        // } else {
+        if (longStrBufLen == longStrBuf.length) {
+            char[] newBuf = new char[longStrBufLen + (longStrBufLen >> 1)];
+            System.arraycopy(longStrBuf, 0, newBuf, 0, longStrBuf.length);
+            Portability.releaseArray(longStrBuf);
+            longStrBuf = newBuf;
+        }
+        longStrBuf[longStrBufLen++] = c;
+        // }
+    }
+
+    private void appendSecondHyphenToBogusComment() throws SAXException {
+        // [NOCPP[
+        switch (commentPolicy) {
+            case ALTER_INFOSET:
+                // detachLongStrBuf();
+                appendLongStrBuf(' ');
+                // FALLTHROUGH
+            case ALLOW:
+                warn("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
+                // ]NOCPP]
+                appendLongStrBuf('-');
+                // [NOCPP[
+                break;
+            case FATAL:
+                fatal("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
+                break;
+        }
+        // ]NOCPP]
+    }
+
+    // [NOCPP[
+    private void maybeAppendSpaceToBogusComment() throws SAXException {
+        switch (commentPolicy) {
+            case ALTER_INFOSET:
+                // detachLongStrBuf();
+                appendLongStrBuf(' ');
+                // FALLTHROUGH
+            case ALLOW:
+                warn("The document is not mappable to XML 1.0 due to a trailing hyphen in a comment.");
+                break;
+            case FATAL:
+                fatal("The document is not mappable to XML 1.0 due to a trailing hyphen in a comment.");
+                break;
+        }
+    }
+
+    // ]NOCPP]
+
+    private void adjustDoubleHyphenAndAppendToLongStrBuf(char c)
+            throws SAXException {
+        errConsecutiveHyphens();
+        // [NOCPP[
+        switch (commentPolicy) {
+            case ALTER_INFOSET:
+                // detachLongStrBuf();
+                longStrBufLen--;
+                appendLongStrBuf(' ');
+                appendLongStrBuf('-');
+                // FALLTHROUGH
+            case ALLOW:
+                warn("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
+                // ]NOCPP]
+                appendLongStrBuf(c);
+                // [NOCPP[
+                break;
+            case FATAL:
+                fatal("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
+                break;
+        }
+        // ]NOCPP]
+    }
+
+    private void appendLongStrBuf(char[] buffer, int offset, int length) {
+        int reqLen = longStrBufLen + length;
+        if (longStrBuf.length < reqLen) {
+            char[] newBuf = new char[reqLen + (reqLen >> 1)];
+            System.arraycopy(longStrBuf, 0, newBuf, 0, longStrBuf.length);
+            Portability.releaseArray(longStrBuf);
+            longStrBuf = newBuf;
+        }
+        System.arraycopy(buffer, offset, longStrBuf, longStrBufLen, length);
+        longStrBufLen = reqLen;
+    }
+
+    /**
+     * Appends to the larger buffer.
+     * 
+     * @param arr
+     *            the UTF-16 code units to append
+     */
+    private void appendLongStrBuf(char[] arr) {
+        // assert longStrBufOffset == -1;
+        appendLongStrBuf(arr, 0, arr.length);
+    }
+
+    /**
+     * Append the contents of the smaller buffer to the larger one.
+     */
+    private void appendStrBufToLongStrBuf() {
+        // assert longStrBufOffset == -1;
+        // if (strBufOffset != -1) {
+        // appendLongStrBuf(buf, strBufOffset, strBufLen);
+        // } else {
+        appendLongStrBuf(strBuf, 0, strBufLen);
+        // }
+    }
+
+    /**
+     * The larger buffer as a string.
+     * 
+     * <p>
+     * C++ memory note: The return value must be released.
+     * 
+     * @return the larger buffer as a string
+     */
+    private String longStrBufToString() {
+        // if (longStrBufOffset != -1) {
+        // return Portability.newStringFromBuffer(buf, longStrBufOffset,
+        // longStrBufLen);
+        // } else {
+        return Portability.newStringFromBuffer(longStrBuf, 0, longStrBufLen);
+        // }
+    }
+
+    /**
+     * Emits the current comment token.
+     * @param pos TODO
+     * 
+     * @throws SAXException
+     */
+    private void emitComment(int provisionalHyphens, int pos) throws SAXException {
+        // [NOCPP[
+        if (wantsComments) {
+            // ]NOCPP]
+            // if (longStrBufOffset != -1) {
+            // tokenHandler.comment(buf, longStrBufOffset, longStrBufLen
+            // - provisionalHyphens);
+            // } else {
+            tokenHandler.comment(longStrBuf, 0, longStrBufLen
+                    - provisionalHyphens);
+            // }
+            // [NOCPP[
+        }
+        // ]NOCPP]
+        cstart = pos + 1;
+    }
+
+    /**
+     * Flushes coalesced character tokens.
+     * @param buf TODO
+     * @param pos TODO
+     * 
+     * @throws SAXException
+     */
+    protected void flushChars(@NoLength char[] buf, int pos) throws SAXException {
+        if (pos > cstart) {
+            tokenHandler.characters(buf, cstart, pos - cstart);
+        }
+        cstart = 0x7fffffff;
+    }
+
+    /**
+     * Reports an condition that would make the infoset incompatible with XML
+     * 1.0 as fatal.
+     * 
+     * @param message
+     *            the message
+     * @throws SAXException
+     * @throws SAXParseException
+     */
+    public void fatal(String message) throws SAXException {
+        SAXParseException spe = new SAXParseException(message, this);
+        if (errorHandler != null) {
+            errorHandler.fatalError(spe);
+        }
+        throw spe;
+    }
+
+    /**
+     * Reports a Parse Error.
+     * 
+     * @param message
+     *            the message
+     * @throws SAXException
+     */
+    public void err(String message) throws SAXException {
+        if (errorHandler == null) {
+            return;
+        }
+        SAXParseException spe = new SAXParseException(message, this);
+        errorHandler.error(spe);
+    }
+
+    public void errTreeBuilder(String message) throws SAXException {
+        ErrorHandler eh = null;
+        if (tokenHandler instanceof TreeBuilder<?>) {
+            TreeBuilder<?> treeBuilder = (TreeBuilder<?>) tokenHandler;
+            eh = treeBuilder.getErrorHandler();
+        }
+        if (eh == null) {
+            eh = errorHandler;
+        }
+        if (eh == null) {
+            return;
+        }
+        SAXParseException spe = new SAXParseException(message, this);
+        eh.error(spe);
+    }
+
+    /**
+     * Reports a warning
+     * 
+     * @param message
+     *            the message
+     * @throws SAXException
+     */
+    public void warn(String message) throws SAXException {
+        if (errorHandler == null) {
+            return;
+        }
+        SAXParseException spe = new SAXParseException(message, this);
+        errorHandler.warning(spe);
+    }
+
+    /**
+     * 
+     */
+    private void resetAttributes() {
+        // [NOCPP[
+        if (newAttributesEachTime) {
+            attributes = null;
+        } else {
+            // ]NOCPP]
+            attributes.clear(mappingLangToXmlLang);
+            // [NOCPP[
+        }
+        // ]NOCPP]
+    }
+
+    private void strBufToElementNameString() {
+        // if (strBufOffset != -1) {
+        // return ElementName.elementNameByBuffer(buf, strBufOffset, strBufLen);
+        // } else {
+        tagName = ElementName.elementNameByBuffer(strBuf, 0, strBufLen);
+        // }
+    }
+
+    private int emitCurrentTagToken(boolean selfClosing, int pos) throws SAXException {
+        cstart = pos + 1;
+        maybeErrSlashInEndTag(selfClosing);
+        stateSave = Tokenizer.DATA;
+        HtmlAttributes attrs = (attributes == null ? HtmlAttributes.EMPTY_ATTRIBUTES
+                : attributes);
+        if (endTag) {
+            /*
+             * When an end tag token is emitted, the content model flag must be
+             * switched to the PCDATA state.
+             */
+            maybeErrAttributesOnEndTag(attrs);
+            tokenHandler.endTag(tagName);
+        } else {
+            tokenHandler.startTag(tagName, attrs, selfClosing);
+        }
+        resetAttributes();
+        return stateSave;
+    }
+
+    private void attributeNameComplete() throws SAXException {
+        // if (strBufOffset != -1) {
+        // attributeName = AttributeName.nameByBuffer(buf, strBufOffset,
+        // strBufLen, namePolicy != XmlViolationPolicy.ALLOW);
+        // } else {
+        attributeName = AttributeName.nameByBuffer(strBuf, 0, strBufLen
+        // [NOCPP[
+                , namePolicy != XmlViolationPolicy.ALLOW
+        // ]NOCPP]
+        );
+        // }
+
+        // [NOCPP[
+        if (attributes == null) {
+            attributes = new HtmlAttributes(mappingLangToXmlLang);
+        }
+        // ]NOCPP]
+
+        /*
+         * When the user agent leaves the attribute name state (and before
+         * emitting the tag token, if appropriate), the complete attribute's
+         * name must be compared to the other attributes on the same token; if
+         * there is already an attribute on the token with the exact same name,
+         * then this is a parse error and the new attribute must be dropped,
+         * along with the value that gets associated with it (if any).
+         */
+        if (attributes.contains(attributeName)) {
+            errDuplicateAttribute();
+            attributeName.release();
+            attributeName = null;
+        }
+    }
+
+    private void addAttributeWithoutValue() throws SAXException {
+        // [NOCPP[
+        if (metaBoundaryPassed && AttributeName.CHARSET == attributeName
+                && ElementName.META == tagName) {
+            err("A \u201Ccharset\u201D attribute on a \u201Cmeta\u201D element found after the first 512 bytes.");
+        }
+        // ]NOCPP]
+        if (attributeName != null) {
+            // [NOCPP[
+            if (html4) {
+                if (attributeName.isBoolean()) {
+                    if (html4ModeCompatibleWithXhtml1Schemata) {
+                        attributes.addAttribute(attributeName,
+                                attributeName.getLocal(AttributeName.HTML),
+                                xmlnsPolicy);
+                    } else {
+                        attributes.addAttribute(attributeName, "", xmlnsPolicy);
+                    }
+                } else {
+                    err("Attribute value omitted for a non-boolean attribute. (HTML4-only error.)");
+                    attributes.addAttribute(attributeName, "", xmlnsPolicy);
+                }