001package org.hl7.fhir.utilities.xhtml;
002
003/*
004  Copyright (c) 2011+, HL7, Inc.
005  All rights reserved.
006
007  Redistribution and use in source and binary forms, with or without modification, 
008  are permitted provided that the following conditions are met:
009
010 * Redistributions of source code must retain the above copyright notice, this 
011     list of conditions and the following disclaimer.
012 * Redistributions in binary form must reproduce the above copyright notice, 
013     this list of conditions and the following disclaimer in the documentation 
014     and/or other materials provided with the distribution.
015 * Neither the name of HL7 nor the names of its contributors may be used to 
016     endorse or promote products derived from this software without specific 
017     prior written permission.
018
019  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
020  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
021  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
022  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
023  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
024  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
025  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
026  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
027  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
028  POSSIBILITY OF SUCH DAMAGE.
029
030 */
031
032
033
034import java.io.IOException;
035import java.io.InputStream;
036import java.io.InputStreamReader;
037import java.io.Reader;
038import java.io.StringReader;
039import java.nio.charset.StandardCharsets;
040import java.util.ArrayList;
041import java.util.HashMap;
042import java.util.HashSet;
043import java.util.List;
044import java.util.Map;
045import java.util.Set;
046
047import org.hl7.fhir.exceptions.FHIRException;
048import org.hl7.fhir.exceptions.FHIRFormatError;
049import org.hl7.fhir.utilities.StringPair;
050import org.hl7.fhir.utilities.Utilities;
051import org.hl7.fhir.utilities.i18n.I18nConstants;
052import org.hl7.fhir.utilities.xhtml.XhtmlNode.Location;
053import org.w3c.dom.Attr;
054import org.w3c.dom.Element;
055import org.w3c.dom.Node;
056import org.xmlpull.v1.XmlPullParser;
057import org.xmlpull.v1.XmlPullParserException;
058
059public class XhtmlParser {
060  public static final String XHTML_NS = "http://www.w3.org/1999/xhtml";
061  private static final char END_OF_CHARS = (char) -1;
062
063  public class NamespaceNormalizationMap {
064
065    private String defaultNamespace;
066
067    private String originalNamespacePrefix;
068    private Map<String, String> map = new HashMap<String, String>();
069
070    public NamespaceNormalizationMap(NamespaceNormalizationMap namespaceMap) {
071      if (namespaceMap != null) {
072        map.putAll(namespaceMap.map);
073        this.defaultNamespace = namespaceMap.defaultNamespace;
074        this.originalNamespacePrefix = namespaceMap.originalNamespacePrefix;
075      }
076    }
077
078    public void setDefaultNamespace(String defaultNamespace) {
079      this.defaultNamespace = defaultNamespace;
080    }
081
082    /**
083     * Keeps track of the original namespace this element had before it was normalized
084     *
085     * This way, child elements using that prefix will be able recognize that they
086     * should use the default namespace.
087     *
088     * <namespaceA:parentElement xmlns:namespaceA="http://www.somewhere.org/namespaceA">
089     *   <namespaceA: childElement/>
090     * </namespaceA:parentElement>
091     *
092     * parentElement's namespaceA would become the default namespace.
093     *
094     * When normalizing childElement originalNamespacePrefix would be namespaceA,
095     * so we would know that childElement should use the default namespace.
096     *
097     * <parentElement xmlns="http://www.somewhere.org/namespaceA">
098     *   <childElement/>
099     * </parentElement>
100     *
101     * @param originalNamespacePrefix
102     */
103    public void setOriginalNamespacePrefix(String originalNamespacePrefix) {
104      this.originalNamespacePrefix = originalNamespacePrefix;
105    }
106
107    public void putNamespacePrefix(String prefix, String namespace) {
108      map.put(prefix, namespace);
109    }
110
111    public String getDefaultNamespace() {
112      return defaultNamespace;
113    }
114
115    public boolean hasDefaultNamespace() {
116      return defaultNamespace != null;
117    }
118
119    public String getNamespaceForPrefix(String prefix) {
120      if (originalNamespacePrefix != null && originalNamespacePrefix.equals(prefix)) {
121        return defaultNamespace;
122      }
123      return  map.containsKey(prefix) ? map.get(prefix) : "http://error/undefined-namespace";
124    }
125
126    public Set<Map.Entry<String, String>> getPrefixNamespaceEntrySet() {
127      return map.entrySet();
128    }
129  }
130
131  public class ElementName {
132    private String namespace;
133    private String name;
134
135    public ElementName(String src) {
136      if (src.contains(":")) {
137        namespace = src.substring(0, src.indexOf(":"));
138        name = src.substring(src.indexOf(":")+1);
139      } else {
140        namespace = null;
141        name = src;
142      }
143    }
144
145    public String getName() {
146      return name;
147    }
148
149    public boolean hasNamespace() {
150      return namespace != null;
151    }
152
153    public String getNamespace() {
154      return namespace;
155    }
156
157    @Override
158    public String toString() {
159      return namespace +"::"+name;
160    }
161
162  }
163
164  private Set<String> elements = new HashSet<String>();
165  private Set<String> attributes = new HashSet<String>();  
166  private Map<String, String> definedEntities = new HashMap<>();
167  private Map<String, String> declaredEntities = new HashMap<>();
168
169
170  public XhtmlParser() {
171    super();
172    policy = ParserSecurityPolicy.Accept; // for general parsing
173
174    // set up sets
175    elements.add("p");
176    elements.add("br");
177    elements.add("div");
178    elements.add("h1");
179    elements.add("h2");
180    elements.add("h3");
181    elements.add("h4");
182    elements.add("h5");
183    elements.add("h6");
184    elements.add("a");
185    elements.add("span");
186    elements.add("b");
187    elements.add("em");
188    elements.add("i");
189    elements.add("strong");
190    elements.add("small");
191    elements.add("big");
192    elements.add("tt");
193    elements.add("small");
194    elements.add("dfn");
195    elements.add("q");
196    elements.add("var");
197    elements.add("abbr");
198    elements.add("acronym");
199    elements.add("cite");
200    elements.add("blockquote");
201    elements.add("hr");
202    elements.add("address");
203    elements.add("bdo");
204    elements.add("kbd");
205    elements.add("q");
206    elements.add("sub");
207    elements.add("sup");
208    elements.add("ul");
209    elements.add("ol");
210    elements.add("li");
211    elements.add("dl");
212    elements.add("dt");
213    elements.add("dd");
214    elements.add("pre");
215    elements.add("table");
216    elements.add("caption");
217    elements.add("colgroup");
218    elements.add("col");
219    elements.add("thead");
220    elements.add("tr");
221    elements.add("tfoot");
222    elements.add("tbody");
223    elements.add("th");
224    elements.add("td");
225    elements.add("code");
226    elements.add("samp");
227    elements.add("img");
228    elements.add("map");
229    elements.add("area");
230
231    attributes.add("title");
232    attributes.add("style");
233    attributes.add("class");
234    attributes.add("id");
235    attributes.add("lang");
236    attributes.add("xml:lang");
237    attributes.add("dir");
238    attributes.add("accesskey");
239    attributes.add("tabindex");
240    // tables:
241    attributes.add("span");
242    attributes.add("width");
243    attributes.add("align");
244    attributes.add("valign");
245    attributes.add("char");
246    attributes.add("charoff");
247    attributes.add("abbr");
248    attributes.add("axis");
249    attributes.add("headers");
250    attributes.add("scope");
251    attributes.add("rowspan");
252    attributes.add("colspan");
253
254    attributes.add("a.href");
255    attributes.add("a.name");
256    attributes.add("img.src");
257    attributes.add("img.border");
258    attributes.add("div.xmlns");
259    attributes.add("blockquote.cite");
260    attributes.add("q.cite");
261    attributes.add("a.charset");
262    attributes.add("a.type");
263    attributes.add("a.name");
264    attributes.add("a.href");
265    attributes.add("a.hreflang");
266    attributes.add("a.rel");
267    attributes.add("a.rev");
268    attributes.add("a.shape");
269    attributes.add("a.coords");
270    attributes.add("img.src");
271    attributes.add("img.alt");
272    attributes.add("img.longdesc");
273    attributes.add("img.height");
274    attributes.add("img.width");
275    attributes.add("img.usemap");
276    attributes.add("img.ismap");
277    attributes.add("map.name");
278    attributes.add("area.shape");
279    attributes.add("area.coords");
280    attributes.add("area.href");
281    attributes.add("area.nohref");
282    attributes.add("area.alt");
283    attributes.add("table.summary");
284    attributes.add("table.width");
285    attributes.add("table.border");
286    attributes.add("table.frame");
287    attributes.add("table.rules");
288    attributes.add("table.cellspacing");
289    attributes.add("table.cellpadding");
290
291    defineEntities();
292  }
293
294  public enum ParserSecurityPolicy {
295    Accept,
296    Drop,
297    Reject
298  }
299
300  private ParserSecurityPolicy policy;
301
302  private boolean trimWhitespace;
303  private boolean mustBeWellFormed = true;
304  private List<StringPair> validationIssues = new ArrayList<>();
305
306  public boolean isTrimWhitespace() {
307    return trimWhitespace;
308  }
309
310  public void setTrimWhitespace(boolean trimWhitespace) {
311    this.trimWhitespace = trimWhitespace;
312  }
313
314  public boolean isMustBeWellFormed() {
315    return mustBeWellFormed;
316  }
317
318  public XhtmlParser setMustBeWellFormed(boolean mustBeWellFormed) {
319    this.mustBeWellFormed = mustBeWellFormed;
320    return this;
321  }
322
323  public boolean isXmlMode() {
324    return xmlMode;
325  }
326
327  public XhtmlParser setXmlMode(boolean xmlMode) {
328    this.xmlMode = xmlMode;
329    return this;
330  }
331
332  public ParserSecurityPolicy getPolicy() {
333    return policy;
334  }
335
336  public void setPolicy(ParserSecurityPolicy policy) {
337    this.policy = policy; 
338  }
339
340  public List<StringPair> getValidationIssues() {
341    return validationIssues;
342  }
343
344  public XhtmlNode parseHtmlNode(Element node) throws FHIRFormatError  {
345    return parseHtmlNode(node, null);
346  }
347
348  public XhtmlNode parseHtmlNode(Element node, String defaultNS) throws FHIRFormatError  {
349    XhtmlNode res = parseNode(node, defaultNS);
350    if (res.getNsDecl() == null)
351      res.getAttributes().put("xmlns", XHTML_NS);
352    return res;
353  }
354
355  private XhtmlNode parseNode(Element node, String defaultNS) throws FHIRFormatError  {
356    XhtmlNode res = new XhtmlNode(NodeType.Element);
357    res.setName(node.getLocalName());
358    defaultNS = checkNS(res, node, defaultNS);
359    for (int i = 0; i < node.getAttributes().getLength(); i++) {
360      Attr attr = (Attr) node.getAttributes().item(i);
361      if (attributeIsOk(res.getName(), attr.getName(), attr.getValue()) && !attr.getLocalName().startsWith("xmlns"))
362        res.getAttributes().put(attr.getName(), attr.getValue());
363    }
364    Node child = node.getFirstChild();
365    while (child != null) {
366      if (child.getNodeType() == Node.TEXT_NODE) {
367        res.addText(child.getTextContent());
368      } else if (child.getNodeType() == Node.COMMENT_NODE) {
369        res.addComment(child.getTextContent());
370      } else if (child.getNodeType() == Node.ELEMENT_NODE) {
371        if (elementIsOk(child.getLocalName()))
372          res.getChildNodes().add(parseNode((Element) child, defaultNS));
373      } else
374        throw new FHIRFormatError("Unhandled XHTML feature: "+Integer.toString(child.getNodeType())+descLoc());
375      child = child.getNextSibling();
376    }
377    return res;
378  }  
379
380  private String checkNS(XhtmlNode res, Element node, String defaultNS) {
381    String ns = node.getNamespaceURI();
382    if (ns == null)
383      return null;
384    if (!ns.equals(defaultNS)) {
385      res.getAttributes().put("xmlns", ns);
386      return ns;
387    }
388    return defaultNS;
389  }
390
391  public XhtmlNode parseHtmlNode(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError  {
392    XhtmlNode res = parseNode(xpp);
393    if (res.getNsDecl() == null)
394      res.getAttributes().put("xmlns", XHTML_NS);
395    return res;
396
397  }
398  private XhtmlNode parseNode(XmlPullParser xpp) throws XmlPullParserException, IOException, FHIRFormatError  {
399    XhtmlNode res = new XhtmlNode(NodeType.Element);
400    res.setName(xpp.getName());
401
402    for (int i = 0; i < xpp.getAttributeCount(); i++) {
403      String an = "xml".equals(xpp.getAttributePrefix(i)) ? "xml:"+xpp.getAttributeName(i) : xpp.getAttributeName(i);
404      String av = xpp.getAttributeValue(i);
405      if (attributeIsOk(xpp.getName(), an, av)) {
406        res.getAttributes().put(an, av);
407      }
408    }
409    int eventType = xpp.next();
410    while (eventType != XmlPullParser.END_TAG) {
411      if (eventType == XmlPullParser.TEXT) {
412        res.addText(xpp.getText());
413        xpp.next();
414      } else if (eventType == XmlPullParser.COMMENT) {
415        res.addComment(xpp.getText());
416        xpp.next();
417      } else if (eventType == XmlPullParser.START_TAG) {
418        if (elementIsOk(xpp.getName()))
419          res.getChildNodes().add(parseNode(xpp));
420      } else
421        throw new FHIRFormatError("Unhandled XHTML feature: "+Integer.toString(eventType)+descLoc());
422      eventType = xpp.getEventType();
423    }
424    xpp.next();
425    return res;
426  }  
427
428  private boolean attributeIsOk(String elem, String attr, String value) throws FHIRFormatError  {
429    boolean ok = attributes.contains(attr) || attributes.contains(elem+"."+attr);
430    if (ok)
431      return true;
432    else switch (policy) {
433    case Accept: return true;
434    case Drop: return false;
435    case Reject: return error(I18nConstants.XHTML_XHTML_ATTRIBUTE_ILLEGAL, elem+"."+attr);
436    }
437
438    if ((elem+"."+attr).equals("img.src") && !(value.startsWith("#") || value.startsWith("http:") || value.startsWith("https:"))) {
439      switch (policy) {
440      case Accept: return true;
441      case Drop: return false;
442      case Reject: return error(I18nConstants.XHTML_XHTML_Image_Reference_Illegal, value);
443      }
444    }
445    return false;
446  }
447
448  private boolean error(String msg, String param) {
449    validationIssues.add(new StringPair(msg, param));
450    return false;
451  }
452
453  private boolean elementIsOk(String name) throws FHIRFormatError  {
454    boolean ok = elements.contains(name);
455    if (ok)
456      return true;
457    else switch (policy) {
458    case Accept: return true;
459    case Drop: return false;
460    case Reject: return error(I18nConstants.XHTML_XHTML_ELEMENT_ILLEGAL, name);
461    }
462    return false;
463  }
464
465  private String descLoc() {
466    return " at line "+Integer.toString(line)+" column "+Integer.toString(col);
467  }
468
469  private Reader rdr;
470  private String cache = "";
471  private XhtmlNode unwindPoint;
472  private String lastText = "";
473  private int line = 1;
474  private int col = 0;
475  private char lastChar;
476  private Location lastLoc;
477  private boolean xmlMode;
478
479  public XhtmlDocument parse(String source, String entryName) throws FHIRFormatError, IOException  {
480    rdr = new StringReader(source);
481    return parse(entryName);
482  }
483
484  public XhtmlDocument parse(InputStream input, String entryName) throws FHIRFormatError, IOException  {
485    rdr = new InputStreamReader(input, StandardCharsets.UTF_8);
486    return parse(entryName);
487  }
488
489  private XhtmlDocument parse(String entryName) throws FHIRFormatError, IOException 
490  {
491    XhtmlDocument result = new XhtmlDocument();
492    skipWhiteSpaceAndComments(result);
493    if (peekChar() != '<')
494      throw new FHIRFormatError("Unable to Parse HTML - does not start with tag. Found "+peekChar()+descLoc());
495    readChar();
496    markLocation();
497    ElementName n = new ElementName(readName().toLowerCase());
498    if ((entryName != null) && !n.getName().equals(entryName))
499      throw new FHIRFormatError("Unable to Parse HTML - starts with '"+n+"' not '"+entryName+"'"+descLoc());
500    XhtmlNode root = result.addTag(n.getName());
501    root.setLocation(markLocation());
502    parseAttributes(root);
503    markLocation();
504    NamespaceNormalizationMap nsm = normalizeNamespaces(n, root, null, true);
505    if (readChar() == '/') {
506      if (peekChar() != '>')
507        throw new FHIRFormatError("unexpected non-end of element "+n+" "+descLoc());
508      readChar();
509      root.setEmptyExpanded(false);
510    } else {
511      unwindPoint = null;
512      List<XhtmlNode> p = new ArrayList<>();
513      parseElementInner(root, p, nsm, true);
514      root.setEmptyExpanded(true);
515    }
516    return result;
517  }
518
519  private Location markLocation() {
520    Location res = lastLoc;
521    lastLoc = new Location(line, col);
522    return res;
523  }
524
525  private NamespaceNormalizationMap normalizeNamespaces(ElementName elementName, XhtmlNode node, NamespaceNormalizationMap parentNamespaceMap, boolean nodeIsRoot) {
526    // what we do here is strip out any stated namespace attributes, putting them in the namespace map
527    // then we figure out what the namespace of this element is, and state it explicitly if it's not the default
528
529    NamespaceNormalizationMap nodeNamespaceMap = new NamespaceNormalizationMap(parentNamespaceMap);
530    List<String> namespaceAttributes = new ArrayList<String>();
531    for (String an : node.getAttributes().keySet()) {
532      if (an.equals("xmlns")) {
533        nodeNamespaceMap.setDefaultNamespace(node.getAttribute(an));
534        namespaceAttributes.add(an);
535      }
536      if (an.startsWith("xmlns:")) {
537        nodeNamespaceMap.putNamespacePrefix(an.substring(6), node.getAttribute(an));
538        namespaceAttributes.add(an);
539      }
540    }
541
542    for (String s : namespaceAttributes)
543      node.getAttributes().remove(s);
544    if (elementName.hasNamespace()) {
545      String elementNamespace = nodeNamespaceMap.getNamespaceForPrefix(elementName.getNamespace());
546      if (!elementNamespace.equals(nodeNamespaceMap.getDefaultNamespace())) {
547        node.getAttributes().put("xmlns", elementNamespace);
548        nodeNamespaceMap.setDefaultNamespace(elementNamespace);
549        nodeNamespaceMap.setOriginalNamespacePrefix(elementName.getNamespace());
550        nodeNamespaceMap.map.remove(elementName.getNamespace());
551      }
552    }
553    // Add namespaces back if not defined in parentNamespaceMap (we haven't seen it before, so we need to define it here)
554    if (shouldAddXmlnsNamespaceAttribute(parentNamespaceMap, nodeIsRoot, nodeNamespaceMap)) {
555      node.getAttributes().put("xmlns", nodeNamespaceMap.getDefaultNamespace());
556    }
557    for (Map.Entry<String, String> entry : nodeNamespaceMap.getPrefixNamespaceEntrySet() ) {
558      if (shouldAddXmlnsNamespacePrefixAttribute(parentNamespaceMap, nodeIsRoot, entry.getKey())) {
559        node.getAttributes().put("xmlns:" + entry.getKey(), entry.getValue());
560      }
561    }
562
563    return nodeNamespaceMap;
564  }
565
566  private static boolean shouldAddXmlnsNamespacePrefixAttribute(NamespaceNormalizationMap parentNamespaceMap, boolean nodeIsRoot, String attributeKey) {
567    if (nodeIsRoot) {
568      return true;
569    }
570    return  (!parentNamespaceMap.map.containsKey(attributeKey));
571  }
572
573  private static boolean shouldAddXmlnsNamespaceAttribute(NamespaceNormalizationMap parentNamespaceMap, boolean nodeIsRoot, NamespaceNormalizationMap nodeNamespaceMap) {
574    if (nodeIsRoot) {
575      return nodeNamespaceMap.hasDefaultNamespace();
576    }
577    return nodeNamespaceMap.hasDefaultNamespace() && (parentNamespaceMap == null || !nodeNamespaceMap.getDefaultNamespace().equals(parentNamespaceMap.getDefaultNamespace()));
578  }
579
580  private void addTextNode(XhtmlNode node, StringBuilder s)
581  {
582    String t = isTrimWhitespace() ? s.toString().trim() : s.toString();
583    if (t.length() > 0)
584    {
585      lastText = t;
586      // System.out.println(t);
587      node.addText(t).setLocation(markLocation());
588      s.setLength(0);
589    }
590  }
591  private void parseElementInner(XhtmlNode node, List<XhtmlNode> parents, NamespaceNormalizationMap nsm, boolean escaping) throws FHIRFormatError, IOException
592  {
593    StringBuilder s = new StringBuilder();
594    while (peekChar() != END_OF_CHARS && !parents.contains(unwindPoint) && !(node == unwindPoint))
595    {
596      if (peekChar() == '<')
597      {
598        addTextNode(node, s);
599        readChar();
600        if (peekChar() == '!') {
601          String sc = readToCommentEnd();
602          // moved the validator
603          //          if (sc.startsWith("DOCTYPE"))
604          //            throw new FHIRFormatError("Malformed XHTML: Found a DocType declaration, and these are not allowed (XXE security vulnerability protection)");
605          node.addComment(sc).setLocation(markLocation());
606        } else if (peekChar() == '?')
607          node.addComment(readToTagEnd()).setLocation(markLocation());
608        else if (peekChar() == '/') {
609          readChar();
610          ElementName n = new ElementName(readToTagEnd());
611          if (node.getName().equals(n.getName()))
612            return;
613          else
614          {
615            if (mustBeWellFormed) {
616              throw new FHIRFormatError("Malformed XHTML: Found \"</"+n.getName()+">\" expecting \"</"+node.getName()+">\""+descLoc());
617            }
618            for (int i = parents.size() - 1; i >= 0; i--)
619            {
620              if (parents.get(i).getName().equals(n))
621                unwindPoint = parents.get(i);
622            }
623            if (unwindPoint != null)
624            {
625              for (int i = parents.size(); i > 0; i--)
626              {
627                if (i < parents.size() && parents.get(i) == unwindPoint)
628                  return;
629                if (i == parents.size())
630                {
631                  parents.get(i - 1).getChildNodes().addAll(node.getChildNodes());
632                  node.getChildNodes().clear();
633                }
634                else
635                {
636                  parents.get(i - 1).getChildNodes().addAll(parents.get(i).getChildNodes());
637                  parents.get(i).getChildNodes().clear();
638                }
639              }
640            }
641          }
642        }
643        else if (Character.isLetterOrDigit(peekChar()))
644        {
645          parseElement(node, parents, nsm);
646        }
647        else
648          throw new FHIRFormatError("Unable to Parse HTML - node '" + node.getName() + "' has unexpected content '"+peekChar()+"' (last text = '"+lastText+"'"+descLoc());
649      }
650      else if (peekChar() == '&') // escaping && 
651      {
652        parseLiteral(s);
653      }
654      else
655        s.append(readChar());
656    }
657    addTextNode(node, s);
658  }
659
660  private void parseElement(XhtmlNode parent, List<XhtmlNode> parents, NamespaceNormalizationMap namespaceMap) throws IOException, FHIRFormatError
661  {
662    markLocation();
663    ElementName name = new ElementName(readName());
664    XhtmlNode node = parent.addTag(name.getName());
665    node.setLocation(markLocation());
666    List<XhtmlNode> newParents = new ArrayList<XhtmlNode>();
667    newParents.addAll(parents);
668    newParents.add(parent);
669    parseAttributes(node);
670    markLocation();
671    namespaceMap = normalizeNamespaces(name, node, namespaceMap, false);
672    if (readChar() == '/') {
673      if (peekChar() != '>')
674        throw new FHIRFormatError("unexpected non-end of element "+name+" "+descLoc());
675      readChar();
676      node.setEmptyExpanded(false);
677    } else {
678      node.setEmptyExpanded(true);
679      parseElementInner(node, newParents, namespaceMap, "script".equals(name.getName()));
680    }
681  }
682
683  private void parseAttributes(XhtmlNode node) throws FHIRFormatError, IOException 
684  {
685    while (Character.isWhitespace(peekChar()))
686      readChar();
687    while (peekChar() != '>' && peekChar() != '/' && peekChar() != END_OF_CHARS)
688    {
689      String name = readName();
690      if (name.length() == 0)
691      {
692        throw new FHIRFormatError("Unable to read attribute on <"+node.getName()+">"+descLoc());
693      }
694      while (Character.isWhitespace(peekChar()))
695        readChar();
696
697      if (isNameChar(peekChar()) || peekChar() == '>' || peekChar() == '/')
698        node.getAttributes().put(name, null);
699      else if (peekChar() != '=')
700      {
701        throw new FHIRFormatError("Unable to read attribute '"+name+"' value on <"+node.getName()+">"+descLoc());
702      }
703      else
704      {
705        readChar();
706        while (Character.isWhitespace(peekChar()))
707          readChar();
708        if (peekChar() == '"' || peekChar() == '\'')
709          node.getAttributes().put(name, parseAttributeValue(readChar()));
710        else
711          node.getAttributes().put(name, parseAttributeValue(END_OF_CHARS));
712      }
713      while (Character.isWhitespace(peekChar()))
714        readChar();
715    }
716  }
717
718  private String parseAttributeValue(char term) throws IOException, FHIRFormatError 
719  {
720    StringBuilder b = new StringBuilder();
721    while (peekChar() != END_OF_CHARS && peekChar() != '>' && (term != END_OF_CHARS || peekChar() != '/') && peekChar() != term)
722    {
723      if (peekChar() == '&')
724      {
725        parseLiteral(b);
726      }
727      else
728        b.append(readChar());
729    }
730    if (peekChar() == term)
731      readChar();
732    return b.toString();
733  }
734
735
736  private void skipWhiteSpaceAndComments(XhtmlNode focus) throws IOException, FHIRFormatError  {
737    while (Character.isWhitespace(peekChar()) || (peekChar() == 0xfeff))
738      readChar();
739    if (peekChar() == '<')
740    {
741      char ch = readChar();
742      if (peekChar() == '!') {
743        readChar();
744        if (peekChar() == '-') {
745          readChar();
746          if (peekChar() == '-') {
747            readChar();
748            if (peekChar() == ' ')
749              readChar();
750            focus.addComment(readToCommentEnd());
751          } else 
752            throw new FHIRFormatError("unrecognised element type <!"+peekChar()+descLoc());
753        } else
754          focus.addDocType(readToDocTypeEnd());
755        skipWhiteSpaceAndComments(focus);
756      } else if (peekChar() == '?') {
757        String r = readToTagEnd();
758        focus.addInstruction(r.substring(1, r.length()-1));
759        skipWhiteSpaceAndComments(focus);
760      } else 
761        pushChar(ch);
762    }
763  }  
764
765  private void skipWhiteSpace() throws IOException {
766    if (trimWhitespace)
767      while (Character.isWhitespace(peekChar()) || (peekChar() == 0xfeff))
768        readChar();
769  }
770
771  private void skipWhiteSpaceInternal() throws IOException {
772    while (Character.isWhitespace(peekChar()) || (peekChar() == 0xfeff))
773      readChar();
774  }
775
776  private void pushChar(char ch) {
777    cache = Character.toString(ch)+cache;    
778  }
779
780  private char peekChar() throws IOException
781  {
782    if (cache.length() > 0)
783      return cache.charAt(0);
784    else if (!rdr.ready())
785      return END_OF_CHARS;
786    else
787    {
788      int i = rdr.read();
789      if (i == -1)       {
790        cache = "";
791        return END_OF_CHARS;
792      }
793      char c = (char) i;
794      cache =  Character.toString(c);
795      return c;
796    }
797  }
798
799  private char readChar() throws IOException
800  {
801    char c;
802    if (cache.length() > 0)
803    {
804      c = cache.charAt(0);
805      cache = cache.length() == 1 ? "" : cache.substring(1);
806    }
807    else if (!rdr.ready())
808      c = END_OF_CHARS;
809    else
810      c = (char)rdr.read();
811    if (c == '\r' || c == '\n') {
812      if (c == '\r' || lastChar != '\r') {
813        line++;
814        col = 0;
815      }  
816      lastChar = c;      
817    }      
818    col++;
819    return c;
820  }
821
822  private String readToTagEnd() throws IOException, FHIRFormatError 
823  {
824    StringBuilder s = new StringBuilder();
825    while (peekChar() != '>' && peekChar() != END_OF_CHARS)
826      s.append(readChar());
827    if (peekChar() != END_OF_CHARS)
828    {
829      readChar();
830      skipWhiteSpace();
831    } else if (mustBeWellFormed)
832      throw new FHIRFormatError("Unexpected termination of html source"+descLoc());
833    return s.toString();
834  }
835
836  private String readToDocTypeEnd() throws IOException, FHIRFormatError 
837  {
838    StringBuilder s = new StringBuilder();
839
840    boolean done = false;
841    while (!done) {
842      char c = peekChar();
843      if (c == '>') {
844        done = true;
845        readChar();
846      } else if (c != END_OF_CHARS)
847        s.append(readChar());
848      else if (mustBeWellFormed)
849        throw new FHIRFormatError("Unexpected termination of html source"+descLoc());
850    }
851    return s.toString();
852  }
853
854  private String readToCommentEnd() throws IOException, FHIRFormatError 
855  {
856    if (peekChar() == '!')
857      readChar();
858    StringBuilder s = new StringBuilder();
859
860    boolean simple = true;
861    if (peekChar() == '-') {
862      readChar();
863      simple = peekChar() != '-';
864      if (simple)
865        s.append('-');
866      else
867        readChar();
868    }
869
870    boolean doctypeEntities = false;
871
872    boolean done = false;
873    while (!done) {
874      char c = peekChar();
875      if (c == '-') {
876        readChar();
877        if (peekChar() == '-') {
878          readChar();
879          if (peekChar() == '>') {
880            done = true;
881          } else {
882            pushChar('-');
883            s.append("-");
884          }
885        } else 
886          s.append('-');
887      } else if (doctypeEntities && c == ']') {
888        s.append(readChar());
889        if (peekChar() == '>') {
890          done = true;
891        }
892      } else if (simple && peekChar() == '>' && !doctypeEntities) {
893        done = true;
894      } else if (c == '[' && s.toString().startsWith("DOCTYPE ")) {
895        doctypeEntities = true;
896        s.append(readChar());
897      } else if (c != END_OF_CHARS)
898        s.append(readChar());
899      else if (mustBeWellFormed)
900        throw new FHIRFormatError("Unexpected termination of html source"+descLoc());
901    }
902    if (peekChar() != END_OF_CHARS)
903    {
904      readChar();
905      skipWhiteSpace();
906    }
907    if (doctypeEntities) {
908      parseDoctypeEntities(s.toString());
909    }
910    return s.toString();
911  }
912
913  private void parseDoctypeEntities(String s) {
914    while (s.contains("<!ENTITY")) {
915      s = s.substring(s.indexOf("<!ENTITY"));
916      int e = s.indexOf(">");
917      String ed = s.substring(0, e+1);
918      s = s.substring(e+1);
919      ed = ed.substring(8).trim();
920      e = ed.indexOf(" ");
921      String n = ed.substring(0, e).trim();
922      ed = ed.substring(e).trim();
923      e = ed.indexOf(" "); // SYSTEM
924      ed = ed.substring(e).trim();
925      String v = ed.substring(0, ed.length()-1);
926      declaredEntities.put(n, v);
927    }
928
929  }
930
931  private boolean isNameChar(char ch)
932  {
933    return Character.isLetterOrDigit(ch) || ch == '_' || ch == '-' || ch == ':';
934  }
935
936  private String readName() throws IOException
937  {
938    StringBuilder s = new StringBuilder();
939    while (isNameChar(peekChar()))
940      s.append(readChar());
941    return s.toString();
942  }
943
944  private String readUntil(char ch) throws IOException
945  {
946    StringBuilder s = new StringBuilder();
947    while (peekChar() != 0 && peekChar() != ch)
948      s.append(readChar());
949    readChar();
950    return s.toString();
951  }
952
953
954  private String readUntil(String sc) throws IOException
955  {
956    StringBuilder s = new StringBuilder();
957    while (peekChar() != 0 && sc.indexOf(peekChar()) == -1)
958      s.append(readChar());
959    readChar();
960    return s.toString();
961  }
962
963  private void parseLiteral(StringBuilder s) throws IOException, FHIRFormatError {
964    // UInt16 w;
965    readChar();
966    String c = readUntil(";&'\"><");
967    if (c.isEmpty())
968      throw new FHIRFormatError("Invalid literal declaration following text: " + s);
969    else if (c.charAt(0) == '#') {
970      if (isInteger(c.substring(1), 10))
971        s.append((char) Integer.parseInt(c.substring(1)));
972      else if (c.charAt(1) == 'x' && isInteger(c.substring(2), 16))
973        s.append((char) Integer.parseInt(c.substring(2), 16));
974    } else if (declaredEntities.containsKey(c)) {
975      s.append(declaredEntities.get(c));
976    } else {
977      if (xmlMode) {
978        if (!Utilities.existsInList(c, "quot", "amp", "apos", "lt", "gt")) {
979          error(I18nConstants.XHTML_XHTML_Entity_Illegal, "&"+c+";");
980        }
981      }
982      if (definedEntities.containsKey(c)) {
983        s.append(definedEntities.get(c));
984        // what's going on here? 
985        // the contents that follow already existed, and then I added the routine to populate the entities 
986        // which was generated from other code. The code that follows is probably redundant, but I haven't
987        // cross checked it. some is welcome to do so... (GG 8-Nov 2021)
988      } else if (c.equals("apos"))
989        s.append('\'');
990      else if (c.equals("quot"))
991        s.append('"');
992      else if (c.equals("nbsp"))
993        s.append(XhtmlNode.NBSP);
994      else if (c.equals("amp"))
995        s.append('&');
996      else if (c.equals("lsquo"))
997        s.append((char) 8216); // right single quotation, U+2019 ISOnum 
998      else if (c.equals("rsquo"))
999        s.append((char) 8217); // right single quotation, U+2019 ISOnum 
1000      else if (c.equals("gt"))
1001        s.append('>');
1002      else if (c.equals("lt"))
1003        s.append('<');
1004      else if (c.equals("copy"))
1005        s.append((char) 169);
1006      else if (c.equals("reg"))
1007        s.append((char) 174);
1008      else if (c.equals("sect"))
1009        s.append((char) 0xA7);
1010      else if (c.equals("fnof"))
1011        s.append((char) 402); // latin small f with hook = function = florin, U+0192 ISOtech -->
1012      else if (c.equals("Alpha"))
1013        s.append((char) 913); // greek capital letter alpha, U+0391
1014      else if (c.equals("Beta"))
1015        s.append((char) 914); // greek capital letter beta, U+0392
1016      else if (c.equals("Gamma"))
1017        s.append((char) 915); // greek capital letter gamma, U+0393 ISOgrk3
1018      else if (c.equals("Delta"))
1019        s.append((char) 916); // greek capital letter delta, U+0394 ISOgrk3
1020      else if (c.equals("Epsilon"))
1021        s.append((char) 917); // greek capital letter epsilon, U+0395
1022      else if (c.equals("Zeta"))
1023        s.append((char) 918); // greek capital letter zeta, U+0396
1024      else if (c.equals("Eta"))
1025        s.append((char) 919); // greek capital letter eta, U+0397
1026      else if (c.equals("Theta"))
1027        s.append((char) 920); // greek capital letter theta, U+0398 ISOgrk3
1028      else if (c.equals("Iota"))
1029        s.append((char) 921); // greek capital letter iota, U+0399
1030      else if (c.equals("Kappa"))
1031        s.append((char) 922); // greek capital letter kappa, U+039A
1032      else if (c.equals("Lambda"))
1033        s.append((char) 923); // greek capital letter lambda, U+039B ISOgrk3
1034      else if (c.equals("Mu"))
1035        s.append((char) 924); // greek capital letter mu, U+039C
1036      else if (c.equals("Nu"))
1037        s.append((char) 925); // greek capital letter nu, U+039D
1038      else if (c.equals("Xi"))
1039        s.append((char) 926); // greek capital letter xi, U+039E ISOgrk3
1040      else if (c.equals("Omicron"))
1041        s.append((char) 927); // greek capital letter omicron, U+039F
1042      else if (c.equals("Pi"))
1043        s.append((char) 928); // greek capital letter pi, U+03A0 ISOgrk3
1044      else if (c.equals("Rho"))
1045        s.append((char) 929); // greek capital letter rho, U+03A1
1046      else if (c.equals("Sigma"))
1047        s.append((char) 931); // greek capital letter sigma, U+03A3 ISOgrk3
1048      else if (c.equals("Tau"))
1049        s.append((char) 932); // greek capital letter tau, U+03A4
1050      else if (c.equals("Upsilon"))
1051        s.append((char) 933); // greek capital letter upsilon, U+03A5 ISOgrk3
1052      else if (c.equals("Phi"))
1053        s.append((char) 934); // greek capital letter phi, U+03A6 ISOgrk3
1054      else if (c.equals("Chi"))
1055        s.append((char) 935); // greek capital letter chi, U+03A7
1056      else if (c.equals("Psi"))
1057        s.append((char) 936); // greek capital letter psi, U+03A8 ISOgrk3
1058      else if (c.equals("Omega"))
1059        s.append((char) 937); // greek capital letter omega, U+03A9 ISOgrk3
1060      else if (c.equals("alpha"))
1061        s.append((char) 945); // greek small letter alpha, U+03B1 ISOgrk3
1062      else if (c.equals("beta"))
1063        s.append((char) 946); // greek small letter beta, U+03B2 ISOgrk3
1064      else if (c.equals("gamma"))
1065        s.append((char) 947); // greek small letter gamma, U+03B3 ISOgrk3
1066      else if (c.equals("delta"))
1067        s.append((char) 948); // greek small letter delta, U+03B4 ISOgrk3
1068      else if (c.equals("epsilon"))
1069        s.append((char) 949); // greek small letter epsilon, U+03B5 ISOgrk3
1070      else if (c.equals("zeta"))
1071        s.append((char) 950); // greek small letter zeta, U+03B6 ISOgrk3
1072      else if (c.equals("eta"))
1073        s.append((char) 951); // greek small letter eta, U+03B7 ISOgrk3
1074      else if (c.equals("theta"))
1075        s.append((char) 952); // greek small letter theta, U+03B8 ISOgrk3
1076      else if (c.equals("iota"))
1077        s.append((char) 953); // greek small letter iota, U+03B9 ISOgrk3
1078      else if (c.equals("kappa"))
1079        s.append((char) 954); // greek small letter kappa, U+03BA ISOgrk3
1080      else if (c.equals("lambda"))
1081        s.append((char) 955); // greek small letter lambda, U+03BB ISOgrk3
1082      else if (c.equals("mu"))
1083        s.append((char) 956); // greek small letter mu, U+03BC ISOgrk3
1084      else if (c.equals("nu"))
1085        s.append((char) 957); // greek small letter nu, U+03BD ISOgrk3
1086      else if (c.equals("xi"))
1087        s.append((char) 958); // greek small letter xi, U+03BE ISOgrk3
1088      else if (c.equals("omicron"))
1089        s.append((char) 959); // greek small letter omicron, U+03BF NEW
1090      else if (c.equals("pi"))
1091        s.append((char) 960); // greek small letter pi, U+03C0 ISOgrk3
1092      else if (c.equals("rho"))
1093        s.append((char) 961); // greek small letter rho, U+03C1 ISOgrk3
1094      else if (c.equals("sigmaf"))
1095        s.append((char) 962); // greek small letter final sigma, U+03C2 ISOgrk3
1096      else if (c.equals("sigma"))
1097        s.append((char) 963); // greek small letter sigma, U+03C3 ISOgrk3
1098      else if (c.equals("tau"))
1099        s.append((char) 964); // greek small letter tau, U+03C4 ISOgrk3
1100      else if (c.equals("upsilon"))
1101        s.append((char) 965); // greek small letter upsilon, U+03C5 ISOgrk3
1102      else if (c.equals("phi"))
1103        s.append((char) 966); // greek small letter phi, U+03C6 ISOgrk3
1104      else if (c.equals("chi"))
1105        s.append((char) 967); // greek small letter chi, U+03C7 ISOgrk3
1106      else if (c.equals("psi"))
1107        s.append((char) 968); // greek small letter psi, U+03C8 ISOgrk3
1108      else if (c.equals("omega"))
1109        s.append((char) 969); // greek small letter omega, U+03C9 ISOgrk3
1110      else if (c.equals("thetasym"))
1111        s.append((char) 977); // greek small letter theta symbol, U+03D1 NEW
1112      else if (c.equals("upsih"))
1113        s.append((char) 978); // greek upsilon with hook symbol, U+03D2 NEW
1114      else if (c.equals("piv"))
1115        s.append((char) 982); // greek pi symbol, U+03D6 ISOgrk3
1116      else if (c.equals("bull"))
1117        s.append((char) 8226); // bullet = black small circle, U+2022 ISOpub
1118      else if (c.equals("hellip"))
1119        s.append((char) 8230); // horizontal ellipsis = three dot leader, U+2026 ISOpub
1120      else if (c.equals("prime"))
1121        s.append((char) 8242); // prime = minutes = feet, U+2032 ISOtech
1122      else if (c.equals("Prime"))
1123        s.append((char) 8243); // double prime = seconds = inches, U+2033 ISOtech
1124      else if (c.equals("oline"))
1125        s.append((char) 8254); // overline = spacing overscore, U+203E NEW
1126      else if (c.equals("frasl"))
1127        s.append((char) 8260); // fraction slash, U+2044 NEW
1128      else if (c.equals("weierp"))
1129        s.append((char) 8472); // script capital P = power set = Weierstrass p, U+2118 ISOamso
1130      else if (c.equals("image"))
1131        s.append((char) 8465); // blackletter capital I = imaginary part, U+2111 ISOamso
1132      else if (c.equals("real"))
1133        s.append((char) 8476); // blackletter capital R = real part symbol, U+211C ISOamso
1134      else if (c.equals("trade"))
1135        s.append((char) 8482); // trade mark sign, U+2122 ISOnum
1136      else if (c.equals("alefsym"))
1137        s.append((char) 8501); // alef symbol = first transfinite cardinal, U+2135 NEW
1138      else if (c.equals("larr"))
1139        s.append((char) 8592); // leftwards arrow, U+2190 ISOnum
1140      else if (c.equals("uarr"))
1141        s.append((char) 8593); // upwards arrow, U+2191 ISOnum
1142      else if (c.equals("rarr"))
1143        s.append((char) 8594); // rightwards arrow, U+2192 ISOnum
1144      else if (c.equals("darr"))
1145        s.append((char) 8595); // downwards arrow, U+2193 ISOnum
1146      else if (c.equals("harr"))
1147        s.append((char) 8596); // left right arrow, U+2194 ISOamsa
1148      else if (c.equals("crarr"))
1149        s.append((char) 8629); // downwards arrow with corner leftwards = carriage return, U+21B5 NEW
1150      else if (c.equals("lArr"))
1151        s.append((char) 8656); // leftwards double arrow, U+21D0 ISOtech
1152      else if (c.equals("uArr"))
1153        s.append((char) 8657); // upwards double arrow, U+21D1 ISOamsa
1154      else if (c.equals("rArr"))
1155        s.append((char) 8658); // rightwards double arrow, U+21D2 ISOtech
1156      else if (c.equals("dArr"))
1157        s.append((char) 8659); // downwards double arrow, U+21D3 ISOamsa
1158      else if (c.equals("hArr"))
1159        s.append((char) 8660); // left right double arrow, U+21D4 ISOamsa
1160      else if (c.equals("forall"))
1161        s.append((char) 8704); // for all, U+2200 ISOtech
1162      else if (c.equals("part"))
1163        s.append((char) 8706); // partial differential, U+2202 ISOtech
1164      else if (c.equals("exist"))
1165        s.append((char) 8707); // there exists, U+2203 ISOtech
1166      else if (c.equals("empty"))
1167        s.append((char) 8709); // empty set = null set = diameter, U+2205 ISOamso
1168      else if (c.equals("nabla"))
1169        s.append((char) 8711); // nabla = backward difference, U+2207 ISOtech
1170      else if (c.equals("isin"))
1171        s.append((char) 8712); // element of, U+2208 ISOtech
1172      else if (c.equals("notin"))
1173        s.append((char) 8713); // not an element of, U+2209 ISOtech
1174      else if (c.equals("ni"))
1175        s.append((char) 8715); // contains as member, U+220B ISOtech
1176      else if (c.equals("prod"))
1177        s.append((char) 8719); // n-ary product = product sign, U+220F ISOamsb
1178      else if (c.equals("sum"))
1179        s.append((char) 8721); // n-ary sumation, U+2211 ISOamsb
1180      else if (c.equals("minus"))
1181        s.append((char) 8722); // minus sign, U+2212 ISOtech
1182      else if (c.equals("lowast"))
1183        s.append((char) 8727); // asterisk operator, U+2217 ISOtech
1184      else if (c.equals("radic"))
1185        s.append((char) 8730); // square root = radical sign, U+221A ISOtech
1186      else if (c.equals("prop"))
1187        s.append((char) 8733); // proportional to, U+221D ISOtech
1188      else if (c.equals("infin"))
1189        s.append((char) 8734); // infinity, U+221E ISOtech -->
1190      else if (c.equals("ang"))
1191        s.append((char) 8736); // angle, U+2220 ISOamso
1192      else if (c.equals("and"))
1193        s.append((char) 8743); // logical and = wedge, U+2227 ISOtech
1194      else if (c.equals("or"))
1195        s.append((char) 8744); // logical or = vee, U+2228 ISOtech
1196      else if (c.equals("cap"))
1197        s.append((char) 8745); // intersection = cap, U+2229 ISOtech
1198      else if (c.equals("cup"))
1199        s.append((char) 8746); // union = cup, U+222A ISOtech
1200      else if (c.equals("int"))
1201        s.append((char) 8747); // integral, U+222B ISOtech
1202      else if (c.equals("there4"))
1203        s.append((char) 8756); // therefore, U+2234 ISOtech
1204      else if (c.equals("sim"))
1205        s.append((char) 8764); // tilde operator = varies with = similar t U+223C ISOtech
1206      else if (c.equals("cong"))
1207        s.append((char) 8773); // approximately equal to, U+2245 ISOtec
1208      else if (c.equals("asymp"))
1209        s.append((char) 8776); // almost equal to = asymptotic to, U+2248 ISOamsr
1210      else if (c.equals("ne"))
1211        s.append((char) 8800); // not equal to, U+2260 ISOtech
1212      else if (c.equals("equiv"))
1213        s.append((char) 8801); // identical to, U+2261 ISOtech
1214      else if (c.equals("le"))
1215        s.append((char) 8804); // less-than or equal to, U+2264 ISOtech
1216      else if (c.equals("ge"))
1217        s.append((char) 8805); // greater-than or equal to, U+2265 ISOtech
1218      else if (c.equals("sub"))
1219        s.append((char) 8834); // subset of, U+2282 ISOtech
1220      else if (c.equals("sup"))
1221        s.append((char) 8835); // superset of, U+2283 ISOtech
1222      else if (c.equals("nsub"))
1223        s.append((char) 8836); // not a subset of, U+2284 ISOamsn
1224      else if (c.equals("sube"))
1225        s.append((char) 8838); // subset of or equal to, U+2286 ISOtech
1226      else if (c.equals("supe"))
1227        s.append((char) 8839); // superset of or equal to, U+2287 ISOtech
1228      else if (c.equals("oplus"))
1229        s.append((char) 8853); // circled plus = direct sum, U+2295 ISOamsb
1230      else if (c.equals("otimes"))
1231        s.append((char) 8855); // circled times = vector product, U+2297 ISOamsb -->
1232      else if (c.equals("perp"))
1233        s.append((char) 8869); // up tack = orthogonal to = perpendicular, U+22A5 ISOtech
1234      else if (c.equals("sdot"))
1235        s.append((char) 8901); // dot operator, U+22C5 ISOamsb
1236      else if (c.equals("lceil"))
1237        s.append((char) 8968); // left ceiling = apl upstile, U+2308 ISOamsc
1238      else if (c.equals("rceil"))
1239        s.append((char) 8969); // right ceiling, U+2309 ISOamsc
1240      else if (c.equals("lfloor"))
1241        s.append((char) 8970); // left floor = apl downstile, U+230A ISOamsc
1242      else if (c.equals("rfloor"))
1243        s.append((char) 8971); // right floor, U+230B ISOamsc
1244      else if (c.equals("lang"))
1245        s.append((char) 9001); // left-pointing angle bracket = bra, U+2329 ISOtech
1246      else if (c.equals("rang"))
1247        s.append((char) 9002); // right-pointing angle bracket = ket, U+232A ISOtech
1248      else if (c.equals("loz"))
1249        s.append((char) 9674); // lozenge, U+25CA ISOpub
1250      else if (c.equals("spades"))
1251        s.append((char) 9824); // black spade suit, U+2660 ISOpub
1252      else if (c.equals("clubs"))
1253        s.append((char) 9827); // black club suit = shamrock, U+2663 ISOpub
1254      else if (c.equals("hearts"))
1255        s.append((char) 9829); // black heart suit = valentine, U+2665 ISOpub
1256      else if (c.equals("diams"))
1257        s.append((char) 9830); // black diamond suit, U+2666 ISOpub --
1258      else if (c.equals("ndash"))
1259        s.append((char) 8211); 
1260      else if (c.equals("mdash"))
1261        s.append((char) 8212); 
1262      else if (c.equals("ldquo"))
1263        s.append((char) 8221); 
1264      else if (c.equals("rdquo"))
1265        s.append((char) 201D); 
1266      else if (c.equals("frac14"))
1267        s.append((char) 188); 
1268      else if (!mustBeWellFormed) {
1269        // we guess that this is an accidentally unescaped &
1270        s.append("&"+c);
1271      } else {
1272        throw new FHIRFormatError("unable to parse character reference '" + c + "'' (last text = '" + lastText + "'" + descLoc());
1273      }
1274    }
1275  }
1276
1277  private boolean isInteger(String s, int base) {
1278    try {
1279      Integer.parseInt(s, base);
1280      return true;
1281    } catch (Exception e) {
1282      return false;
1283    }
1284  }
1285
1286  public XhtmlNode parseFragment(String source) throws IOException, FHIRException  {
1287    rdr = new StringReader(source);
1288    return parseFragment();
1289  }
1290
1291  public XhtmlNode parseFragment(InputStream input) throws IOException, FHIRException  {
1292    rdr = new InputStreamReader(input);
1293    return parseFragment();
1294  }
1295
1296  private XhtmlNode parseFragment() throws IOException, FHIRException 
1297  {
1298    skipWhiteSpace();
1299    if (peekChar() != '<')
1300      throw new FHIRException("Unable to Parse HTML - does not start with tag. Found "+peekChar()+descLoc());
1301    readChar();
1302    if (peekChar() == '?') {
1303      readToTagEnd();
1304      skipWhiteSpaceInternal();
1305      if (peekChar() != '<')
1306        throw new FHIRException("Unable to Parse HTML - does not start with tag after processing instruction. Found "+peekChar()+descLoc());
1307      readChar();
1308    }
1309    String n = readName().toLowerCase();
1310    readToTagEnd();
1311    XhtmlNode result = new XhtmlNode(NodeType.Element);
1312
1313    int colonIndex = n.indexOf(':');
1314    if (colonIndex != -1) {
1315      n = n.substring(colonIndex + 1);
1316    }
1317
1318    result.setName(n);
1319    unwindPoint = null;
1320    List<XhtmlNode> p = new ArrayList<>();
1321    parseElementInner(result, p, null, true);
1322
1323    return result;
1324  }
1325
1326  private void defineEntities() {
1327    definedEntities.put("&AElig;", "\u00C6");
1328    definedEntities.put("&AMP;", "\u0026");
1329    definedEntities.put("&Aacute;", "\u00C1");
1330    definedEntities.put("&Abreve;", "\u0102");
1331    definedEntities.put("&Acirc;", "\u00C2");
1332    definedEntities.put("&Acy;", "\u0410");
1333    definedEntities.put("&Afr;", "\uD835\uDD04");
1334    definedEntities.put("&Agrave;", "\u00C0");
1335    definedEntities.put("&Alpha;", "\u0391");
1336    definedEntities.put("&Amacr;", "\u0100");
1337    definedEntities.put("&And;", "\u2A53");
1338    definedEntities.put("&Aogon;", "\u0104");
1339    definedEntities.put("&Aopf;", "\uD835\uDD38");
1340    definedEntities.put("&ApplyFunction;", "\u2061");
1341    definedEntities.put("&Aring;", "\u00C5");
1342    definedEntities.put("&Ascr;", "\uD835\uDC9C");
1343    definedEntities.put("&Assign;", "\u2254");
1344    definedEntities.put("&Atilde;", "\u00C3");
1345    definedEntities.put("&Auml;", "\u00C4");
1346    definedEntities.put("&Backslash;", "\u2216");
1347    definedEntities.put("&Barv;", "\u2AE7");
1348    definedEntities.put("&Barwed;", "\u2306");
1349    definedEntities.put("&Bcy;", "\u0411");
1350    definedEntities.put("&Because;", "\u2235");
1351    definedEntities.put("&Bernoullis;", "\u212C");
1352    definedEntities.put("&Beta;", "\u0392");
1353    definedEntities.put("&Bfr;", "\uD835\uDD05");
1354    definedEntities.put("&Bopf;", "\uD835\uDD39");
1355    definedEntities.put("&Breve;", "\u02D8");
1356    definedEntities.put("&Bscr;", "\u212C");
1357    definedEntities.put("&Bumpeq;", "\u224E");
1358    definedEntities.put("&CHcy;", "\u0427");
1359    definedEntities.put("&COPY;", "\u00A9");
1360    definedEntities.put("&Cacute;", "\u0106");
1361    definedEntities.put("&Cap;", "\u22D2");
1362    definedEntities.put("&CapitalDifferentialD;", "\u2145");
1363    definedEntities.put("&Cayleys;", "\u212D");
1364    definedEntities.put("&Ccaron;", "\u010C");
1365    definedEntities.put("&Ccedil;", "\u00C7");
1366    definedEntities.put("&Ccirc;", "\u0108");
1367    definedEntities.put("&Cconint;", "\u2230");
1368    definedEntities.put("&Cdot;", "\u010A");
1369    definedEntities.put("&Cedilla;", "\u00B8");
1370    definedEntities.put("&CenterDot;", "\u00B7");
1371    definedEntities.put("&Cfr;", "\u212D");
1372    definedEntities.put("&Chi;", "\u03A7");
1373    definedEntities.put("&CircleDot;", "\u2299");
1374    definedEntities.put("&CircleMinus;", "\u2296");
1375    definedEntities.put("&CirclePlus;", "\u2295");
1376    definedEntities.put("&CircleTimes;", "\u2297");
1377    definedEntities.put("&ClockwiseContourIntegral;", "\u2232");
1378    definedEntities.put("&CloseCurlyDoubleQuote;", "\u201D");
1379    definedEntities.put("&CloseCurlyQuote;", "\u2019");
1380    definedEntities.put("&Colon;", "\u2237");
1381    definedEntities.put("&Colone;", "\u2A74");
1382    definedEntities.put("&Congruent;", "\u2261");
1383    definedEntities.put("&Conint;", "\u222F");
1384    definedEntities.put("&ContourIntegral;", "\u222E");
1385    definedEntities.put("&Copf;", "\u2102");
1386    definedEntities.put("&Coproduct;", "\u2210");
1387    definedEntities.put("&CounterClockwiseContourIntegral;", "\u2233");
1388    definedEntities.put("&Cross;", "\u2A2F");
1389    definedEntities.put("&Cscr;", "\uD835\uDC9E");
1390    definedEntities.put("&Cup;", "\u22D3");
1391    definedEntities.put("&CupCap;", "\u224D");
1392    definedEntities.put("&DD;", "\u2145");
1393    definedEntities.put("&DDotrahd;", "\u2911");
1394    definedEntities.put("&DJcy;", "\u0402");
1395    definedEntities.put("&DScy;", "\u0405");
1396    definedEntities.put("&DZcy;", "\u040F");
1397    definedEntities.put("&Dagger;", "\u2021");
1398    definedEntities.put("&Darr;", "\u21A1");
1399    definedEntities.put("&Dashv;", "\u2AE4");
1400    definedEntities.put("&Dcaron;", "\u010E");
1401    definedEntities.put("&Dcy;", "\u0414");
1402    definedEntities.put("&Del;", "\u2207");
1403    definedEntities.put("&Delta;", "\u0394");
1404    definedEntities.put("&Dfr;", "\uD835\uDD07");
1405    definedEntities.put("&DiacriticalAcute;", "\u00B4");
1406    definedEntities.put("&DiacriticalDot;", "\u02D9");
1407    definedEntities.put("&DiacriticalDoubleAcute;", "\u02DD");
1408    definedEntities.put("&DiacriticalGrave;", "\u0060");
1409    definedEntities.put("&DiacriticalTilde;", "\u02DC");
1410    definedEntities.put("&Diamond;", "\u22C4");
1411    definedEntities.put("&DifferentialD;", "\u2146");
1412    definedEntities.put("&Dopf;", "\uD835\uDD3B");
1413    definedEntities.put("&Dot;", "\u00A8");
1414    definedEntities.put("&DotDot;", "\u20DC");
1415    definedEntities.put("&DotEqual;", "\u2250");
1416    definedEntities.put("&DoubleContourIntegral;", "\u222F");
1417    definedEntities.put("&DoubleDot;", "\u00A8");
1418    definedEntities.put("&DoubleDownArrow;", "\u21D3");
1419    definedEntities.put("&DoubleLeftArrow;", "\u21D0");
1420    definedEntities.put("&DoubleLeftRightArrow;", "\u21D4");
1421    definedEntities.put("&DoubleLeftTee;", "\u2AE4");
1422    definedEntities.put("&DoubleLongLeftArrow;", "\u27F8");
1423    definedEntities.put("&DoubleLongLeftRightArrow;", "\u27FA");
1424    definedEntities.put("&DoubleLongRightArrow;", "\u27F9");
1425    definedEntities.put("&DoubleRightArrow;", "\u21D2");
1426    definedEntities.put("&DoubleRightTee;", "\u22A8");
1427    definedEntities.put("&DoubleUpArrow;", "\u21D1");
1428    definedEntities.put("&DoubleUpDownArrow;", "\u21D5");
1429    definedEntities.put("&DoubleVerticalBar;", "\u2225");
1430    definedEntities.put("&DownArrow;", "\u2193");
1431    definedEntities.put("&DownArrowBar;", "\u2913");
1432    definedEntities.put("&DownArrowUpArrow;", "\u21F5");
1433    definedEntities.put("&DownBreve;", "\u0311");
1434    definedEntities.put("&DownLeftRightVector;", "\u2950");
1435    definedEntities.put("&DownLeftTeeVector;", "\u295E");
1436    definedEntities.put("&DownLeftVector;", "\u21BD");
1437    definedEntities.put("&DownLeftVectorBar;", "\u2956");
1438    definedEntities.put("&DownRightTeeVector;", "\u295F");
1439    definedEntities.put("&DownRightVector;", "\u21C1");
1440    definedEntities.put("&DownRightVectorBar;", "\u2957");
1441    definedEntities.put("&DownTee;", "\u22A4");
1442    definedEntities.put("&DownTeeArrow;", "\u21A7");
1443    definedEntities.put("&Downarrow;", "\u21D3");
1444    definedEntities.put("&Dscr;", "\uD835\uDC9F");
1445    definedEntities.put("&Dstrok;", "\u0110");
1446    definedEntities.put("&ENG;", "\u014A");
1447    definedEntities.put("&ETH;", "\u00D0");
1448    definedEntities.put("&Eacute;", "\u00C9");
1449    definedEntities.put("&Ecaron;", "\u011A");
1450    definedEntities.put("&Ecirc;", "\u00CA");
1451    definedEntities.put("&Ecy;", "\u042D");
1452    definedEntities.put("&Edot;", "\u0116");
1453    definedEntities.put("&Efr;", "\uD835\uDD08");
1454    definedEntities.put("&Egrave;", "\u00C8");
1455    definedEntities.put("&Element;", "\u2208");
1456    definedEntities.put("&Emacr;", "\u0112");
1457    definedEntities.put("&EmptySmallSquare;", "\u25FB");
1458    definedEntities.put("&EmptyVerySmallSquare;", "\u25AB");
1459    definedEntities.put("&Eogon;", "\u0118");
1460    definedEntities.put("&Eopf;", "\uD835\uDD3C");
1461    definedEntities.put("&Epsilon;", "\u0395");
1462    definedEntities.put("&Equal;", "\u2A75");
1463    definedEntities.put("&EqualTilde;", "\u2242");
1464    definedEntities.put("&Equilibrium;", "\u21CC");
1465    definedEntities.put("&Escr;", "\u2130");
1466    definedEntities.put("&Esim;", "\u2A73");
1467    definedEntities.put("&Eta;", "\u0397");
1468    definedEntities.put("&Euml;", "\u00CB");
1469    definedEntities.put("&Exists;", "\u2203");
1470    definedEntities.put("&ExponentialE;", "\u2147");
1471    definedEntities.put("&Fcy;", "\u0424");
1472    definedEntities.put("&Ffr;", "\uD835\uDD09");
1473    definedEntities.put("&FilledSmallSquare;", "\u25FC");
1474    definedEntities.put("&FilledVerySmallSquare;", "\u25AA");
1475    definedEntities.put("&Fopf;", "\uD835\uDD3D");
1476    definedEntities.put("&ForAll;", "\u2200");
1477    definedEntities.put("&Fouriertrf;", "\u2131");
1478    definedEntities.put("&Fscr;", "\u2131");
1479    definedEntities.put("&GJcy;", "\u0403");
1480    definedEntities.put("&GT;", "\u003E");
1481    definedEntities.put("&Gamma;", "\u0393");
1482    definedEntities.put("&Gammad;", "\u03DC");
1483    definedEntities.put("&Gbreve;", "\u011E");
1484    definedEntities.put("&Gcedil;", "\u0122");
1485    definedEntities.put("&Gcirc;", "\u011C");
1486    definedEntities.put("&Gcy;", "\u0413");
1487    definedEntities.put("&Gdot;", "\u0120");
1488    definedEntities.put("&Gfr;", "\uD835\uDD0A");
1489    definedEntities.put("&Gg;", "\u22D9");
1490    definedEntities.put("&Gopf;", "\uD835\uDD3E");
1491    definedEntities.put("&GreaterEqual;", "\u2265");
1492    definedEntities.put("&GreaterEqualLess;", "\u22DB");
1493    definedEntities.put("&GreaterFullEqual;", "\u2267");
1494    definedEntities.put("&GreaterGreater;", "\u2AA2");
1495    definedEntities.put("&GreaterLess;", "\u2277");
1496    definedEntities.put("&GreaterSlantEqual;", "\u2A7E");
1497    definedEntities.put("&GreaterTilde;", "\u2273");
1498    definedEntities.put("&Gscr;", "\uD835\uDCA2");
1499    definedEntities.put("&Gt;", "\u226B");
1500    definedEntities.put("&HARDcy;", "\u042A");
1501    definedEntities.put("&Hacek;", "\u02C7");
1502    definedEntities.put("&Hat;", "\u005E");
1503    definedEntities.put("&Hcirc;", "\u0124");
1504    definedEntities.put("&Hfr;", "\u210C");
1505    definedEntities.put("&HilbertSpace;", "\u210B");
1506    definedEntities.put("&Hopf;", "\u210D");
1507    definedEntities.put("&HorizontalLine;", "\u2500");
1508    definedEntities.put("&Hscr;", "\u210B");
1509    definedEntities.put("&Hstrok;", "\u0126");
1510    definedEntities.put("&HumpDownHump;", "\u224E");
1511    definedEntities.put("&HumpEqual;", "\u224F");
1512    definedEntities.put("&IEcy;", "\u0415");
1513    definedEntities.put("&IJlig;", "\u0132");
1514    definedEntities.put("&IOcy;", "\u0401");
1515    definedEntities.put("&Iacute;", "\u00CD");
1516    definedEntities.put("&Icirc;", "\u00CE");
1517    definedEntities.put("&Icy;", "\u0418");
1518    definedEntities.put("&Idot;", "\u0130");
1519    definedEntities.put("&Ifr;", "\u2111");
1520    definedEntities.put("&Igrave;", "\u00CC");
1521    definedEntities.put("&Im;", "\u2111");
1522    definedEntities.put("&Imacr;", "\u012A");
1523    definedEntities.put("&ImaginaryI;", "\u2148");
1524    definedEntities.put("&Implies;", "\u21D2");
1525    definedEntities.put("&Int;", "\u222C");
1526    definedEntities.put("&Integral;", "\u222B");
1527    definedEntities.put("&Intersection;", "\u22C2");
1528    definedEntities.put("&InvisibleComma;", "\u2063");
1529    definedEntities.put("&InvisibleTimes;", "\u2062");
1530    definedEntities.put("&Iogon;", "\u012E");
1531    definedEntities.put("&Iopf;", "\uD835\uDD40");
1532    definedEntities.put("&Iota;", "\u0399");
1533    definedEntities.put("&Iscr;", "\u2110");
1534    definedEntities.put("&Itilde;", "\u0128");
1535    definedEntities.put("&Iukcy;", "\u0406");
1536    definedEntities.put("&Iuml;", "\u00CF");
1537    definedEntities.put("&Jcirc;", "\u0134");
1538    definedEntities.put("&Jcy;", "\u0419");
1539    definedEntities.put("&Jfr;", "\uD835\uDD0D");
1540    definedEntities.put("&Jopf;", "\uD835\uDD41");
1541    definedEntities.put("&Jscr;", "\uD835\uDCA5");
1542    definedEntities.put("&Jsercy;", "\u0408");
1543    definedEntities.put("&Jukcy;", "\u0404");
1544    definedEntities.put("&KHcy;", "\u0425");
1545    definedEntities.put("&KJcy;", "\u040C");
1546    definedEntities.put("&Kappa;", "\u039A");
1547    definedEntities.put("&Kcedil;", "\u0136");
1548    definedEntities.put("&Kcy;", "\u041A");
1549    definedEntities.put("&Kfr;", "\uD835\uDD0E");
1550    definedEntities.put("&Kopf;", "\uD835\uDD42");
1551    definedEntities.put("&Kscr;", "\uD835\uDCA6");
1552    definedEntities.put("&LJcy;", "\u0409");
1553    definedEntities.put("&LT;", "\u003C");
1554    definedEntities.put("&Lacute;", "\u0139");
1555    definedEntities.put("&Lambda;", "\u039B");
1556    definedEntities.put("&Lang;", "\u27EA");
1557    definedEntities.put("&Laplacetrf;", "\u2112");
1558    definedEntities.put("&Larr;", "\u219E");
1559    definedEntities.put("&Lcaron;", "\u013D");
1560    definedEntities.put("&Lcedil;", "\u013B");
1561    definedEntities.put("&Lcy;", "\u041B");
1562    definedEntities.put("&LeftAngleBracket;", "\u27E8");
1563    definedEntities.put("&LeftArrow;", "\u2190");
1564    definedEntities.put("&LeftArrowBar;", "\u21E4");
1565    definedEntities.put("&LeftArrowRightArrow;", "\u21C6");
1566    definedEntities.put("&LeftCeiling;", "\u2308");
1567    definedEntities.put("&LeftDoubleBracket;", "\u27E6");
1568    definedEntities.put("&LeftDownTeeVector;", "\u2961");
1569    definedEntities.put("&LeftDownVector;", "\u21C3");
1570    definedEntities.put("&LeftDownVectorBar;", "\u2959");
1571    definedEntities.put("&LeftFloor;", "\u230A");
1572    definedEntities.put("&LeftRightArrow;", "\u2194");
1573    definedEntities.put("&LeftRightVector;", "\u294E");
1574    definedEntities.put("&LeftTee;", "\u22A3");
1575    definedEntities.put("&LeftTeeArrow;", "\u21A4");
1576    definedEntities.put("&LeftTeeVector;", "\u295A");
1577    definedEntities.put("&LeftTriangle;", "\u22B2");
1578    definedEntities.put("&LeftTriangleBar;", "\u29CF");
1579    definedEntities.put("&LeftTriangleEqual;", "\u22B4");
1580    definedEntities.put("&LeftUpDownVector;", "\u2951");
1581    definedEntities.put("&LeftUpTeeVector;", "\u2960");
1582    definedEntities.put("&LeftUpVector;", "\u21BF");
1583    definedEntities.put("&LeftUpVectorBar;", "\u2958");
1584    definedEntities.put("&LeftVector;", "\u21BC");
1585    definedEntities.put("&LeftVectorBar;", "\u2952");
1586    definedEntities.put("&Leftarrow;", "\u21D0");
1587    definedEntities.put("&Leftrightarrow;", "\u21D4");
1588    definedEntities.put("&LessEqualGreater;", "\u22DA");
1589    definedEntities.put("&LessFullEqual;", "\u2266");
1590    definedEntities.put("&LessGreater;", "\u2276");
1591    definedEntities.put("&LessLess;", "\u2AA1");
1592    definedEntities.put("&LessSlantEqual;", "\u2A7D");
1593    definedEntities.put("&LessTilde;", "\u2272");
1594    definedEntities.put("&Lfr;", "\uD835\uDD0F");
1595    definedEntities.put("&Ll;", "\u22D8");
1596    definedEntities.put("&Lleftarrow;", "\u21DA");
1597    definedEntities.put("&Lmidot;", "\u013F");
1598    definedEntities.put("&LongLeftArrow;", "\u27F5");
1599    definedEntities.put("&LongLeftRightArrow;", "\u27F7");
1600    definedEntities.put("&LongRightArrow;", "\u27F6");
1601    definedEntities.put("&Longleftarrow;", "\u27F8");
1602    definedEntities.put("&Longleftrightarrow;", "\u27FA");
1603    definedEntities.put("&Longrightarrow;", "\u27F9");
1604    definedEntities.put("&Lopf;", "\uD835\uDD43");
1605    definedEntities.put("&LowerLeftArrow;", "\u2199");
1606    definedEntities.put("&LowerRightArrow;", "\u2198");
1607    definedEntities.put("&Lscr;", "\u2112");
1608    definedEntities.put("&Lsh;", "\u21B0");
1609    definedEntities.put("&Lstrok;", "\u0141");
1610    definedEntities.put("&Lt;", "\u226A");
1611    definedEntities.put("&Map;", "\u2905");
1612    definedEntities.put("&Mcy;", "\u041C");
1613    definedEntities.put("&MediumSpace;", "\u205F");
1614    definedEntities.put("&Mellintrf;", "\u2133");
1615    definedEntities.put("&Mfr;", "\uD835\uDD10");
1616    definedEntities.put("&MinusPlus;", "\u2213");
1617    definedEntities.put("&Mopf;", "\uD835\uDD44");
1618    definedEntities.put("&Mscr;", "\u2133");
1619    definedEntities.put("&Mu;", "\u039C");
1620    definedEntities.put("&NJcy;", "\u040A");
1621    definedEntities.put("&Nacute;", "\u0143");
1622    definedEntities.put("&Ncaron;", "\u0147");
1623    definedEntities.put("&Ncedil;", "\u0145");
1624    definedEntities.put("&Ncy;", "\u041D");
1625    definedEntities.put("&NegativeMediumSpace;", "\u200B");
1626    definedEntities.put("&NegativeThickSpace;", "\u200B");
1627    definedEntities.put("&NegativeThinSpace;", "\u200B");
1628    definedEntities.put("&NegativeVeryThinSpace;", "\u200B");
1629    definedEntities.put("&NestedGreaterGreater;", "\u226B");
1630    definedEntities.put("&NestedLessLess;", "\u226A");
1631    definedEntities.put("&NewLine;", "\n");
1632    definedEntities.put("&Nfr;", "\uD835\uDD11");
1633    definedEntities.put("&NoBreak;", "\u2060");
1634    definedEntities.put("&NonBreakingSpace;", "\u00A0");
1635    definedEntities.put("&Nopf;", "\u2115");
1636    definedEntities.put("&Not;", "\u2AEC");
1637    definedEntities.put("&NotCongruent;", "\u2262");
1638    definedEntities.put("&NotCupCap;", "\u226D");
1639    definedEntities.put("&NotDoubleVerticalBar;", "\u2226");
1640    definedEntities.put("&NotElement;", "\u2209");
1641    definedEntities.put("&NotEqual;", "\u2260");
1642    definedEntities.put("&NotEqualTilde;", "\u2242\u0338");
1643    definedEntities.put("&NotExists;", "\u2204");
1644    definedEntities.put("&NotGreater;", "\u226F");
1645    definedEntities.put("&NotGreaterEqual;", "\u2271");
1646    definedEntities.put("&NotGreaterFullEqual;", "\u2267\u0033");
1647    definedEntities.put("&NotGreaterGreater;", "\u226B\u0033");
1648    definedEntities.put("&NotGreaterLess;", "\u2279");
1649    definedEntities.put("&NotGreaterSlantEqual;", "\u2A7E\u0338");
1650    definedEntities.put("&NotGreaterTilde;", "\u2275");
1651    definedEntities.put("&NotHumpDownHump;", "\u224E\u0338");
1652    definedEntities.put("&NotHumpEqual;", "\u224F\u0338");
1653    definedEntities.put("&NotLeftTriangle;", "\u22EA");
1654    definedEntities.put("&NotLeftTriangleBar;", "\u29CF\u0338");
1655    definedEntities.put("&NotLeftTriangleEqual;", "\u22EC");
1656    definedEntities.put("&NotLess;", "\u226E");
1657    definedEntities.put("&NotLessEqual;", "\u2270");
1658    definedEntities.put("&NotLessGreater;", "\u2278");
1659    definedEntities.put("&NotLessLess;", "\u226A\u0338");
1660    definedEntities.put("&NotLessSlantEqual;", "\u2A7D\u0338");
1661    definedEntities.put("&NotLessTilde;", "\u2274");
1662    definedEntities.put("&NotNestedGreaterGreater;", "\u2AA2\u0338");
1663    definedEntities.put("&NotNestedLessLess;", "\u2AA1\u0338");
1664    definedEntities.put("&NotPrecedes;", "\u2280");
1665    definedEntities.put("&NotPrecedesEqual;", "\u2AAF\u0338");
1666    definedEntities.put("&NotPrecedesSlantEqual;", "\u22E0");
1667    definedEntities.put("&NotReverseElement;", "\u220C");
1668    definedEntities.put("&NotRightTriangle;", "\u22EB");
1669    definedEntities.put("&NotRightTriangleBar;", "\u29D0\u0338");
1670    definedEntities.put("&NotRightTriangleEqual;", "\u22ED");
1671    definedEntities.put("&NotSquareSubset;", "\u228F\u0338");
1672    definedEntities.put("&NotSquareSubsetEqual;", "\u22E2");
1673    definedEntities.put("&NotSquareSuperset;", "\u2290\u0338");
1674    definedEntities.put("&NotSquareSupersetEqual;", "\u22E3");
1675    definedEntities.put("&NotSubset;", "\u2282\u20D2");
1676    definedEntities.put("&NotSubsetEqual;", "\u2288");
1677    definedEntities.put("&NotSucceeds;", "\u2281");
1678    definedEntities.put("&NotSucceedsEqual;", "\u2AB0\u0338");
1679    definedEntities.put("&NotSucceedsSlantEqual;", "\u22E1");
1680    definedEntities.put("&NotSucceedsTilde;", "\u227F\u0338");
1681    definedEntities.put("&NotSuperset;", "\u2283\u20D2");
1682    definedEntities.put("&NotSupersetEqual;", "\u2289");
1683    definedEntities.put("&NotTilde;", "\u2241");
1684    definedEntities.put("&NotTildeEqual;", "\u2244");
1685    definedEntities.put("&NotTildeFullEqual;", "\u2247");
1686    definedEntities.put("&NotTildeTilde;", "\u2249");
1687    definedEntities.put("&NotVerticalBar;", "\u2224");
1688    definedEntities.put("&Nscr;", "\uD835\uDCA9");
1689    definedEntities.put("&Ntilde;", "\u00D1");
1690    definedEntities.put("&Nu;", "\u039D");
1691    definedEntities.put("&OElig;", "\u0152");
1692    definedEntities.put("&Oacute;", "\u00D3");
1693    definedEntities.put("&Ocirc;", "\u00D4");
1694    definedEntities.put("&Ocy;", "\u041E");
1695    definedEntities.put("&Odblac;", "\u0150");
1696    definedEntities.put("&Ofr;", "\uD835\uDD12");
1697    definedEntities.put("&Ograve;", "\u00D2");
1698    definedEntities.put("&Omacr;", "\u014C");
1699    definedEntities.put("&Omega;", "\u03A9");
1700    definedEntities.put("&Omicron;", "\u039F");
1701    definedEntities.put("&Oopf;", "\uD835\uDD46");
1702    definedEntities.put("&OpenCurlyDoubleQuote;", "\u201C");
1703    definedEntities.put("&OpenCurlyQuote;", "\u2018");
1704    definedEntities.put("&Or;", "\u2A54");
1705    definedEntities.put("&Oscr;", "\uD835\uDCAA");
1706    definedEntities.put("&Oslash;", "\u00D8");
1707    definedEntities.put("&Otilde;", "\u00D5");
1708    definedEntities.put("&Otimes;", "\u2A37");
1709    definedEntities.put("&Ouml;", "\u00D6");
1710    definedEntities.put("&OverBar;", "\u203E");
1711    definedEntities.put("&OverBrace;", "\u23DE");
1712    definedEntities.put("&OverBracket;", "\u23B4");
1713    definedEntities.put("&OverParenthesis;", "\u23DC");
1714    definedEntities.put("&PartialD;", "\u2202");
1715    definedEntities.put("&Pcy;", "\u041F");
1716    definedEntities.put("&Pfr;", "\uD835\uDD13");
1717    definedEntities.put("&Phi;", "\u03A6");
1718    definedEntities.put("&Pi;", "\u03A0");
1719    definedEntities.put("&PlusMinus;", "\u00B1");
1720    definedEntities.put("&Poincareplane;", "\u210C");
1721    definedEntities.put("&Popf;", "\u2119");
1722    definedEntities.put("&Pr;", "\u2ABB");
1723    definedEntities.put("&Precedes;", "\u227A");
1724    definedEntities.put("&PrecedesEqual;", "\u2AAF");
1725    definedEntities.put("&PrecedesSlantEqual;", "\u227C");
1726    definedEntities.put("&PrecedesTilde;", "\u227E");
1727    definedEntities.put("&Prime;", "\u2033");
1728    definedEntities.put("&Product;", "\u220F");
1729    definedEntities.put("&Proportion;", "\u2237");
1730    definedEntities.put("&Proportional;", "\u221D");
1731    definedEntities.put("&Pscr;", "\uD835\uDCAB");
1732    definedEntities.put("&Psi;", "\u03A8");
1733    definedEntities.put("&QUOT;", "\\u0022");
1734    definedEntities.put("&Qfr;", "\uD835\uDD14");
1735    definedEntities.put("&Qopf;", "\u211A");
1736    definedEntities.put("&Qscr;", "\uD835\uDCAC");
1737    definedEntities.put("&RBarr;", "\u2910");
1738    definedEntities.put("&REG;", "\u00AE");
1739    definedEntities.put("&Racute;", "\u0154");
1740    definedEntities.put("&Rang;", "\u27EB");
1741    definedEntities.put("&Rarr;", "\u21A0");
1742    definedEntities.put("&Rarrtl;", "\u2916");
1743    definedEntities.put("&Rcaron;", "\u0158");
1744    definedEntities.put("&Rcedil;", "\u0156");
1745    definedEntities.put("&Rcy;", "\u0420");
1746    definedEntities.put("&Re;", "\u211C");
1747    definedEntities.put("&ReverseElement;", "\u220B");
1748    definedEntities.put("&ReverseEquilibrium;", "\u21CB");
1749    definedEntities.put("&ReverseUpEquilibrium;", "\u296F");
1750    definedEntities.put("&Rfr;", "\u211C");
1751    definedEntities.put("&Rho;", "\u03A1");
1752    definedEntities.put("&RightAngleBracket;", "\u27E9");
1753    definedEntities.put("&RightArrow;", "\u2192");
1754    definedEntities.put("&RightArrowBar;", "\u21E5");
1755    definedEntities.put("&RightArrowLeftArrow;", "\u21C4");
1756    definedEntities.put("&RightCeiling;", "\u2309");
1757    definedEntities.put("&RightDoubleBracket;", "\u27E7");
1758    definedEntities.put("&RightDownTeeVector;", "\u295D");
1759    definedEntities.put("&RightDownVector;", "\u21C2");
1760    definedEntities.put("&RightDownVectorBar;", "\u2955");
1761    definedEntities.put("&RightFloor;", "\u230B");
1762    definedEntities.put("&RightTee;", "\u22A2");
1763    definedEntities.put("&RightTeeArrow;", "\u21A6");
1764    definedEntities.put("&RightTeeVector;", "\u295B");
1765    definedEntities.put("&RightTriangle;", "\u22B3");
1766    definedEntities.put("&RightTriangleBar;", "\u29D0");
1767    definedEntities.put("&RightTriangleEqual;", "\u22B5");
1768    definedEntities.put("&RightUpDownVector;", "\u294F");
1769    definedEntities.put("&RightUpTeeVector;", "\u295C");
1770    definedEntities.put("&RightUpVector;", "\u21BE");
1771    definedEntities.put("&RightUpVectorBar;", "\u2954");
1772    definedEntities.put("&RightVector;", "\u21C0");
1773    definedEntities.put("&RightVectorBar;", "\u2953");
1774    definedEntities.put("&Rightarrow;", "\u21D2");
1775    definedEntities.put("&Ropf;", "\u211D");
1776    definedEntities.put("&RoundImplies;", "\u2970");
1777    definedEntities.put("&Rrightarrow;", "\u21DB");
1778    definedEntities.put("&Rscr;", "\u211B");
1779    definedEntities.put("&Rsh;", "\u21B1");
1780    definedEntities.put("&RuleDelayed;", "\u29F4");
1781    definedEntities.put("&SHCHcy;", "\u0429");
1782    definedEntities.put("&SHcy;", "\u0428");
1783    definedEntities.put("&SOFTcy;", "\u042C");
1784    definedEntities.put("&Sacute;", "\u015A");
1785    definedEntities.put("&Sc;", "\u2ABC");
1786    definedEntities.put("&Scaron;", "\u0160");
1787    definedEntities.put("&Scedil;", "\u015E");
1788    definedEntities.put("&Scirc;", "\u015C");
1789    definedEntities.put("&Scy;", "\u0421");
1790    definedEntities.put("&Sfr;", "\uD835\uDD16");
1791    definedEntities.put("&ShortDownArrow;", "\u2193");
1792    definedEntities.put("&ShortLeftArrow;", "\u2190");
1793    definedEntities.put("&ShortRightArrow;", "\u2192");
1794    definedEntities.put("&ShortUpArrow;", "\u2191");
1795    definedEntities.put("&Sigma;", "\u03A3");
1796    definedEntities.put("&SmallCircle;", "\u2218");
1797    definedEntities.put("&Sopf;", "\uD835\uDD4A");
1798    definedEntities.put("&Sqrt;", "\u221A");
1799    definedEntities.put("&Square;", "\u25A1");
1800    definedEntities.put("&SquareIntersection;", "\u2293");
1801    definedEntities.put("&SquareSubset;", "\u228F");
1802    definedEntities.put("&SquareSubsetEqual;", "\u2291");
1803    definedEntities.put("&SquareSuperset;", "\u2290");
1804    definedEntities.put("&SquareSupersetEqual;", "\u2292");
1805    definedEntities.put("&SquareUnion;", "\u2294");
1806    definedEntities.put("&Sscr;", "\uD835\uDCAE");
1807    definedEntities.put("&Star;", "\u22C6");
1808    definedEntities.put("&Sub;", "\u22D0");
1809    definedEntities.put("&Subset;", "\u22D0");
1810    definedEntities.put("&SubsetEqual;", "\u2286");
1811    definedEntities.put("&Succeeds;", "\u227B");
1812    definedEntities.put("&SucceedsEqual;", "\u2AB0");
1813    definedEntities.put("&SucceedsSlantEqual;", "\u227D");
1814    definedEntities.put("&SucceedsTilde;", "\u227F");
1815    definedEntities.put("&SuchThat;", "\u220B");
1816    definedEntities.put("&Sum;", "\u2211");
1817    definedEntities.put("&Sup;", "\u22D1");
1818    definedEntities.put("&Superset;", "\u2283");
1819    definedEntities.put("&SupersetEqual;", "\u2287");
1820    definedEntities.put("&Supset;", "\u22D1");
1821    definedEntities.put("&THORN;", "\u00DE");
1822    definedEntities.put("&TRADE;", "\u2122");
1823    definedEntities.put("&TSHcy;", "\u040B");
1824    definedEntities.put("&TScy;", "\u0426");
1825    definedEntities.put("&Tab;", "\u0009");
1826    definedEntities.put("&Tau;", "\u03A4");
1827    definedEntities.put("&Tcaron;", "\u0164");
1828    definedEntities.put("&Tcedil;", "\u0162");
1829    definedEntities.put("&Tcy;", "\u0422");
1830    definedEntities.put("&Tfr;", "\uD835\uDD17");
1831    definedEntities.put("&Therefore;", "\u2234");
1832    definedEntities.put("&Theta;", "\u0398");
1833    definedEntities.put("&ThickSpace;", "\u205F\u200A");
1834    definedEntities.put("&ThinSpace;", "\u2009");
1835    definedEntities.put("&Tilde;", "\u223C");
1836    definedEntities.put("&TildeEqual;", "\u2243");
1837    definedEntities.put("&TildeFullEqual;", "\u2245");
1838    definedEntities.put("&TildeTilde;", "\u2248");
1839    definedEntities.put("&Topf;", "\uD835\uDD4B");
1840    definedEntities.put("&TripleDot;", "\u20DB");
1841    definedEntities.put("&Tscr;", "\uD835\uDCAF");
1842    definedEntities.put("&Tstrok;", "\u0166");
1843    definedEntities.put("&Uacute;", "\u00DA");
1844    definedEntities.put("&Uarr;", "\u219F");
1845    definedEntities.put("&Uarrocir;", "\u2949");
1846    definedEntities.put("&Ubrcy;", "\u040E");
1847    definedEntities.put("&Ubreve;", "\u016C");
1848    definedEntities.put("&Ucirc;", "\u00DB");
1849    definedEntities.put("&Ucy;", "\u0423");
1850    definedEntities.put("&Udblac;", "\u0170");
1851    definedEntities.put("&Ufr;", "\uD835\uDD18");
1852    definedEntities.put("&Ugrave;", "\u00D9");
1853    definedEntities.put("&Umacr;", "\u016A");
1854    definedEntities.put("&UnderBar;", "\u005F");
1855    definedEntities.put("&UnderBrace;", "\u23DF");
1856    definedEntities.put("&UnderBracket;", "\u23B5");
1857    definedEntities.put("&UnderParenthesis;", "\u23DD");
1858    definedEntities.put("&Union;", "\u22C3");
1859    definedEntities.put("&UnionPlus;", "\u228E");
1860    definedEntities.put("&Uogon;", "\u0172");
1861    definedEntities.put("&Uopf;", "\uD835\uDD4C");
1862    definedEntities.put("&UpArrow;", "\u2191");
1863    definedEntities.put("&UpArrowBar;", "\u2912");
1864    definedEntities.put("&UpArrowDownArrow;", "\u21C5");
1865    definedEntities.put("&UpDownArrow;", "\u2195");
1866    definedEntities.put("&UpEquilibrium;", "\u296E");
1867    definedEntities.put("&UpTee;", "\u22A5");
1868    definedEntities.put("&UpTeeArrow;", "\u21A5");
1869    definedEntities.put("&Uparrow;", "\u21D1");
1870    definedEntities.put("&Updownarrow;", "\u21D5");
1871    definedEntities.put("&UpperLeftArrow;", "\u2196");
1872    definedEntities.put("&UpperRightArrow;", "\u2197");
1873    definedEntities.put("&Upsi;", "\u03D2");
1874    definedEntities.put("&Upsilon;", "\u03A5");
1875    definedEntities.put("&Uring;", "\u016E");
1876    definedEntities.put("&Uscr;", "\uD835\uDCB0");
1877    definedEntities.put("&Utilde;", "\u0168");
1878    definedEntities.put("&Uuml;", "\u00DC");
1879    definedEntities.put("&VDash;", "\u22AB");
1880    definedEntities.put("&Vbar;", "\u2AEB");
1881    definedEntities.put("&Vcy;", "\u0412");
1882    definedEntities.put("&Vdash;", "\u22A9");
1883    definedEntities.put("&Vdashl;", "\u2AE6");
1884    definedEntities.put("&Vee;", "\u22C1");
1885    definedEntities.put("&Verbar;", "\u2016");
1886    definedEntities.put("&Vert;", "\u2016");
1887    definedEntities.put("&VerticalBar;", "\u2223");
1888    definedEntities.put("&VerticalLine;", "\u007C");
1889    definedEntities.put("&VerticalSeparator;", "\u2758");
1890    definedEntities.put("&VerticalTilde;", "\u2240");
1891    definedEntities.put("&VeryThinSpace;", "\u200A");
1892    definedEntities.put("&Vfr;", "\uD835\uDD19");
1893    definedEntities.put("&Vopf;", "\uD835\uDD4D");
1894    definedEntities.put("&Vscr;", "\uD835\uDCB1");
1895    definedEntities.put("&Vvdash;", "\u22AA");
1896    definedEntities.put("&Wcirc;", "\u0174");
1897    definedEntities.put("&Wedge;", "\u22C0");
1898    definedEntities.put("&Wfr;", "\uD835\uDD1A");
1899    definedEntities.put("&Wopf;", "\uD835\uDD4E");
1900    definedEntities.put("&Wscr;", "\uD835\uDCB2");
1901    definedEntities.put("&Xfr;", "\uD835\uDD1B");
1902    definedEntities.put("&Xi;", "\u039E");
1903    definedEntities.put("&Xopf;", "\uD835\uDD4F");
1904    definedEntities.put("&Xscr;", "\uD835\uDCB3");
1905    definedEntities.put("&YAcy;", "\u042F");
1906    definedEntities.put("&YIcy;", "\u0407");
1907    definedEntities.put("&YUcy;", "\u042E");
1908    definedEntities.put("&Yacute;", "\u00DD");
1909    definedEntities.put("&Ycirc;", "\u0176");
1910    definedEntities.put("&Ycy;", "\u042B");
1911    definedEntities.put("&Yfr;", "\uD835\uDD1C");
1912    definedEntities.put("&Yopf;", "\uD835\uDD50");
1913    definedEntities.put("&Yscr;", "\uD835\uDCB4");
1914    definedEntities.put("&Yuml;", "\u0178");
1915    definedEntities.put("&ZHcy;", "\u0416");
1916    definedEntities.put("&Zacute;", "\u0179");
1917    definedEntities.put("&Zcaron;", "\u017D");
1918    definedEntities.put("&Zcy;", "\u0417");
1919    definedEntities.put("&Zdot;", "\u017B");
1920    definedEntities.put("&ZeroWidthSpace;", "\u200B");
1921    definedEntities.put("&Zeta;", "\u0396");
1922    definedEntities.put("&Zfr;", "\u2128");
1923    definedEntities.put("&Zopf;", "\u2124");
1924    definedEntities.put("&Zscr;", "\uD835\uDCB5");
1925    definedEntities.put("&aacute;", "\u00E1");
1926    definedEntities.put("&abreve;", "\u0103");
1927    definedEntities.put("&ac;", "\u223E");
1928    definedEntities.put("&acE;", "\u223E\u0333");
1929    definedEntities.put("&acd;", "\u223F");
1930    definedEntities.put("&acirc;", "\u00E2");
1931    definedEntities.put("&acute;", "\u00B4");
1932    definedEntities.put("&acy;", "\u0430");
1933    definedEntities.put("&aelig;", "\u00E6");
1934    definedEntities.put("&af;", "\u2061");
1935    definedEntities.put("&afr;", "\uD835\uDD1E");
1936    definedEntities.put("&agrave;", "\u00E0");
1937    definedEntities.put("&alefsym;", "\u2135");
1938    definedEntities.put("&aleph;", "\u2135");
1939    definedEntities.put("&alpha;", "\u03B1");
1940    definedEntities.put("&amacr;", "\u0101");
1941    definedEntities.put("&amalg;", "\u2A3F");
1942    definedEntities.put("&amp;", "\u0026");
1943    definedEntities.put("&and;", "\u2227");
1944    definedEntities.put("&andand;", "\u2A55");
1945    definedEntities.put("&andd;", "\u2A5C");
1946    definedEntities.put("&andslope;", "\u2A58");
1947    definedEntities.put("&andv;", "\u2A5A");
1948    definedEntities.put("&ang;", "\u2220");
1949    definedEntities.put("&ange;", "\u29A4");
1950    definedEntities.put("&angle;", "\u2220");
1951    definedEntities.put("&angmsd;", "\u2221");
1952    definedEntities.put("&angmsdaa;", "\u29A8");
1953    definedEntities.put("&angmsdab;", "\u29A9");
1954    definedEntities.put("&angmsdac;", "\u29AA");
1955    definedEntities.put("&angmsdad;", "\u29AB");
1956    definedEntities.put("&angmsdae;", "\u29AC");
1957    definedEntities.put("&angmsdaf;", "\u29AD");
1958    definedEntities.put("&angmsdag;", "\u29AE");
1959    definedEntities.put("&angmsdah;", "\u29AF");
1960    definedEntities.put("&angrt;", "\u221F");
1961    definedEntities.put("&angrtvb;", "\u22BE");
1962    definedEntities.put("&angrtvbd;", "\u299D");
1963    definedEntities.put("&angsph;", "\u2222");
1964    definedEntities.put("&angst;", "\u00C5");
1965    definedEntities.put("&angzarr;", "\u237C");
1966    definedEntities.put("&aogon;", "\u0105");
1967    definedEntities.put("&aopf;", "\uD835\uDD52");
1968    definedEntities.put("&ap;", "\u2248");
1969    definedEntities.put("&apE;", "\u2A70");
1970    definedEntities.put("&apacir;", "\u2A6F");
1971    definedEntities.put("&ape;", "\u224A");
1972    definedEntities.put("&apid;", "\u224B");
1973    definedEntities.put("&apos;", "\u0027");
1974    definedEntities.put("&approx;", "\u2248");
1975    definedEntities.put("&approxeq;", "\u224A");
1976    definedEntities.put("&aring;", "\u00E5");
1977    definedEntities.put("&ascr;", "\uD835\uDCB6");
1978    definedEntities.put("&ast;", "\u002A");
1979    definedEntities.put("&asymp;", "\u2248");
1980    definedEntities.put("&asympeq;", "\u224D");
1981    definedEntities.put("&atilde;", "\u00E3");
1982    definedEntities.put("&auml;", "\u00E4");
1983    definedEntities.put("&awconint;", "\u2233");
1984    definedEntities.put("&awint;", "\u2A11");
1985    definedEntities.put("&bNot;", "\u2AED");
1986    definedEntities.put("&backcong;", "\u224C");
1987    definedEntities.put("&backepsilon;", "\u03F6");
1988    definedEntities.put("&backprime;", "\u2035");
1989    definedEntities.put("&backsim;", "\u223D");
1990    definedEntities.put("&backsimeq;", "\u22CD");
1991    definedEntities.put("&barvee;", "\u22BD");
1992    definedEntities.put("&barwed;", "\u2305");
1993    definedEntities.put("&barwedge;", "\u2305");
1994    definedEntities.put("&bbrk;", "\u23B5");
1995    definedEntities.put("&bbrktbrk;", "\u23B6");
1996    definedEntities.put("&bcong;", "\u224C");
1997    definedEntities.put("&bcy;", "\u0431");
1998    definedEntities.put("&bdquo;", "\u201E");
1999    definedEntities.put("&becaus;", "\u2235");
2000    definedEntities.put("&because;", "\u2235");
2001    definedEntities.put("&bemptyv;", "\u29B0");
2002    definedEntities.put("&bepsi;", "\u03F6");
2003    definedEntities.put("&bernou;", "\u212C");
2004    definedEntities.put("&beta;", "\u03B2");
2005    definedEntities.put("&beth;", "\u2136");
2006    definedEntities.put("&between;", "\u226C");
2007    definedEntities.put("&bfr;", "\uD835\uDD1F");
2008    definedEntities.put("&bigcap;", "\u22C2");
2009    definedEntities.put("&bigcirc;", "\u25EF");
2010    definedEntities.put("&bigcup;", "\u22C3");
2011    definedEntities.put("&bigodot;", "\u2A00");
2012    definedEntities.put("&bigoplus;", "\u2A01");
2013    definedEntities.put("&bigotimes;", "\u2A02");
2014    definedEntities.put("&bigsqcup;", "\u2A06");
2015    definedEntities.put("&bigstar;", "\u2605");
2016    definedEntities.put("&bigtriangledown;", "\u25BD");
2017    definedEntities.put("&bigtriangleup;", "\u25B3");
2018    definedEntities.put("&biguplus;", "\u2A04");
2019    definedEntities.put("&bigvee;", "\u22C1");
2020    definedEntities.put("&bigwedge;", "\u22C0");
2021    definedEntities.put("&bkarow;", "\u290D");
2022    definedEntities.put("&blacklozenge;", "\u29EB");
2023    definedEntities.put("&blacksquare;", "\u25AA");
2024    definedEntities.put("&blacktriangle;", "\u25B4");
2025    definedEntities.put("&blacktriangledown;", "\u25BE");
2026    definedEntities.put("&blacktriangleleft;", "\u25C2");
2027    definedEntities.put("&blacktriangleright;", "\u25B8");
2028    definedEntities.put("&blank;", "\u2423");
2029    definedEntities.put("&blk12;", "\u2592");
2030    definedEntities.put("&blk14;", "\u2591");
2031    definedEntities.put("&blk34;", "\u2593");
2032    definedEntities.put("&block;", "\u2588");
2033    definedEntities.put("&bne;", "\u003D\u20E5");
2034    definedEntities.put("&bnequiv;", "\u2261\u20E5");
2035    definedEntities.put("&bnot;", "\u2310");
2036    definedEntities.put("&bopf;", "\uD835\uDD53");
2037    definedEntities.put("&bot;", "\u22A5");
2038    definedEntities.put("&bottom;", "\u22A5");
2039    definedEntities.put("&bowtie;", "\u22C8");
2040    definedEntities.put("&boxDL;", "\u2557");
2041    definedEntities.put("&boxDR;", "\u2554");
2042    definedEntities.put("&boxDl;", "\u2556");
2043    definedEntities.put("&boxDr;", "\u2553");
2044    definedEntities.put("&boxH;", "\u2550");
2045    definedEntities.put("&boxHD;", "\u2566");
2046    definedEntities.put("&boxHU;", "\u2569");
2047    definedEntities.put("&boxHd;", "\u2564");
2048    definedEntities.put("&boxHu;", "\u2567");
2049    definedEntities.put("&boxUL;", "\u255D");
2050    definedEntities.put("&boxUR;", "\u255A");
2051    definedEntities.put("&boxUl;", "\u255C");
2052    definedEntities.put("&boxUr;", "\u2559");
2053    definedEntities.put("&boxV;", "\u2551");
2054    definedEntities.put("&boxVH;", "\u256C");
2055    definedEntities.put("&boxVL;", "\u2563");
2056    definedEntities.put("&boxVR;", "\u2560");
2057    definedEntities.put("&boxVh;", "\u256B");
2058    definedEntities.put("&boxVl;", "\u2562");
2059    definedEntities.put("&boxVr;", "\u255F");
2060    definedEntities.put("&boxbox;", "\u29C9");
2061    definedEntities.put("&boxdL;", "\u2555");
2062    definedEntities.put("&boxdR;", "\u2552");
2063    definedEntities.put("&boxdl;", "\u2510");
2064    definedEntities.put("&boxdr;", "\u250C");
2065    definedEntities.put("&boxh;", "\u2500");
2066    definedEntities.put("&boxhD;", "\u2565");
2067    definedEntities.put("&boxhU;", "\u2568");
2068    definedEntities.put("&boxhd;", "\u252C");
2069    definedEntities.put("&boxhu;", "\u2534");
2070    definedEntities.put("&boxminus;", "\u229F");
2071    definedEntities.put("&boxplus;", "\u229E");
2072    definedEntities.put("&boxtimes;", "\u22A0");
2073    definedEntities.put("&boxuL;", "\u255B");
2074    definedEntities.put("&boxuR;", "\u2558");
2075    definedEntities.put("&boxul;", "\u2518");
2076    definedEntities.put("&boxur;", "\u2514");
2077    definedEntities.put("&boxv;", "\u2502");
2078    definedEntities.put("&boxvH;", "\u256A");
2079    definedEntities.put("&boxvL;", "\u2561");
2080    definedEntities.put("&boxvR;", "\u255E");
2081    definedEntities.put("&boxvh;", "\u253C");
2082    definedEntities.put("&boxvl;", "\u2524");
2083    definedEntities.put("&boxvr;", "\u251C");
2084    definedEntities.put("&bprime;", "\u2035");
2085    definedEntities.put("&breve;", "\u02D8");
2086    definedEntities.put("&brvbar;", "\u00A6");
2087    definedEntities.put("&bscr;", "\uD835\uDCB7");
2088    definedEntities.put("&bsemi;", "\u204F");
2089    definedEntities.put("&bsim;", "\u223D");
2090    definedEntities.put("&bsime;", "\u22CD");
2091    definedEntities.put("&bsol;", "\\u005C");
2092    definedEntities.put("&bsolb;", "\u29C5");
2093    definedEntities.put("&bsolhsub;", "\u27C8");
2094    definedEntities.put("&bull;", "\u2022");
2095    definedEntities.put("&bullet;", "\u2022");
2096    definedEntities.put("&bump;", "\u224E");
2097    definedEntities.put("&bumpE;", "\u2AAE");
2098    definedEntities.put("&bumpe;", "\u224F");
2099    definedEntities.put("&bumpeq;", "\u224F");
2100    definedEntities.put("&cacute;", "\u0107");
2101    definedEntities.put("&cap;", "\u2229");
2102    definedEntities.put("&capand;", "\u2A44");
2103    definedEntities.put("&capbrcup;", "\u2A49");
2104    definedEntities.put("&capcap;", "\u2A4B");
2105    definedEntities.put("&capcup;", "\u2A47");
2106    definedEntities.put("&capdot;", "\u2A40");
2107    definedEntities.put("&caps;", "\u2229\uFE00");
2108    definedEntities.put("&caret;", "\u2041");
2109    definedEntities.put("&caron;", "\u02C7");
2110    definedEntities.put("&ccaps;", "\u2A4D");
2111    definedEntities.put("&ccaron;", "\u010D");
2112    definedEntities.put("&ccedil;", "\u00E7");
2113    definedEntities.put("&ccirc;", "\u0109");
2114    definedEntities.put("&ccups;", "\u2A4C");
2115    definedEntities.put("&ccupssm;", "\u2A50");
2116    definedEntities.put("&cdot;", "\u010B");
2117    definedEntities.put("&cedil;", "\u00B8");
2118    definedEntities.put("&cemptyv;", "\u29B2");
2119    definedEntities.put("&cent;", "\u00A2");
2120    definedEntities.put("&centerdot;", "\u00B7");
2121    definedEntities.put("&cfr;", "\uD835\uDD20");
2122    definedEntities.put("&chcy;", "\u0447");
2123    definedEntities.put("&check;", "\u2713");
2124    definedEntities.put("&checkmark;", "\u2713");
2125    definedEntities.put("&chi;", "\u03C7");
2126    definedEntities.put("&cir;", "\u25CB");
2127    definedEntities.put("&cirE;", "\u29C3");
2128    definedEntities.put("&circ;", "\u02C6");
2129    definedEntities.put("&circeq;", "\u2257");
2130    definedEntities.put("&circlearrowleft;", "\u21BA");
2131    definedEntities.put("&circlearrowright;", "\u21BB");
2132    definedEntities.put("&circledR;", "\u00AE");
2133    definedEntities.put("&circledS;", "\u24C8");
2134    definedEntities.put("&circledast;", "\u229B");
2135    definedEntities.put("&circledcirc;", "\u229A");
2136    definedEntities.put("&circleddash;", "\u229D");
2137    definedEntities.put("&cire;", "\u2257");
2138    definedEntities.put("&cirfnint;", "\u2A10");
2139    definedEntities.put("&cirmid;", "\u2AEF");
2140    definedEntities.put("&cirscir;", "\u29C2");
2141    definedEntities.put("&clubs;", "\u2663");
2142    definedEntities.put("&clubsuit;", "\u2663");
2143    definedEntities.put("&colon;", "\u003A");
2144    definedEntities.put("&colone;", "\u2254");
2145    definedEntities.put("&coloneq;", "\u2254");
2146    definedEntities.put("&comma;", "\u002C");
2147    definedEntities.put("&commat;", "\u0040");
2148    definedEntities.put("&comp;", "\u2201");
2149    definedEntities.put("&compfn;", "\u2218");
2150    definedEntities.put("&complement;", "\u2201");
2151    definedEntities.put("&complexes;", "\u2102");
2152    definedEntities.put("&cong;", "\u2245");
2153    definedEntities.put("&congdot;", "\u2A6D");
2154    definedEntities.put("&conint;", "\u222E");
2155    definedEntities.put("&copf;", "\uD835\uDD54");
2156    definedEntities.put("&coprod;", "\u2210");
2157    definedEntities.put("&copy;", "\u00A9");
2158    definedEntities.put("&copysr;", "\u2117");
2159    definedEntities.put("&crarr;", "\u21B5");
2160    definedEntities.put("&cross;", "\u2717");
2161    definedEntities.put("&cscr;", "\uD835\uDCB8");
2162    definedEntities.put("&csub;", "\u2ACF");
2163    definedEntities.put("&csube;", "\u2AD1");
2164    definedEntities.put("&csup;", "\u2AD0");
2165    definedEntities.put("&csupe;", "\u2AD2");
2166    definedEntities.put("&ctdot;", "\u22EF");
2167    definedEntities.put("&cudarrl;", "\u2938");
2168    definedEntities.put("&cudarrr;", "\u2935");
2169    definedEntities.put("&cuepr;", "\u22DE");
2170    definedEntities.put("&cuesc;", "\u22DF");
2171    definedEntities.put("&cularr;", "\u21B6");
2172    definedEntities.put("&cularrp;", "\u293D");
2173    definedEntities.put("&cup;", "\u222A");
2174    definedEntities.put("&cupbrcap;", "\u2A48");
2175    definedEntities.put("&cupcap;", "\u2A46");
2176    definedEntities.put("&cupcup;", "\u2A4A");
2177    definedEntities.put("&cupdot;", "\u228D");
2178    definedEntities.put("&cupor;", "\u2A45");
2179    definedEntities.put("&cups;", "\u222A\uFE00");
2180    definedEntities.put("&curarr;", "\u21B7");
2181    definedEntities.put("&curarrm;", "\u293C");
2182    definedEntities.put("&curlyeqprec;", "\u22DE");
2183    definedEntities.put("&curlyeqsucc;", "\u22DF");
2184    definedEntities.put("&curlyvee;", "\u22CE");
2185    definedEntities.put("&curlywedge;", "\u22CF");
2186    definedEntities.put("&curren;", "\u00A4");
2187    definedEntities.put("&curvearrowleft;", "\u21B6");
2188    definedEntities.put("&curvearrowright;", "\u21B7");
2189    definedEntities.put("&cuvee;", "\u22CE");
2190    definedEntities.put("&cuwed;", "\u22CF");
2191    definedEntities.put("&cwconint;", "\u2232");
2192    definedEntities.put("&cwint;", "\u2231");
2193    definedEntities.put("&cylcty;", "\u232D");
2194    definedEntities.put("&dArr;", "\u21D3");
2195    definedEntities.put("&dHar;", "\u2965");
2196    definedEntities.put("&dagger;", "\u2020");
2197    definedEntities.put("&daleth;", "\u2138");
2198    definedEntities.put("&darr;", "\u2193");
2199    definedEntities.put("&dash;", "\u2010");
2200    definedEntities.put("&dashv;", "\u22A3");
2201    definedEntities.put("&dbkarow;", "\u290F");
2202    definedEntities.put("&dblac;", "\u02DD");
2203    definedEntities.put("&dcaron;", "\u010F");
2204    definedEntities.put("&dcy;", "\u0434");
2205    definedEntities.put("&dd;", "\u2146");
2206    definedEntities.put("&ddagger;", "\u2021");
2207    definedEntities.put("&ddarr;", "\u21CA");
2208    definedEntities.put("&ddotseq;", "\u2A77");
2209    definedEntities.put("&deg;", "\u00B0");
2210    definedEntities.put("&delta;", "\u03B4");
2211    definedEntities.put("&demptyv;", "\u29B1");
2212    definedEntities.put("&dfisht;", "\u297F");
2213    definedEntities.put("&dfr;", "\uD835\uDD21");
2214    definedEntities.put("&dharl;", "\u21C3");
2215    definedEntities.put("&dharr;", "\u21C2");
2216    definedEntities.put("&diam;", "\u22C4");
2217    definedEntities.put("&diamond;", "\u22C4");
2218    definedEntities.put("&diamondsuit;", "\u2666");
2219    definedEntities.put("&diams;", "\u2666");
2220    definedEntities.put("&die;", "\u00A8");
2221    definedEntities.put("&digamma;", "\u03DD");
2222    definedEntities.put("&disin;", "\u22F2");
2223    definedEntities.put("&div;", "\u00F7");
2224    definedEntities.put("&divide;", "\u00F7");
2225    definedEntities.put("&divideontimes;", "\u22C7");
2226    definedEntities.put("&divonx;", "\u22C7");
2227    definedEntities.put("&djcy;", "\u0452");
2228    definedEntities.put("&dlcorn;", "\u231E");
2229    definedEntities.put("&dlcrop;", "\u230D");
2230    definedEntities.put("&dollar;", "\u0024");
2231    definedEntities.put("&dopf;", "\uD835\uDD55");
2232    definedEntities.put("&dot;", "\u02D9");
2233    definedEntities.put("&doteq;", "\u2250");
2234    definedEntities.put("&doteqdot;", "\u2251");
2235    definedEntities.put("&dotminus;", "\u2238");
2236    definedEntities.put("&dotplus;", "\u2214");
2237    definedEntities.put("&dotsquare;", "\u22A1");
2238    definedEntities.put("&doublebarwedge;", "\u2306");
2239    definedEntities.put("&downarrow;", "\u2193");
2240    definedEntities.put("&downdownarrows;", "\u21CA");
2241    definedEntities.put("&downharpoonleft;", "\u21C3");
2242    definedEntities.put("&downharpoonright;", "\u21C2");
2243    definedEntities.put("&drbkarow;", "\u2910");
2244    definedEntities.put("&drcorn;", "\u231F");
2245    definedEntities.put("&drcrop;", "\u230C");
2246    definedEntities.put("&dscr;", "\uD835\uDCB9");
2247    definedEntities.put("&dscy;", "\u0455");
2248    definedEntities.put("&dsol;", "\u29F6");
2249    definedEntities.put("&dstrok;", "\u0111");
2250    definedEntities.put("&dtdot;", "\u22F1");
2251    definedEntities.put("&dtri;", "\u25BF");
2252    definedEntities.put("&dtrif;", "\u25BE");
2253    definedEntities.put("&duarr;", "\u21F5");
2254    definedEntities.put("&duhar;", "\u296F");
2255    definedEntities.put("&dwangle;", "\u29A6");
2256    definedEntities.put("&dzcy;", "\u045F");
2257    definedEntities.put("&dzigrarr;", "\u27FF");
2258    definedEntities.put("&eDDot;", "\u2A77");
2259    definedEntities.put("&eDot;", "\u2251");
2260    definedEntities.put("&eacute;", "\u00E9");
2261    definedEntities.put("&easter;", "\u2A6E");
2262    definedEntities.put("&ecaron;", "\u011B");
2263    definedEntities.put("&ecir;", "\u2256");
2264    definedEntities.put("&ecirc;", "\u00EA");
2265    definedEntities.put("&ecolon;", "\u2255");
2266    definedEntities.put("&ecy;", "\u044D");
2267    definedEntities.put("&edot;", "\u0117");
2268    definedEntities.put("&ee;", "\u2147");
2269    definedEntities.put("&efDot;", "\u2252");
2270    definedEntities.put("&efr;", "\uD835\uDD22");
2271    definedEntities.put("&eg;", "\u2A9A");
2272    definedEntities.put("&egrave;", "\u00E8");
2273    definedEntities.put("&egs;", "\u2A96");
2274    definedEntities.put("&egsdot;", "\u2A98");
2275    definedEntities.put("&el;", "\u2A99");
2276    definedEntities.put("&elinters;", "\u23E7");
2277    definedEntities.put("&ell;", "\u2113");
2278    definedEntities.put("&els;", "\u2A95");
2279    definedEntities.put("&elsdot;", "\u2A97");
2280    definedEntities.put("&emacr;", "\u0113");
2281    definedEntities.put("&empty;", "\u2205");
2282    definedEntities.put("&emptyset;", "\u2205");
2283    definedEntities.put("&emptyv;", "\u2205");
2284    definedEntities.put("&emsp13;", "\u2004");
2285    definedEntities.put("&emsp14;", "\u2005");
2286    definedEntities.put("&emsp;", "\u2003");
2287    definedEntities.put("&eng;", "\u014B");
2288    definedEntities.put("&ensp;", "\u2002");
2289    definedEntities.put("&eogon;", "\u0119");
2290    definedEntities.put("&eopf;", "\uD835\uDD56");
2291    definedEntities.put("&epar;", "\u22D5");
2292    definedEntities.put("&eparsl;", "\u29E3");
2293    definedEntities.put("&eplus;", "\u2A71");
2294    definedEntities.put("&epsi;", "\u03B5");
2295    definedEntities.put("&epsilon;", "\u03B5");
2296    definedEntities.put("&epsiv;", "\u03F5");
2297    definedEntities.put("&eqcirc;", "\u2256");
2298    definedEntities.put("&eqcolon;", "\u2255");
2299    definedEntities.put("&eqsim;", "\u2242");
2300    definedEntities.put("&eqslantgtr;", "\u2A96");
2301    definedEntities.put("&eqslantless;", "\u2A95");
2302    definedEntities.put("&equals;", "\u003D");
2303    definedEntities.put("&equest;", "\u225F");
2304    definedEntities.put("&equiv;", "\u2261");
2305    definedEntities.put("&equivDD;", "\u2A78");
2306    definedEntities.put("&eqvparsl;", "\u29E5");
2307    definedEntities.put("&erDot;", "\u2253");
2308    definedEntities.put("&erarr;", "\u2971");
2309    definedEntities.put("&escr;", "\u212F");
2310    definedEntities.put("&esdot;", "\u2250");
2311    definedEntities.put("&esim;", "\u2242");
2312    definedEntities.put("&eta;", "\u03B7");
2313    definedEntities.put("&eth;", "\u00F0");
2314    definedEntities.put("&euml;", "\u00EB");
2315    definedEntities.put("&euro;", "\u20AC");
2316    definedEntities.put("&excl;", "\u0021");
2317    definedEntities.put("&exist;", "\u2203");
2318    definedEntities.put("&expectation;", "\u2130");
2319    definedEntities.put("&exponentiale;", "\u2147");
2320    definedEntities.put("&fallingdotseq;", "\u2252");
2321    definedEntities.put("&fcy;", "\u0444");
2322    definedEntities.put("&female;", "\u2640");
2323    definedEntities.put("&ffilig;", "\uFB03");
2324    definedEntities.put("&fflig;", "\uFB00");
2325    definedEntities.put("&ffllig;", "\uFB04");
2326    definedEntities.put("&ffr;", "\uD835\uDD23");
2327    definedEntities.put("&filig;", "\uFB01");
2328    definedEntities.put("&fjlig;", "\u0066\u006A");
2329    definedEntities.put("&flat;", "\u266D");
2330    definedEntities.put("&fllig;", "\uFB02");
2331    definedEntities.put("&fltns;", "\u25B1");
2332    definedEntities.put("&fnof;", "\u0192");
2333    definedEntities.put("&fopf;", "\uD835\uDD57");
2334    definedEntities.put("&forall;", "\u2200");
2335    definedEntities.put("&fork;", "\u22D4");
2336    definedEntities.put("&forkv;", "\u2AD9");
2337    definedEntities.put("&fpartint;", "\u2A0D");
2338    definedEntities.put("&frac12;", "\u00BD");
2339    definedEntities.put("&frac13;", "\u2153");
2340    definedEntities.put("&frac14;", "\u00BC");
2341    definedEntities.put("&frac15;", "\u2155");
2342    definedEntities.put("&frac16;", "\u2159");
2343    definedEntities.put("&frac18;", "\u215B");
2344    definedEntities.put("&frac23;", "\u2154");
2345    definedEntities.put("&frac25;", "\u2156");
2346    definedEntities.put("&frac34;", "\u00BE");
2347    definedEntities.put("&frac35;", "\u2157");
2348    definedEntities.put("&frac38;", "\u215C");
2349    definedEntities.put("&frac45;", "\u2158");
2350    definedEntities.put("&frac56;", "\u215A");
2351    definedEntities.put("&frac58;", "\u215D");
2352    definedEntities.put("&frac78;", "\u215E");
2353    definedEntities.put("&frasl;", "\u2044");
2354    definedEntities.put("&frown;", "\u2322");
2355    definedEntities.put("&fscr;", "\uD835\uDCBB");
2356    definedEntities.put("&gE;", "\u2267");
2357    definedEntities.put("&gEl;", "\u2A8C");
2358    definedEntities.put("&gacute;", "\u01F5");
2359    definedEntities.put("&gamma;", "\u03B3");
2360    definedEntities.put("&gammad;", "\u03DD");
2361    definedEntities.put("&gap;", "\u2A86");
2362    definedEntities.put("&gbreve;", "\u011F");
2363    definedEntities.put("&gcirc;", "\u011D");
2364    definedEntities.put("&gcy;", "\u0433");
2365    definedEntities.put("&gdot;", "\u0121");
2366    definedEntities.put("&ge;", "\u2265");
2367    definedEntities.put("&gel;", "\u22DB");
2368    definedEntities.put("&geq;", "\u2265");
2369    definedEntities.put("&geqq;", "\u2267");
2370    definedEntities.put("&geqslant;", "\u2A7E");
2371    definedEntities.put("&ges;", "\u2A7E");
2372    definedEntities.put("&gescc;", "\u2AA9");
2373    definedEntities.put("&gesdot;", "\u2A80");
2374    definedEntities.put("&gesdoto;", "\u2A82");
2375    definedEntities.put("&gesdotol;", "\u2A84");
2376    definedEntities.put("&gesl;", "\u22DB\uFE00");
2377    definedEntities.put("&gesles;", "\u2A94");
2378    definedEntities.put("&gfr;", "\uD835\uDD24");
2379    definedEntities.put("&gg;", "\u226B");
2380    definedEntities.put("&ggg;", "\u22D9");
2381    definedEntities.put("&gimel;", "\u2137");
2382    definedEntities.put("&gjcy;", "\u0453");
2383    definedEntities.put("&gl;", "\u2277");
2384    definedEntities.put("&glE;", "\u2A92");
2385    definedEntities.put("&gla;", "\u2AA5");
2386    definedEntities.put("&glj;", "\u2AA4");
2387    definedEntities.put("&gnE;", "\u2269");
2388    definedEntities.put("&gnap;", "\u2A8A");
2389    definedEntities.put("&gnapprox;", "\u2A8A");
2390    definedEntities.put("&gne;", "\u2A88");
2391    definedEntities.put("&gneq;", "\u2A88");
2392    definedEntities.put("&gneqq;", "\u2269");
2393    definedEntities.put("&gnsim;", "\u22E7");
2394    definedEntities.put("&gopf;", "\uD835\uDD58");
2395    definedEntities.put("&grave;", "\u0060");
2396    definedEntities.put("&gscr;", "\u210A");
2397    definedEntities.put("&gsim;", "\u2273");
2398    definedEntities.put("&gsime;", "\u2A8E");
2399    definedEntities.put("&gsiml;", "\u2A90");
2400    definedEntities.put("&gt;", "\u003E");
2401    definedEntities.put("&gtcc;", "\u2AA7");
2402    definedEntities.put("&gtcir;", "\u2A7A");
2403    definedEntities.put("&gtdot;", "\u22D7");
2404    definedEntities.put("&gtlPar;", "\u2995");
2405    definedEntities.put("&gtquest;", "\u2A7C");
2406    definedEntities.put("&gtrapprox;", "\u2A86");
2407    definedEntities.put("&gtrarr;", "\u2978");
2408    definedEntities.put("&gtrdot;", "\u22D7");
2409    definedEntities.put("&gtreqless;", "\u22DB");
2410    definedEntities.put("&gtreqqless;", "\u2A8C");
2411    definedEntities.put("&gtrless;", "\u2277");
2412    definedEntities.put("&gtrsim;", "\u2273");
2413    definedEntities.put("&gvertneqq;", "\u2269\uFE00");
2414    definedEntities.put("&gvnE;", "\u2269\uFE00");
2415    definedEntities.put("&hArr;", "\u21D4");
2416    definedEntities.put("&hairsp;", "\u200A");
2417    definedEntities.put("&half;", "\u00BD");
2418    definedEntities.put("&hamilt;", "\u210B");
2419    definedEntities.put("&hardcy;", "\u044A");
2420    definedEntities.put("&harr;", "\u2194");
2421    definedEntities.put("&harrcir;", "\u2948");
2422    definedEntities.put("&harrw;", "\u21AD");
2423    definedEntities.put("&hbar;", "\u210F");
2424    definedEntities.put("&hcirc;", "\u0125");
2425    definedEntities.put("&hearts;", "\u2665");
2426    definedEntities.put("&heartsuit;", "\u2665");
2427    definedEntities.put("&hellip;", "\u2026");
2428    definedEntities.put("&hercon;", "\u22B9");
2429    definedEntities.put("&hfr;", "\uD835\uDD25");
2430    definedEntities.put("&hksearow;", "\u2925");
2431    definedEntities.put("&hkswarow;", "\u2926");
2432    definedEntities.put("&hoarr;", "\u21FF");
2433    definedEntities.put("&homtht;", "\u223B");
2434    definedEntities.put("&hookleftarrow;", "\u21A9");
2435    definedEntities.put("&hookrightarrow;", "\u21AA");
2436    definedEntities.put("&hopf;", "\uD835\uDD59");
2437    definedEntities.put("&horbar;", "\u2015");
2438    definedEntities.put("&hscr;", "\uD835\uDCBD");
2439    definedEntities.put("&hslash;", "\u210F");
2440    definedEntities.put("&hstrok;", "\u0127");
2441    definedEntities.put("&hybull;", "\u2043");
2442    definedEntities.put("&hyphen;", "\u2010");
2443    definedEntities.put("&iacute;", "\u00ED");
2444    definedEntities.put("&ic;", "\u2063");
2445    definedEntities.put("&icirc;", "\u00EE");
2446    definedEntities.put("&icy;", "\u0438");
2447    definedEntities.put("&iecy;", "\u0435");
2448    definedEntities.put("&iexcl;", "\u00A1");
2449    definedEntities.put("&iff;", "\u21D4");
2450    definedEntities.put("&ifr;", "\uD835\uDD26");
2451    definedEntities.put("&igrave;", "\u00EC");
2452    definedEntities.put("&ii;", "\u2148");
2453    definedEntities.put("&iiiint;", "\u2A0C");
2454    definedEntities.put("&iiint;", "\u222D");
2455    definedEntities.put("&iinfin;", "\u29DC");
2456    definedEntities.put("&iiota;", "\u2129");
2457    definedEntities.put("&ijlig;", "\u0133");
2458    definedEntities.put("&imacr;", "\u012B");
2459    definedEntities.put("&image;", "\u2111");
2460    definedEntities.put("&imagline;", "\u2110");
2461    definedEntities.put("&imagpart;", "\u2111");
2462    definedEntities.put("&imath;", "\u0131");
2463    definedEntities.put("&imof;", "\u22B7");
2464    definedEntities.put("&imped;", "\u01B5");
2465    definedEntities.put("&in;", "\u2208");
2466    definedEntities.put("&incare;", "\u2105");
2467    definedEntities.put("&infin;", "\u221E");
2468    definedEntities.put("&infintie;", "\u29DD");
2469    definedEntities.put("&inodot;", "\u0131");
2470    definedEntities.put("&int;", "\u222B");
2471    definedEntities.put("&intcal;", "\u22BA");
2472    definedEntities.put("&integers;", "\u2124");
2473    definedEntities.put("&intercal;", "\u22BA");
2474    definedEntities.put("&intlarhk;", "\u2A17");
2475    definedEntities.put("&intprod;", "\u2A3C");
2476    definedEntities.put("&iocy;", "\u0451");
2477    definedEntities.put("&iogon;", "\u012F");
2478    definedEntities.put("&iopf;", "\uD835\uDD5A");
2479    definedEntities.put("&iota;", "\u03B9");
2480    definedEntities.put("&iprod;", "\u2A3C");
2481    definedEntities.put("&iquest;", "\u00BF");
2482    definedEntities.put("&iscr;", "\uD835\uDCBE");
2483    definedEntities.put("&isin;", "\u2208");
2484    definedEntities.put("&isinE;", "\u22F9");
2485    definedEntities.put("&isindot;", "\u22F5");
2486    definedEntities.put("&isins;", "\u22F4");
2487    definedEntities.put("&isinsv;", "\u22F3");
2488    definedEntities.put("&isinv;", "\u2208");
2489    definedEntities.put("&it;", "\u2062");
2490    definedEntities.put("&itilde;", "\u0129");
2491    definedEntities.put("&iukcy;", "\u0456");
2492    definedEntities.put("&iuml;", "\u00EF");
2493    definedEntities.put("&jcirc;", "\u0135");
2494    definedEntities.put("&jcy;", "\u0439");
2495    definedEntities.put("&jfr;", "\uD835\uDD27");
2496    definedEntities.put("&jmath;", "\u0237");
2497    definedEntities.put("&jopf;", "\uD835\uDD5B");
2498    definedEntities.put("&jscr;", "\uD835\uDCBF");
2499    definedEntities.put("&jsercy;", "\u0458");
2500    definedEntities.put("&jukcy;", "\u0454");
2501    definedEntities.put("&kappa;", "\u03BA");
2502    definedEntities.put("&kappav;", "\u03F0");
2503    definedEntities.put("&kcedil;", "\u0137");
2504    definedEntities.put("&kcy;", "\u043A");
2505    definedEntities.put("&kfr;", "\uD835\uDD28");
2506    definedEntities.put("&kgreen;", "\u0138");
2507    definedEntities.put("&khcy;", "\u0445");
2508    definedEntities.put("&kjcy;", "\u045C");
2509    definedEntities.put("&kopf;", "\uD835\uDD5C");
2510    definedEntities.put("&kscr;", "\uD835\uDCC0");
2511    definedEntities.put("&lAarr;", "\u21DA");
2512    definedEntities.put("&lArr;", "\u21D0");
2513    definedEntities.put("&lAtail;", "\u291B");
2514    definedEntities.put("&lBarr;", "\u290E");
2515    definedEntities.put("&lE;", "\u2266");
2516    definedEntities.put("&lEg;", "\u2A8B");
2517    definedEntities.put("&lHar;", "\u2962");
2518    definedEntities.put("&lacute;", "\u013A");
2519    definedEntities.put("&laemptyv;", "\u29B4");
2520    definedEntities.put("&lagran;", "\u2112");
2521    definedEntities.put("&lambda;", "\u03BB");
2522    definedEntities.put("&lang;", "\u27E8");
2523    definedEntities.put("&langd;", "\u2991");
2524    definedEntities.put("&langle;", "\u27E8");
2525    definedEntities.put("&lap;", "\u2A85");
2526    definedEntities.put("&laquo;", "\u00AB");
2527    definedEntities.put("&larr;", "\u2190");
2528    definedEntities.put("&larrb;", "\u21E4");
2529    definedEntities.put("&larrbfs;", "\u291F");
2530    definedEntities.put("&larrfs;", "\u291D");
2531    definedEntities.put("&larrhk;", "\u21A9");
2532    definedEntities.put("&larrlp;", "\u21AB");
2533    definedEntities.put("&larrpl;", "\u2939");
2534    definedEntities.put("&larrsim;", "\u2973");
2535    definedEntities.put("&larrtl;", "\u21A2");
2536    definedEntities.put("&lat;", "\u2AAB");
2537    definedEntities.put("&latail;", "\u2919");
2538    definedEntities.put("&late;", "\u2AAD");
2539    definedEntities.put("&lates;", "\u2AAD\uFE00");
2540    definedEntities.put("&lbarr;", "\u290C");
2541    definedEntities.put("&lbbrk;", "\u2772");
2542    definedEntities.put("&lbrace;", "\u007B");
2543    definedEntities.put("&lbrack;", "\u005B");
2544    definedEntities.put("&lbrke;", "\u298B");
2545    definedEntities.put("&lbrksld;", "\u298F");
2546    definedEntities.put("&lbrkslu;", "\u298D");
2547    definedEntities.put("&lcaron;", "\u013E");
2548    definedEntities.put("&lcedil;", "\u013C");
2549    definedEntities.put("&lceil;", "\u2308");
2550    definedEntities.put("&lcub;", "\u007B");
2551    definedEntities.put("&lcy;", "\u043B");
2552    definedEntities.put("&ldca;", "\u2936");
2553    definedEntities.put("&ldquo;", "\u201C");
2554    definedEntities.put("&ldquor;", "\u201E");
2555    definedEntities.put("&ldrdhar;", "\u2967");
2556    definedEntities.put("&ldrushar;", "\u294B");
2557    definedEntities.put("&ldsh;", "\u21B2");
2558    definedEntities.put("&le;", "\u2264");
2559    definedEntities.put("&leftarrow;", "\u2190");
2560    definedEntities.put("&leftarrowtail;", "\u21A2");
2561    definedEntities.put("&leftharpoondown;", "\u21BD");
2562    definedEntities.put("&leftharpoonup;", "\u21BC");
2563    definedEntities.put("&leftleftarrows;", "\u21C7");
2564    definedEntities.put("&leftrightarrow;", "\u2194");
2565    definedEntities.put("&leftrightarrows;", "\u21C6");
2566    definedEntities.put("&leftrightharpoons;", "\u21CB");
2567    definedEntities.put("&leftrightsquigarrow;", "\u21AD");
2568    definedEntities.put("&leftthreetimes;", "\u22CB");
2569    definedEntities.put("&leg;", "\u22DA");
2570    definedEntities.put("&leq;", "\u2264");
2571    definedEntities.put("&leqq;", "\u2266");
2572    definedEntities.put("&leqslant;", "\u2A7D");
2573    definedEntities.put("&les;", "\u2A7D");
2574    definedEntities.put("&lescc;", "\u2AA8");
2575    definedEntities.put("&lesdot;", "\u2A7F");
2576    definedEntities.put("&lesdoto;", "\u2A81");
2577    definedEntities.put("&lesdotor;", "\u2A83");
2578    definedEntities.put("&lesg;", "\u22DA\uFE00");
2579    definedEntities.put("&lesges;", "\u2A93");
2580    definedEntities.put("&lessapprox;", "\u2A85");
2581    definedEntities.put("&lessdot;", "\u22D6");
2582    definedEntities.put("&lesseqgtr;", "\u22DA");
2583    definedEntities.put("&lesseqqgtr;", "\u2A8B");
2584    definedEntities.put("&lessgtr;", "\u2276");
2585    definedEntities.put("&lesssim;", "\u2272");
2586    definedEntities.put("&lfisht;", "\u297C");
2587    definedEntities.put("&lfloor;", "\u230A");
2588    definedEntities.put("&lfr;", "\uD835\uDD29");
2589    definedEntities.put("&lg;", "\u2276");
2590    definedEntities.put("&lgE;", "\u2A91");
2591    definedEntities.put("&lhard;", "\u21BD");
2592    definedEntities.put("&lharu;", "\u21BC");
2593    definedEntities.put("&lharul;", "\u296A");
2594    definedEntities.put("&lhblk;", "\u2584");
2595    definedEntities.put("&ljcy;", "\u0459");
2596    definedEntities.put("&ll;", "\u226A");
2597    definedEntities.put("&llarr;", "\u21C7");
2598    definedEntities.put("&llcorner;", "\u231E");
2599    definedEntities.put("&llhard;", "\u296B");
2600    definedEntities.put("&lltri;", "\u25FA");
2601    definedEntities.put("&lmidot;", "\u0140");
2602    definedEntities.put("&lmoust;", "\u23B0");
2603    definedEntities.put("&lmoustache;", "\u23B0");
2604    definedEntities.put("&lnE;", "\u2268");
2605    definedEntities.put("&lnap;", "\u2A89");
2606    definedEntities.put("&lnapprox;", "\u2A89");
2607    definedEntities.put("&lne;", "\u2A87");
2608    definedEntities.put("&lneq;", "\u2A87");
2609    definedEntities.put("&lneqq;", "\u2268");
2610    definedEntities.put("&lnsim;", "\u22E6");
2611    definedEntities.put("&loang;", "\u27EC");
2612    definedEntities.put("&loarr;", "\u21FD");
2613    definedEntities.put("&lobrk;", "\u27E6");
2614    definedEntities.put("&longleftarrow;", "\u27F5");
2615    definedEntities.put("&longleftrightarrow;", "\u27F7");
2616    definedEntities.put("&longmapsto;", "\u27FC");
2617    definedEntities.put("&longrightarrow;", "\u27F6");
2618    definedEntities.put("&looparrowleft;", "\u21AB");
2619    definedEntities.put("&looparrowright;", "\u21AC");
2620    definedEntities.put("&lopar;", "\u2985");
2621    definedEntities.put("&lopf;", "\uD835\uDD5D");
2622    definedEntities.put("&loplus;", "\u2A2D");
2623    definedEntities.put("&lotimes;", "\u2A34");
2624    definedEntities.put("&lowast;", "\u2217");
2625    definedEntities.put("&lowbar;", "\u005F");
2626    definedEntities.put("&loz;", "\u25CA");
2627    definedEntities.put("&lozenge;", "\u25CA");
2628    definedEntities.put("&lozf;", "\u29EB");
2629    definedEntities.put("&lpar;", "\u0028");
2630    definedEntities.put("&lparlt;", "\u2993");
2631    definedEntities.put("&lrarr;", "\u21C6");
2632    definedEntities.put("&lrcorner;", "\u231F");
2633    definedEntities.put("&lrhar;", "\u21CB");
2634    definedEntities.put("&lrhard;", "\u296D");
2635    definedEntities.put("&lrm;", "\u200E");
2636    definedEntities.put("&lrtri;", "\u22BF");
2637    definedEntities.put("&lsaquo;", "\u2039");
2638    definedEntities.put("&lscr;", "\uD835\uDCC1");
2639    definedEntities.put("&lsh;", "\u21B0");
2640    definedEntities.put("&lsim;", "\u2272");
2641    definedEntities.put("&lsime;", "\u2A8D");
2642    definedEntities.put("&lsimg;", "\u2A8F");
2643    definedEntities.put("&lsqb;", "\u005B");
2644    definedEntities.put("&lsquo;", "\u2018");
2645    definedEntities.put("&lsquor;", "\u201A");
2646    definedEntities.put("&lstrok;", "\u0142");
2647    definedEntities.put("&lt;", "\u003C");
2648    definedEntities.put("&ltcc;", "\u2AA6");
2649    definedEntities.put("&ltcir;", "\u2A79");
2650    definedEntities.put("&ltdot;", "\u22D6");
2651    definedEntities.put("&lthree;", "\u22CB");
2652    definedEntities.put("&ltimes;", "\u22C9");
2653    definedEntities.put("&ltlarr;", "\u2976");
2654    definedEntities.put("&ltquest;", "\u2A7B");
2655    definedEntities.put("&ltrPar;", "\u2996");
2656    definedEntities.put("&ltri;", "\u25C3");
2657    definedEntities.put("&ltrie;", "\u22B4");
2658    definedEntities.put("&ltrif;", "\u25C2");
2659    definedEntities.put("&lurdshar;", "\u294A");
2660    definedEntities.put("&luruhar;", "\u2966");
2661    definedEntities.put("&lvertneqq;", "\u2268\uFE00");
2662    definedEntities.put("&lvnE;", "\u2268\uFE00");
2663    definedEntities.put("&mDDot;", "\u223A");
2664    definedEntities.put("&macr;", "\u00AF");
2665    definedEntities.put("&male;", "\u2642");
2666    definedEntities.put("&malt;", "\u2720");
2667    definedEntities.put("&maltese;", "\u2720");
2668    definedEntities.put("&map;", "\u21A6");
2669    definedEntities.put("&mapsto;", "\u21A6");
2670    definedEntities.put("&mapstodown;", "\u21A7");
2671    definedEntities.put("&mapstoleft;", "\u21A4");
2672    definedEntities.put("&mapstoup;", "\u21A5");
2673    definedEntities.put("&marker;", "\u25AE");
2674    definedEntities.put("&mcomma;", "\u2A29");
2675    definedEntities.put("&mcy;", "\u043C");
2676    definedEntities.put("&mdash;", "\u2014");
2677    definedEntities.put("&measuredangle;", "\u2221");
2678    definedEntities.put("&mfr;", "\uD835\uDD2A");
2679    definedEntities.put("&mho;", "\u2127");
2680    definedEntities.put("&micro;", "\u00B5");
2681    definedEntities.put("&mid;", "\u2223");
2682    definedEntities.put("&midast;", "\u002A");
2683    definedEntities.put("&midcir;", "\u2AF0");
2684    definedEntities.put("&middot;", "\u00B7");
2685    definedEntities.put("&minus;", "\u2212");
2686    definedEntities.put("&minusb;", "\u229F");
2687    definedEntities.put("&minusd;", "\u2238");
2688    definedEntities.put("&minusdu;", "\u2A2A");
2689    definedEntities.put("&mlcp;", "\u2ADB");
2690    definedEntities.put("&mldr;", "\u2026");
2691    definedEntities.put("&mnplus;", "\u2213");
2692    definedEntities.put("&models;", "\u22A7");
2693    definedEntities.put("&mopf;", "\uD835\uDD5E");
2694    definedEntities.put("&mp;", "\u2213");
2695    definedEntities.put("&mscr;", "\uD835\uDCC2");
2696    definedEntities.put("&mstpos;", "\u223E");
2697    definedEntities.put("&mu;", "\u03BC");
2698    definedEntities.put("&multimap;", "\u22B8");
2699    definedEntities.put("&mumap;", "\u22B8");
2700    definedEntities.put("&nGg;", "\u22D9\u0338");
2701    definedEntities.put("&nGt;", "\u226B\u20D2");
2702    definedEntities.put("&nGtv;", "\u226B\u0338");
2703    definedEntities.put("&nLeftarrow;", "\u21CD");
2704    definedEntities.put("&nLeftrightarrow;", "\u21CE");
2705    definedEntities.put("&nLl;", "\u22D8\u0338");
2706    definedEntities.put("&nLt;", "\u226A\u20D2");
2707    definedEntities.put("&nLtv;", "\u226A\u0338");
2708    definedEntities.put("&nRightarrow;", "\u21CF");
2709    definedEntities.put("&nVDash;", "\u22AF");
2710    definedEntities.put("&nVdash;", "\u22AE");
2711    definedEntities.put("&nabla;", "\u2207");
2712    definedEntities.put("&nacute;", "\u0144");
2713    definedEntities.put("&nang;", "\u2220\u20D2");
2714    definedEntities.put("&nap;", "\u2249");
2715    definedEntities.put("&napE;", "\u2A70\u0338");
2716    definedEntities.put("&napid;", "\u224B\u0338");
2717    definedEntities.put("&napos;", "\u0149");
2718    definedEntities.put("&napprox;", "\u2249");
2719    definedEntities.put("&natur;", "\u266E");
2720    definedEntities.put("&natural;", "\u266E");
2721    definedEntities.put("&naturals;", "\u2115");
2722    definedEntities.put("&nbsp;", "\u00A0");
2723    definedEntities.put("&nbump;", "\u224E\u0338");
2724    definedEntities.put("&nbumpe;", "\u224F\u0338");
2725    definedEntities.put("&ncap;", "\u2A43");
2726    definedEntities.put("&ncaron;", "\u0148");
2727    definedEntities.put("&ncedil;", "\u0146");
2728    definedEntities.put("&ncong;", "\u2247");
2729    definedEntities.put("&ncongdot;", "\u2A6D\u0338");
2730    definedEntities.put("&ncup;", "\u2A42");
2731    definedEntities.put("&ncy;", "\u043D");
2732    definedEntities.put("&ndash;", "\u2013");
2733    definedEntities.put("&ne;", "\u2260");
2734    definedEntities.put("&neArr;", "\u21D7");
2735    definedEntities.put("&nearhk;", "\u2924");
2736    definedEntities.put("&nearr;", "\u2197");
2737    definedEntities.put("&nearrow;", "\u2197");
2738    definedEntities.put("&nedot;", "\u2250\u0338");
2739    definedEntities.put("&nequiv;", "\u2262");
2740    definedEntities.put("&nesear;", "\u2928");
2741    definedEntities.put("&nesim;", "\u2242\u0338");
2742    definedEntities.put("&nexist;", "\u2204");
2743    definedEntities.put("&nexists;", "\u2204");
2744    definedEntities.put("&nfr;", "\uD835\uDD2B");
2745    definedEntities.put("&ngE;", "\u2267\u0338");
2746    definedEntities.put("&nge;", "\u2271");
2747    definedEntities.put("&ngeq;", "\u2271");
2748    definedEntities.put("&ngeqq;", "\u2267\u0338");
2749    definedEntities.put("&ngeqslant;", "\u2A7E\u0338");
2750    definedEntities.put("&nges;", "\u2A7E\u0338");
2751    definedEntities.put("&ngsim;", "\u2275");
2752    definedEntities.put("&ngt;", "\u226F");
2753    definedEntities.put("&ngtr;", "\u226F");
2754    definedEntities.put("&nhArr;", "\u21CE");
2755    definedEntities.put("&nharr;", "\u21AE");
2756    definedEntities.put("&nhpar;", "\u2AF2");
2757    definedEntities.put("&ni;", "\u220B");
2758    definedEntities.put("&nis;", "\u22FC");
2759    definedEntities.put("&nisd;", "\u22FA");
2760    definedEntities.put("&niv;", "\u220B");
2761    definedEntities.put("&njcy;", "\u045A");
2762    definedEntities.put("&nlArr;", "\u21CD");
2763    definedEntities.put("&nlE;", "\u2266\u0338");
2764    definedEntities.put("&nlarr;", "\u219A");
2765    definedEntities.put("&nldr;", "\u2025");
2766    definedEntities.put("&nle;", "\u2270");
2767    definedEntities.put("&nleftarrow;", "\u219A");
2768    definedEntities.put("&nleftrightarrow;", "\u21AE");
2769    definedEntities.put("&nleq;", "\u2270");
2770    definedEntities.put("&nleqq;", "\u2266\u0338");
2771    definedEntities.put("&nleqslant;", "\u2A7D\u0338");
2772    definedEntities.put("&nles;", "\u2A7D\u0338");
2773    definedEntities.put("&nless;", "\u226E");
2774    definedEntities.put("&nlsim;", "\u2274");
2775    definedEntities.put("&nlt;", "\u226E");
2776    definedEntities.put("&nltri;", "\u22EA");
2777    definedEntities.put("&nltrie;", "\u22EC");
2778    definedEntities.put("&nmid;", "\u2224");
2779    definedEntities.put("&nopf;", "\uD835\uDD5F");
2780    definedEntities.put("&not;", "\u00AC");
2781    definedEntities.put("&notin;", "\u2209");
2782    definedEntities.put("&notinE;", "\u22F9\u0338");
2783    definedEntities.put("&notindot;", "\u22F5\u0338");
2784    definedEntities.put("&notinva;", "\u2209");
2785    definedEntities.put("&notinvb;", "\u22F7");
2786    definedEntities.put("&notinvc;", "\u22F6");
2787    definedEntities.put("&notni;", "\u220C");
2788    definedEntities.put("&notniva;", "\u220C");
2789    definedEntities.put("&notnivb;", "\u22FE");
2790    definedEntities.put("&notnivc;", "\u22FD");
2791    definedEntities.put("&npar;", "\u2226");
2792    definedEntities.put("&nparallel;", "\u2226");
2793    definedEntities.put("&nparsl;", "\u2AFD\u20E5");
2794    definedEntities.put("&npart;", "\u2202\u0338");
2795    definedEntities.put("&npolint;", "\u2A14");
2796    definedEntities.put("&npr;", "\u2280");
2797    definedEntities.put("&nprcue;", "\u22E0");
2798    definedEntities.put("&npre;", "\u2AAF\u0338");
2799    definedEntities.put("&nprec;", "\u2280");
2800    definedEntities.put("&npreceq;", "\u2AAF\u0338");
2801    definedEntities.put("&nrArr;", "\u21CF");
2802    definedEntities.put("&nrarr;", "\u219B");
2803    definedEntities.put("&nrarrc;", "\u2933\u0338");
2804    definedEntities.put("&nrarrw;", "\u219D\u0338");
2805    definedEntities.put("&nrightarrow;", "\u219B");
2806    definedEntities.put("&nrtri;", "\u22EB");
2807    definedEntities.put("&nrtrie;", "\u22ED");
2808    definedEntities.put("&nsc;", "\u2281");
2809    definedEntities.put("&nsccue;", "\u22E1");
2810    definedEntities.put("&nsce;", "\u2AB0\u0338");
2811    definedEntities.put("&nscr;", "\uD835\uDCC3");
2812    definedEntities.put("&nshortmid;", "\u2224");
2813    definedEntities.put("&nshortparallel;", "\u2226");
2814    definedEntities.put("&nsim;", "\u2241");
2815    definedEntities.put("&nsime;", "\u2244");
2816    definedEntities.put("&nsimeq;", "\u2244");
2817    definedEntities.put("&nsmid;", "\u2224");
2818    definedEntities.put("&nspar;", "\u2226");
2819    definedEntities.put("&nsqsube;", "\u22E2");
2820    definedEntities.put("&nsqsupe;", "\u22E3");
2821    definedEntities.put("&nsub;", "\u2284");
2822    definedEntities.put("&nsubE;", "\u2AC5\u0338");
2823    definedEntities.put("&nsube;", "\u2288");
2824    definedEntities.put("&nsubset;", "\u2282\u20D2");
2825    definedEntities.put("&nsubseteq;", "\u2288");
2826    definedEntities.put("&nsubseteqq;", "\u2AC5\u0338");
2827    definedEntities.put("&nsucc;", "\u2281");
2828    definedEntities.put("&nsucceq;", "\u2AB0\u0338");
2829    definedEntities.put("&nsup;", "\u2285");
2830    definedEntities.put("&nsupE;", "\u2AC6\u0338");
2831    definedEntities.put("&nsupe;", "\u2289");
2832    definedEntities.put("&nsupset;", "\u2283\u20D2");
2833    definedEntities.put("&nsupseteq;", "\u2289");
2834    definedEntities.put("&nsupseteqq;", "\u2AC6\u0338");
2835    definedEntities.put("&ntgl;", "\u2279");
2836    definedEntities.put("&ntilde;", "\u00F1");
2837    definedEntities.put("&ntlg;", "\u2278");
2838    definedEntities.put("&ntriangleleft;", "\u22EA");
2839    definedEntities.put("&ntrianglelefteq;", "\u22EC");
2840    definedEntities.put("&ntriangleright;", "\u22EB");
2841    definedEntities.put("&ntrianglerighteq;", "\u22ED");
2842    definedEntities.put("&nu;", "\u03BD");
2843    definedEntities.put("&num;", "\u0023");
2844    definedEntities.put("&numero;", "\u2116");
2845    definedEntities.put("&numsp;", "\u2007");
2846    definedEntities.put("&nvDash;", "\u22AD");
2847    definedEntities.put("&nvHarr;", "\u2904");
2848    definedEntities.put("&nvap;", "\u224D\u20D2");
2849    definedEntities.put("&nvdash;", "\u22AC");
2850    definedEntities.put("&nvge;", "\u2265\u20D2");
2851    definedEntities.put("&nvgt;", "\u003E\u20D2");
2852    definedEntities.put("&nvinfin;", "\u29DE");
2853    definedEntities.put("&nvlArr;", "\u2902");
2854    definedEntities.put("&nvle;", "\u2264\u20D2");
2855    definedEntities.put("&nvlt;", "\u003C\u20D2");
2856    definedEntities.put("&nvltrie;", "\u22B4\u20D2");
2857    definedEntities.put("&nvrArr;", "\u2903");
2858    definedEntities.put("&nvrtrie;", "\u22B5\u20D2");
2859    definedEntities.put("&nvsim;", "\u223C\u20D2");
2860    definedEntities.put("&nwArr;", "\u21D6");
2861    definedEntities.put("&nwarhk;", "\u2923");
2862    definedEntities.put("&nwarr;", "\u2196");
2863    definedEntities.put("&nwarrow;", "\u2196");
2864    definedEntities.put("&nwnear;", "\u2927");
2865    definedEntities.put("&oS;", "\u24C8");
2866    definedEntities.put("&oacute;", "\u00F3");
2867    definedEntities.put("&oast;", "\u229B");
2868    definedEntities.put("&ocir;", "\u229A");
2869    definedEntities.put("&ocirc;", "\u00F4");
2870    definedEntities.put("&ocy;", "\u043E");
2871    definedEntities.put("&odash;", "\u229D");
2872    definedEntities.put("&odblac;", "\u0151");
2873    definedEntities.put("&odiv;", "\u2A38");
2874    definedEntities.put("&odot;", "\u2299");
2875    definedEntities.put("&odsold;", "\u29BC");
2876    definedEntities.put("&oelig;", "\u0153");
2877    definedEntities.put("&ofcir;", "\u29BF");
2878    definedEntities.put("&ofr;", "\uD835\uDD2C");
2879    definedEntities.put("&ogon;", "\u02DB");
2880    definedEntities.put("&ograve;", "\u00F2");
2881    definedEntities.put("&ogt;", "\u29C1");
2882    definedEntities.put("&ohbar;", "\u29B5");
2883    definedEntities.put("&ohm;", "\u03A9");
2884    definedEntities.put("&oint;", "\u222E");
2885    definedEntities.put("&olarr;", "\u21BA");
2886    definedEntities.put("&olcir;", "\u29BE");
2887    definedEntities.put("&olcross;", "\u29BB");
2888    definedEntities.put("&oline;", "\u203E");
2889    definedEntities.put("&olt;", "\u29C0");
2890    definedEntities.put("&omacr;", "\u014D");
2891    definedEntities.put("&omega;", "\u03C9");
2892    definedEntities.put("&omicron;", "\u03BF");
2893    definedEntities.put("&omid;", "\u29B6");
2894    definedEntities.put("&ominus;", "\u2296");
2895    definedEntities.put("&oopf;", "\uD835\uDD60");
2896    definedEntities.put("&opar;", "\u29B7");
2897    definedEntities.put("&operp;", "\u29B9");
2898    definedEntities.put("&oplus;", "\u2295");
2899    definedEntities.put("&or;", "\u2228");
2900    definedEntities.put("&orarr;", "\u21BB");
2901    definedEntities.put("&ord;", "\u2A5D");
2902    definedEntities.put("&order;", "\u2134");
2903    definedEntities.put("&orderof;", "\u2134");
2904    definedEntities.put("&ordf;", "\u00AA");
2905    definedEntities.put("&ordm;", "\u00BA");
2906    definedEntities.put("&origof;", "\u22B6");
2907    definedEntities.put("&oror;", "\u2A56");
2908    definedEntities.put("&orslope;", "\u2A57");
2909    definedEntities.put("&orv;", "\u2A5B");
2910    definedEntities.put("&oscr;", "\u2134");
2911    definedEntities.put("&oslash;", "\u00F8");
2912    definedEntities.put("&osol;", "\u2298");
2913    definedEntities.put("&otilde;", "\u00F5");
2914    definedEntities.put("&otimes;", "\u2297");
2915    definedEntities.put("&otimesas;", "\u2A36");
2916    definedEntities.put("&ouml;", "\u00F6");
2917    definedEntities.put("&ovbar;", "\u233D");
2918    definedEntities.put("&par;", "\u2225");
2919    definedEntities.put("&para;", "\u00B6");
2920    definedEntities.put("&parallel;", "\u2225");
2921    definedEntities.put("&parsim;", "\u2AF3");
2922    definedEntities.put("&parsl;", "\u2AFD");
2923    definedEntities.put("&part;", "\u2202");
2924    definedEntities.put("&pcy;", "\u043F");
2925    definedEntities.put("&percnt;", "\u0025");
2926    definedEntities.put("&period;", "\u002E");
2927    definedEntities.put("&permil;", "\u2030");
2928    definedEntities.put("&perp;", "\u22A5");
2929    definedEntities.put("&pertenk;", "\u2031");
2930    definedEntities.put("&pfr;", "\uD835\uDD2D");
2931    definedEntities.put("&phi;", "\u03C6");
2932    definedEntities.put("&phiv;", "\u03D5");
2933    definedEntities.put("&phmmat;", "\u2133");
2934    definedEntities.put("&phone;", "\u260E");
2935    definedEntities.put("&pi;", "\u03C0");
2936    definedEntities.put("&pitchfork;", "\u22D4");
2937    definedEntities.put("&piv;", "\u03D6");
2938    definedEntities.put("&planck;", "\u210F");
2939    definedEntities.put("&planckh;", "\u210E");
2940    definedEntities.put("&plankv;", "\u210F");
2941    definedEntities.put("&plus;", "\u002B");
2942    definedEntities.put("&plusacir;", "\u2A23");
2943    definedEntities.put("&plusb;", "\u229E");
2944    definedEntities.put("&pluscir;", "\u2A22");
2945    definedEntities.put("&plusdo;", "\u2214");
2946    definedEntities.put("&plusdu;", "\u2A25");
2947    definedEntities.put("&pluse;", "\u2A72");
2948    definedEntities.put("&plusmn;", "\u00B1");
2949    definedEntities.put("&plussim;", "\u2A26");
2950    definedEntities.put("&plustwo;", "\u2A27");
2951    definedEntities.put("&pm;", "\u00B1");
2952    definedEntities.put("&pointint;", "\u2A15");
2953    definedEntities.put("&popf;", "\uD835\uDD61");
2954    definedEntities.put("&pound;", "\u00A3");
2955    definedEntities.put("&pr;", "\u227A");
2956    definedEntities.put("&prE;", "\u2AB3");
2957    definedEntities.put("&prap;", "\u2AB7");
2958    definedEntities.put("&prcue;", "\u227C");
2959    definedEntities.put("&pre;", "\u2AAF");
2960    definedEntities.put("&prec;", "\u227A");
2961    definedEntities.put("&precapprox;", "\u2AB7");
2962    definedEntities.put("&preccurlyeq;", "\u227C");
2963    definedEntities.put("&preceq;", "\u2AAF");
2964    definedEntities.put("&precnapprox;", "\u2AB9");
2965    definedEntities.put("&precneqq;", "\u2AB5");
2966    definedEntities.put("&precnsim;", "\u22E8");
2967    definedEntities.put("&precsim;", "\u227E");
2968    definedEntities.put("&prime;", "\u2032");
2969    definedEntities.put("&primes;", "\u2119");
2970    definedEntities.put("&prnE;", "\u2AB5");
2971    definedEntities.put("&prnap;", "\u2AB9");
2972    definedEntities.put("&prnsim;", "\u22E8");
2973    definedEntities.put("&prod;", "\u220F");
2974    definedEntities.put("&profalar;", "\u232E");
2975    definedEntities.put("&profline;", "\u2312");
2976    definedEntities.put("&profsurf;", "\u2313");
2977    definedEntities.put("&prop;", "\u221D");
2978    definedEntities.put("&propto;", "\u221D");
2979    definedEntities.put("&prsim;", "\u227E");
2980    definedEntities.put("&prurel;", "\u22B0");
2981    definedEntities.put("&pscr;", "\uD835\uDCC5");
2982    definedEntities.put("&psi;", "\u03C8");
2983    definedEntities.put("&puncsp;", "\u2008");
2984    definedEntities.put("&qfr;", "\uD835\uDD2E");
2985    definedEntities.put("&qint;", "\u2A0C");
2986    definedEntities.put("&qopf;", "\uD835\uDD62");
2987    definedEntities.put("&qprime;", "\u2057");
2988    definedEntities.put("&qscr;", "\uD835\uDCC6");
2989    definedEntities.put("&quaternions;", "\u210D");
2990    definedEntities.put("&quatint;", "\u2A16");
2991    definedEntities.put("&quest;", "\u003F");
2992    definedEntities.put("&questeq;", "\u225F");
2993    definedEntities.put("&quot;", "\\u0022");
2994    definedEntities.put("&rAarr;", "\u21DB");
2995    definedEntities.put("&rArr;", "\u21D2");
2996    definedEntities.put("&rAtail;", "\u291C");
2997    definedEntities.put("&rBarr;", "\u290F");
2998    definedEntities.put("&rHar;", "\u2964");
2999    definedEntities.put("&race;", "\u223D\u0331");
3000    definedEntities.put("&racute;", "\u0155");
3001    definedEntities.put("&radic;", "\u221A");
3002    definedEntities.put("&raemptyv;", "\u29B3");
3003    definedEntities.put("&rang;", "\u27E9");
3004    definedEntities.put("&rangd;", "\u2992");
3005    definedEntities.put("&range;", "\u29A5");
3006    definedEntities.put("&rangle;", "\u27E9");
3007    definedEntities.put("&raquo;", "\u00BB");
3008    definedEntities.put("&rarr;", "\u2192");
3009    definedEntities.put("&rarrap;", "\u2975");
3010    definedEntities.put("&rarrb;", "\u21E5");
3011    definedEntities.put("&rarrbfs;", "\u2920");
3012    definedEntities.put("&rarrc;", "\u2933");
3013    definedEntities.put("&rarrfs;", "\u291E");
3014    definedEntities.put("&rarrhk;", "\u21AA");
3015    definedEntities.put("&rarrlp;", "\u21AC");
3016    definedEntities.put("&rarrpl;", "\u2945");
3017    definedEntities.put("&rarrsim;", "\u2974");
3018    definedEntities.put("&rarrtl;", "\u21A3");
3019    definedEntities.put("&rarrw;", "\u219D");
3020    definedEntities.put("&ratail;", "\u291A");
3021    definedEntities.put("&ratio;", "\u2236");
3022    definedEntities.put("&rationals;", "\u211A");
3023    definedEntities.put("&rbarr;", "\u290D");
3024    definedEntities.put("&rbbrk;", "\u2773");
3025    definedEntities.put("&rbrace;", "\u007D");
3026    definedEntities.put("&rbrack;", "\u005D");
3027    definedEntities.put("&rbrke;", "\u298C");
3028    definedEntities.put("&rbrksld;", "\u298E");
3029    definedEntities.put("&rbrkslu;", "\u2990");
3030    definedEntities.put("&rcaron;", "\u0159");
3031    definedEntities.put("&rcedil;", "\u0157");
3032    definedEntities.put("&rceil;", "\u2309");
3033    definedEntities.put("&rcub;", "\u007D");
3034    definedEntities.put("&rcy;", "\u0440");
3035    definedEntities.put("&rdca;", "\u2937");
3036    definedEntities.put("&rdldhar;", "\u2969");
3037    definedEntities.put("&rdquo;", "\u201D");
3038    definedEntities.put("&rdquor;", "\u201D");
3039    definedEntities.put("&rdsh;", "\u21B3");
3040    definedEntities.put("&real;", "\u211C");
3041    definedEntities.put("&realine;", "\u211B");
3042    definedEntities.put("&realpart;", "\u211C");
3043    definedEntities.put("&reals;", "\u211D");
3044    definedEntities.put("&rect;", "\u25AD");
3045    definedEntities.put("&reg;", "\u00AE");
3046    definedEntities.put("&rfisht;", "\u297D");
3047    definedEntities.put("&rfloor;", "\u230B");
3048    definedEntities.put("&rfr;", "\uD835\uDD2F");
3049    definedEntities.put("&rhard;", "\u21C1");
3050    definedEntities.put("&rharu;", "\u21C0");
3051    definedEntities.put("&rharul;", "\u296C");
3052    definedEntities.put("&rho;", "\u03C1");
3053    definedEntities.put("&rhov;", "\u03F1");
3054    definedEntities.put("&rightarrow;", "\u2192");
3055    definedEntities.put("&rightarrowtail;", "\u21A3");
3056    definedEntities.put("&rightharpoondown;", "\u21C1");
3057    definedEntities.put("&rightharpoonup;", "\u21C0");
3058    definedEntities.put("&rightleftarrows;", "\u21C4");
3059    definedEntities.put("&rightleftharpoons;", "\u21CC");
3060    definedEntities.put("&rightrightarrows;", "\u21C9");
3061    definedEntities.put("&rightsquigarrow;", "\u219D");
3062    definedEntities.put("&rightthreetimes;", "\u22CC");
3063    definedEntities.put("&ring;", "\u02DA");
3064    definedEntities.put("&risingdotseq;", "\u2253");
3065    definedEntities.put("&rlarr;", "\u21C4");
3066    definedEntities.put("&rlhar;", "\u21CC");
3067    definedEntities.put("&rlm;", "\u200F");
3068    definedEntities.put("&rmoust;", "\u23B1");
3069    definedEntities.put("&rmoustache;", "\u23B1");
3070    definedEntities.put("&rnmid;", "\u2AEE");
3071    definedEntities.put("&roang;", "\u27ED");
3072    definedEntities.put("&roarr;", "\u21FE");
3073    definedEntities.put("&robrk;", "\u27E7");
3074    definedEntities.put("&ropar;", "\u2986");
3075    definedEntities.put("&ropf;", "\uD835\uDD63");
3076    definedEntities.put("&roplus;", "\u2A2E");
3077    definedEntities.put("&rotimes;", "\u2A35");
3078    definedEntities.put("&rpar;", "\u0029");
3079    definedEntities.put("&rpargt;", "\u2994");
3080    definedEntities.put("&rppolint;", "\u2A12");
3081    definedEntities.put("&rrarr;", "\u21C9");
3082    definedEntities.put("&rsaquo;", "\u203A");
3083    definedEntities.put("&rscr;", "\uD835\uDCC7");
3084    definedEntities.put("&rsh;", "\u21B1");
3085    definedEntities.put("&rsqb;", "\u005D");
3086    definedEntities.put("&rsquo;", "\u2019");
3087    definedEntities.put("&rsquor;", "\u2019");
3088    definedEntities.put("&rthree;", "\u22CC");
3089    definedEntities.put("&rtimes;", "\u22CA");
3090    definedEntities.put("&rtri;", "\u25B9");
3091    definedEntities.put("&rtrie;", "\u22B5");
3092    definedEntities.put("&rtrif;", "\u25B8");
3093    definedEntities.put("&rtriltri;", "\u29CE");
3094    definedEntities.put("&ruluhar;", "\u2968");
3095    definedEntities.put("&rx;", "\u211E");
3096    definedEntities.put("&sacute;", "\u015B");
3097    definedEntities.put("&sbquo;", "\u201A");
3098    definedEntities.put("&sc;", "\u227B");
3099    definedEntities.put("&scE;", "\u2AB4");
3100    definedEntities.put("&scap;", "\u2AB8");
3101    definedEntities.put("&scaron;", "\u0161");
3102    definedEntities.put("&sccue;", "\u227D");
3103    definedEntities.put("&sce;", "\u2AB0");
3104    definedEntities.put("&scedil;", "\u015F");
3105    definedEntities.put("&scirc;", "\u015D");
3106    definedEntities.put("&scnE;", "\u2AB6");
3107    definedEntities.put("&scnap;", "\u2ABA");
3108    definedEntities.put("&scnsim;", "\u22E9");
3109    definedEntities.put("&scpolint;", "\u2A13");
3110    definedEntities.put("&scsim;", "\u227F");
3111    definedEntities.put("&scy;", "\u0441");
3112    definedEntities.put("&sdot;", "\u22C5");
3113    definedEntities.put("&sdotb;", "\u22A1");
3114    definedEntities.put("&sdote;", "\u2A66");
3115    definedEntities.put("&seArr;", "\u21D8");
3116    definedEntities.put("&searhk;", "\u2925");
3117    definedEntities.put("&searr;", "\u2198");
3118    definedEntities.put("&searrow;", "\u2198");
3119    definedEntities.put("&sect;", "\u00A7");
3120    definedEntities.put("&semi;", "\u003B");
3121    definedEntities.put("&seswar;", "\u2929");
3122    definedEntities.put("&setminus;", "\u2216");
3123    definedEntities.put("&setmn;", "\u2216");
3124    definedEntities.put("&sext;", "\u2736");
3125    definedEntities.put("&sfr;", "\uD835\uDD30");
3126    definedEntities.put("&sfrown;", "\u2322");
3127    definedEntities.put("&sharp;", "\u266F");
3128    definedEntities.put("&shchcy;", "\u0449");
3129    definedEntities.put("&shcy;", "\u0448");
3130    definedEntities.put("&shortmid;", "\u2223");
3131    definedEntities.put("&shortparallel;", "\u2225");
3132    definedEntities.put("&shy;", "\u00AD");
3133    definedEntities.put("&sigma;", "\u03C3");
3134    definedEntities.put("&sigmaf;", "\u03C2");
3135    definedEntities.put("&sigmav;", "\u03C2");
3136    definedEntities.put("&sim;", "\u223C");
3137    definedEntities.put("&simdot;", "\u2A6A");
3138    definedEntities.put("&sime;", "\u2243");
3139    definedEntities.put("&simeq;", "\u2243");
3140    definedEntities.put("&simg;", "\u2A9E");
3141    definedEntities.put("&simgE;", "\u2AA0");
3142    definedEntities.put("&siml;", "\u2A9D");
3143    definedEntities.put("&simlE;", "\u2A9F");
3144    definedEntities.put("&simne;", "\u2246");
3145    definedEntities.put("&simplus;", "\u2A24");
3146    definedEntities.put("&simrarr;", "\u2972");
3147    definedEntities.put("&slarr;", "\u2190");
3148    definedEntities.put("&smallsetminus;", "\u2216");
3149    definedEntities.put("&smashp;", "\u2A33");
3150    definedEntities.put("&smeparsl;", "\u29E4");
3151    definedEntities.put("&smid;", "\u2223");
3152    definedEntities.put("&smile;", "\u2323");
3153    definedEntities.put("&smt;", "\u2AAA");
3154    definedEntities.put("&smte;", "\u2AAC");
3155    definedEntities.put("&smtes;", "\u2AAC\uFE00");
3156    definedEntities.put("&softcy;", "\u044C");
3157    definedEntities.put("&sol;", "\u002F");
3158    definedEntities.put("&solb;", "\u29C4");
3159    definedEntities.put("&solbar;", "\u233F");
3160    definedEntities.put("&sopf;", "\uD835\uDD64");
3161    definedEntities.put("&spades;", "\u2660");
3162    definedEntities.put("&spadesuit;", "\u2660");
3163    definedEntities.put("&spar;", "\u2225");
3164    definedEntities.put("&sqcap;", "\u2293");
3165    definedEntities.put("&sqcaps;", "\u2293\uFE00");
3166    definedEntities.put("&sqcup;", "\u2294");
3167    definedEntities.put("&sqcups;", "\u2294\uFE00");
3168    definedEntities.put("&sqsub;", "\u228F");
3169    definedEntities.put("&sqsube;", "\u2291");
3170    definedEntities.put("&sqsubset;", "\u228F");
3171    definedEntities.put("&sqsubseteq;", "\u2291");
3172    definedEntities.put("&sqsup;", "\u2290");
3173    definedEntities.put("&sqsupe;", "\u2292");
3174    definedEntities.put("&sqsupset;", "\u2290");
3175    definedEntities.put("&sqsupseteq;", "\u2292");
3176    definedEntities.put("&squ;", "\u25A1");
3177    definedEntities.put("&square;", "\u25A1");
3178    definedEntities.put("&squarf;", "\u25AA");
3179    definedEntities.put("&squf;", "\u25AA");
3180    definedEntities.put("&srarr;", "\u2192");
3181    definedEntities.put("&sscr;", "\uD835\uDCC8");
3182    definedEntities.put("&ssetmn;", "\u2216");
3183    definedEntities.put("&ssmile;", "\u2323");
3184    definedEntities.put("&sstarf;", "\u22C6");
3185    definedEntities.put("&star;", "\u2606");
3186    definedEntities.put("&starf;", "\u2605");
3187    definedEntities.put("&straightepsilon;", "\u03F5");
3188    definedEntities.put("&straightphi;", "\u03D5");
3189    definedEntities.put("&strns;", "\u00AF");
3190    definedEntities.put("&sub;", "\u2282");
3191    definedEntities.put("&subE;", "\u2AC5");
3192    definedEntities.put("&subdot;", "\u2ABD");
3193    definedEntities.put("&sube;", "\u2286");
3194    definedEntities.put("&subedot;", "\u2AC3");
3195    definedEntities.put("&submult;", "\u2AC1");
3196    definedEntities.put("&subnE;", "\u2ACB");
3197    definedEntities.put("&subne;", "\u228A");
3198    definedEntities.put("&subplus;", "\u2ABF");
3199    definedEntities.put("&subrarr;", "\u2979");
3200    definedEntities.put("&subset;", "\u2282");
3201    definedEntities.put("&subseteq;", "\u2286");
3202    definedEntities.put("&subseteqq;", "\u2AC5");
3203    definedEntities.put("&subsetneq;", "\u228A");
3204    definedEntities.put("&subsetneqq;", "\u2ACB");
3205    definedEntities.put("&subsim;", "\u2AC7");
3206    definedEntities.put("&subsub;", "\u2AD5");
3207    definedEntities.put("&subsup;", "\u2AD3");
3208    definedEntities.put("&succ;", "\u227B");
3209    definedEntities.put("&succapprox;", "\u2AB8");
3210    definedEntities.put("&succcurlyeq;", "\u227D");
3211    definedEntities.put("&succeq;", "\u2AB0");
3212    definedEntities.put("&succnapprox;", "\u2ABA");
3213    definedEntities.put("&succneqq;", "\u2AB6");
3214    definedEntities.put("&succnsim;", "\u22E9");
3215    definedEntities.put("&succsim;", "\u227F");
3216    definedEntities.put("&sum;", "\u2211");
3217    definedEntities.put("&sung;", "\u266A");
3218    definedEntities.put("&sup1;", "\u00B9");
3219    definedEntities.put("&sup2;", "\u00B2");
3220    definedEntities.put("&sup3;", "\u00B3");
3221    definedEntities.put("&sup;", "\u2283");
3222    definedEntities.put("&supE;", "\u2AC6");
3223    definedEntities.put("&supdot;", "\u2ABE");
3224    definedEntities.put("&supdsub;", "\u2AD8");
3225    definedEntities.put("&supe;", "\u2287");
3226    definedEntities.put("&supedot;", "\u2AC4");
3227    definedEntities.put("&suphsol;", "\u27C9");
3228    definedEntities.put("&suphsub;", "\u2AD7");
3229    definedEntities.put("&suplarr;", "\u297B");
3230    definedEntities.put("&supmult;", "\u2AC2");
3231    definedEntities.put("&supnE;", "\u2ACC");
3232    definedEntities.put("&supne;", "\u228B");
3233    definedEntities.put("&supplus;", "\u2AC0");
3234    definedEntities.put("&supset;", "\u2283");
3235    definedEntities.put("&supseteq;", "\u2287");
3236    definedEntities.put("&supseteqq;", "\u2AC6");
3237    definedEntities.put("&supsetneq;", "\u228B");
3238    definedEntities.put("&supsetneqq;", "\u2ACC");
3239    definedEntities.put("&supsim;", "\u2AC8");
3240    definedEntities.put("&supsub;", "\u2AD4");
3241    definedEntities.put("&supsup;", "\u2AD6");
3242    definedEntities.put("&swArr;", "\u21D9");
3243    definedEntities.put("&swarhk;", "\u2926");
3244    definedEntities.put("&swarr;", "\u2199");
3245    definedEntities.put("&swarrow;", "\u2199");
3246    definedEntities.put("&swnwar;", "\u292A");
3247    definedEntities.put("&szlig;", "\u00DF");
3248    definedEntities.put("&target;", "\u2316");
3249    definedEntities.put("&tau;", "\u03C4");
3250    definedEntities.put("&tbrk;", "\u23B4");
3251    definedEntities.put("&tcaron;", "\u0165");
3252    definedEntities.put("&tcedil;", "\u0163");
3253    definedEntities.put("&tcy;", "\u0442");
3254    definedEntities.put("&tdot;", "\u20DB");
3255    definedEntities.put("&telrec;", "\u2315");
3256    definedEntities.put("&tfr;", "\uD835\uDD31");
3257    definedEntities.put("&there4;", "\u2234");
3258    definedEntities.put("&therefore;", "\u2234");
3259    definedEntities.put("&theta;", "\u03B8");
3260    definedEntities.put("&thetasym;", "\u03D1");
3261    definedEntities.put("&thetav;", "\u03D1");
3262    definedEntities.put("&thickapprox;", "\u2248");
3263    definedEntities.put("&thicksim;", "\u223C");
3264    definedEntities.put("&thinsp;", "\u2009");
3265    definedEntities.put("&thkap;", "\u2248");
3266    definedEntities.put("&thksim;", "\u223C");
3267    definedEntities.put("&thorn;", "\u00FE");
3268    definedEntities.put("&tilde;", "\u02DC");
3269    definedEntities.put("&times;", "\u00D7");
3270    definedEntities.put("&timesb;", "\u22A0");
3271    definedEntities.put("&timesbar;", "\u2A31");
3272    definedEntities.put("&timesd;", "\u2A30");
3273    definedEntities.put("&tint;", "\u222D");
3274    definedEntities.put("&toea;", "\u2928");
3275    definedEntities.put("&top;", "\u22A4");
3276    definedEntities.put("&topbot;", "\u2336");
3277    definedEntities.put("&topcir;", "\u2AF1");
3278    definedEntities.put("&topf;", "\uD835\uDD65");
3279    definedEntities.put("&topfork;", "\u2ADA");
3280    definedEntities.put("&tosa;", "\u2929");
3281    definedEntities.put("&tprime;", "\u2034");
3282    definedEntities.put("&trade;", "\u2122");
3283    definedEntities.put("&triangle;", "\u25B5");
3284    definedEntities.put("&triangledown;", "\u25BF");
3285    definedEntities.put("&triangleleft;", "\u25C3");
3286    definedEntities.put("&trianglelefteq;", "\u22B4");
3287    definedEntities.put("&triangleq;", "\u225C");
3288    definedEntities.put("&triangleright;", "\u25B9");
3289    definedEntities.put("&trianglerighteq;", "\u22B5");
3290    definedEntities.put("&tridot;", "\u25EC");
3291    definedEntities.put("&trie;", "\u225C");
3292    definedEntities.put("&triminus;", "\u2A3A");
3293    definedEntities.put("&triplus;", "\u2A39");
3294    definedEntities.put("&trisb;", "\u29CD");
3295    definedEntities.put("&tritime;", "\u2A3B");
3296    definedEntities.put("&trpezium;", "\u23E2");
3297    definedEntities.put("&tscr;", "\uD835\uDCC9");
3298    definedEntities.put("&tscy;", "\u0446");
3299    definedEntities.put("&tshcy;", "\u045B");
3300    definedEntities.put("&tstrok;", "\u0167");
3301    definedEntities.put("&twixt;", "\u226C");
3302    definedEntities.put("&twoheadleftarrow;", "\u219E");
3303    definedEntities.put("&twoheadrightarrow;", "\u21A0");
3304    definedEntities.put("&uArr;", "\u21D1");
3305    definedEntities.put("&uHar;", "\u2963");
3306    definedEntities.put("&uacute;", "\u00FA");
3307    definedEntities.put("&uarr;", "\u2191");
3308    definedEntities.put("&ubrcy;", "\u045E");
3309    definedEntities.put("&ubreve;", "\u016D");
3310    definedEntities.put("&ucirc;", "\u00FB");
3311    definedEntities.put("&ucy;", "\u0443");
3312    definedEntities.put("&udarr;", "\u21C5");
3313    definedEntities.put("&udblac;", "\u0171");
3314    definedEntities.put("&udhar;", "\u296E");
3315    definedEntities.put("&ufisht;", "\u297E");
3316    definedEntities.put("&ufr;", "\uD835\uDD32");
3317    definedEntities.put("&ugrave;", "\u00F9");
3318    definedEntities.put("&uharl;", "\u21BF");
3319    definedEntities.put("&uharr;", "\u21BE");
3320    definedEntities.put("&uhblk;", "\u2580");
3321    definedEntities.put("&ulcorn;", "\u231C");
3322    definedEntities.put("&ulcorner;", "\u231C");
3323    definedEntities.put("&ulcrop;", "\u230F");
3324    definedEntities.put("&ultri;", "\u25F8");
3325    definedEntities.put("&umacr;", "\u016B");
3326    definedEntities.put("&uml;", "\u00A8");
3327    definedEntities.put("&uogon;", "\u0173");
3328    definedEntities.put("&uopf;", "\uD835\uDD66");
3329    definedEntities.put("&uparrow;", "\u2191");
3330    definedEntities.put("&updownarrow;", "\u2195");
3331    definedEntities.put("&upharpoonleft;", "\u21BF");
3332    definedEntities.put("&upharpoonright;", "\u21BE");
3333    definedEntities.put("&uplus;", "\u228E");
3334    definedEntities.put("&upsi;", "\u03C5");
3335    definedEntities.put("&upsih;", "\u03D2");
3336    definedEntities.put("&upsilon;", "\u03C5");
3337    definedEntities.put("&upuparrows;", "\u21C8");
3338    definedEntities.put("&urcorn;", "\u231D");
3339    definedEntities.put("&urcorner;", "\u231D");
3340    definedEntities.put("&urcrop;", "\u230E");
3341    definedEntities.put("&uring;", "\u016F");
3342    definedEntities.put("&urtri;", "\u25F9");
3343    definedEntities.put("&uscr;", "\uD835\uDCCA");
3344    definedEntities.put("&utdot;", "\u22F0");
3345    definedEntities.put("&utilde;", "\u0169");
3346    definedEntities.put("&utri;", "\u25B5");
3347    definedEntities.put("&utrif;", "\u25B4");
3348    definedEntities.put("&uuarr;", "\u21C8");
3349    definedEntities.put("&uuml;", "\u00FC");
3350    definedEntities.put("&uwangle;", "\u29A7");
3351    definedEntities.put("&vArr;", "\u21D5");
3352    definedEntities.put("&vBar;", "\u2AE8");
3353    definedEntities.put("&vBarv;", "\u2AE9");
3354    definedEntities.put("&vDash;", "\u22A8");
3355    definedEntities.put("&vangrt;", "\u299C");
3356    definedEntities.put("&varepsilon;", "\u03F5");
3357    definedEntities.put("&varkappa;", "\u03F0");
3358    definedEntities.put("&varnothing;", "\u2205");
3359    definedEntities.put("&varphi;", "\u03D5");
3360    definedEntities.put("&varpi;", "\u03D6");
3361    definedEntities.put("&varpropto;", "\u221D");
3362    definedEntities.put("&varr;", "\u2195");
3363    definedEntities.put("&varrho;", "\u03F1");
3364    definedEntities.put("&varsigma;", "\u03C2");
3365    definedEntities.put("&varsubsetneq;", "\u228A\uFE00");
3366    definedEntities.put("&varsubsetneqq;", "\u2ACB\uFE00");
3367    definedEntities.put("&varsupsetneq;", "\u228B\uFE00");
3368    definedEntities.put("&varsupsetneqq;", "\u2ACC\uFE00");
3369    definedEntities.put("&vartheta;", "\u03D1");
3370    definedEntities.put("&vartriangleleft;", "\u22B2");
3371    definedEntities.put("&vartriangleright;", "\u22B3");
3372    definedEntities.put("&vcy;", "\u0432");
3373    definedEntities.put("&vdash;", "\u22A2");
3374    definedEntities.put("&vee;", "\u2228");
3375    definedEntities.put("&veebar;", "\u22BB");
3376    definedEntities.put("&veeeq;", "\u225A");
3377    definedEntities.put("&vellip;", "\u22EE");
3378    definedEntities.put("&verbar;", "\u007C");
3379    definedEntities.put("&vert;", "\u007C");
3380    definedEntities.put("&vfr;", "\uD835\uDD33");
3381    definedEntities.put("&vltri;", "\u22B2");
3382    definedEntities.put("&vnsub;", "\u2282\u20D2");
3383    definedEntities.put("&vnsup;", "\u2283\u20D2");
3384    definedEntities.put("&vopf;", "\uD835\uDD67");
3385    definedEntities.put("&vprop;", "\u221D");
3386    definedEntities.put("&vrtri;", "\u22B3");
3387    definedEntities.put("&vscr;", "\uD835\uDCCB");
3388    definedEntities.put("&vsubnE;", "\u2ACB\uFE00");
3389    definedEntities.put("&vsubne;", "\u228A\uFE00");
3390    definedEntities.put("&vsupnE;", "\u2ACC\uFE00");
3391    definedEntities.put("&vsupne;", "\u228B\uFE00");
3392    definedEntities.put("&vzigzag;", "\u299A");
3393    definedEntities.put("&wcirc;", "\u0175");
3394    definedEntities.put("&wedbar;", "\u2A5F");
3395    definedEntities.put("&wedge;", "\u2227");
3396    definedEntities.put("&wedgeq;", "\u2259");
3397    definedEntities.put("&weierp;", "\u2118");
3398    definedEntities.put("&wfr;", "\uD835\uDD34");
3399    definedEntities.put("&wopf;", "\uD835\uDD68");
3400    definedEntities.put("&wp;", "\u2118");
3401    definedEntities.put("&wr;", "\u2240");
3402    definedEntities.put("&wreath;", "\u2240");
3403    definedEntities.put("&wscr;", "\uD835\uDCCC");
3404    definedEntities.put("&xcap;", "\u22C2");
3405    definedEntities.put("&xcirc;", "\u25EF");
3406    definedEntities.put("&xcup;", "\u22C3");
3407    definedEntities.put("&xdtri;", "\u25BD");
3408    definedEntities.put("&xfr;", "\uD835\uDD35");
3409    definedEntities.put("&xhArr;", "\u27FA");
3410    definedEntities.put("&xharr;", "\u27F7");
3411    definedEntities.put("&xi;", "\u03BE");
3412    definedEntities.put("&xlArr;", "\u27F8");
3413    definedEntities.put("&xlarr;", "\u27F5");
3414    definedEntities.put("&xmap;", "\u27FC");
3415    definedEntities.put("&xnis;", "\u22FB");
3416    definedEntities.put("&xodot;", "\u2A00");
3417    definedEntities.put("&xopf;", "\uD835\uDD69");
3418    definedEntities.put("&xoplus;", "\u2A01");
3419    definedEntities.put("&xotime;", "\u2A02");
3420    definedEntities.put("&xrArr;", "\u27F9");
3421    definedEntities.put("&xrarr;", "\u27F6");
3422    definedEntities.put("&xscr;", "\uD835\uDCCD");
3423    definedEntities.put("&xsqcup;", "\u2A06");
3424    definedEntities.put("&xuplus;", "\u2A04");
3425    definedEntities.put("&xutri;", "\u25B3");
3426    definedEntities.put("&xvee;", "\u22C1");
3427    definedEntities.put("&xwedge;", "\u22C0");
3428    definedEntities.put("&yacute;", "\u00FD");
3429    definedEntities.put("&yacy;", "\u044F");
3430    definedEntities.put("&ycirc;", "\u0177");
3431    definedEntities.put("&ycy;", "\u044B");
3432    definedEntities.put("&yen;", "\u00A5");
3433    definedEntities.put("&yfr;", "\uD835\uDD36");
3434    definedEntities.put("&yicy;", "\u0457");
3435    definedEntities.put("&yopf;", "\uD835\uDD6A");
3436    definedEntities.put("&yscr;", "\uD835\uDCCE");
3437    definedEntities.put("&yucy;", "\u044E");
3438    definedEntities.put("&yuml;", "\u00FF");
3439    definedEntities.put("&zacute;", "\u017A");
3440    definedEntities.put("&zcaron;", "\u017E");
3441    definedEntities.put("&zcy;", "\u0437");
3442    definedEntities.put("&zdot;", "\u017C");
3443    definedEntities.put("&zeetrf;", "\u2128");
3444    definedEntities.put("&zeta;", "\u03B6");
3445    definedEntities.put("&zfr;", "\uD835\uDD37");
3446    definedEntities.put("&zhcy;", "\u0436");
3447    definedEntities.put("&zigrarr;", "\u21DD");
3448    definedEntities.put("&zopf;", "\uD835\uDD6B");
3449    definedEntities.put("&zscr;", "\uD835\uDCCF");
3450    definedEntities.put("&zwj;", "\u200D");
3451    definedEntities.put("&zwnj;", "\u200C");
3452  }
3453
3454}