Skip to content

Instantly share code, notes, and snippets.

@Bak-Jin-Hyeong
Last active May 4, 2017 06:43
Show Gist options
  • Save Bak-Jin-Hyeong/cf8d3ff817b6dce5c8e0648f51a193c5 to your computer and use it in GitHub Desktop.
Save Bak-Jin-Hyeong/cf8d3ff817b6dce5c8e0648f51a193c5 to your computer and use it in GitHub Desktop.
#include <cstring>
#include <algorithm>
#include <utility>
#include <string>
#include <regex>
template<typename C> class EncodeCodePointToUTF {
public:
C encoded[(4 / sizeof(C)) + 1] = {};
int length = 1;
explicit EncodeCodePointToUTF(unsigned int codePoint) {
EncodeImpl<sizeof(C)>(codePoint);
}
private:
template<size_t> void EncodeImpl(unsigned int codePoint);
template<> void EncodeImpl<4>(unsigned int codePoint) {
encoded[0] = static_cast<C>(codePoint);
encoded[1] = '\0';
length = 1;
}
template<> void EncodeImpl<2>(unsigned int codePoint) {
if (codePoint <= 0xFFFF) {
encoded[0] = static_cast<C>(codePoint);
encoded[1] = '\0';
length = 1;
}
else if (codePoint <= 0x10FFFF) {
const auto x = codePoint - 0x10000;
encoded[0] = static_cast<C>(0xD800 + ((x >> 10) & 0x3FF));
encoded[1] = static_cast<C>(0xDC00 + (x & 0x3FF));
encoded[2] = '\0';
length = 2;
}
else {
encoded[0] = '\0';
length = 0;
}
}
template<> void EncodeImpl<1>(unsigned int codePoint) {
if (codePoint <= 0x7F) {
encoded[0] = static_cast<C>(codePoint);
encoded[1] = '\0';
length = 1;
}
else if (codePoint <= 0x7FF) {
encoded[0] = static_cast<C>(0xC0 + ((codePoint >> 6) & 0x1F));
encoded[1] = static_cast<C>(0x80 + (codePoint & 0x3F));
encoded[2] = '\0';
length = 2;
}
else if (codePoint <= 0xFFFF) {
encoded[0] = static_cast<C>(0xE0 + ((codePoint >> 12) & 0xF));
encoded[1] = static_cast<C>(0x80 + ((codePoint >> 6) & 0x3F));
encoded[2] = static_cast<C>(0x80 + (codePoint & 0x3F));
encoded[3] = '\0';
length = 3;
}
else if (codePoint <= 0x10FFFF) {
encoded[0] = static_cast<C>(0xF0 + ((codePoint >> 18) & 0x7));
encoded[1] = static_cast<C>(0x80 + ((codePoint >> 12) & 0x3F));
encoded[2] = static_cast<C>(0x80 + ((codePoint >> 6) & 0x3F));
encoded[3] = static_cast<C>(0x80 + (codePoint & 0x3F));
encoded[4] = '\0';
length = 4;
}
else {
encoded[0] = '\0';
length = 0;
}
}
};
inline int HTMLEntityNameToCodePoint(const char* name) {
struct Lookup {
const char* name;
int code;
};
struct Compare {
bool operator()(const Lookup& lhs, const Lookup& rhs) const {
return strcmp(lhs.name, rhs.name) < 0;
}
bool operator()(const Lookup& lhs, const char* rhs) const {
return strcmp(lhs.name, rhs) < 0;
}
bool operator()(const char* lhs, const Lookup& rhs) const {
return strcmp(lhs, rhs.name) < 0;
}
};
// CAUTION: Alphabetical ordering should be maintained.
// NOTE: scrabbed from https://dev.w3.org/html5/html-author/charref
static const Lookup lookup_[] = {
{ "AElig", 0x000C6 },
{ "AMP", 0x00026 },
{ "Aacute", 0x000C1 },
{ "Abreve", 0x00102 },
{ "Acirc", 0x000C2 },
{ "Acy", 0x00410 },
{ "Afr", 0x1D504 },
{ "Agrave", 0x000C0 },
{ "Alpha", 0x00391 },
{ "Amacr", 0x00100 },
{ "And", 0x02A53 },
{ "Aogon", 0x00104 },
{ "Aopf", 0x1D538 },
{ "ApplyFunction", 0x02061 },
{ "Aring", 0x000C5 },
{ "Ascr", 0x1D49C },
{ "Assign", 0x02254 },
{ "Atilde", 0x000C3 },
{ "Aum", 0x000C4 },
{ "Backslash", 0x02216 },
{ "Barv", 0x02AE7 },
{ "Barwed", 0x02306 },
{ "Bcy", 0x00411 },
{ "Because", 0x02235 },
{ "Bernoullis", 0x0212C },
{ "Beta", 0x00392 },
{ "Bfr", 0x1D505 },
{ "Bopf", 0x1D539 },
{ "Breve", 0x002D8 },
{ "Bscr", 0x0212C },
{ "Bumpeq", 0x0224E },
{ "CHcy", 0x00427 },
{ "COPY", 0x000A9 },
{ "Cacute", 0x00106 },
{ "Cap", 0x022D2 },
{ "CapitalDifferentialD", 0x02145 },
{ "Cayleys", 0x0212D },
{ "Ccaron", 0x0010C },
{ "Ccedi", 0x000C7 },
{ "Ccirc", 0x00108 },
{ "Cconint", 0x02230 },
{ "Cdot", 0x0010A },
{ "Cedilla", 0x000B8 },
{ "CenterDot", 0x000B7 },
{ "Cfr", 0x0212D },
{ "Chi", 0x003A7 },
{ "CircleDot", 0x02299 },
{ "CircleMinus", 0x02296 },
{ "CirclePlus", 0x02295 },
{ "CircleTimes", 0x02297 },
{ "ClockwiseContourIntegra", 0x02232 },
{ "CloseCurlyDoubleQuote", 0x0201D },
{ "CloseCurlyQuote", 0x02019 },
{ "Colon", 0x02237 },
{ "Colone", 0x02A74 },
{ "Congruent", 0x02261 },
{ "Conint", 0x0222F },
{ "ContourIntegra", 0x0222E },
{ "Copf", 0x02102 },
{ "Coproduct", 0x02210 },
{ "CounterClockwiseContourIntegra", 0x02233 },
{ "Cross", 0x02A2F },
{ "Cscr", 0x1D49E },
{ "Cup", 0x022D3 },
{ "CupCap", 0x0224D },
{ "DD", 0x02145 },
{ "DDotrahd", 0x02911 },
{ "DJcy", 0x00402 },
{ "DScy", 0x00405 },
{ "DZcy", 0x0040F },
{ "Dagger", 0x02021 },
{ "Darr", 0x021A1 },
{ "Dashv", 0x02AE4 },
{ "Dcaron", 0x0010E },
{ "Dcy", 0x00414 },
{ "De", 0x02207 },
{ "Delta", 0x00394 },
{ "Dfr", 0x1D507 },
{ "DiacriticalAcute", 0x000B4 },
{ "DiacriticalDot", 0x002D9 },
{ "DiacriticalDoubleAcute", 0x002DD },
{ "DiacriticalGrave", 0x00060 },
{ "DiacriticalTilde", 0x002DC },
{ "Diamond", 0x022C4 },
{ "DifferentialD", 0x02146 },
{ "Dopf", 0x1D53B },
{ "Dot", 0x000A8 },
{ "DotDot", 0x020DC },
{ "DotEqua", 0x02250 },
{ "DoubleContourIntegra", 0x0222F },
{ "DoubleDot", 0x000A8 },
{ "DoubleDownArrow", 0x021D3 },
{ "DoubleLeftArrow", 0x021D0 },
{ "DoubleLeftRightArrow", 0x021D4 },
{ "DoubleLeftTee", 0x02AE4 },
{ "DoubleLongLeftArrow", 0x027F8 },
{ "DoubleLongLeftRightArrow", 0x027FA },
{ "DoubleLongRightArrow", 0x027F9 },
{ "DoubleRightArrow", 0x021D2 },
{ "DoubleRightTee", 0x022A8 },
{ "DoubleUpArrow", 0x021D1 },
{ "DoubleUpDownArrow", 0x021D5 },
{ "DoubleVerticalBar", 0x02225 },
{ "DownArrow", 0x02193 },
{ "DownArrowBar", 0x02913 },
{ "DownArrowUpArrow", 0x021F5 },
{ "DownBreve", 0x00311 },
{ "DownLeftRightVector", 0x02950 },
{ "DownLeftTeeVector", 0x0295E },
{ "DownLeftVector", 0x021BD },
{ "DownLeftVectorBar", 0x02956 },
{ "DownRightTeeVector", 0x0295F },
{ "DownRightVector", 0x021C1 },
{ "DownRightVectorBar", 0x02957 },
{ "DownTee", 0x022A4 },
{ "DownTeeArrow", 0x021A7 },
{ "Downarrow", 0x021D3 },
{ "Dscr", 0x1D49F },
{ "Dstrok", 0x00110 },
{ "ENG", 0x0014A },
{ "ETH", 0x000D0 },
{ "Eacute", 0x000C9 },
{ "Ecaron", 0x0011A },
{ "Ecirc", 0x000CA },
{ "Ecy", 0x0042D },
{ "Edot", 0x00116 },
{ "Efr", 0x1D508 },
{ "Egrave", 0x000C8 },
{ "Element", 0x02208 },
{ "Emacr", 0x00112 },
{ "EmptySmallSquare", 0x025FB },
{ "EmptyVerySmallSquare", 0x025AB },
{ "Eogon", 0x00118 },
{ "Eopf", 0x1D53C },
{ "Epsilon", 0x00395 },
{ "Equa", 0x02A75 },
{ "EqualTilde", 0x02242 },
{ "Equilibrium", 0x021CC },
{ "Escr", 0x02130 },
{ "Esim", 0x02A73 },
{ "Eta", 0x00397 },
{ "Eum", 0x000CB },
{ "Exists", 0x02203 },
{ "ExponentialE", 0x02147 },
{ "Fcy", 0x00424 },
{ "Ffr", 0x1D509 },
{ "FilledSmallSquare", 0x025FC },
{ "FilledVerySmallSquare", 0x025AA },
{ "Fopf", 0x1D53D },
{ "ForAl", 0x02200 },
{ "Fouriertrf", 0x02131 },
{ "Fscr", 0x02131 },
{ "GJcy", 0x00403 },
{ "GT", 0x0003E },
{ "Gamma", 0x00393 },
{ "Gammad", 0x003DC },
{ "Gbreve", 0x0011E },
{ "Gcedi", 0x00122 },
{ "Gcirc", 0x0011C },
{ "Gcy", 0x00413 },
{ "Gdot", 0x00120 },
{ "Gfr", 0x1D50A },
{ "Gg", 0x022D9 },
{ "Gopf", 0x1D53E },
{ "GreaterEqua", 0x02265 },
{ "GreaterEqualLess", 0x022DB },
{ "GreaterFullEqua", 0x02267 },
{ "GreaterGreater", 0x02AA2 },
{ "GreaterLess", 0x02277 },
{ "GreaterSlantEqua", 0x02A7E },
{ "GreaterTilde", 0x02273 },
{ "Gscr", 0x1D4A2 },
{ "Gt", 0x0226B },
{ "HARDcy", 0x0042A },
{ "Hacek", 0x002C7 },
{ "Hat", 0x0005E },
{ "Hcirc", 0x00124 },
{ "Hfr", 0x0210C },
{ "HilbertSpace", 0x0210B },
{ "Hopf", 0x0210D },
{ "HorizontalLine", 0x02500 },
{ "Hscr", 0x0210B },
{ "Hstrok", 0x00126 },
{ "HumpDownHump", 0x0224E },
{ "HumpEqua", 0x0224F },
{ "IEcy", 0x00415 },
{ "IJlig", 0x00132 },
{ "IOcy", 0x00401 },
{ "Iacute", 0x000CD },
{ "Icirc", 0x000CE },
{ "Icy", 0x00418 },
{ "Idot", 0x00130 },
{ "Ifr", 0x02111 },
{ "Igrave", 0x000CC },
{ "Im", 0x02111 },
{ "Imacr", 0x0012A },
{ "ImaginaryI", 0x02148 },
{ "Implies", 0x021D2 },
{ "Int", 0x0222C },
{ "Integra", 0x0222B },
{ "Intersection", 0x022C2 },
{ "InvisibleComma", 0x02063 },
{ "InvisibleTimes", 0x02062 },
{ "Iogon", 0x0012E },
{ "Iopf", 0x1D540 },
{ "Iota", 0x00399 },
{ "Iscr", 0x02110 },
{ "Itilde", 0x00128 },
{ "Iukcy", 0x00406 },
{ "Ium", 0x000CF },
{ "Jcirc", 0x00134 },
{ "Jcy", 0x00419 },
{ "Jfr", 0x1D50D },
{ "Jopf", 0x1D541 },
{ "Jscr", 0x1D4A5 },
{ "Jsercy", 0x00408 },
{ "Jukcy", 0x00404 },
{ "KHcy", 0x00425 },
{ "KJcy", 0x0040C },
{ "Kappa", 0x0039A },
{ "Kcedi", 0x00136 },
{ "Kcy", 0x0041A },
{ "Kfr", 0x1D50E },
{ "Kopf", 0x1D542 },
{ "Kscr", 0x1D4A6 },
{ "LJcy", 0x00409 },
{ "LT", 0x0003C },
{ "Lacute", 0x00139 },
{ "Lambda", 0x0039B },
{ "Lang", 0x027EA },
{ "Laplacetrf", 0x02112 },
{ "Larr", 0x0219E },
{ "Lcaron", 0x0013D },
{ "Lcedi", 0x0013B },
{ "Lcy", 0x0041B },
{ "LeftAngleBracket", 0x027E8 },
{ "LeftArrow", 0x02190 },
{ "LeftArrowBar", 0x021E4 },
{ "LeftArrowRightArrow", 0x021C6 },
{ "LeftCeiling", 0x02308 },
{ "LeftDoubleBracket", 0x027E6 },
{ "LeftDownTeeVector", 0x02961 },
{ "LeftDownVector", 0x021C3 },
{ "LeftDownVectorBar", 0x02959 },
{ "LeftFloor", 0x0230A },
{ "LeftRightArrow", 0x02194 },
{ "LeftRightVector", 0x0294E },
{ "LeftTee", 0x022A3 },
{ "LeftTeeArrow", 0x021A4 },
{ "LeftTeeVector", 0x0295A },
{ "LeftTriangle", 0x022B2 },
{ "LeftTriangleBar", 0x029CF },
{ "LeftTriangleEqua", 0x022B4 },
{ "LeftUpDownVector", 0x02951 },
{ "LeftUpTeeVector", 0x02960 },
{ "LeftUpVector", 0x021BF },
{ "LeftUpVectorBar", 0x02958 },
{ "LeftVector", 0x021BC },
{ "LeftVectorBar", 0x02952 },
{ "Leftarrow", 0x021D0 },
{ "Leftrightarrow", 0x021D4 },
{ "LessEqualGreater", 0x022DA },
{ "LessFullEqua", 0x02266 },
{ "LessGreater", 0x02276 },
{ "LessLess", 0x02AA1 },
{ "LessSlantEqua", 0x02A7D },
{ "LessTilde", 0x02272 },
{ "Lfr", 0x1D50F },
{ "L", 0x022D8 },
{ "Lleftarrow", 0x021DA },
{ "Lmidot", 0x0013F },
{ "LongLeftArrow", 0x027F5 },
{ "LongLeftRightArrow", 0x027F7 },
{ "LongRightArrow", 0x027F6 },
{ "Longleftarrow", 0x027F8 },
{ "Longleftrightarrow", 0x027FA },
{ "Longrightarrow", 0x027F9 },
{ "Lopf", 0x1D543 },
{ "LowerLeftArrow", 0x02199 },
{ "LowerRightArrow", 0x02198 },
{ "Lscr", 0x02112 },
{ "Lsh", 0x021B0 },
{ "Lstrok", 0x00141 },
{ "Lt", 0x0226A },
{ "Map", 0x02905 },
{ "Mcy", 0x0041C },
{ "MediumSpace", 0x0205F },
{ "Mellintrf", 0x02133 },
{ "Mfr", 0x1D510 },
{ "MinusPlus", 0x02213 },
{ "Mopf", 0x1D544 },
{ "Mscr", 0x02133 },
{ "Mu", 0x0039C },
{ "NJcy", 0x0040A },
{ "Nacute", 0x00143 },
{ "Ncaron", 0x00147 },
{ "Ncedi", 0x00145 },
{ "Ncy", 0x0041D },
{ "NegativeMediumSpace", 0x0200B },
{ "NegativeThickSpace", 0x0200B },
{ "NegativeThinSpace", 0x0200B },
{ "NegativeVeryThinSpace", 0x0200B },
{ "NestedGreaterGreater", 0x0226B },
{ "NestedLessLess", 0x0226A },
{ "NewLine", 0x0000A },
{ "Nfr", 0x1D511 },
{ "NoBreak", 0x02060 },
{ "NonBreakingSpace", 0x000A0 },
{ "Nopf", 0x02115 },
{ "Not", 0x02AEC },
{ "NotCongruent", 0x02262 },
{ "NotCupCap", 0x0226D },
{ "NotDoubleVerticalBar", 0x02226 },
{ "NotElement", 0x02209 },
{ "NotEqua", 0x02260 },
{ "NotExists", 0x02204 },
{ "NotGreater", 0x0226F },
{ "NotGreaterEqua", 0x02271 },
{ "NotGreaterLess", 0x02279 },
{ "NotGreaterTilde", 0x02275 },
{ "NotLeftTriangle", 0x022EA },
{ "NotLeftTriangleEqua", 0x022EC },
{ "NotLess", 0x0226E },
{ "NotLessEqua", 0x02270 },
{ "NotLessGreater", 0x02278 },
{ "NotLessTilde", 0x02274 },
{ "NotPrecedes", 0x02280 },
{ "NotPrecedesSlantEqua", 0x022E0 },
{ "NotReverseElement", 0x0220C },
{ "NotRightTriangle", 0x022EB },
{ "NotRightTriangleEqua", 0x022ED },
{ "NotSquareSubsetEqua", 0x022E2 },
{ "NotSquareSupersetEqua", 0x022E3 },
{ "NotSubsetEqua", 0x02288 },
{ "NotSucceeds", 0x02281 },
{ "NotSucceedsSlantEqua", 0x022E1 },
{ "NotSupersetEqua", 0x02289 },
{ "NotTilde", 0x02241 },
{ "NotTildeEqua", 0x02244 },
{ "NotTildeFullEqua", 0x02247 },
{ "NotTildeTilde", 0x02249 },
{ "NotVerticalBar", 0x02224 },
{ "Nscr", 0x1D4A9 },
{ "Ntilde", 0x000D1 },
{ "Nu", 0x0039D },
{ "OElig", 0x00152 },
{ "Oacute", 0x000D3 },
{ "Ocirc", 0x000D4 },
{ "Ocy", 0x0041E },
{ "Odblac", 0x00150 },
{ "Ofr", 0x1D512 },
{ "Ograve", 0x000D2 },
{ "Omacr", 0x0014C },
{ "Omega", 0x003A9 },
{ "Omicron", 0x0039F },
{ "Oopf", 0x1D546 },
{ "OpenCurlyDoubleQuote", 0x0201C },
{ "OpenCurlyQuote", 0x02018 },
{ "Or", 0x02A54 },
{ "Oscr", 0x1D4AA },
{ "Oslash", 0x000D8 },
{ "Otilde", 0x000D5 },
{ "Otimes", 0x02A37 },
{ "Oum", 0x000D6 },
{ "OverBar", 0x000AF },
{ "OverBrace", 0x023DE },
{ "OverBracket", 0x023B4 },
{ "OverParenthesis", 0x023DC },
{ "PartialD", 0x02202 },
{ "Pcy", 0x0041F },
{ "Pfr", 0x1D513 },
{ "Phi", 0x003A6 },
{ "Pi", 0x003A0 },
{ "PlusMinus", 0x000B1 },
{ "Poincareplane", 0x0210C },
{ "Popf", 0x02119 },
{ "Pr", 0x02ABB },
{ "Precedes", 0x0227A },
{ "PrecedesEqua", 0x02AAF },
{ "PrecedesSlantEqua", 0x0227C },
{ "PrecedesTilde", 0x0227E },
{ "Prime", 0x02033 },
{ "Product", 0x0220F },
{ "Proportion", 0x02237 },
{ "Proportiona", 0x0221D },
{ "Pscr", 0x1D4AB },
{ "Psi", 0x003A8 },
{ "QUOT", 0x00022 },
{ "Qfr", 0x1D514 },
{ "Qopf", 0x0211A },
{ "Qscr", 0x1D4AC },
{ "RBarr", 0x02910 },
{ "REG", 0x000AE },
{ "Racute", 0x00154 },
{ "Rang", 0x027EB },
{ "Rarr", 0x021A0 },
{ "Rarrt", 0x02916 },
{ "Rcaron", 0x00158 },
{ "Rcedi", 0x00156 },
{ "Rcy", 0x00420 },
{ "Re", 0x0211C },
{ "ReverseElement", 0x0220B },
{ "ReverseEquilibrium", 0x021CB },
{ "ReverseUpEquilibrium", 0x0296F },
{ "Rfr", 0x0211C },
{ "Rho", 0x003A1 },
{ "RightAngleBracket", 0x027E9 },
{ "RightArrow", 0x02192 },
{ "RightArrowBar", 0x021E5 },
{ "RightArrowLeftArrow", 0x021C4 },
{ "RightCeiling", 0x02309 },
{ "RightDoubleBracket", 0x027E7 },
{ "RightDownTeeVector", 0x0295D },
{ "RightDownVector", 0x021C2 },
{ "RightDownVectorBar", 0x02955 },
{ "RightFloor", 0x0230B },
{ "RightTee", 0x022A2 },
{ "RightTeeArrow", 0x021A6 },
{ "RightTeeVector", 0x0295B },
{ "RightTriangle", 0x022B3 },
{ "RightTriangleBar", 0x029D0 },
{ "RightTriangleEqua", 0x022B5 },
{ "RightUpDownVector", 0x0294F },
{ "RightUpTeeVector", 0x0295C },
{ "RightUpVector", 0x021BE },
{ "RightUpVectorBar", 0x02954 },
{ "RightVector", 0x021C0 },
{ "RightVectorBar", 0x02953 },
{ "Rightarrow", 0x021D2 },
{ "Ropf", 0x0211D },
{ "RoundImplies", 0x02970 },
{ "Rrightarrow", 0x021DB },
{ "Rscr", 0x0211B },
{ "Rsh", 0x021B1 },
{ "RuleDelayed", 0x029F4 },
{ "SHCHcy", 0x00429 },
{ "SHcy", 0x00428 },
{ "SOFTcy", 0x0042C },
{ "Sacute", 0x0015A },
{ "Sc", 0x02ABC },
{ "Scaron", 0x00160 },
{ "Scedi", 0x0015E },
{ "Scirc", 0x0015C },
{ "Scy", 0x00421 },
{ "Sfr", 0x1D516 },
{ "ShortDownArrow", 0x02193 },
{ "ShortLeftArrow", 0x02190 },
{ "ShortRightArrow", 0x02192 },
{ "ShortUpArrow", 0x02191 },
{ "Sigma", 0x003A3 },
{ "SmallCircle", 0x02218 },
{ "Sopf", 0x1D54A },
{ "Sqrt", 0x0221A },
{ "Square", 0x025A1 },
{ "SquareIntersection", 0x02293 },
{ "SquareSubset", 0x0228F },
{ "SquareSubsetEqua", 0x02291 },
{ "SquareSuperset", 0x02290 },
{ "SquareSupersetEqua", 0x02292 },
{ "SquareUnion", 0x02294 },
{ "Sscr", 0x1D4AE },
{ "Star", 0x022C6 },
{ "Sub", 0x022D0 },
{ "Subset", 0x022D0 },
{ "SubsetEqua", 0x02286 },
{ "Succeeds", 0x0227B },
{ "SucceedsEqua", 0x02AB0 },
{ "SucceedsSlantEqua", 0x0227D },
{ "SucceedsTilde", 0x0227F },
{ "SuchThat", 0x0220B },
{ "Sum", 0x02211 },
{ "Sup", 0x022D1 },
{ "Superset", 0x02283 },
{ "SupersetEqua", 0x02287 },
{ "Supset", 0x022D1 },
{ "THORN", 0x000DE },
{ "TRADE", 0x02122 },
{ "TSHcy", 0x0040B },
{ "TScy", 0x00426 },
{ "Tab", 0x00009 },
{ "Tau", 0x003A4 },
{ "Tcaron", 0x00164 },
{ "Tcedi", 0x00162 },
{ "Tcy", 0x00422 },
{ "Tfr", 0x1D517 },
{ "Therefore", 0x02234 },
{ "Theta", 0x00398 },
{ "ThinSpace", 0x02009 },
{ "Tilde", 0x0223C },
{ "TildeEqua", 0x02243 },
{ "TildeFullEqua", 0x02245 },
{ "TildeTilde", 0x02248 },
{ "Topf", 0x1D54B },
{ "TripleDot", 0x020DB },
{ "Tscr", 0x1D4AF },
{ "Tstrok", 0x00166 },
{ "Uacute", 0x000DA },
{ "Uarr", 0x0219F },
{ "Uarrocir", 0x02949 },
{ "Ubrcy", 0x0040E },
{ "Ubreve", 0x0016C },
{ "Ucirc", 0x000DB },
{ "Ucy", 0x00423 },
{ "Udblac", 0x00170 },
{ "Ufr", 0x1D518 },
{ "Ugrave", 0x000D9 },
{ "Umacr", 0x0016A },
{ "UnderBar", 0x00332 },
{ "UnderBrace", 0x023DF },
{ "UnderBracket", 0x023B5 },
{ "UnderParenthesis", 0x023DD },
{ "Union", 0x022C3 },
{ "UnionPlus", 0x0228E },
{ "Uogon", 0x00172 },
{ "Uopf", 0x1D54C },
{ "UpArrow", 0x02191 },
{ "UpArrowBar", 0x02912 },
{ "UpArrowDownArrow", 0x021C5 },
{ "UpDownArrow", 0x02195 },
{ "UpEquilibrium", 0x0296E },
{ "UpTee", 0x022A5 },
{ "UpTeeArrow", 0x021A5 },
{ "Uparrow", 0x021D1 },
{ "Updownarrow", 0x021D5 },
{ "UpperLeftArrow", 0x02196 },
{ "UpperRightArrow", 0x02197 },
{ "Upsi", 0x003D2 },
{ "Upsilon", 0x003A5 },
{ "Uring", 0x0016E },
{ "Uscr", 0x1D4B0 },
{ "Utilde", 0x00168 },
{ "Uum", 0x000DC },
{ "VDash", 0x022AB },
{ "Vbar", 0x02AEB },
{ "Vcy", 0x00412 },
{ "Vdash", 0x022A9 },
{ "Vdash", 0x02AE6 },
{ "Vee", 0x022C1 },
{ "Verbar", 0x02016 },
{ "Vert", 0x02016 },
{ "VerticalBar", 0x02223 },
{ "VerticalLine", 0x0007C },
{ "VerticalSeparator", 0x02758 },
{ "VerticalTilde", 0x02240 },
{ "VeryThinSpace", 0x0200A },
{ "Vfr", 0x1D519 },
{ "Vopf", 0x1D54D },
{ "Vscr", 0x1D4B1 },
{ "Vvdash", 0x022AA },
{ "Wcirc", 0x00174 },
{ "Wedge", 0x022C0 },
{ "Wfr", 0x1D51A },
{ "Wopf", 0x1D54E },
{ "Wscr", 0x1D4B2 },
{ "Xfr", 0x1D51B },
{ "Xi", 0x0039E },
{ "Xopf", 0x1D54F },
{ "Xscr", 0x1D4B3 },
{ "YAcy", 0x0042F },
{ "YIcy", 0x00407 },
{ "YUcy", 0x0042E },
{ "Yacute", 0x000DD },
{ "Ycirc", 0x00176 },
{ "Ycy", 0x0042B },
{ "Yfr", 0x1D51C },
{ "Yopf", 0x1D550 },
{ "Yscr", 0x1D4B4 },
{ "Yum", 0x00178 },
{ "ZHcy", 0x00416 },
{ "Zacute", 0x00179 },
{ "Zcaron", 0x0017D },
{ "Zcy", 0x00417 },
{ "Zdot", 0x0017B },
{ "ZeroWidthSpace", 0x0200B },
{ "Zeta", 0x00396 },
{ "Zfr", 0x02128 },
{ "Zopf", 0x02124 },
{ "Zscr", 0x1D4B5 },
{ "aacute", 0x000E1 },
{ "abreve", 0x00103 },
{ "ac", 0x0223E },
{ "acd", 0x0223F },
{ "acirc", 0x000E2 },
{ "acute", 0x000B4 },
{ "acy", 0x00430 },
{ "aelig", 0x000E6 },
{ "af", 0x02061 },
{ "afr", 0x1D51E },
{ "agrave", 0x000E0 },
{ "alefsym", 0x02135 },
{ "aleph", 0x02135 },
{ "alpha", 0x003B1 },
{ "amacr", 0x00101 },
{ "amalg", 0x02A3F },
{ "amp", 0x00026 },
{ "and", 0x02227 },
{ "andand", 0x02A55 },
{ "andd", 0x02A5C },
{ "andslope", 0x02A58 },
{ "andv", 0x02A5A },
{ "ang", 0x02220 },
{ "ange", 0x029A4 },
{ "angle", 0x02220 },
{ "angmsd", 0x02221 },
{ "angmsdaa", 0x029A8 },
{ "angmsdab", 0x029A9 },
{ "angmsdac", 0x029AA },
{ "angmsdad", 0x029AB },
{ "angmsdae", 0x029AC },
{ "angmsdaf", 0x029AD },
{ "angmsdag", 0x029AE },
{ "angmsdah", 0x029AF },
{ "angrt", 0x0221F },
{ "angrtvb", 0x022BE },
{ "angrtvbd", 0x0299D },
{ "angsph", 0x02222 },
{ "angst", 0x0212B },
{ "angzarr", 0x0237C },
{ "aogon", 0x00105 },
{ "aopf", 0x1D552 },
{ "ap", 0x02248 },
{ "apE", 0x02A70 },
{ "apacir", 0x02A6F },
{ "ape", 0x0224A },
{ "apid", 0x0224B },
{ "apos", 0x00027 },
{ "approx", 0x02248 },
{ "approxeq", 0x0224A },
{ "aring", 0x000E5 },
{ "ascr", 0x1D4B6 },
{ "ast", 0x0002A },
{ "asymp", 0x02248 },
{ "asympeq", 0x0224D },
{ "atilde", 0x000E3 },
{ "aum", 0x000E4 },
{ "awconint", 0x02233 },
{ "awint", 0x02A11 },
{ "bNot", 0x02AED },
{ "backcong", 0x0224C },
{ "backepsilon", 0x003F6 },
{ "backprime", 0x02035 },
{ "backsim", 0x0223D },
{ "backsimeq", 0x022CD },
{ "barvee", 0x022BD },
{ "barwed", 0x02305 },
{ "barwedge", 0x02305 },
{ "bbrk", 0x023B5 },
{ "bbrktbrk", 0x023B6 },
{ "bcong", 0x0224C },
{ "bcy", 0x00431 },
{ "bdquo", 0x0201E },
{ "becaus", 0x02235 },
{ "because", 0x02235 },
{ "bemptyv", 0x029B0 },
{ "bepsi", 0x003F6 },
{ "bernou", 0x0212C },
{ "beta", 0x003B2 },
{ "beth", 0x02136 },
{ "between", 0x0226C },
{ "bfr", 0x1D51F },
{ "bigcap", 0x022C2 },
{ "bigcirc", 0x025EF },
{ "bigcup", 0x022C3 },
{ "bigodot", 0x02A00 },
{ "bigoplus", 0x02A01 },
{ "bigotimes", 0x02A02 },
{ "bigsqcup", 0x02A06 },
{ "bigstar", 0x02605 },
{ "bigtriangledown", 0x025BD },
{ "bigtriangleup", 0x025B3 },
{ "biguplus", 0x02A04 },
{ "bigvee", 0x022C1 },
{ "bigwedge", 0x022C0 },
{ "bkarow", 0x0290D },
{ "blacklozenge", 0x029EB },
{ "blacksquare", 0x025AA },
{ "blacktriangle", 0x025B4 },
{ "blacktriangledown", 0x025BE },
{ "blacktriangleleft", 0x025C2 },
{ "blacktriangleright", 0x025B8 },
{ "blank", 0x02423 },
{ "blk12", 0x02592 },
{ "blk14", 0x02591 },
{ "blk34", 0x02593 },
{ "block", 0x02588 },
{ "bnot", 0x02310 },
{ "bopf", 0x1D553 },
{ "bot", 0x022A5 },
{ "bottom", 0x022A5 },
{ "bowtie", 0x022C8 },
{ "boxD", 0x02557 },
{ "boxDR", 0x02554 },
{ "boxD", 0x02556 },
{ "boxDr", 0x02553 },
{ "boxH", 0x02550 },
{ "boxHD", 0x02566 },
{ "boxHU", 0x02569 },
{ "boxHd", 0x02564 },
{ "boxHu", 0x02567 },
{ "boxU", 0x0255D },
{ "boxUR", 0x0255A },
{ "boxU", 0x0255C },
{ "boxUr", 0x02559 },
{ "boxV", 0x02551 },
{ "boxVH", 0x0256C },
{ "boxV", 0x02563 },
{ "boxVR", 0x02560 },
{ "boxVh", 0x0256B },
{ "boxV", 0x02562 },
{ "boxVr", 0x0255F },
{ "boxbox", 0x029C9 },
{ "boxd", 0x02555 },
{ "boxdR", 0x02552 },
{ "boxd", 0x02510 },
{ "boxdr", 0x0250C },
{ "boxh", 0x02500 },
{ "boxhD", 0x02565 },
{ "boxhU", 0x02568 },
{ "boxhd", 0x0252C },
{ "boxhu", 0x02534 },
{ "boxminus", 0x0229F },
{ "boxplus", 0x0229E },
{ "boxtimes", 0x022A0 },
{ "boxu", 0x0255B },
{ "boxuR", 0x02558 },
{ "boxu", 0x02518 },
{ "boxur", 0x02514 },
{ "boxv", 0x02502 },
{ "boxvH", 0x0256A },
{ "boxv", 0x02561 },
{ "boxvR", 0x0255E },
{ "boxvh", 0x0253C },
{ "boxv", 0x02524 },
{ "boxvr", 0x0251C },
{ "bprime", 0x02035 },
{ "breve", 0x002D8 },
{ "brvbar", 0x000A6 },
{ "bscr", 0x1D4B7 },
{ "bsemi", 0x0204F },
{ "bsim", 0x0223D },
{ "bsime", 0x022CD },
{ "bso", 0x0005C },
{ "bsolb", 0x029C5 },
{ "bul", 0x02022 },
{ "bullet", 0x02022 },
{ "bump", 0x0224E },
{ "bumpE", 0x02AAE },
{ "bumpe", 0x0224F },
{ "bumpeq", 0x0224F },
{ "cacute", 0x00107 },
{ "cap", 0x02229 },
{ "capand", 0x02A44 },
{ "capbrcup", 0x02A49 },
{ "capcap", 0x02A4B },
{ "capcup", 0x02A47 },
{ "capdot", 0x02A40 },
{ "caret", 0x02041 },
{ "caron", 0x002C7 },
{ "ccaps", 0x02A4D },
{ "ccaron", 0x0010D },
{ "ccedi", 0x000E7 },
{ "ccirc", 0x00109 },
{ "ccups", 0x02A4C },
{ "ccupssm", 0x02A50 },
{ "cdot", 0x0010B },
{ "cedi", 0x000B8 },
{ "cemptyv", 0x029B2 },
{ "cent", 0x000A2 },
{ "centerdot", 0x000B7 },
{ "cfr", 0x1D520 },
{ "chcy", 0x00447 },
{ "check", 0x02713 },
{ "checkmark", 0x02713 },
{ "chi", 0x003C7 },
{ "cir", 0x025CB },
{ "cirE", 0x029C3 },
{ "circ", 0x002C6 },
{ "circeq", 0x02257 },
{ "circlearrowleft", 0x021BA },
{ "circlearrowright", 0x021BB },
{ "circledR", 0x000AE },
{ "circledS", 0x024C8 },
{ "circledast", 0x0229B },
{ "circledcirc", 0x0229A },
{ "circleddash", 0x0229D },
{ "cire", 0x02257 },
{ "cirfnint", 0x02A10 },
{ "cirmid", 0x02AEF },
{ "cirscir", 0x029C2 },
{ "clubs", 0x02663 },
{ "clubsuit", 0x02663 },
{ "colon", 0x0003A },
{ "colone", 0x02254 },
{ "coloneq", 0x02254 },
{ "comma", 0x0002C },
{ "commat", 0x00040 },
{ "comp", 0x02201 },
{ "compfn", 0x02218 },
{ "complement", 0x02201 },
{ "complexes", 0x02102 },
{ "cong", 0x02245 },
{ "congdot", 0x02A6D },
{ "conint", 0x0222E },
{ "copf", 0x1D554 },
{ "coprod", 0x02210 },
{ "copy", 0x000A9 },
{ "copysr", 0x02117 },
{ "crarr", 0x021B5 },
{ "cross", 0x02717 },
{ "cscr", 0x1D4B8 },
{ "csub", 0x02ACF },
{ "csube", 0x02AD1 },
{ "csup", 0x02AD0 },
{ "csupe", 0x02AD2 },
{ "ctdot", 0x022EF },
{ "cudarr", 0x02938 },
{ "cudarrr", 0x02935 },
{ "cuepr", 0x022DE },
{ "cuesc", 0x022DF },
{ "cularr", 0x021B6 },
{ "cularrp", 0x0293D },
{ "cup", 0x0222A },
{ "cupbrcap", 0x02A48 },
{ "cupcap", 0x02A46 },
{ "cupcup", 0x02A4A },
{ "cupdot", 0x0228D },
{ "cupor", 0x02A45 },
{ "curarr", 0x021B7 },
{ "curarrm", 0x0293C },
{ "curlyeqprec", 0x022DE },
{ "curlyeqsucc", 0x022DF },
{ "curlyvee", 0x022CE },
{ "curlywedge", 0x022CF },
{ "curren", 0x000A4 },
{ "curvearrowleft", 0x021B6 },
{ "curvearrowright", 0x021B7 },
{ "cuvee", 0x022CE },
{ "cuwed", 0x022CF },
{ "cwconint", 0x02232 },
{ "cwint", 0x02231 },
{ "cylcty", 0x0232D },
{ "dArr", 0x021D3 },
{ "dHar", 0x02965 },
{ "dagger", 0x02020 },
{ "daleth", 0x02138 },
{ "darr", 0x02193 },
{ "dash", 0x02010 },
{ "dashv", 0x022A3 },
{ "dbkarow", 0x0290F },
{ "dblac", 0x002DD },
{ "dcaron", 0x0010F },
{ "dcy", 0x00434 },
{ "dd", 0x02146 },
{ "ddagger", 0x02021 },
{ "ddarr", 0x021CA },
{ "ddotseq", 0x02A77 },
{ "deg", 0x000B0 },
{ "delta", 0x003B4 },
{ "demptyv", 0x029B1 },
{ "dfisht", 0x0297F },
{ "dfr", 0x1D521 },
{ "dhar", 0x021C3 },
{ "dharr", 0x021C2 },
{ "diam", 0x022C4 },
{ "diamond", 0x022C4 },
{ "diamondsuit", 0x02666 },
{ "diams", 0x02666 },
{ "die", 0x000A8 },
{ "digamma", 0x003DD },
{ "disin", 0x022F2 },
{ "div", 0x000F7 },
{ "divide", 0x000F7 },
{ "divideontimes", 0x022C7 },
{ "divonx", 0x022C7 },
{ "djcy", 0x00452 },
{ "dlcorn", 0x0231E },
{ "dlcrop", 0x0230D },
{ "dollar", 0x00024 },
{ "dopf", 0x1D555 },
{ "dot", 0x002D9 },
{ "doteq", 0x02250 },
{ "doteqdot", 0x02251 },
{ "dotminus", 0x02238 },
{ "dotplus", 0x02214 },
{ "dotsquare", 0x022A1 },
{ "doublebarwedge", 0x02306 },
{ "downarrow", 0x02193 },
{ "downdownarrows", 0x021CA },
{ "downharpoonleft", 0x021C3 },
{ "downharpoonright", 0x021C2 },
{ "drbkarow", 0x02910 },
{ "drcorn", 0x0231F },
{ "drcrop", 0x0230C },
{ "dscr", 0x1D4B9 },
{ "dscy", 0x00455 },
{ "dso", 0x029F6 },
{ "dstrok", 0x00111 },
{ "dtdot", 0x022F1 },
{ "dtri", 0x025BF },
{ "dtrif", 0x025BE },
{ "duarr", 0x021F5 },
{ "duhar", 0x0296F },
{ "dwangle", 0x029A6 },
{ "dzcy", 0x0045F },
{ "dzigrarr", 0x027FF },
{ "eDDot", 0x02A77 },
{ "eDot", 0x02251 },
{ "eacute", 0x000E9 },
{ "easter", 0x02A6E },
{ "ecaron", 0x0011B },
{ "ecir", 0x02256 },
{ "ecirc", 0x000EA },
{ "ecolon", 0x02255 },
{ "ecy", 0x0044D },
{ "edot", 0x00117 },
{ "ee", 0x02147 },
{ "efDot", 0x02252 },
{ "efr", 0x1D522 },
{ "eg", 0x02A9A },
{ "egrave", 0x000E8 },
{ "egs", 0x02A96 },
{ "egsdot", 0x02A98 },
{ "e", 0x02A99 },
{ "elinters", 0x023E7 },
{ "el", 0x02113 },
{ "els", 0x02A95 },
{ "elsdot", 0x02A97 },
{ "emacr", 0x00113 },
{ "empty", 0x02205 },
{ "emptyset", 0x02205 },
{ "emptyv", 0x02205 },
{ "emsp", 0x02003 },
{ "emsp13", 0x02004 },
{ "emsp14", 0x02005 },
{ "eng", 0x0014B },
{ "ensp", 0x02002 },
{ "eogon", 0x00119 },
{ "eopf", 0x1D556 },
{ "epar", 0x022D5 },
{ "epars", 0x029E3 },
{ "eplus", 0x02A71 },
{ "epsi", 0x003F5 },
{ "epsilon", 0x003B5 },
{ "epsiv", 0x003B5 },
{ "eqcirc", 0x02256 },
{ "eqcolon", 0x02255 },
{ "eqsim", 0x02242 },
{ "eqslantgtr", 0x02A96 },
{ "eqslantless", 0x02A95 },
{ "equals", 0x0003D },
{ "equest", 0x0225F },
{ "equiv", 0x02261 },
{ "equivDD", 0x02A78 },
{ "eqvpars", 0x029E5 },
{ "erDot", 0x02253 },
{ "erarr", 0x02971 },
{ "escr", 0x0212F },
{ "esdot", 0x02250 },
{ "esim", 0x02242 },
{ "eta", 0x003B7 },
{ "eth", 0x000F0 },
{ "eum", 0x000EB },
{ "euro", 0x020AC },
{ "exc", 0x00021 },
{ "exist", 0x02203 },
{ "expectation", 0x02130 },
{ "exponentiale", 0x02147 },
{ "fallingdotseq", 0x02252 },
{ "fcy", 0x00444 },
{ "female", 0x02640 },
{ "ffilig", 0x0FB03 },
{ "fflig", 0x0FB00 },
{ "ffllig", 0x0FB04 },
{ "ffr", 0x1D523 },
{ "filig", 0x0FB01 },
{ "flat", 0x0266D },
{ "fllig", 0x0FB02 },
{ "fltns", 0x025B1 },
{ "fnof", 0x00192 },
{ "fopf", 0x1D557 },
{ "foral", 0x02200 },
{ "fork", 0x022D4 },
{ "forkv", 0x02AD9 },
{ "fpartint", 0x02A0D },
{ "frac12", 0x000BD },
{ "frac13", 0x02153 },
{ "frac14", 0x000BC },
{ "frac15", 0x02155 },
{ "frac16", 0x02159 },
{ "frac18", 0x0215B },
{ "frac23", 0x02154 },
{ "frac25", 0x02156 },
{ "frac34", 0x000BE },
{ "frac35", 0x02157 },
{ "frac38", 0x0215C },
{ "frac45", 0x02158 },
{ "frac56", 0x0215A },
{ "frac58", 0x0215D },
{ "frac78", 0x0215E },
{ "fras", 0x02044 },
{ "frown", 0x02322 },
{ "fscr", 0x1D4BB },
{ "gE", 0x02267 },
{ "gE", 0x02A8C },
{ "gacute", 0x001F5 },
{ "gamma", 0x003B3 },
{ "gammad", 0x003DD },
{ "gap", 0x02A86 },
{ "gbreve", 0x0011F },
{ "gcirc", 0x0011D },
{ "gcy", 0x00433 },
{ "gdot", 0x00121 },
{ "ge", 0x02265 },
{ "ge", 0x022DB },
{ "geq", 0x02265 },
{ "geqq", 0x02267 },
{ "geqslant", 0x02A7E },
{ "ges", 0x02A7E },
{ "gescc", 0x02AA9 },
{ "gesdot", 0x02A80 },
{ "gesdoto", 0x02A82 },
{ "gesdoto", 0x02A84 },
{ "gesles", 0x02A94 },
{ "gfr", 0x1D524 },
{ "gg", 0x0226B },
{ "ggg", 0x022D9 },
{ "gime", 0x02137 },
{ "gjcy", 0x00453 },
{ "g", 0x02277 },
{ "glE", 0x02A92 },
{ "gla", 0x02AA5 },
{ "glj", 0x02AA4 },
{ "gnE", 0x02269 },
{ "gnap", 0x02A8A },
{ "gnapprox", 0x02A8A },
{ "gne", 0x02A88 },
{ "gneq", 0x02A88 },
{ "gneqq", 0x02269 },
{ "gnsim", 0x022E7 },
{ "gopf", 0x1D558 },
{ "grave", 0x00060 },
{ "gscr", 0x0210A },
{ "gsim", 0x02273 },
{ "gsime", 0x02A8E },
{ "gsim", 0x02A90 },
{ "gt", 0x0003E },
{ "gtcc", 0x02AA7 },
{ "gtcir", 0x02A7A },
{ "gtdot", 0x022D7 },
{ "gtlPar", 0x02995 },
{ "gtquest", 0x02A7C },
{ "gtrapprox", 0x02A86 },
{ "gtrarr", 0x02978 },
{ "gtrdot", 0x022D7 },
{ "gtreqless", 0x022DB },
{ "gtreqqless", 0x02A8C },
{ "gtrless", 0x02277 },
{ "gtrsim", 0x02273 },
{ "hArr", 0x021D4 },
{ "hairsp", 0x0200A },
{ "half", 0x000BD },
{ "hamilt", 0x0210B },
{ "hardcy", 0x0044A },
{ "harr", 0x02194 },
{ "harrcir", 0x02948 },
{ "harrw", 0x021AD },
{ "hbar", 0x0210F },
{ "hcirc", 0x00125 },
{ "hearts", 0x02665 },
{ "heartsuit", 0x02665 },
{ "hellip", 0x02026 },
{ "hercon", 0x022B9 },
{ "hfr", 0x1D525 },
{ "hksearow", 0x02925 },
{ "hkswarow", 0x02926 },
{ "hoarr", 0x021FF },
{ "homtht", 0x0223B },
{ "hookleftarrow", 0x021A9 },
{ "hookrightarrow", 0x021AA },
{ "hopf", 0x1D559 },
{ "horbar", 0x02015 },
{ "hscr", 0x1D4BD },
{ "hslash", 0x0210F },
{ "hstrok", 0x00127 },
{ "hybul", 0x02043 },
{ "hyphen", 0x02010 },
{ "iacute", 0x000ED },
{ "ic", 0x02063 },
{ "icirc", 0x000EE },
{ "icy", 0x00438 },
{ "iecy", 0x00435 },
{ "iexc", 0x000A1 },
{ "iff", 0x021D4 },
{ "ifr", 0x1D526 },
{ "igrave", 0x000EC },
{ "ii", 0x02148 },
{ "iiiint", 0x02A0C },
{ "iiint", 0x0222D },
{ "iinfin", 0x029DC },
{ "iiota", 0x02129 },
{ "ijlig", 0x00133 },
{ "imacr", 0x0012B },
{ "image", 0x02111 },
{ "imagline", 0x02110 },
{ "imagpart", 0x02111 },
{ "imath", 0x00131 },
{ "imof", 0x022B7 },
{ "imped", 0x001B5 },
{ "in", 0x02208 },
{ "incare", 0x02105 },
{ "infin", 0x0221E },
{ "infintie", 0x029DD },
{ "inodot", 0x00131 },
{ "int", 0x0222B },
{ "intca", 0x022BA },
{ "integers", 0x02124 },
{ "interca", 0x022BA },
{ "intlarhk", 0x02A17 },
{ "intprod", 0x02A3C },
{ "iocy", 0x00451 },
{ "iogon", 0x0012F },
{ "iopf", 0x1D55A },
{ "iota", 0x003B9 },
{ "iprod", 0x02A3C },
{ "iquest", 0x000BF },
{ "iscr", 0x1D4BE },
{ "isin", 0x02208 },
{ "isinE", 0x022F9 },
{ "isindot", 0x022F5 },
{ "isins", 0x022F4 },
{ "isinsv", 0x022F3 },
{ "isinv", 0x02208 },
{ "it", 0x02062 },
{ "itilde", 0x00129 },
{ "iukcy", 0x00456 },
{ "ium", 0x000EF },
{ "jcirc", 0x00135 },
{ "jcy", 0x00439 },
{ "jfr", 0x1D527 },
{ "jmath", 0x00237 },
{ "jopf", 0x1D55B },
{ "jscr", 0x1D4BF },
{ "jsercy", 0x00458 },
{ "jukcy", 0x00454 },
{ "kappa", 0x003BA },
{ "kappav", 0x003F0 },
{ "kcedi", 0x00137 },
{ "kcy", 0x0043A },
{ "kfr", 0x1D528 },
{ "kgreen", 0x00138 },
{ "khcy", 0x00445 },
{ "kjcy", 0x0045C },
{ "kopf", 0x1D55C },
{ "kscr", 0x1D4C0 },
{ "lAarr", 0x021DA },
{ "lArr", 0x021D0 },
{ "lAtai", 0x0291B },
{ "lBarr", 0x0290E },
{ "lE", 0x02266 },
{ "lEg", 0x02A8B },
{ "lHar", 0x02962 },
{ "lacute", 0x0013A },
{ "laemptyv", 0x029B4 },
{ "lagran", 0x02112 },
{ "lambda", 0x003BB },
{ "lang", 0x027E8 },
{ "langd", 0x02991 },
{ "langle", 0x027E8 },
{ "lap", 0x02A85 },
{ "laquo", 0x000AB },
{ "larr", 0x02190 },
{ "larrb", 0x021E4 },
{ "larrbfs", 0x0291F },
{ "larrfs", 0x0291D },
{ "larrhk", 0x021A9 },
{ "larrlp", 0x021AB },
{ "larrp", 0x02939 },
{ "larrsim", 0x02973 },
{ "larrt", 0x021A2 },
{ "lat", 0x02AAB },
{ "latai", 0x02919 },
{ "late", 0x02AAD },
{ "lbarr", 0x0290C },
{ "lbbrk", 0x02772 },
{ "lbrace", 0x0007B },
{ "lbrack", 0x0005B },
{ "lbrke", 0x0298B },
{ "lbrksld", 0x0298F },
{ "lbrkslu", 0x0298D },
{ "lcaron", 0x0013E },
{ "lcedi", 0x0013C },
{ "lcei", 0x02308 },
{ "lcub", 0x0007B },
{ "lcy", 0x0043B },
{ "ldca", 0x02936 },
{ "ldquo", 0x0201C },
{ "ldquor", 0x0201E },
{ "ldrdhar", 0x02967 },
{ "ldrushar", 0x0294B },
{ "ldsh", 0x021B2 },
{ "le", 0x02264 },
{ "leftarrow", 0x02190 },
{ "leftarrowtai", 0x021A2 },
{ "leftharpoondown", 0x021BD },
{ "leftharpoonup", 0x021BC },
{ "leftleftarrows", 0x021C7 },
{ "leftrightarrow", 0x02194 },
{ "leftrightarrows", 0x021C6 },
{ "leftrightharpoons", 0x021CB },
{ "leftrightsquigarrow", 0x021AD },
{ "leftthreetimes", 0x022CB },
{ "leg", 0x022DA },
{ "leq", 0x02264 },
{ "leqq", 0x02266 },
{ "leqslant", 0x02A7D },
{ "les", 0x02A7D },
{ "lescc", 0x02AA8 },
{ "lesdot", 0x02A7F },
{ "lesdoto", 0x02A81 },
{ "lesdotor", 0x02A83 },
{ "lesges", 0x02A93 },
{ "lessapprox", 0x02A85 },
{ "lessdot", 0x022D6 },
{ "lesseqgtr", 0x022DA },
{ "lesseqqgtr", 0x02A8B },
{ "lessgtr", 0x02276 },
{ "lesssim", 0x02272 },
{ "lfisht", 0x0297C },
{ "lfloor", 0x0230A },
{ "lfr", 0x1D529 },
{ "lg", 0x02276 },
{ "lgE", 0x02A91 },
{ "lhard", 0x021BD },
{ "lharu", 0x021BC },
{ "lharu", 0x0296A },
{ "lhblk", 0x02584 },
{ "ljcy", 0x00459 },
{ "l", 0x0226A },
{ "llarr", 0x021C7 },
{ "llcorner", 0x0231E },
{ "llhard", 0x0296B },
{ "lltri", 0x025FA },
{ "lmidot", 0x00140 },
{ "lmoust", 0x023B0 },
{ "lmoustache", 0x023B0 },
{ "lnE", 0x02268 },
{ "lnap", 0x02A89 },
{ "lnapprox", 0x02A89 },
{ "lne", 0x02A87 },
{ "lneq", 0x02A87 },
{ "lneqq", 0x02268 },
{ "lnsim", 0x022E6 },
{ "loang", 0x027EC },
{ "loarr", 0x021FD },
{ "lobrk", 0x027E6 },
{ "longleftarrow", 0x027F5 },
{ "longleftrightarrow", 0x027F7 },
{ "longmapsto", 0x027FC },
{ "longrightarrow", 0x027F6 },
{ "looparrowleft", 0x021AB },
{ "looparrowright", 0x021AC },
{ "lopar", 0x02985 },
{ "lopf", 0x1D55D },
{ "loplus", 0x02A2D },
{ "lotimes", 0x02A34 },
{ "lowast", 0x02217 },
{ "lowbar", 0x0005F },
{ "loz", 0x025CA },
{ "lozenge", 0x025CA },
{ "lozf", 0x029EB },
{ "lpar", 0x00028 },
{ "lparlt", 0x02993 },
{ "lrarr", 0x021C6 },
{ "lrcorner", 0x0231F },
{ "lrhar", 0x021CB },
{ "lrhard", 0x0296D },
{ "lrm", 0x0200E },
{ "lrtri", 0x022BF },
{ "lsaquo", 0x02039 },
{ "lscr", 0x1D4C1 },
{ "lsh", 0x021B0 },
{ "lsim", 0x02272 },
{ "lsime", 0x02A8D },
{ "lsimg", 0x02A8F },
{ "lsqb", 0x0005B },
{ "lsquo", 0x02018 },
{ "lsquor", 0x0201A },
{ "lstrok", 0x00142 },
{ "lt", 0x0003C },
{ "ltcc", 0x02AA6 },
{ "ltcir", 0x02A79 },
{ "ltdot", 0x022D6 },
{ "lthree", 0x022CB },
{ "ltimes", 0x022C9 },
{ "ltlarr", 0x02976 },
{ "ltquest", 0x02A7B },
{ "ltrPar", 0x02996 },
{ "ltri", 0x025C3 },
{ "ltrie", 0x022B4 },
{ "ltrif", 0x025C2 },
{ "lurdshar", 0x0294A },
{ "luruhar", 0x02966 },
{ "mDDot", 0x0223A },
{ "macr", 0x000AF },
{ "male", 0x02642 },
{ "malt", 0x02720 },
{ "maltese", 0x02720 },
{ "map", 0x021A6 },
{ "mapsto", 0x021A6 },
{ "mapstodown", 0x021A7 },
{ "mapstoleft", 0x021A4 },
{ "mapstoup", 0x021A5 },
{ "marker", 0x025AE },
{ "mcomma", 0x02A29 },
{ "mcy", 0x0043C },
{ "mdash", 0x02014 },
{ "measuredangle", 0x02221 },
{ "mfr", 0x1D52A },
{ "mho", 0x02127 },
{ "micro", 0x000B5 },
{ "mid", 0x02223 },
{ "midast", 0x0002A },
{ "midcir", 0x02AF0 },
{ "middot", 0x000B7 },
{ "minus", 0x02212 },
{ "minusb", 0x0229F },
{ "minusd", 0x02238 },
{ "minusdu", 0x02A2A },
{ "mlcp", 0x02ADB },
{ "mldr", 0x02026 },
{ "mnplus", 0x02213 },
{ "models", 0x022A7 },
{ "mopf", 0x1D55E },
{ "mp", 0x02213 },
{ "mscr", 0x1D4C2 },
{ "mstpos", 0x0223E },
{ "mu", 0x003BC },
{ "multimap", 0x022B8 },
{ "mumap", 0x022B8 },
{ "nLeftarrow", 0x021CD },
{ "nLeftrightarrow", 0x021CE },
{ "nRightarrow", 0x021CF },
{ "nVDash", 0x022AF },
{ "nVdash", 0x022AE },
{ "nabla", 0x02207 },
{ "nacute", 0x00144 },
{ "nap", 0x02249 },
{ "napos", 0x00149 },
{ "napprox", 0x02249 },
{ "natur", 0x0266E },
{ "natura", 0x0266E },
{ "naturals", 0x02115 },
{ "nbsp", 0x000A0 },
{ "ncap", 0x02A43 },
{ "ncaron", 0x00148 },
{ "ncedi", 0x00146 },
{ "ncong", 0x02247 },
{ "ncup", 0x02A42 },
{ "ncy", 0x0043D },
{ "ndash", 0x02013 },
{ "ne", 0x02260 },
{ "neArr", 0x021D7 },
{ "nearhk", 0x02924 },
{ "nearr", 0x02197 },
{ "nearrow", 0x02197 },
{ "nequiv", 0x02262 },
{ "nesear", 0x02928 },
{ "nexist", 0x02204 },
{ "nexists", 0x02204 },
{ "nfr", 0x1D52B },
{ "nge", 0x02271 },
{ "ngeq", 0x02271 },
{ "ngsim", 0x02275 },
{ "ngt", 0x0226F },
{ "ngtr", 0x0226F },
{ "nhArr", 0x021CE },
{ "nharr", 0x021AE },
{ "nhpar", 0x02AF2 },
{ "ni", 0x0220B },
{ "nis", 0x022FC },
{ "nisd", 0x022FA },
{ "niv", 0x0220B },
{ "njcy", 0x0045A },
{ "nlArr", 0x021CD },
{ "nlarr", 0x0219A },
{ "nldr", 0x02025 },
{ "nle", 0x02270 },
{ "nleftarrow", 0x0219A },
{ "nleftrightarrow", 0x021AE },
{ "nleq", 0x02270 },
{ "nless", 0x0226E },
{ "nlsim", 0x02274 },
{ "nlt", 0x0226E },
{ "nltri", 0x022EA },
{ "nltrie", 0x022EC },
{ "nmid", 0x02224 },
{ "nopf", 0x1D55F },
{ "not", 0x000AC },
{ "notin", 0x02209 },
{ "notinva", 0x02209 },
{ "notinvb", 0x022F7 },
{ "notinvc", 0x022F6 },
{ "notni", 0x0220C },
{ "notniva", 0x0220C },
{ "notnivb", 0x022FE },
{ "notnivc", 0x022FD },
{ "npar", 0x02226 },
{ "nparalle", 0x02226 },
{ "npolint", 0x02A14 },
{ "npr", 0x02280 },
{ "nprcue", 0x022E0 },
{ "nprec", 0x02280 },
{ "nrArr", 0x021CF },
{ "nrarr", 0x0219B },
{ "nrightarrow", 0x0219B },
{ "nrtri", 0x022EB },
{ "nrtrie", 0x022ED },
{ "nsc", 0x02281 },
{ "nsccue", 0x022E1 },
{ "nscr", 0x1D4C3 },
{ "nshortmid", 0x02224 },
{ "nshortparalle", 0x02226 },
{ "nsim", 0x02241 },
{ "nsime", 0x02244 },
{ "nsimeq", 0x02244 },
{ "nsmid", 0x02224 },
{ "nspar", 0x02226 },
{ "nsqsube", 0x022E2 },
{ "nsqsupe", 0x022E3 },
{ "nsub", 0x02284 },
{ "nsube", 0x02288 },
{ "nsubseteq", 0x02288 },
{ "nsucc", 0x02281 },
{ "nsup", 0x02285 },
{ "nsupe", 0x02289 },
{ "nsupseteq", 0x02289 },
{ "ntg", 0x02279 },
{ "ntilde", 0x000F1 },
{ "ntlg", 0x02278 },
{ "ntriangleleft", 0x022EA },
{ "ntrianglelefteq", 0x022EC },
{ "ntriangleright", 0x022EB },
{ "ntrianglerighteq", 0x022ED },
{ "nu", 0x003BD },
{ "num", 0x00023 },
{ "numero", 0x02116 },
{ "numsp", 0x02007 },
{ "nvDash", 0x022AD },
{ "nvHarr", 0x02904 },
{ "nvdash", 0x022AC },
{ "nvinfin", 0x029DE },
{ "nvlArr", 0x02902 },
{ "nvrArr", 0x02903 },
{ "nwArr", 0x021D6 },
{ "nwarhk", 0x02923 },
{ "nwarr", 0x02196 },
{ "nwarrow", 0x02196 },
{ "nwnear", 0x02927 },
{ "oS", 0x024C8 },
{ "oacute", 0x000F3 },
{ "oast", 0x0229B },
{ "ocir", 0x0229A },
{ "ocirc", 0x000F4 },
{ "ocy", 0x0043E },
{ "odash", 0x0229D },
{ "odblac", 0x00151 },
{ "odiv", 0x02A38 },
{ "odot", 0x02299 },
{ "odsold", 0x029BC },
{ "oelig", 0x00153 },
{ "ofcir", 0x029BF },
{ "ofr", 0x1D52C },
{ "ogon", 0x002DB },
{ "ograve", 0x000F2 },
{ "ogt", 0x029C1 },
{ "ohbar", 0x029B5 },
{ "ohm", 0x02126 },
{ "oint", 0x0222E },
{ "olarr", 0x021BA },
{ "olcir", 0x029BE },
{ "olcross", 0x029BB },
{ "oline", 0x0203E },
{ "olt", 0x029C0 },
{ "omacr", 0x0014D },
{ "omega", 0x003C9 },
{ "omicron", 0x003BF },
{ "omid", 0x029B6 },
{ "ominus", 0x02296 },
{ "oopf", 0x1D560 },
{ "opar", 0x029B7 },
{ "operp", 0x029B9 },
{ "oplus", 0x02295 },
{ "or", 0x02228 },
{ "orarr", 0x021BB },
{ "ord", 0x02A5D },
{ "order", 0x02134 },
{ "orderof", 0x02134 },
{ "ordf", 0x000AA },
{ "ordm", 0x000BA },
{ "origof", 0x022B6 },
{ "oror", 0x02A56 },
{ "orslope", 0x02A57 },
{ "orv", 0x02A5B },
{ "oscr", 0x02134 },
{ "oslash", 0x000F8 },
{ "oso", 0x02298 },
{ "otilde", 0x000F5 },
{ "otimes", 0x02297 },
{ "otimesas", 0x02A36 },
{ "oum", 0x000F6 },
{ "ovbar", 0x0233D },
{ "par", 0x02225 },
{ "para", 0x000B6 },
{ "paralle", 0x02225 },
{ "parsim", 0x02AF3 },
{ "pars", 0x02AFD },
{ "part", 0x02202 },
{ "pcy", 0x0043F },
{ "percnt", 0x00025 },
{ "period", 0x0002E },
{ "permi", 0x02030 },
{ "perp", 0x022A5 },
{ "pertenk", 0x02031 },
{ "pfr", 0x1D52D },
{ "phi", 0x003C6 },
{ "phiv", 0x003C6 },
{ "phmmat", 0x02133 },
{ "phone", 0x0260E },
{ "pi", 0x003C0 },
{ "pitchfork", 0x022D4 },
{ "piv", 0x003D6 },
{ "planck", 0x0210F },
{ "planckh", 0x0210E },
{ "plankv", 0x0210F },
{ "plus", 0x0002B },
{ "plusacir", 0x02A23 },
{ "plusb", 0x0229E },
{ "pluscir", 0x02A22 },
{ "plusdo", 0x02214 },
{ "plusdu", 0x02A25 },
{ "pluse", 0x02A72 },
{ "plusmn", 0x000B1 },
{ "plussim", 0x02A26 },
{ "plustwo", 0x02A27 },
{ "pm", 0x000B1 },
{ "pointint", 0x02A15 },
{ "popf", 0x1D561 },
{ "pound", 0x000A3 },
{ "pr", 0x0227A },
{ "prE", 0x02AB3 },
{ "prap", 0x02AB7 },
{ "prcue", 0x0227C },
{ "pre", 0x02AAF },
{ "prec", 0x0227A },
{ "precapprox", 0x02AB7 },
{ "preccurlyeq", 0x0227C },
{ "preceq", 0x02AAF },
{ "precnapprox", 0x02AB9 },
{ "precneqq", 0x02AB5 },
{ "precnsim", 0x022E8 },
{ "precsim", 0x0227E },
{ "prime", 0x02032 },
{ "primes", 0x02119 },
{ "prnE", 0x02AB5 },
{ "prnap", 0x02AB9 },
{ "prnsim", 0x022E8 },
{ "prod", 0x0220F },
{ "profalar", 0x0232E },
{ "profline", 0x02312 },
{ "profsurf", 0x02313 },
{ "prop", 0x0221D },
{ "propto", 0x0221D },
{ "prsim", 0x0227E },
{ "prure", 0x022B0 },
{ "pscr", 0x1D4C5 },
{ "psi", 0x003C8 },
{ "puncsp", 0x02008 },
{ "qfr", 0x1D52E },
{ "qint", 0x02A0C },
{ "qopf", 0x1D562 },
{ "qprime", 0x02057 },
{ "qscr", 0x1D4C6 },
{ "quaternions", 0x0210D },
{ "quatint", 0x02A16 },
{ "quest", 0x0003F },
{ "questeq", 0x0225F },
{ "quot", 0x00022 },
{ "rAarr", 0x021DB },
{ "rArr", 0x021D2 },
{ "rAtai", 0x0291C },
{ "rBarr", 0x0290F },
{ "rHar", 0x02964 },
{ "race", 0x029DA },
{ "racute", 0x00155 },
{ "radic", 0x0221A },
{ "raemptyv", 0x029B3 },
{ "rang", 0x027E9 },
{ "rangd", 0x02992 },
{ "range", 0x029A5 },
{ "rangle", 0x027E9 },
{ "raquo", 0x000BB },
{ "rarr", 0x02192 },
{ "rarrap", 0x02975 },
{ "rarrb", 0x021E5 },
{ "rarrbfs", 0x02920 },
{ "rarrc", 0x02933 },
{ "rarrfs", 0x0291E },
{ "rarrhk", 0x021AA },
{ "rarrlp", 0x021AC },
{ "rarrp", 0x02945 },
{ "rarrsim", 0x02974 },
{ "rarrt", 0x021A3 },
{ "rarrw", 0x0219D },
{ "ratai", 0x0291A },
{ "ratio", 0x02236 },
{ "rationals", 0x0211A },
{ "rbarr", 0x0290D },
{ "rbbrk", 0x02773 },
{ "rbrace", 0x0007D },
{ "rbrack", 0x0005D },
{ "rbrke", 0x0298C },
{ "rbrksld", 0x0298E },
{ "rbrkslu", 0x02990 },
{ "rcaron", 0x00159 },
{ "rcedi", 0x00157 },
{ "rcei", 0x02309 },
{ "rcub", 0x0007D },
{ "rcy", 0x00440 },
{ "rdca", 0x02937 },
{ "rdldhar", 0x02969 },
{ "rdquo", 0x0201D },
{ "rdquor", 0x0201D },
{ "rdsh", 0x021B3 },
{ "rea", 0x0211C },
{ "realine", 0x0211B },
{ "realpart", 0x0211C },
{ "reals", 0x0211D },
{ "rect", 0x025AD },
{ "reg", 0x000AE },
{ "rfisht", 0x0297D },
{ "rfloor", 0x0230B },
{ "rfr", 0x1D52F },
{ "rhard", 0x021C1 },
{ "rharu", 0x021C0 },
{ "rharu", 0x0296C },
{ "rho", 0x003C1 },
{ "rhov", 0x003F1 },
{ "rightarrow", 0x02192 },
{ "rightarrowtai", 0x021A3 },
{ "rightharpoondown", 0x021C1 },
{ "rightharpoonup", 0x021C0 },
{ "rightleftarrows", 0x021C4 },
{ "rightleftharpoons", 0x021CC },
{ "rightrightarrows", 0x021C9 },
{ "rightsquigarrow", 0x0219D },
{ "rightthreetimes", 0x022CC },
{ "ring", 0x002DA },
{ "risingdotseq", 0x02253 },
{ "rlarr", 0x021C4 },
{ "rlhar", 0x021CC },
{ "rlm", 0x0200F },
{ "rmoust", 0x023B1 },
{ "rmoustache", 0x023B1 },
{ "rnmid", 0x02AEE },
{ "roang", 0x027ED },
{ "roarr", 0x021FE },
{ "robrk", 0x027E7 },
{ "ropar", 0x02986 },
{ "ropf", 0x1D563 },
{ "roplus", 0x02A2E },
{ "rotimes", 0x02A35 },
{ "rpar", 0x00029 },
{ "rpargt", 0x02994 },
{ "rppolint", 0x02A12 },
{ "rrarr", 0x021C9 },
{ "rsaquo", 0x0203A },
{ "rscr", 0x1D4C7 },
{ "rsh", 0x021B1 },
{ "rsqb", 0x0005D },
{ "rsquo", 0x02019 },
{ "rsquor", 0x02019 },
{ "rthree", 0x022CC },
{ "rtimes", 0x022CA },
{ "rtri", 0x025B9 },
{ "rtrie", 0x022B5 },
{ "rtrif", 0x025B8 },
{ "rtriltri", 0x029CE },
{ "ruluhar", 0x02968 },
{ "rx", 0x0211E },
{ "sacute", 0x0015B },
{ "sbquo", 0x0201A },
{ "sc", 0x0227B },
{ "scE", 0x02AB4 },
{ "scap", 0x02AB8 },
{ "scaron", 0x00161 },
{ "sccue", 0x0227D },
{ "sce", 0x02AB0 },
{ "scedi", 0x0015F },
{ "scirc", 0x0015D },
{ "scnE", 0x02AB6 },
{ "scnap", 0x02ABA },
{ "scnsim", 0x022E9 },
{ "scpolint", 0x02A13 },
{ "scsim", 0x0227F },
{ "scy", 0x00441 },
{ "sdot", 0x022C5 },
{ "sdotb", 0x022A1 },
{ "sdote", 0x02A66 },
{ "seArr", 0x021D8 },
{ "searhk", 0x02925 },
{ "searr", 0x02198 },
{ "searrow", 0x02198 },
{ "sect", 0x000A7 },
{ "semi", 0x0003B },
{ "seswar", 0x02929 },
{ "setminus", 0x02216 },
{ "setmn", 0x02216 },
{ "sext", 0x02736 },
{ "sfr", 0x1D530 },
{ "sfrown", 0x02322 },
{ "sharp", 0x0266F },
{ "shchcy", 0x00449 },
{ "shcy", 0x00448 },
{ "shortmid", 0x02223 },
{ "shortparalle", 0x02225 },
{ "shy", 0x000AD },
{ "sigma", 0x003C3 },
{ "sigmaf", 0x003C2 },
{ "sigmav", 0x003C2 },
{ "sim", 0x0223C },
{ "simdot", 0x02A6A },
{ "sime", 0x02243 },
{ "simeq", 0x02243 },
{ "simg", 0x02A9E },
{ "simgE", 0x02AA0 },
{ "sim", 0x02A9D },
{ "simlE", 0x02A9F },
{ "simne", 0x02246 },
{ "simplus", 0x02A24 },
{ "simrarr", 0x02972 },
{ "slarr", 0x02190 },
{ "smallsetminus", 0x02216 },
{ "smashp", 0x02A33 },
{ "smepars", 0x029E4 },
{ "smid", 0x02223 },
{ "smile", 0x02323 },
{ "smt", 0x02AAA },
{ "smte", 0x02AAC },
{ "softcy", 0x0044C },
{ "so", 0x0002F },
{ "solb", 0x029C4 },
{ "solbar", 0x0233F },
{ "sopf", 0x1D564 },
{ "spades", 0x02660 },
{ "spadesuit", 0x02660 },
{ "spar", 0x02225 },
{ "sqcap", 0x02293 },
{ "sqcup", 0x02294 },
{ "sqsub", 0x0228F },
{ "sqsube", 0x02291 },
{ "sqsubset", 0x0228F },
{ "sqsubseteq", 0x02291 },
{ "sqsup", 0x02290 },
{ "sqsupe", 0x02292 },
{ "sqsupset", 0x02290 },
{ "sqsupseteq", 0x02292 },
{ "squ", 0x025A1 },
{ "square", 0x025A1 },
{ "squarf", 0x025AA },
{ "squf", 0x025AA },
{ "srarr", 0x02192 },
{ "sscr", 0x1D4C8 },
{ "ssetmn", 0x02216 },
{ "ssmile", 0x02323 },
{ "sstarf", 0x022C6 },
{ "star", 0x02606 },
{ "starf", 0x02605 },
{ "straightepsilon", 0x003F5 },
{ "straightphi", 0x003D5 },
{ "strns", 0x000AF },
{ "sub", 0x02282 },
{ "subE", 0x02AC5 },
{ "subdot", 0x02ABD },
{ "sube", 0x02286 },
{ "subedot", 0x02AC3 },
{ "submult", 0x02AC1 },
{ "subnE", 0x02ACB },
{ "subne", 0x0228A },
{ "subplus", 0x02ABF },
{ "subrarr", 0x02979 },
{ "subset", 0x02282 },
{ "subseteq", 0x02286 },
{ "subseteqq", 0x02AC5 },
{ "subsetneq", 0x0228A },
{ "subsetneqq", 0x02ACB },
{ "subsim", 0x02AC7 },
{ "subsub", 0x02AD5 },
{ "subsup", 0x02AD3 },
{ "succ", 0x0227B },
{ "succapprox", 0x02AB8 },
{ "succcurlyeq", 0x0227D },
{ "succeq", 0x02AB0 },
{ "succnapprox", 0x02ABA },
{ "succneqq", 0x02AB6 },
{ "succnsim", 0x022E9 },
{ "succsim", 0x0227F },
{ "sum", 0x02211 },
{ "sung", 0x0266A },
{ "sup", 0x02283 },
{ "sup1", 0x000B9 },
{ "sup2", 0x000B2 },
{ "sup3", 0x000B3 },
{ "supE", 0x02AC6 },
{ "supdot", 0x02ABE },
{ "supdsub", 0x02AD8 },
{ "supe", 0x02287 },
{ "supedot", 0x02AC4 },
{ "suphsub", 0x02AD7 },
{ "suplarr", 0x0297B },
{ "supmult", 0x02AC2 },
{ "supnE", 0x02ACC },
{ "supne", 0x0228B },
{ "supplus", 0x02AC0 },
{ "supset", 0x02283 },
{ "supseteq", 0x02287 },
{ "supseteqq", 0x02AC6 },
{ "supsetneq", 0x0228B },
{ "supsetneqq", 0x02ACC },
{ "supsim", 0x02AC8 },
{ "supsub", 0x02AD4 },
{ "supsup", 0x02AD6 },
{ "swArr", 0x021D9 },
{ "swarhk", 0x02926 },
{ "swarr", 0x02199 },
{ "swarrow", 0x02199 },
{ "swnwar", 0x0292A },
{ "szlig", 0x000DF },
{ "target", 0x02316 },
{ "tau", 0x003C4 },
{ "tbrk", 0x023B4 },
{ "tcaron", 0x00165 },
{ "tcedi", 0x00163 },
{ "tcy", 0x00442 },
{ "tdot", 0x020DB },
{ "telrec", 0x02315 },
{ "tfr", 0x1D531 },
{ "there4", 0x02234 },
{ "therefore", 0x02234 },
{ "theta", 0x003B8 },
{ "thetasym", 0x003D1 },
{ "thetav", 0x003D1 },
{ "thickapprox", 0x02248 },
{ "thicksim", 0x0223C },
{ "thinsp", 0x02009 },
{ "thkap", 0x02248 },
{ "thksim", 0x0223C },
{ "thorn", 0x000FE },
{ "tilde", 0x002DC },
{ "times", 0x000D7 },
{ "timesb", 0x022A0 },
{ "timesbar", 0x02A31 },
{ "timesd", 0x02A30 },
{ "tint", 0x0222D },
{ "toea", 0x02928 },
{ "top", 0x022A4 },
{ "topbot", 0x02336 },
{ "topcir", 0x02AF1 },
{ "topf", 0x1D565 },
{ "topfork", 0x02ADA },
{ "tosa", 0x02929 },
{ "tprime", 0x02034 },
{ "trade", 0x02122 },
{ "triangle", 0x025B5 },
{ "triangledown", 0x025BF },
{ "triangleleft", 0x025C3 },
{ "trianglelefteq", 0x022B4 },
{ "triangleq", 0x0225C },
{ "triangleright", 0x025B9 },
{ "trianglerighteq", 0x022B5 },
{ "tridot", 0x025EC },
{ "trie", 0x0225C },
{ "triminus", 0x02A3A },
{ "triplus", 0x02A39 },
{ "trisb", 0x029CD },
{ "tritime", 0x02A3B },
{ "trpezium", 0x023E2 },
{ "tscr", 0x1D4C9 },
{ "tscy", 0x00446 },
{ "tshcy", 0x0045B },
{ "tstrok", 0x00167 },
{ "twixt", 0x0226C },
{ "twoheadleftarrow", 0x0219E },
{ "twoheadrightarrow", 0x021A0 },
{ "uArr", 0x021D1 },
{ "uHar", 0x02963 },
{ "uacute", 0x000FA },
{ "uarr", 0x02191 },
{ "ubrcy", 0x0045E },
{ "ubreve", 0x0016D },
{ "ucirc", 0x000FB },
{ "ucy", 0x00443 },
{ "udarr", 0x021C5 },
{ "udblac", 0x00171 },
{ "udhar", 0x0296E },
{ "ufisht", 0x0297E },
{ "ufr", 0x1D532 },
{ "ugrave", 0x000F9 },
{ "uhar", 0x021BF },
{ "uharr", 0x021BE },
{ "uhblk", 0x02580 },
{ "ulcorn", 0x0231C },
{ "ulcorner", 0x0231C },
{ "ulcrop", 0x0230F },
{ "ultri", 0x025F8 },
{ "umacr", 0x0016B },
{ "um", 0x000A8 },
{ "uogon", 0x00173 },
{ "uopf", 0x1D566 },
{ "uparrow", 0x02191 },
{ "updownarrow", 0x02195 },
{ "upharpoonleft", 0x021BF },
{ "upharpoonright", 0x021BE },
{ "uplus", 0x0228E },
{ "upsi", 0x003C5 },
{ "upsih", 0x003D2 },
{ "upsilon", 0x003C5 },
{ "upuparrows", 0x021C8 },
{ "urcorn", 0x0231D },
{ "urcorner", 0x0231D },
{ "urcrop", 0x0230E },
{ "uring", 0x0016F },
{ "urtri", 0x025F9 },
{ "uscr", 0x1D4CA },
{ "utdot", 0x022F0 },
{ "utilde", 0x00169 },
{ "utri", 0x025B5 },
{ "utrif", 0x025B4 },
{ "uuarr", 0x021C8 },
{ "uum", 0x000FC },
{ "uwangle", 0x029A7 },
{ "vArr", 0x021D5 },
{ "vBar", 0x02AE8 },
{ "vBarv", 0x02AE9 },
{ "vDash", 0x022A8 },
{ "vangrt", 0x0299C },
{ "varepsilon", 0x003B5 },
{ "varkappa", 0x003F0 },
{ "varnothing", 0x02205 },
{ "varphi", 0x003C6 },
{ "varpi", 0x003D6 },
{ "varpropto", 0x0221D },
{ "varr", 0x02195 },
{ "varrho", 0x003F1 },
{ "varsigma", 0x003C2 },
{ "vartheta", 0x003D1 },
{ "vartriangleleft", 0x022B2 },
{ "vartriangleright", 0x022B3 },
{ "vcy", 0x00432 },
{ "vdash", 0x022A2 },
{ "vee", 0x02228 },
{ "veebar", 0x022BB },
{ "veeeq", 0x0225A },
{ "vellip", 0x022EE },
{ "verbar", 0x0007C },
{ "vert", 0x0007C },
{ "vfr", 0x1D533 },
{ "vltri", 0x022B2 },
{ "vopf", 0x1D567 },
{ "vprop", 0x0221D },
{ "vrtri", 0x022B3 },
{ "vscr", 0x1D4CB },
{ "vzigzag", 0x0299A },
{ "wcirc", 0x00175 },
{ "wedbar", 0x02A5F },
{ "wedge", 0x02227 },
{ "wedgeq", 0x02259 },
{ "weierp", 0x02118 },
{ "wfr", 0x1D534 },
{ "wopf", 0x1D568 },
{ "wp", 0x02118 },
{ "wr", 0x02240 },
{ "wreath", 0x02240 },
{ "wscr", 0x1D4CC },
{ "xcap", 0x022C2 },
{ "xcirc", 0x025EF },
{ "xcup", 0x022C3 },
{ "xdtri", 0x025BD },
{ "xfr", 0x1D535 },
{ "xhArr", 0x027FA },
{ "xharr", 0x027F7 },
{ "xi", 0x003BE },
{ "xlArr", 0x027F8 },
{ "xlarr", 0x027F5 },
{ "xmap", 0x027FC },
{ "xnis", 0x022FB },
{ "xodot", 0x02A00 },
{ "xopf", 0x1D569 },
{ "xoplus", 0x02A01 },
{ "xotime", 0x02A02 },
{ "xrArr", 0x027F9 },
{ "xrarr", 0x027F6 },
{ "xscr", 0x1D4CD },
{ "xsqcup", 0x02A06 },
{ "xuplus", 0x02A04 },
{ "xutri", 0x025B3 },
{ "xvee", 0x022C1 },
{ "xwedge", 0x022C0 },
{ "yacute", 0x000FD },
{ "yacy", 0x0044F },
{ "ycirc", 0x00177 },
{ "ycy", 0x0044B },
{ "yen", 0x000A5 },
{ "yfr", 0x1D536 },
{ "yicy", 0x00457 },
{ "yopf", 0x1D56A },
{ "yscr", 0x1D4CE },
{ "yucy", 0x0044E },
{ "yum", 0x000FF },
{ "zacute", 0x0017A },
{ "zcaron", 0x0017E },
{ "zcy", 0x00437 },
{ "zdot", 0x0017C },
{ "zeetrf", 0x02128 },
{ "zeta", 0x003B6 },
{ "zfr", 0x1D537 },
{ "zhcy", 0x00436 },
{ "zigrarr", 0x021DD },
{ "zopf", 0x1D56B },
{ "zscr", 0x1D4CF },
{ "zwj", 0x0200D },
{ "zwnj", 0x0200C },
};
if (!name || name[0] == '\0') {
return -1;
}
const auto e = std::end(lookup_);
const auto i = std::lower_bound(std::begin(lookup_), e, name, Compare{});
if (i != e && strcmp((*i).name, name) == 0) {
return (*i).code;
}
return -1;
}
inline int HTMLEntityNameToCodePoint(const wchar_t* name) {
if (!name || name[0] == '\0') {
return -1;
}
char narrow[32];
// longest entity name : strlen("CounterClockwiseContourIntegral") == 31;
int i = 0;
for (; i < 31; ++i) {
const auto c = name[i];
if (c == '\0' || c < 0 || c >= 0x7F) {
break;
}
narrow[i] = static_cast<char>(name[i]);
}
if (name[i] != '\0') {
return -1;
}
narrow[i] = '\0';
return HTMLEntityNameToCodePoint(narrow);
}
template<typename Char>
inline int HTMLEntityToCodePoint(const Char* entity) {
if (!entity || entity[0] == L'\0') {
return -1;
}
while (*entity == '[' || *entity == '&') {
++entity;
}
if (*entity == '#') {
struct ToULong {
static auto Convert(
const wchar_t* s, wchar_t** endptr, int radix) {
return wcstoul(s, endptr, radix);
}
static auto Convert(
const char* s, char** endptr, int radix) {
return strtoul(s, endptr, radix);
}
};
++entity;
int radix = 10;
if (*entity == 'x') {
++entity;
radix = 16;
}
Char* end = nullptr;
const auto code = ToULong::Convert(entity, &end, radix);
if (end && *end == ';' && code <= 0x10FFFF) {
return static_cast<int>(code);
}
else {
return -1;
}
}
else {
static const size_t max_entity_length = 32;
Char buffer[max_entity_length + 1] = {};
for (size_t i = 0; i < max_entity_length; ++i) {
if (entity[i] == '\0' || entity[i] == ';') {
break;
}
buffer[i] = entity[i];
}
return HTMLEntityNameToCodePoint(buffer);
}
}
template<typename C>
struct HTMLEntityPatterns;
template<> struct HTMLEntityPatterns<char> {
static const std::regex pattern;
};
template<> struct HTMLEntityPatterns<wchar_t> {
static const std::wregex pattern;
};
const std::regex HTMLEntityPatterns<char>::pattern{
"&[a-zA-Z]+?;|"
"&#x[\\da-fA-F]+?;|"
"&#\\d+?;"
};
const std::wregex HTMLEntityPatterns<wchar_t>::pattern{
L"&[a-zA-Z]+?;|"
L"&#x[\\da-fA-F]+?;|"
L"&#\\d+?;"
};
template<typename InIt>
inline auto ConvertHTMLEntities(InIt first, InIt last) {
using C = std::decay<decltype(*first)>::type;
const auto& pattern = HTMLEntityPatterns<C>::pattern;
auto it = std::regex_iterator<InIt>(first, last, pattern);
auto end = std::regex_iterator<InIt>();
std::basic_string<C> result;
result.reserve(std::distance(first, last));
auto last_appended = first;
C temp[64] = {};
const size_t temp_capacity = _countof(temp);
for (; it != end; ++it) {
const auto& match = *it;
for (auto& sub : match) {
if (!sub.matched || sub.length() >= temp_capacity) {
continue;
}
auto z = std::copy(sub.first, sub.second, temp);
*z = '\0';
auto code = HTMLEntityToCodePoint(temp);
if (code >= 0 && code <= 0x10FFFF) {
auto utf = EncodeCodePointToUTF<C>(code);
result.append(last_appended, sub.first);
result.append(utf.encoded);
last_appended = sub.second;
break;
}
}
}
result.append(last_appended, last);
return result;
}
template<typename C>
inline auto ConvertHTMLEntities(const std::basic_string<C>& source) {
return ConvertHTMLEntities(source.cbegin(), source.cend());
}
inline auto ConvertHTMLEntities(const char* source) {
if (!source) return std::string{};
return ConvertHTMLEntities(source, source + strlen(source));
}
inline auto ConvertHTMLEntities(const wchar_t* source) {
if (!source) return std::wstring{};
return ConvertHTMLEntities(source, source + wcslen(source));
}
template <typename InIt>
inline auto UnescapeJsonString(InIt first, InIt last) {
using C = std::decay<decltype(*first)>::type;
auto replacement = [](auto c) -> C {
switch (c) {
case 'b': return '\b';
case 'f': return '\f';
case 'n': return '\n';
case 'r': return '\r';
case 't': return '\t';
default: return c;
}
};
struct CodePointConversion {
int codePoint = -1;
int advance = 0;
CodePointConversion(InIt first, InIt last) {
char temp[16];
size_t i = 0;
for (; i < 15 && first != last; ++i, ++first) {
auto c = *first;
if ((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
temp[i] = static_cast<char>(*first);
}
else {
break;
}
}
temp[i] = '\0';
char* end = nullptr;
auto result = strtoul(temp, &end, 16);
while (end - temp > 0 && result > 0x10FFFF) {
--end;
*end = '\0';
end = nullptr;
result = strtoul(temp, &end, 16);
}
codePoint = result;
advance = static_cast<int>(end - temp);
}
};
std::basic_string<C> result;
result.reserve(std::distance(first, last));
auto last_appended = first;
for (auto it = std::find(first, last, '\\'); it != last;) {
auto next = it;
++next;
if (next == last) {
break;
}
auto next_next = next;
++next_next;
auto c = *next;
switch (c) {
case '"': case '\\': case '/':
case 'b': case 'f': case 'n': case 'r': case 't':
result.append(last_appended, it);
result.push_back(replacement(c));
++next;
last_appended = next;
break;
case 'u':
if (next_next != last) {
auto cp = CodePointConversion{next_next, last};
if (cp.advance > 0 && cp.codePoint >= 0 && cp.codePoint <= 0x10FFFF) {
auto utf = EncodeCodePointToUTF<C>(cp.codePoint);
result.append(last_appended, it);
result.append(utf.encoded, utf.encoded + utf.length);
next = next_next;
std::advance(next, cp.advance);
last_appended = next;
}
}
break;
default:
break;
}
it = std::find(next, last, '\\');
}
result.append(last_appended, last);
return result;
}
template <typename Char>
inline auto UnescapeJsonString(const std::basic_string<Char>& source) {
return UnescapeJsonString(source.cbegin(), source.cend());
}
inline auto UnescapeJsonString(const char* source) {
if (!source) return std::string{};
return UnescapeJsonString(source, source + strlen(source));
}
inline auto UnescapeJsonString(const wchar_t* source) {
if (!source) return std::wstring{};
return UnescapeJsonString(source, source + wcslen(source));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment