diff --git a/packages/html-tools/charref.js b/packages/html-tools/charref.js index c0725abb0..aa313c5fd 100644 --- a/packages/html-tools/charref.js +++ b/packages/html-tools/charref.js @@ -2,2283 +2,2288 @@ import { makeRegexMatcher } from './scanner'; // http://www.whatwg.org/specs/web-apps/current-work/multipage/entities.json - // Note that some entities don't have a final semicolon! These are used to // make `<` (for example) with no semicolon a parse error but `&abcde` not. - -var ENTITIES = { - "Á": { "codepoints": [193], "characters": "\u00C1" }, - "Á": { "codepoints": [193], "characters": "\u00C1" }, - "á": { "codepoints": [225], "characters": "\u00E1" }, - "á": { "codepoints": [225], "characters": "\u00E1" }, - "Ă": { "codepoints": [258], "characters": "\u0102" }, - "ă": { "codepoints": [259], "characters": "\u0103" }, - "∾": { "codepoints": [8766], "characters": "\u223E" }, - "∿": { "codepoints": [8767], "characters": "\u223F" }, - "∾̳": { "codepoints": [8766, 819], "characters": "\u223E\u0333" }, - "Â": { "codepoints": [194], "characters": "\u00C2" }, - "Â": { "codepoints": [194], "characters": "\u00C2" }, - "â": { "codepoints": [226], "characters": "\u00E2" }, - "â": { "codepoints": [226], "characters": "\u00E2" }, - "´": { "codepoints": [180], "characters": "\u00B4" }, - "´": { "codepoints": [180], "characters": "\u00B4" }, - "А": { "codepoints": [1040], "characters": "\u0410" }, - "а": { "codepoints": [1072], "characters": "\u0430" }, - "Æ": { "codepoints": [198], "characters": "\u00C6" }, - "Æ": { "codepoints": [198], "characters": "\u00C6" }, - "æ": { "codepoints": [230], "characters": "\u00E6" }, - "æ": { "codepoints": [230], "characters": "\u00E6" }, - "⁡": { "codepoints": [8289], "characters": "\u2061" }, - "𝔄": { "codepoints": [120068], "characters": "\uD835\uDD04" }, - "𝔞": { "codepoints": [120094], "characters": "\uD835\uDD1E" }, - "À": { "codepoints": [192], "characters": "\u00C0" }, - "À": { "codepoints": [192], "characters": "\u00C0" }, - "à": { "codepoints": [224], "characters": "\u00E0" }, - "à": { "codepoints": [224], "characters": "\u00E0" }, - "ℵ": { "codepoints": [8501], "characters": "\u2135" }, - "ℵ": { "codepoints": [8501], "characters": "\u2135" }, - "Α": { "codepoints": [913], "characters": "\u0391" }, - "α": { "codepoints": [945], "characters": "\u03B1" }, - "Ā": { "codepoints": [256], "characters": "\u0100" }, - "ā": { "codepoints": [257], "characters": "\u0101" }, - "⨿": { "codepoints": [10815], "characters": "\u2A3F" }, - "&": { "codepoints": [38], "characters": "\u0026" }, - "&": { "codepoints": [38], "characters": "\u0026" }, - "&": { "codepoints": [38], "characters": "\u0026" }, - "&": { "codepoints": [38], "characters": "\u0026" }, - "⩕": { "codepoints": [10837], "characters": "\u2A55" }, - "⩓": { "codepoints": [10835], "characters": "\u2A53" }, - "∧": { "codepoints": [8743], "characters": "\u2227" }, - "⩜": { "codepoints": [10844], "characters": "\u2A5C" }, - "⩘": { "codepoints": [10840], "characters": "\u2A58" }, - "⩚": { "codepoints": [10842], "characters": "\u2A5A" }, - "∠": { "codepoints": [8736], "characters": "\u2220" }, - "⦤": { "codepoints": [10660], "characters": "\u29A4" }, - "∠": { "codepoints": [8736], "characters": "\u2220" }, - "⦨": { "codepoints": [10664], "characters": "\u29A8" }, - "⦩": { "codepoints": [10665], "characters": "\u29A9" }, - "⦪": { "codepoints": [10666], "characters": "\u29AA" }, - "⦫": { "codepoints": [10667], "characters": "\u29AB" }, - "⦬": { "codepoints": [10668], "characters": "\u29AC" }, - "⦭": { "codepoints": [10669], "characters": "\u29AD" }, - "⦮": { "codepoints": [10670], "characters": "\u29AE" }, - "⦯": { "codepoints": [10671], "characters": "\u29AF" }, - "∡": { "codepoints": [8737], "characters": "\u2221" }, - "∟": { "codepoints": [8735], "characters": "\u221F" }, - "⊾": { "codepoints": [8894], "characters": "\u22BE" }, - "⦝": { "codepoints": [10653], "characters": "\u299D" }, - "∢": { "codepoints": [8738], "characters": "\u2222" }, - "Å": { "codepoints": [197], "characters": "\u00C5" }, - "⍼": { "codepoints": [9084], "characters": "\u237C" }, - "Ą": { "codepoints": [260], "characters": "\u0104" }, - "ą": { "codepoints": [261], "characters": "\u0105" }, - "𝔸": { "codepoints": [120120], "characters": "\uD835\uDD38" }, - "𝕒": { "codepoints": [120146], "characters": "\uD835\uDD52" }, - "⩯": { "codepoints": [10863], "characters": "\u2A6F" }, - "≈": { "codepoints": [8776], "characters": "\u2248" }, - "⩰": { "codepoints": [10864], "characters": "\u2A70" }, - "≊": { "codepoints": [8778], "characters": "\u224A" }, - "≋": { "codepoints": [8779], "characters": "\u224B" }, - "'": { "codepoints": [39], "characters": "\u0027" }, - "⁡": { "codepoints": [8289], "characters": "\u2061" }, - "≈": { "codepoints": [8776], "characters": "\u2248" }, - "≊": { "codepoints": [8778], "characters": "\u224A" }, - "Å": { "codepoints": [197], "characters": "\u00C5" }, - "Å": { "codepoints": [197], "characters": "\u00C5" }, - "å": { "codepoints": [229], "characters": "\u00E5" }, - "å": { "codepoints": [229], "characters": "\u00E5" }, - "𝒜": { "codepoints": [119964], "characters": "\uD835\uDC9C" }, - "𝒶": { "codepoints": [119990], "characters": "\uD835\uDCB6" }, - "≔": { "codepoints": [8788], "characters": "\u2254" }, - "*": { "codepoints": [42], "characters": "\u002A" }, - "≈": { "codepoints": [8776], "characters": "\u2248" }, - "≍": { "codepoints": [8781], "characters": "\u224D" }, - "Ã": { "codepoints": [195], "characters": "\u00C3" }, - "Ã": { "codepoints": [195], "characters": "\u00C3" }, - "ã": { "codepoints": [227], "characters": "\u00E3" }, - "ã": { "codepoints": [227], "characters": "\u00E3" }, - "Ä": { "codepoints": [196], "characters": "\u00C4" }, - "Ä": { "codepoints": [196], "characters": "\u00C4" }, - "ä": { "codepoints": [228], "characters": "\u00E4" }, - "ä": { "codepoints": [228], "characters": "\u00E4" }, - "∳": { "codepoints": [8755], "characters": "\u2233" }, - "⨑": { "codepoints": [10769], "characters": "\u2A11" }, - "≌": { "codepoints": [8780], "characters": "\u224C" }, - "϶": { "codepoints": [1014], "characters": "\u03F6" }, - "‵": { "codepoints": [8245], "characters": "\u2035" }, - "∽": { "codepoints": [8765], "characters": "\u223D" }, - "⋍": { "codepoints": [8909], "characters": "\u22CD" }, - "∖": { "codepoints": [8726], "characters": "\u2216" }, - "⫧": { "codepoints": [10983], "characters": "\u2AE7" }, - "⊽": { "codepoints": [8893], "characters": "\u22BD" }, - "⌅": { "codepoints": [8965], "characters": "\u2305" }, - "⌆": { "codepoints": [8966], "characters": "\u2306" }, - "⌅": { "codepoints": [8965], "characters": "\u2305" }, - "⎵": { "codepoints": [9141], "characters": "\u23B5" }, - "⎶": { "codepoints": [9142], "characters": "\u23B6" }, - "≌": { "codepoints": [8780], "characters": "\u224C" }, - "Б": { "codepoints": [1041], "characters": "\u0411" }, - "б": { "codepoints": [1073], "characters": "\u0431" }, - "„": { "codepoints": [8222], "characters": "\u201E" }, - "∵": { "codepoints": [8757], "characters": "\u2235" }, - "∵": { "codepoints": [8757], "characters": "\u2235" }, - "∵": { "codepoints": [8757], "characters": "\u2235" }, - "⦰": { "codepoints": [10672], "characters": "\u29B0" }, - "϶": { "codepoints": [1014], "characters": "\u03F6" }, - "ℬ": { "codepoints": [8492], "characters": "\u212C" }, - "ℬ": { "codepoints": [8492], "characters": "\u212C" }, - "Β": { "codepoints": [914], "characters": "\u0392" }, - "β": { "codepoints": [946], "characters": "\u03B2" }, - "ℶ": { "codepoints": [8502], "characters": "\u2136" }, - "≬": { "codepoints": [8812], "characters": "\u226C" }, - "𝔅": { "codepoints": [120069], "characters": "\uD835\uDD05" }, - "𝔟": { "codepoints": [120095], "characters": "\uD835\uDD1F" }, - "⋂": { "codepoints": [8898], "characters": "\u22C2" }, - "◯": { "codepoints": [9711], "characters": "\u25EF" }, - "⋃": { "codepoints": [8899], "characters": "\u22C3" }, - "⨀": { "codepoints": [10752], "characters": "\u2A00" }, - "⨁": { "codepoints": [10753], "characters": "\u2A01" }, - "⨂": { "codepoints": [10754], "characters": "\u2A02" }, - "⨆": { "codepoints": [10758], "characters": "\u2A06" }, - "★": { "codepoints": [9733], "characters": "\u2605" }, - "▽": { "codepoints": [9661], "characters": "\u25BD" }, - "△": { "codepoints": [9651], "characters": "\u25B3" }, - "⨄": { "codepoints": [10756], "characters": "\u2A04" }, - "⋁": { "codepoints": [8897], "characters": "\u22C1" }, - "⋀": { "codepoints": [8896], "characters": "\u22C0" }, - "⤍": { "codepoints": [10509], "characters": "\u290D" }, - "⧫": { "codepoints": [10731], "characters": "\u29EB" }, - "▪": { "codepoints": [9642], "characters": "\u25AA" }, - "▴": { "codepoints": [9652], "characters": "\u25B4" }, - "▾": { "codepoints": [9662], "characters": "\u25BE" }, - "◂": { "codepoints": [9666], "characters": "\u25C2" }, - "▸": { "codepoints": [9656], "characters": "\u25B8" }, - "␣": { "codepoints": [9251], "characters": "\u2423" }, - "▒": { "codepoints": [9618], "characters": "\u2592" }, - "░": { "codepoints": [9617], "characters": "\u2591" }, - "▓": { "codepoints": [9619], "characters": "\u2593" }, - "█": { "codepoints": [9608], "characters": "\u2588" }, - "=⃥": { "codepoints": [61, 8421], "characters": "\u003D\u20E5" }, - "≡⃥": { "codepoints": [8801, 8421], "characters": "\u2261\u20E5" }, - "⫭": { "codepoints": [10989], "characters": "\u2AED" }, - "⌐": { "codepoints": [8976], "characters": "\u2310" }, - "𝔹": { "codepoints": [120121], "characters": "\uD835\uDD39" }, - "𝕓": { "codepoints": [120147], "characters": "\uD835\uDD53" }, - "⊥": { "codepoints": [8869], "characters": "\u22A5" }, - "⊥": { "codepoints": [8869], "characters": "\u22A5" }, - "⋈": { "codepoints": [8904], "characters": "\u22C8" }, - "⧉": { "codepoints": [10697], "characters": "\u29C9" }, - "┐": { "codepoints": [9488], "characters": "\u2510" }, - "╕": { "codepoints": [9557], "characters": "\u2555" }, - "╖": { "codepoints": [9558], "characters": "\u2556" }, - "╗": { "codepoints": [9559], "characters": "\u2557" }, - "┌": { "codepoints": [9484], "characters": "\u250C" }, - "╒": { "codepoints": [9554], "characters": "\u2552" }, - "╓": { "codepoints": [9555], "characters": "\u2553" }, - "╔": { "codepoints": [9556], "characters": "\u2554" }, - "─": { "codepoints": [9472], "characters": "\u2500" }, - "═": { "codepoints": [9552], "characters": "\u2550" }, - "┬": { "codepoints": [9516], "characters": "\u252C" }, - "╤": { "codepoints": [9572], "characters": "\u2564" }, - "╥": { "codepoints": [9573], "characters": "\u2565" }, - "╦": { "codepoints": [9574], "characters": "\u2566" }, - "┴": { "codepoints": [9524], "characters": "\u2534" }, - "╧": { "codepoints": [9575], "characters": "\u2567" }, - "╨": { "codepoints": [9576], "characters": "\u2568" }, - "╩": { "codepoints": [9577], "characters": "\u2569" }, - "⊟": { "codepoints": [8863], "characters": "\u229F" }, - "⊞": { "codepoints": [8862], "characters": "\u229E" }, - "⊠": { "codepoints": [8864], "characters": "\u22A0" }, - "┘": { "codepoints": [9496], "characters": "\u2518" }, - "╛": { "codepoints": [9563], "characters": "\u255B" }, - "╜": { "codepoints": [9564], "characters": "\u255C" }, - "╝": { "codepoints": [9565], "characters": "\u255D" }, - "└": { "codepoints": [9492], "characters": "\u2514" }, - "╘": { "codepoints": [9560], "characters": "\u2558" }, - "╙": { "codepoints": [9561], "characters": "\u2559" }, - "╚": { "codepoints": [9562], "characters": "\u255A" }, - "│": { "codepoints": [9474], "characters": "\u2502" }, - "║": { "codepoints": [9553], "characters": "\u2551" }, - "┼": { "codepoints": [9532], "characters": "\u253C" }, - "╪": { "codepoints": [9578], "characters": "\u256A" }, - "╫": { "codepoints": [9579], "characters": "\u256B" }, - "╬": { "codepoints": [9580], "characters": "\u256C" }, - "┤": { "codepoints": [9508], "characters": "\u2524" }, - "╡": { "codepoints": [9569], "characters": "\u2561" }, - "╢": { "codepoints": [9570], "characters": "\u2562" }, - "╣": { "codepoints": [9571], "characters": "\u2563" }, - "├": { "codepoints": [9500], "characters": "\u251C" }, - "╞": { "codepoints": [9566], "characters": "\u255E" }, - "╟": { "codepoints": [9567], "characters": "\u255F" }, - "╠": { "codepoints": [9568], "characters": "\u2560" }, - "‵": { "codepoints": [8245], "characters": "\u2035" }, - "˘": { "codepoints": [728], "characters": "\u02D8" }, - "˘": { "codepoints": [728], "characters": "\u02D8" }, - "¦": { "codepoints": [166], "characters": "\u00A6" }, - "¦": { "codepoints": [166], "characters": "\u00A6" }, - "𝒷": { "codepoints": [119991], "characters": "\uD835\uDCB7" }, - "ℬ": { "codepoints": [8492], "characters": "\u212C" }, - "⁏": { "codepoints": [8271], "characters": "\u204F" }, - "∽": { "codepoints": [8765], "characters": "\u223D" }, - "⋍": { "codepoints": [8909], "characters": "\u22CD" }, - "⧅": { "codepoints": [10693], "characters": "\u29C5" }, - "\": { "codepoints": [92], "characters": "\u005C" }, - "⟈": { "codepoints": [10184], "characters": "\u27C8" }, - "•": { "codepoints": [8226], "characters": "\u2022" }, - "•": { "codepoints": [8226], "characters": "\u2022" }, - "≎": { "codepoints": [8782], "characters": "\u224E" }, - "⪮": { "codepoints": [10926], "characters": "\u2AAE" }, - "≏": { "codepoints": [8783], "characters": "\u224F" }, - "≎": { "codepoints": [8782], "characters": "\u224E" }, - "≏": { "codepoints": [8783], "characters": "\u224F" }, - "Ć": { "codepoints": [262], "characters": "\u0106" }, - "ć": { "codepoints": [263], "characters": "\u0107" }, - "⩄": { "codepoints": [10820], "characters": "\u2A44" }, - "⩉": { "codepoints": [10825], "characters": "\u2A49" }, - "⩋": { "codepoints": [10827], "characters": "\u2A4B" }, - "∩": { "codepoints": [8745], "characters": "\u2229" }, - "⋒": { "codepoints": [8914], "characters": "\u22D2" }, - "⩇": { "codepoints": [10823], "characters": "\u2A47" }, - "⩀": { "codepoints": [10816], "characters": "\u2A40" }, - "ⅅ": { "codepoints": [8517], "characters": "\u2145" }, - "∩︀": { "codepoints": [8745, 65024], "characters": "\u2229\uFE00" }, - "⁁": { "codepoints": [8257], "characters": "\u2041" }, - "ˇ": { "codepoints": [711], "characters": "\u02C7" }, - "ℭ": { "codepoints": [8493], "characters": "\u212D" }, - "⩍": { "codepoints": [10829], "characters": "\u2A4D" }, - "Č": { "codepoints": [268], "characters": "\u010C" }, - "č": { "codepoints": [269], "characters": "\u010D" }, - "Ç": { "codepoints": [199], "characters": "\u00C7" }, - "Ç": { "codepoints": [199], "characters": "\u00C7" }, - "ç": { "codepoints": [231], "characters": "\u00E7" }, - "ç": { "codepoints": [231], "characters": "\u00E7" }, - "Ĉ": { "codepoints": [264], "characters": "\u0108" }, - "ĉ": { "codepoints": [265], "characters": "\u0109" }, - "∰": { "codepoints": [8752], "characters": "\u2230" }, - "⩌": { "codepoints": [10828], "characters": "\u2A4C" }, - "⩐": { "codepoints": [10832], "characters": "\u2A50" }, - "Ċ": { "codepoints": [266], "characters": "\u010A" }, - "ċ": { "codepoints": [267], "characters": "\u010B" }, - "¸": { "codepoints": [184], "characters": "\u00B8" }, - "¸": { "codepoints": [184], "characters": "\u00B8" }, - "¸": { "codepoints": [184], "characters": "\u00B8" }, - "⦲": { "codepoints": [10674], "characters": "\u29B2" }, - "¢": { "codepoints": [162], "characters": "\u00A2" }, - "¢": { "codepoints": [162], "characters": "\u00A2" }, - "·": { "codepoints": [183], "characters": "\u00B7" }, - "·": { "codepoints": [183], "characters": "\u00B7" }, - "𝔠": { "codepoints": [120096], "characters": "\uD835\uDD20" }, - "ℭ": { "codepoints": [8493], "characters": "\u212D" }, - "Ч": { "codepoints": [1063], "characters": "\u0427" }, - "ч": { "codepoints": [1095], "characters": "\u0447" }, - "✓": { "codepoints": [10003], "characters": "\u2713" }, - "✓": { "codepoints": [10003], "characters": "\u2713" }, - "Χ": { "codepoints": [935], "characters": "\u03A7" }, - "χ": { "codepoints": [967], "characters": "\u03C7" }, - "ˆ": { "codepoints": [710], "characters": "\u02C6" }, - "≗": { "codepoints": [8791], "characters": "\u2257" }, - "↺": { "codepoints": [8634], "characters": "\u21BA" }, - "↻": { "codepoints": [8635], "characters": "\u21BB" }, - "⊛": { "codepoints": [8859], "characters": "\u229B" }, - "⊚": { "codepoints": [8858], "characters": "\u229A" }, - "⊝": { "codepoints": [8861], "characters": "\u229D" }, - "⊙": { "codepoints": [8857], "characters": "\u2299" }, - "®": { "codepoints": [174], "characters": "\u00AE" }, - "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" }, - "⊖": { "codepoints": [8854], "characters": "\u2296" }, - "⊕": { "codepoints": [8853], "characters": "\u2295" }, - "⊗": { "codepoints": [8855], "characters": "\u2297" }, - "○": { "codepoints": [9675], "characters": "\u25CB" }, - "⧃": { "codepoints": [10691], "characters": "\u29C3" }, - "≗": { "codepoints": [8791], "characters": "\u2257" }, - "⨐": { "codepoints": [10768], "characters": "\u2A10" }, - "⫯": { "codepoints": [10991], "characters": "\u2AEF" }, - "⧂": { "codepoints": [10690], "characters": "\u29C2" }, - "∲": { "codepoints": [8754], "characters": "\u2232" }, - "”": { "codepoints": [8221], "characters": "\u201D" }, - "’": { "codepoints": [8217], "characters": "\u2019" }, - "♣": { "codepoints": [9827], "characters": "\u2663" }, - "♣": { "codepoints": [9827], "characters": "\u2663" }, - ":": { "codepoints": [58], "characters": "\u003A" }, - "∷": { "codepoints": [8759], "characters": "\u2237" }, - "⩴": { "codepoints": [10868], "characters": "\u2A74" }, - "≔": { "codepoints": [8788], "characters": "\u2254" }, - "≔": { "codepoints": [8788], "characters": "\u2254" }, - ",": { "codepoints": [44], "characters": "\u002C" }, - "@": { "codepoints": [64], "characters": "\u0040" }, - "∁": { "codepoints": [8705], "characters": "\u2201" }, - "∘": { "codepoints": [8728], "characters": "\u2218" }, - "∁": { "codepoints": [8705], "characters": "\u2201" }, - "ℂ": { "codepoints": [8450], "characters": "\u2102" }, - "≅": { "codepoints": [8773], "characters": "\u2245" }, - "⩭": { "codepoints": [10861], "characters": "\u2A6D" }, - "≡": { "codepoints": [8801], "characters": "\u2261" }, - "∮": { "codepoints": [8750], "characters": "\u222E" }, - "∯": { "codepoints": [8751], "characters": "\u222F" }, - "∮": { "codepoints": [8750], "characters": "\u222E" }, - "𝕔": { "codepoints": [120148], "characters": "\uD835\uDD54" }, - "ℂ": { "codepoints": [8450], "characters": "\u2102" }, - "∐": { "codepoints": [8720], "characters": "\u2210" }, - "∐": { "codepoints": [8720], "characters": "\u2210" }, - "©": { "codepoints": [169], "characters": "\u00A9" }, - "©": { "codepoints": [169], "characters": "\u00A9" }, - "©": { "codepoints": [169], "characters": "\u00A9" }, - "©": { "codepoints": [169], "characters": "\u00A9" }, - "℗": { "codepoints": [8471], "characters": "\u2117" }, - "∳": { "codepoints": [8755], "characters": "\u2233" }, - "↵": { "codepoints": [8629], "characters": "\u21B5" }, - "✗": { "codepoints": [10007], "characters": "\u2717" }, - "⨯": { "codepoints": [10799], "characters": "\u2A2F" }, - "𝒞": { "codepoints": [119966], "characters": "\uD835\uDC9E" }, - "𝒸": { "codepoints": [119992], "characters": "\uD835\uDCB8" }, - "⫏": { "codepoints": [10959], "characters": "\u2ACF" }, - "⫑": { "codepoints": [10961], "characters": "\u2AD1" }, - "⫐": { "codepoints": [10960], "characters": "\u2AD0" }, - "⫒": { "codepoints": [10962], "characters": "\u2AD2" }, - "⋯": { "codepoints": [8943], "characters": "\u22EF" }, - "⤸": { "codepoints": [10552], "characters": "\u2938" }, - "⤵": { "codepoints": [10549], "characters": "\u2935" }, - "⋞": { "codepoints": [8926], "characters": "\u22DE" }, - "⋟": { "codepoints": [8927], "characters": "\u22DF" }, - "↶": { "codepoints": [8630], "characters": "\u21B6" }, - "⤽": { "codepoints": [10557], "characters": "\u293D" }, - "⩈": { "codepoints": [10824], "characters": "\u2A48" }, - "⩆": { "codepoints": [10822], "characters": "\u2A46" }, - "≍": { "codepoints": [8781], "characters": "\u224D" }, - "∪": { "codepoints": [8746], "characters": "\u222A" }, - "⋓": { "codepoints": [8915], "characters": "\u22D3" }, - "⩊": { "codepoints": [10826], "characters": "\u2A4A" }, - "⊍": { "codepoints": [8845], "characters": "\u228D" }, - "⩅": { "codepoints": [10821], "characters": "\u2A45" }, - "∪︀": { "codepoints": [8746, 65024], "characters": "\u222A\uFE00" }, - "↷": { "codepoints": [8631], "characters": "\u21B7" }, - "⤼": { "codepoints": [10556], "characters": "\u293C" }, - "⋞": { "codepoints": [8926], "characters": "\u22DE" }, - "⋟": { "codepoints": [8927], "characters": "\u22DF" }, - "⋎": { "codepoints": [8910], "characters": "\u22CE" }, - "⋏": { "codepoints": [8911], "characters": "\u22CF" }, - "¤": { "codepoints": [164], "characters": "\u00A4" }, - "¤": { "codepoints": [164], "characters": "\u00A4" }, - "↶": { "codepoints": [8630], "characters": "\u21B6" }, - "↷": { "codepoints": [8631], "characters": "\u21B7" }, - "⋎": { "codepoints": [8910], "characters": "\u22CE" }, - "⋏": { "codepoints": [8911], "characters": "\u22CF" }, - "∲": { "codepoints": [8754], "characters": "\u2232" }, - "∱": { "codepoints": [8753], "characters": "\u2231" }, - "⌭": { "codepoints": [9005], "characters": "\u232D" }, - "†": { "codepoints": [8224], "characters": "\u2020" }, - "‡": { "codepoints": [8225], "characters": "\u2021" }, - "ℸ": { "codepoints": [8504], "characters": "\u2138" }, - "↓": { "codepoints": [8595], "characters": "\u2193" }, - "↡": { "codepoints": [8609], "characters": "\u21A1" }, - "⇓": { "codepoints": [8659], "characters": "\u21D3" }, - "‐": { "codepoints": [8208], "characters": "\u2010" }, - "⫤": { "codepoints": [10980], "characters": "\u2AE4" }, - "⊣": { "codepoints": [8867], "characters": "\u22A3" }, - "⤏": { "codepoints": [10511], "characters": "\u290F" }, - "˝": { "codepoints": [733], "characters": "\u02DD" }, - "Ď": { "codepoints": [270], "characters": "\u010E" }, - "ď": { "codepoints": [271], "characters": "\u010F" }, - "Д": { "codepoints": [1044], "characters": "\u0414" }, - "д": { "codepoints": [1076], "characters": "\u0434" }, - "‡": { "codepoints": [8225], "characters": "\u2021" }, - "⇊": { "codepoints": [8650], "characters": "\u21CA" }, - "ⅅ": { "codepoints": [8517], "characters": "\u2145" }, - "ⅆ": { "codepoints": [8518], "characters": "\u2146" }, - "⤑": { "codepoints": [10513], "characters": "\u2911" }, - "⩷": { "codepoints": [10871], "characters": "\u2A77" }, - "°": { "codepoints": [176], "characters": "\u00B0" }, - "°": { "codepoints": [176], "characters": "\u00B0" }, - "∇": { "codepoints": [8711], "characters": "\u2207" }, - "Δ": { "codepoints": [916], "characters": "\u0394" }, - "δ": { "codepoints": [948], "characters": "\u03B4" }, - "⦱": { "codepoints": [10673], "characters": "\u29B1" }, - "⥿": { "codepoints": [10623], "characters": "\u297F" }, - "𝔇": { "codepoints": [120071], "characters": "\uD835\uDD07" }, - "𝔡": { "codepoints": [120097], "characters": "\uD835\uDD21" }, - "⥥": { "codepoints": [10597], "characters": "\u2965" }, - "⇃": { "codepoints": [8643], "characters": "\u21C3" }, - "⇂": { "codepoints": [8642], "characters": "\u21C2" }, - "´": { "codepoints": [180], "characters": "\u00B4" }, - "˙": { "codepoints": [729], "characters": "\u02D9" }, - "˝": { "codepoints": [733], "characters": "\u02DD" }, - "`": { "codepoints": [96], "characters": "\u0060" }, - "˜": { "codepoints": [732], "characters": "\u02DC" }, - "⋄": { "codepoints": [8900], "characters": "\u22C4" }, - "⋄": { "codepoints": [8900], "characters": "\u22C4" }, - "⋄": { "codepoints": [8900], "characters": "\u22C4" }, - "♦": { "codepoints": [9830], "characters": "\u2666" }, - "♦": { "codepoints": [9830], "characters": "\u2666" }, - "¨": { "codepoints": [168], "characters": "\u00A8" }, - "ⅆ": { "codepoints": [8518], "characters": "\u2146" }, - "ϝ": { "codepoints": [989], "characters": "\u03DD" }, - "⋲": { "codepoints": [8946], "characters": "\u22F2" }, - "÷": { "codepoints": [247], "characters": "\u00F7" }, - "÷": { "codepoints": [247], "characters": "\u00F7" }, - "÷": { "codepoints": [247], "characters": "\u00F7" }, - "⋇": { "codepoints": [8903], "characters": "\u22C7" }, - "⋇": { "codepoints": [8903], "characters": "\u22C7" }, - "Ђ": { "codepoints": [1026], "characters": "\u0402" }, - "ђ": { "codepoints": [1106], "characters": "\u0452" }, - "⌞": { "codepoints": [8990], "characters": "\u231E" }, - "⌍": { "codepoints": [8973], "characters": "\u230D" }, - "$": { "codepoints": [36], "characters": "\u0024" }, - "𝔻": { "codepoints": [120123], "characters": "\uD835\uDD3B" }, - "𝕕": { "codepoints": [120149], "characters": "\uD835\uDD55" }, - "¨": { "codepoints": [168], "characters": "\u00A8" }, - "˙": { "codepoints": [729], "characters": "\u02D9" }, - "⃜": { "codepoints": [8412], "characters": "\u20DC" }, - "≐": { "codepoints": [8784], "characters": "\u2250" }, - "≑": { "codepoints": [8785], "characters": "\u2251" }, - "≐": { "codepoints": [8784], "characters": "\u2250" }, - "∸": { "codepoints": [8760], "characters": "\u2238" }, - "∔": { "codepoints": [8724], "characters": "\u2214" }, - "⊡": { "codepoints": [8865], "characters": "\u22A1" }, - "⌆": { "codepoints": [8966], "characters": "\u2306" }, - "∯": { "codepoints": [8751], "characters": "\u222F" }, - "¨": { "codepoints": [168], "characters": "\u00A8" }, - "⇓": { "codepoints": [8659], "characters": "\u21D3" }, - "⇐": { "codepoints": [8656], "characters": "\u21D0" }, - "⇔": { "codepoints": [8660], "characters": "\u21D4" }, - "⫤": { "codepoints": [10980], "characters": "\u2AE4" }, - "⟸": { "codepoints": [10232], "characters": "\u27F8" }, - "⟺": { "codepoints": [10234], "characters": "\u27FA" }, - "⟹": { "codepoints": [10233], "characters": "\u27F9" }, - "⇒": { "codepoints": [8658], "characters": "\u21D2" }, - "⊨": { "codepoints": [8872], "characters": "\u22A8" }, - "⇑": { "codepoints": [8657], "characters": "\u21D1" }, - "⇕": { "codepoints": [8661], "characters": "\u21D5" }, - "∥": { "codepoints": [8741], "characters": "\u2225" }, - "⤓": { "codepoints": [10515], "characters": "\u2913" }, - "↓": { "codepoints": [8595], "characters": "\u2193" }, - "↓": { "codepoints": [8595], "characters": "\u2193" }, - "⇓": { "codepoints": [8659], "characters": "\u21D3" }, - "⇵": { "codepoints": [8693], "characters": "\u21F5" }, - "̑": { "codepoints": [785], "characters": "\u0311" }, - "⇊": { "codepoints": [8650], "characters": "\u21CA" }, - "⇃": { "codepoints": [8643], "characters": "\u21C3" }, - "⇂": { "codepoints": [8642], "characters": "\u21C2" }, - "⥐": { "codepoints": [10576], "characters": "\u2950" }, - "⥞": { "codepoints": [10590], "characters": "\u295E" }, - "⥖": { "codepoints": [10582], "characters": "\u2956" }, - "↽": { "codepoints": [8637], "characters": "\u21BD" }, - "⥟": { "codepoints": [10591], "characters": "\u295F" }, - "⥗": { "codepoints": [10583], "characters": "\u2957" }, - "⇁": { "codepoints": [8641], "characters": "\u21C1" }, - "↧": { "codepoints": [8615], "characters": "\u21A7" }, - "⊤": { "codepoints": [8868], "characters": "\u22A4" }, - "⤐": { "codepoints": [10512], "characters": "\u2910" }, - "⌟": { "codepoints": [8991], "characters": "\u231F" }, - "⌌": { "codepoints": [8972], "characters": "\u230C" }, - "𝒟": { "codepoints": [119967], "characters": "\uD835\uDC9F" }, - "𝒹": { "codepoints": [119993], "characters": "\uD835\uDCB9" }, - "Ѕ": { "codepoints": [1029], "characters": "\u0405" }, - "ѕ": { "codepoints": [1109], "characters": "\u0455" }, - "⧶": { "codepoints": [10742], "characters": "\u29F6" }, - "Đ": { "codepoints": [272], "characters": "\u0110" }, - "đ": { "codepoints": [273], "characters": "\u0111" }, - "⋱": { "codepoints": [8945], "characters": "\u22F1" }, - "▿": { "codepoints": [9663], "characters": "\u25BF" }, - "▾": { "codepoints": [9662], "characters": "\u25BE" }, - "⇵": { "codepoints": [8693], "characters": "\u21F5" }, - "⥯": { "codepoints": [10607], "characters": "\u296F" }, - "⦦": { "codepoints": [10662], "characters": "\u29A6" }, - "Џ": { "codepoints": [1039], "characters": "\u040F" }, - "џ": { "codepoints": [1119], "characters": "\u045F" }, - "⟿": { "codepoints": [10239], "characters": "\u27FF" }, - "É": { "codepoints": [201], "characters": "\u00C9" }, - "É": { "codepoints": [201], "characters": "\u00C9" }, - "é": { "codepoints": [233], "characters": "\u00E9" }, - "é": { "codepoints": [233], "characters": "\u00E9" }, - "⩮": { "codepoints": [10862], "characters": "\u2A6E" }, - "Ě": { "codepoints": [282], "characters": "\u011A" }, - "ě": { "codepoints": [283], "characters": "\u011B" }, - "Ê": { "codepoints": [202], "characters": "\u00CA" }, - "Ê": { "codepoints": [202], "characters": "\u00CA" }, - "ê": { "codepoints": [234], "characters": "\u00EA" }, - "ê": { "codepoints": [234], "characters": "\u00EA" }, - "≖": { "codepoints": [8790], "characters": "\u2256" }, - "≕": { "codepoints": [8789], "characters": "\u2255" }, - "Э": { "codepoints": [1069], "characters": "\u042D" }, - "э": { "codepoints": [1101], "characters": "\u044D" }, - "⩷": { "codepoints": [10871], "characters": "\u2A77" }, - "Ė": { "codepoints": [278], "characters": "\u0116" }, - "ė": { "codepoints": [279], "characters": "\u0117" }, - "≑": { "codepoints": [8785], "characters": "\u2251" }, - "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, - "≒": { "codepoints": [8786], "characters": "\u2252" }, - "𝔈": { "codepoints": [120072], "characters": "\uD835\uDD08" }, - "𝔢": { "codepoints": [120098], "characters": "\uD835\uDD22" }, - "⪚": { "codepoints": [10906], "characters": "\u2A9A" }, - "È": { "codepoints": [200], "characters": "\u00C8" }, - "È": { "codepoints": [200], "characters": "\u00C8" }, - "è": { "codepoints": [232], "characters": "\u00E8" }, - "è": { "codepoints": [232], "characters": "\u00E8" }, - "⪖": { "codepoints": [10902], "characters": "\u2A96" }, - "⪘": { "codepoints": [10904], "characters": "\u2A98" }, - "⪙": { "codepoints": [10905], "characters": "\u2A99" }, - "∈": { "codepoints": [8712], "characters": "\u2208" }, - "⏧": { "codepoints": [9191], "characters": "\u23E7" }, - "ℓ": { "codepoints": [8467], "characters": "\u2113" }, - "⪕": { "codepoints": [10901], "characters": "\u2A95" }, - "⪗": { "codepoints": [10903], "characters": "\u2A97" }, - "Ē": { "codepoints": [274], "characters": "\u0112" }, - "ē": { "codepoints": [275], "characters": "\u0113" }, - "∅": { "codepoints": [8709], "characters": "\u2205" }, - "∅": { "codepoints": [8709], "characters": "\u2205" }, - "◻": { "codepoints": [9723], "characters": "\u25FB" }, - "∅": { "codepoints": [8709], "characters": "\u2205" }, - "▫": { "codepoints": [9643], "characters": "\u25AB" }, - " ": { "codepoints": [8196], "characters": "\u2004" }, - " ": { "codepoints": [8197], "characters": "\u2005" }, - " ": { "codepoints": [8195], "characters": "\u2003" }, - "Ŋ": { "codepoints": [330], "characters": "\u014A" }, - "ŋ": { "codepoints": [331], "characters": "\u014B" }, - " ": { "codepoints": [8194], "characters": "\u2002" }, - "Ę": { "codepoints": [280], "characters": "\u0118" }, - "ę": { "codepoints": [281], "characters": "\u0119" }, - "𝔼": { "codepoints": [120124], "characters": "\uD835\uDD3C" }, - "𝕖": { "codepoints": [120150], "characters": "\uD835\uDD56" }, - "⋕": { "codepoints": [8917], "characters": "\u22D5" }, - "⧣": { "codepoints": [10723], "characters": "\u29E3" }, - "⩱": { "codepoints": [10865], "characters": "\u2A71" }, - "ε": { "codepoints": [949], "characters": "\u03B5" }, - "Ε": { "codepoints": [917], "characters": "\u0395" }, - "ε": { "codepoints": [949], "characters": "\u03B5" }, - "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, - "≖": { "codepoints": [8790], "characters": "\u2256" }, - "≕": { "codepoints": [8789], "characters": "\u2255" }, - "≂": { "codepoints": [8770], "characters": "\u2242" }, - "⪖": { "codepoints": [10902], "characters": "\u2A96" }, - "⪕": { "codepoints": [10901], "characters": "\u2A95" }, - "⩵": { "codepoints": [10869], "characters": "\u2A75" }, - "=": { "codepoints": [61], "characters": "\u003D" }, - "≂": { "codepoints": [8770], "characters": "\u2242" }, - "≟": { "codepoints": [8799], "characters": "\u225F" }, - "⇌": { "codepoints": [8652], "characters": "\u21CC" }, - "≡": { "codepoints": [8801], "characters": "\u2261" }, - "⩸": { "codepoints": [10872], "characters": "\u2A78" }, - "⧥": { "codepoints": [10725], "characters": "\u29E5" }, - "⥱": { "codepoints": [10609], "characters": "\u2971" }, - "≓": { "codepoints": [8787], "characters": "\u2253" }, - "ℯ": { "codepoints": [8495], "characters": "\u212F" }, - "ℰ": { "codepoints": [8496], "characters": "\u2130" }, - "≐": { "codepoints": [8784], "characters": "\u2250" }, - "⩳": { "codepoints": [10867], "characters": "\u2A73" }, - "≂": { "codepoints": [8770], "characters": "\u2242" }, - "Η": { "codepoints": [919], "characters": "\u0397" }, - "η": { "codepoints": [951], "characters": "\u03B7" }, - "Ð": { "codepoints": [208], "characters": "\u00D0" }, - "Ð": { "codepoints": [208], "characters": "\u00D0" }, - "ð": { "codepoints": [240], "characters": "\u00F0" }, - "ð": { "codepoints": [240], "characters": "\u00F0" }, - "Ë": { "codepoints": [203], "characters": "\u00CB" }, - "Ë": { "codepoints": [203], "characters": "\u00CB" }, - "ë": { "codepoints": [235], "characters": "\u00EB" }, - "ë": { "codepoints": [235], "characters": "\u00EB" }, - "€": { "codepoints": [8364], "characters": "\u20AC" }, - "!": { "codepoints": [33], "characters": "\u0021" }, - "∃": { "codepoints": [8707], "characters": "\u2203" }, - "∃": { "codepoints": [8707], "characters": "\u2203" }, - "ℰ": { "codepoints": [8496], "characters": "\u2130" }, - "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, - "ⅇ": { "codepoints": [8519], "characters": "\u2147" }, - "≒": { "codepoints": [8786], "characters": "\u2252" }, - "Ф": { "codepoints": [1060], "characters": "\u0424" }, - "ф": { "codepoints": [1092], "characters": "\u0444" }, - "♀": { "codepoints": [9792], "characters": "\u2640" }, - "ffi": { "codepoints": [64259], "characters": "\uFB03" }, - "ff": { "codepoints": [64256], "characters": "\uFB00" }, - "ffl": { "codepoints": [64260], "characters": "\uFB04" }, - "𝔉": { "codepoints": [120073], "characters": "\uD835\uDD09" }, - "𝔣": { "codepoints": [120099], "characters": "\uD835\uDD23" }, - "fi": { "codepoints": [64257], "characters": "\uFB01" }, - "◼": { "codepoints": [9724], "characters": "\u25FC" }, - "▪": { "codepoints": [9642], "characters": "\u25AA" }, - "fj": { "codepoints": [102, 106], "characters": "\u0066\u006A" }, - "♭": { "codepoints": [9837], "characters": "\u266D" }, - "fl": { "codepoints": [64258], "characters": "\uFB02" }, - "▱": { "codepoints": [9649], "characters": "\u25B1" }, - "ƒ": { "codepoints": [402], "characters": "\u0192" }, - "𝔽": { "codepoints": [120125], "characters": "\uD835\uDD3D" }, - "𝕗": { "codepoints": [120151], "characters": "\uD835\uDD57" }, - "∀": { "codepoints": [8704], "characters": "\u2200" }, - "∀": { "codepoints": [8704], "characters": "\u2200" }, - "⋔": { "codepoints": [8916], "characters": "\u22D4" }, - "⫙": { "codepoints": [10969], "characters": "\u2AD9" }, - "ℱ": { "codepoints": [8497], "characters": "\u2131" }, - "⨍": { "codepoints": [10765], "characters": "\u2A0D" }, - "½": { "codepoints": [189], "characters": "\u00BD" }, - "½": { "codepoints": [189], "characters": "\u00BD" }, - "⅓": { "codepoints": [8531], "characters": "\u2153" }, - "¼": { "codepoints": [188], "characters": "\u00BC" }, - "¼": { "codepoints": [188], "characters": "\u00BC" }, - "⅕": { "codepoints": [8533], "characters": "\u2155" }, - "⅙": { "codepoints": [8537], "characters": "\u2159" }, - "⅛": { "codepoints": [8539], "characters": "\u215B" }, - "⅔": { "codepoints": [8532], "characters": "\u2154" }, - "⅖": { "codepoints": [8534], "characters": "\u2156" }, - "¾": { "codepoints": [190], "characters": "\u00BE" }, - "¾": { "codepoints": [190], "characters": "\u00BE" }, - "⅗": { "codepoints": [8535], "characters": "\u2157" }, - "⅜": { "codepoints": [8540], "characters": "\u215C" }, - "⅘": { "codepoints": [8536], "characters": "\u2158" }, - "⅚": { "codepoints": [8538], "characters": "\u215A" }, - "⅝": { "codepoints": [8541], "characters": "\u215D" }, - "⅞": { "codepoints": [8542], "characters": "\u215E" }, - "⁄": { "codepoints": [8260], "characters": "\u2044" }, - "⌢": { "codepoints": [8994], "characters": "\u2322" }, - "𝒻": { "codepoints": [119995], "characters": "\uD835\uDCBB" }, - "ℱ": { "codepoints": [8497], "characters": "\u2131" }, - "ǵ": { "codepoints": [501], "characters": "\u01F5" }, - "Γ": { "codepoints": [915], "characters": "\u0393" }, - "γ": { "codepoints": [947], "characters": "\u03B3" }, - "Ϝ": { "codepoints": [988], "characters": "\u03DC" }, - "ϝ": { "codepoints": [989], "characters": "\u03DD" }, - "⪆": { "codepoints": [10886], "characters": "\u2A86" }, - "Ğ": { "codepoints": [286], "characters": "\u011E" }, - "ğ": { "codepoints": [287], "characters": "\u011F" }, - "Ģ": { "codepoints": [290], "characters": "\u0122" }, - "Ĝ": { "codepoints": [284], "characters": "\u011C" }, - "ĝ": { "codepoints": [285], "characters": "\u011D" }, - "Г": { "codepoints": [1043], "characters": "\u0413" }, - "г": { "codepoints": [1075], "characters": "\u0433" }, - "Ġ": { "codepoints": [288], "characters": "\u0120" }, - "ġ": { "codepoints": [289], "characters": "\u0121" }, - "≥": { "codepoints": [8805], "characters": "\u2265" }, - "≧": { "codepoints": [8807], "characters": "\u2267" }, - "⪌": { "codepoints": [10892], "characters": "\u2A8C" }, - "⋛": { "codepoints": [8923], "characters": "\u22DB" }, - "≥": { "codepoints": [8805], "characters": "\u2265" }, - "≧": { "codepoints": [8807], "characters": "\u2267" }, - "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, - "⪩": { "codepoints": [10921], "characters": "\u2AA9" }, - "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, - "⪀": { "codepoints": [10880], "characters": "\u2A80" }, - "⪂": { "codepoints": [10882], "characters": "\u2A82" }, - "⪄": { "codepoints": [10884], "characters": "\u2A84" }, - "⋛︀": { "codepoints": [8923, 65024], "characters": "\u22DB\uFE00" }, - "⪔": { "codepoints": [10900], "characters": "\u2A94" }, - "𝔊": { "codepoints": [120074], "characters": "\uD835\uDD0A" }, - "𝔤": { "codepoints": [120100], "characters": "\uD835\uDD24" }, - "≫": { "codepoints": [8811], "characters": "\u226B" }, - "⋙": { "codepoints": [8921], "characters": "\u22D9" }, - "⋙": { "codepoints": [8921], "characters": "\u22D9" }, - "ℷ": { "codepoints": [8503], "characters": "\u2137" }, - "Ѓ": { "codepoints": [1027], "characters": "\u0403" }, - "ѓ": { "codepoints": [1107], "characters": "\u0453" }, - "⪥": { "codepoints": [10917], "characters": "\u2AA5" }, - "≷": { "codepoints": [8823], "characters": "\u2277" }, - "⪒": { "codepoints": [10898], "characters": "\u2A92" }, - "⪤": { "codepoints": [10916], "characters": "\u2AA4" }, - "⪊": { "codepoints": [10890], "characters": "\u2A8A" }, - "⪊": { "codepoints": [10890], "characters": "\u2A8A" }, - "⪈": { "codepoints": [10888], "characters": "\u2A88" }, - "≩": { "codepoints": [8809], "characters": "\u2269" }, - "⪈": { "codepoints": [10888], "characters": "\u2A88" }, - "≩": { "codepoints": [8809], "characters": "\u2269" }, - "⋧": { "codepoints": [8935], "characters": "\u22E7" }, - "𝔾": { "codepoints": [120126], "characters": "\uD835\uDD3E" }, - "𝕘": { "codepoints": [120152], "characters": "\uD835\uDD58" }, - "`": { "codepoints": [96], "characters": "\u0060" }, - "≥": { "codepoints": [8805], "characters": "\u2265" }, - "⋛": { "codepoints": [8923], "characters": "\u22DB" }, - "≧": { "codepoints": [8807], "characters": "\u2267" }, - "⪢": { "codepoints": [10914], "characters": "\u2AA2" }, - "≷": { "codepoints": [8823], "characters": "\u2277" }, - "⩾": { "codepoints": [10878], "characters": "\u2A7E" }, - "≳": { "codepoints": [8819], "characters": "\u2273" }, - "𝒢": { "codepoints": [119970], "characters": "\uD835\uDCA2" }, - "ℊ": { "codepoints": [8458], "characters": "\u210A" }, - "≳": { "codepoints": [8819], "characters": "\u2273" }, - "⪎": { "codepoints": [10894], "characters": "\u2A8E" }, - "⪐": { "codepoints": [10896], "characters": "\u2A90" }, - "⪧": { "codepoints": [10919], "characters": "\u2AA7" }, - "⩺": { "codepoints": [10874], "characters": "\u2A7A" }, - ">": { "codepoints": [62], "characters": "\u003E" }, - ">": { "codepoints": [62], "characters": "\u003E" }, - ">": { "codepoints": [62], "characters": "\u003E" }, - ">": { "codepoints": [62], "characters": "\u003E" }, - "≫": { "codepoints": [8811], "characters": "\u226B" }, - "⋗": { "codepoints": [8919], "characters": "\u22D7" }, - "⦕": { "codepoints": [10645], "characters": "\u2995" }, - "⩼": { "codepoints": [10876], "characters": "\u2A7C" }, - "⪆": { "codepoints": [10886], "characters": "\u2A86" }, - "⥸": { "codepoints": [10616], "characters": "\u2978" }, - "⋗": { "codepoints": [8919], "characters": "\u22D7" }, - "⋛": { "codepoints": [8923], "characters": "\u22DB" }, - "⪌": { "codepoints": [10892], "characters": "\u2A8C" }, - "≷": { "codepoints": [8823], "characters": "\u2277" }, - "≳": { "codepoints": [8819], "characters": "\u2273" }, - "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" }, - "≩︀": { "codepoints": [8809, 65024], "characters": "\u2269\uFE00" }, - "ˇ": { "codepoints": [711], "characters": "\u02C7" }, - " ": { "codepoints": [8202], "characters": "\u200A" }, - "½": { "codepoints": [189], "characters": "\u00BD" }, - "ℋ": { "codepoints": [8459], "characters": "\u210B" }, - "Ъ": { "codepoints": [1066], "characters": "\u042A" }, - "ъ": { "codepoints": [1098], "characters": "\u044A" }, - "⥈": { "codepoints": [10568], "characters": "\u2948" }, - "↔": { "codepoints": [8596], "characters": "\u2194" }, - "⇔": { "codepoints": [8660], "characters": "\u21D4" }, - "↭": { "codepoints": [8621], "characters": "\u21AD" }, - "^": { "codepoints": [94], "characters": "\u005E" }, - "ℏ": { "codepoints": [8463], "characters": "\u210F" }, - "Ĥ": { "codepoints": [292], "characters": "\u0124" }, - "ĥ": { "codepoints": [293], "characters": "\u0125" }, - "♥": { "codepoints": [9829], "characters": "\u2665" }, - "♥": { "codepoints": [9829], "characters": "\u2665" }, - "…": { "codepoints": [8230], "characters": "\u2026" }, - "⊹": { "codepoints": [8889], "characters": "\u22B9" }, - "𝔥": { "codepoints": [120101], "characters": "\uD835\uDD25" }, - "ℌ": { "codepoints": [8460], "characters": "\u210C" }, - "ℋ": { "codepoints": [8459], "characters": "\u210B" }, - "⤥": { "codepoints": [10533], "characters": "\u2925" }, - "⤦": { "codepoints": [10534], "characters": "\u2926" }, - "⇿": { "codepoints": [8703], "characters": "\u21FF" }, - "∻": { "codepoints": [8763], "characters": "\u223B" }, - "↩": { "codepoints": [8617], "characters": "\u21A9" }, - "↪": { "codepoints": [8618], "characters": "\u21AA" }, - "𝕙": { "codepoints": [120153], "characters": "\uD835\uDD59" }, - "ℍ": { "codepoints": [8461], "characters": "\u210D" }, - "―": { "codepoints": [8213], "characters": "\u2015" }, - "─": { "codepoints": [9472], "characters": "\u2500" }, - "𝒽": { "codepoints": [119997], "characters": "\uD835\uDCBD" }, - "ℋ": { "codepoints": [8459], "characters": "\u210B" }, - "ℏ": { "codepoints": [8463], "characters": "\u210F" }, - "Ħ": { "codepoints": [294], "characters": "\u0126" }, - "ħ": { "codepoints": [295], "characters": "\u0127" }, - "≎": { "codepoints": [8782], "characters": "\u224E" }, - "≏": { "codepoints": [8783], "characters": "\u224F" }, - "⁃": { "codepoints": [8259], "characters": "\u2043" }, - "‐": { "codepoints": [8208], "characters": "\u2010" }, - "Í": { "codepoints": [205], "characters": "\u00CD" }, - "Í": { "codepoints": [205], "characters": "\u00CD" }, - "í": { "codepoints": [237], "characters": "\u00ED" }, - "í": { "codepoints": [237], "characters": "\u00ED" }, - "⁣": { "codepoints": [8291], "characters": "\u2063" }, - "Î": { "codepoints": [206], "characters": "\u00CE" }, - "Î": { "codepoints": [206], "characters": "\u00CE" }, - "î": { "codepoints": [238], "characters": "\u00EE" }, - "î": { "codepoints": [238], "characters": "\u00EE" }, - "И": { "codepoints": [1048], "characters": "\u0418" }, - "и": { "codepoints": [1080], "characters": "\u0438" }, - "İ": { "codepoints": [304], "characters": "\u0130" }, - "Е": { "codepoints": [1045], "characters": "\u0415" }, - "е": { "codepoints": [1077], "characters": "\u0435" }, - "¡": { "codepoints": [161], "characters": "\u00A1" }, - "¡": { "codepoints": [161], "characters": "\u00A1" }, - "⇔": { "codepoints": [8660], "characters": "\u21D4" }, - "𝔦": { "codepoints": [120102], "characters": "\uD835\uDD26" }, - "ℑ": { "codepoints": [8465], "characters": "\u2111" }, - "Ì": { "codepoints": [204], "characters": "\u00CC" }, - "Ì": { "codepoints": [204], "characters": "\u00CC" }, - "ì": { "codepoints": [236], "characters": "\u00EC" }, - "ì": { "codepoints": [236], "characters": "\u00EC" }, - "ⅈ": { "codepoints": [8520], "characters": "\u2148" }, - "⨌": { "codepoints": [10764], "characters": "\u2A0C" }, - "∭": { "codepoints": [8749], "characters": "\u222D" }, - "⧜": { "codepoints": [10716], "characters": "\u29DC" }, - "℩": { "codepoints": [8489], "characters": "\u2129" }, - "IJ": { "codepoints": [306], "characters": "\u0132" }, - "ij": { "codepoints": [307], "characters": "\u0133" }, - "Ī": { "codepoints": [298], "characters": "\u012A" }, - "ī": { "codepoints": [299], "characters": "\u012B" }, - "ℑ": { "codepoints": [8465], "characters": "\u2111" }, - "ⅈ": { "codepoints": [8520], "characters": "\u2148" }, - "ℐ": { "codepoints": [8464], "characters": "\u2110" }, - "ℑ": { "codepoints": [8465], "characters": "\u2111" }, - "ı": { "codepoints": [305], "characters": "\u0131" }, - "ℑ": { "codepoints": [8465], "characters": "\u2111" }, - "⊷": { "codepoints": [8887], "characters": "\u22B7" }, - "Ƶ": { "codepoints": [437], "characters": "\u01B5" }, - "⇒": { "codepoints": [8658], "characters": "\u21D2" }, - "℅": { "codepoints": [8453], "characters": "\u2105" }, - "∈": { "codepoints": [8712], "characters": "\u2208" }, - "∞": { "codepoints": [8734], "characters": "\u221E" }, - "⧝": { "codepoints": [10717], "characters": "\u29DD" }, - "ı": { "codepoints": [305], "characters": "\u0131" }, - "⊺": { "codepoints": [8890], "characters": "\u22BA" }, - "∫": { "codepoints": [8747], "characters": "\u222B" }, - "∬": { "codepoints": [8748], "characters": "\u222C" }, - "ℤ": { "codepoints": [8484], "characters": "\u2124" }, - "∫": { "codepoints": [8747], "characters": "\u222B" }, - "⊺": { "codepoints": [8890], "characters": "\u22BA" }, - "⋂": { "codepoints": [8898], "characters": "\u22C2" }, - "⨗": { "codepoints": [10775], "characters": "\u2A17" }, - "⨼": { "codepoints": [10812], "characters": "\u2A3C" }, - "⁣": { "codepoints": [8291], "characters": "\u2063" }, - "⁢": { "codepoints": [8290], "characters": "\u2062" }, - "Ё": { "codepoints": [1025], "characters": "\u0401" }, - "ё": { "codepoints": [1105], "characters": "\u0451" }, - "Į": { "codepoints": [302], "characters": "\u012E" }, - "į": { "codepoints": [303], "characters": "\u012F" }, - "𝕀": { "codepoints": [120128], "characters": "\uD835\uDD40" }, - "𝕚": { "codepoints": [120154], "characters": "\uD835\uDD5A" }, - "Ι": { "codepoints": [921], "characters": "\u0399" }, - "ι": { "codepoints": [953], "characters": "\u03B9" }, - "⨼": { "codepoints": [10812], "characters": "\u2A3C" }, - "¿": { "codepoints": [191], "characters": "\u00BF" }, - "¿": { "codepoints": [191], "characters": "\u00BF" }, - "𝒾": { "codepoints": [119998], "characters": "\uD835\uDCBE" }, - "ℐ": { "codepoints": [8464], "characters": "\u2110" }, - "∈": { "codepoints": [8712], "characters": "\u2208" }, - "⋵": { "codepoints": [8949], "characters": "\u22F5" }, - "⋹": { "codepoints": [8953], "characters": "\u22F9" }, - "⋴": { "codepoints": [8948], "characters": "\u22F4" }, - "⋳": { "codepoints": [8947], "characters": "\u22F3" }, - "∈": { "codepoints": [8712], "characters": "\u2208" }, - "⁢": { "codepoints": [8290], "characters": "\u2062" }, - "Ĩ": { "codepoints": [296], "characters": "\u0128" }, - "ĩ": { "codepoints": [297], "characters": "\u0129" }, - "І": { "codepoints": [1030], "characters": "\u0406" }, - "і": { "codepoints": [1110], "characters": "\u0456" }, - "Ï": { "codepoints": [207], "characters": "\u00CF" }, - "Ï": { "codepoints": [207], "characters": "\u00CF" }, - "ï": { "codepoints": [239], "characters": "\u00EF" }, - "ï": { "codepoints": [239], "characters": "\u00EF" }, - "Ĵ": { "codepoints": [308], "characters": "\u0134" }, - "ĵ": { "codepoints": [309], "characters": "\u0135" }, - "Й": { "codepoints": [1049], "characters": "\u0419" }, - "й": { "codepoints": [1081], "characters": "\u0439" }, - "𝔍": { "codepoints": [120077], "characters": "\uD835\uDD0D" }, - "𝔧": { "codepoints": [120103], "characters": "\uD835\uDD27" }, - "ȷ": { "codepoints": [567], "characters": "\u0237" }, - "𝕁": { "codepoints": [120129], "characters": "\uD835\uDD41" }, - "𝕛": { "codepoints": [120155], "characters": "\uD835\uDD5B" }, - "𝒥": { "codepoints": [119973], "characters": "\uD835\uDCA5" }, - "𝒿": { "codepoints": [119999], "characters": "\uD835\uDCBF" }, - "Ј": { "codepoints": [1032], "characters": "\u0408" }, - "ј": { "codepoints": [1112], "characters": "\u0458" }, - "Є": { "codepoints": [1028], "characters": "\u0404" }, - "є": { "codepoints": [1108], "characters": "\u0454" }, - "Κ": { "codepoints": [922], "characters": "\u039A" }, - "κ": { "codepoints": [954], "characters": "\u03BA" }, - "ϰ": { "codepoints": [1008], "characters": "\u03F0" }, - "Ķ": { "codepoints": [310], "characters": "\u0136" }, - "ķ": { "codepoints": [311], "characters": "\u0137" }, - "К": { "codepoints": [1050], "characters": "\u041A" }, - "к": { "codepoints": [1082], "characters": "\u043A" }, - "𝔎": { "codepoints": [120078], "characters": "\uD835\uDD0E" }, - "𝔨": { "codepoints": [120104], "characters": "\uD835\uDD28" }, - "ĸ": { "codepoints": [312], "characters": "\u0138" }, - "Х": { "codepoints": [1061], "characters": "\u0425" }, - "х": { "codepoints": [1093], "characters": "\u0445" }, - "Ќ": { "codepoints": [1036], "characters": "\u040C" }, - "ќ": { "codepoints": [1116], "characters": "\u045C" }, - "𝕂": { "codepoints": [120130], "characters": "\uD835\uDD42" }, - "𝕜": { "codepoints": [120156], "characters": "\uD835\uDD5C" }, - "𝒦": { "codepoints": [119974], "characters": "\uD835\uDCA6" }, - "𝓀": { "codepoints": [120000], "characters": "\uD835\uDCC0" }, - "⇚": { "codepoints": [8666], "characters": "\u21DA" }, - "Ĺ": { "codepoints": [313], "characters": "\u0139" }, - "ĺ": { "codepoints": [314], "characters": "\u013A" }, - "⦴": { "codepoints": [10676], "characters": "\u29B4" }, - "ℒ": { "codepoints": [8466], "characters": "\u2112" }, - "Λ": { "codepoints": [923], "characters": "\u039B" }, - "λ": { "codepoints": [955], "characters": "\u03BB" }, - "⟨": { "codepoints": [10216], "characters": "\u27E8" }, - "⟪": { "codepoints": [10218], "characters": "\u27EA" }, - "⦑": { "codepoints": [10641], "characters": "\u2991" }, - "⟨": { "codepoints": [10216], "characters": "\u27E8" }, - "⪅": { "codepoints": [10885], "characters": "\u2A85" }, - "ℒ": { "codepoints": [8466], "characters": "\u2112" }, - "«": { "codepoints": [171], "characters": "\u00AB" }, - "«": { "codepoints": [171], "characters": "\u00AB" }, - "⇤": { "codepoints": [8676], "characters": "\u21E4" }, - "⤟": { "codepoints": [10527], "characters": "\u291F" }, - "←": { "codepoints": [8592], "characters": "\u2190" }, - "↞": { "codepoints": [8606], "characters": "\u219E" }, - "⇐": { "codepoints": [8656], "characters": "\u21D0" }, - "⤝": { "codepoints": [10525], "characters": "\u291D" }, - "↩": { "codepoints": [8617], "characters": "\u21A9" }, - "↫": { "codepoints": [8619], "characters": "\u21AB" }, - "⤹": { "codepoints": [10553], "characters": "\u2939" }, - "⥳": { "codepoints": [10611], "characters": "\u2973" }, - "↢": { "codepoints": [8610], "characters": "\u21A2" }, - "⤙": { "codepoints": [10521], "characters": "\u2919" }, - "⤛": { "codepoints": [10523], "characters": "\u291B" }, - "⪫": { "codepoints": [10923], "characters": "\u2AAB" }, - "⪭": { "codepoints": [10925], "characters": "\u2AAD" }, - "⪭︀": { "codepoints": [10925, 65024], "characters": "\u2AAD\uFE00" }, - "⤌": { "codepoints": [10508], "characters": "\u290C" }, - "⤎": { "codepoints": [10510], "characters": "\u290E" }, - "❲": { "codepoints": [10098], "characters": "\u2772" }, - "{": { "codepoints": [123], "characters": "\u007B" }, - "[": { "codepoints": [91], "characters": "\u005B" }, - "⦋": { "codepoints": [10635], "characters": "\u298B" }, - "⦏": { "codepoints": [10639], "characters": "\u298F" }, - "⦍": { "codepoints": [10637], "characters": "\u298D" }, - "Ľ": { "codepoints": [317], "characters": "\u013D" }, - "ľ": { "codepoints": [318], "characters": "\u013E" }, - "Ļ": { "codepoints": [315], "characters": "\u013B" }, - "ļ": { "codepoints": [316], "characters": "\u013C" }, - "⌈": { "codepoints": [8968], "characters": "\u2308" }, - "{": { "codepoints": [123], "characters": "\u007B" }, - "Л": { "codepoints": [1051], "characters": "\u041B" }, - "л": { "codepoints": [1083], "characters": "\u043B" }, - "⤶": { "codepoints": [10550], "characters": "\u2936" }, - "“": { "codepoints": [8220], "characters": "\u201C" }, - "„": { "codepoints": [8222], "characters": "\u201E" }, - "⥧": { "codepoints": [10599], "characters": "\u2967" }, - "⥋": { "codepoints": [10571], "characters": "\u294B" }, - "↲": { "codepoints": [8626], "characters": "\u21B2" }, - "≤": { "codepoints": [8804], "characters": "\u2264" }, - "≦": { "codepoints": [8806], "characters": "\u2266" }, - "⟨": { "codepoints": [10216], "characters": "\u27E8" }, - "⇤": { "codepoints": [8676], "characters": "\u21E4" }, - "←": { "codepoints": [8592], "characters": "\u2190" }, - "←": { "codepoints": [8592], "characters": "\u2190" }, - "⇐": { "codepoints": [8656], "characters": "\u21D0" }, - "⇆": { "codepoints": [8646], "characters": "\u21C6" }, - "↢": { "codepoints": [8610], "characters": "\u21A2" }, - "⌈": { "codepoints": [8968], "characters": "\u2308" }, - "⟦": { "codepoints": [10214], "characters": "\u27E6" }, - "⥡": { "codepoints": [10593], "characters": "\u2961" }, - "⥙": { "codepoints": [10585], "characters": "\u2959" }, - "⇃": { "codepoints": [8643], "characters": "\u21C3" }, - "⌊": { "codepoints": [8970], "characters": "\u230A" }, - "↽": { "codepoints": [8637], "characters": "\u21BD" }, - "↼": { "codepoints": [8636], "characters": "\u21BC" }, - "⇇": { "codepoints": [8647], "characters": "\u21C7" }, - "↔": { "codepoints": [8596], "characters": "\u2194" }, - "↔": { "codepoints": [8596], "characters": "\u2194" }, - "⇔": { "codepoints": [8660], "characters": "\u21D4" }, - "⇆": { "codepoints": [8646], "characters": "\u21C6" }, - "⇋": { "codepoints": [8651], "characters": "\u21CB" }, - "↭": { "codepoints": [8621], "characters": "\u21AD" }, - "⥎": { "codepoints": [10574], "characters": "\u294E" }, - "↤": { "codepoints": [8612], "characters": "\u21A4" }, - "⊣": { "codepoints": [8867], "characters": "\u22A3" }, - "⥚": { "codepoints": [10586], "characters": "\u295A" }, - "⋋": { "codepoints": [8907], "characters": "\u22CB" }, - "⧏": { "codepoints": [10703], "characters": "\u29CF" }, - "⊲": { "codepoints": [8882], "characters": "\u22B2" }, - "⊴": { "codepoints": [8884], "characters": "\u22B4" }, - "⥑": { "codepoints": [10577], "characters": "\u2951" }, - "⥠": { "codepoints": [10592], "characters": "\u2960" }, - "⥘": { "codepoints": [10584], "characters": "\u2958" }, - "↿": { "codepoints": [8639], "characters": "\u21BF" }, - "⥒": { "codepoints": [10578], "characters": "\u2952" }, - "↼": { "codepoints": [8636], "characters": "\u21BC" }, - "⪋": { "codepoints": [10891], "characters": "\u2A8B" }, - "⋚": { "codepoints": [8922], "characters": "\u22DA" }, - "≤": { "codepoints": [8804], "characters": "\u2264" }, - "≦": { "codepoints": [8806], "characters": "\u2266" }, - "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, - "⪨": { "codepoints": [10920], "characters": "\u2AA8" }, - "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, - "⩿": { "codepoints": [10879], "characters": "\u2A7F" }, - "⪁": { "codepoints": [10881], "characters": "\u2A81" }, - "⪃": { "codepoints": [10883], "characters": "\u2A83" }, - "⋚︀": { "codepoints": [8922, 65024], "characters": "\u22DA\uFE00" }, - "⪓": { "codepoints": [10899], "characters": "\u2A93" }, - "⪅": { "codepoints": [10885], "characters": "\u2A85" }, - "⋖": { "codepoints": [8918], "characters": "\u22D6" }, - "⋚": { "codepoints": [8922], "characters": "\u22DA" }, - "⪋": { "codepoints": [10891], "characters": "\u2A8B" }, - "⋚": { "codepoints": [8922], "characters": "\u22DA" }, - "≦": { "codepoints": [8806], "characters": "\u2266" }, - "≶": { "codepoints": [8822], "characters": "\u2276" }, - "≶": { "codepoints": [8822], "characters": "\u2276" }, - "⪡": { "codepoints": [10913], "characters": "\u2AA1" }, - "≲": { "codepoints": [8818], "characters": "\u2272" }, - "⩽": { "codepoints": [10877], "characters": "\u2A7D" }, - "≲": { "codepoints": [8818], "characters": "\u2272" }, - "⥼": { "codepoints": [10620], "characters": "\u297C" }, - "⌊": { "codepoints": [8970], "characters": "\u230A" }, - "𝔏": { "codepoints": [120079], "characters": "\uD835\uDD0F" }, - "𝔩": { "codepoints": [120105], "characters": "\uD835\uDD29" }, - "≶": { "codepoints": [8822], "characters": "\u2276" }, - "⪑": { "codepoints": [10897], "characters": "\u2A91" }, - "⥢": { "codepoints": [10594], "characters": "\u2962" }, - "↽": { "codepoints": [8637], "characters": "\u21BD" }, - "↼": { "codepoints": [8636], "characters": "\u21BC" }, - "⥪": { "codepoints": [10602], "characters": "\u296A" }, - "▄": { "codepoints": [9604], "characters": "\u2584" }, - "Љ": { "codepoints": [1033], "characters": "\u0409" }, - "љ": { "codepoints": [1113], "characters": "\u0459" }, - "⇇": { "codepoints": [8647], "characters": "\u21C7" }, - "≪": { "codepoints": [8810], "characters": "\u226A" }, - "⋘": { "codepoints": [8920], "characters": "\u22D8" }, - "⌞": { "codepoints": [8990], "characters": "\u231E" }, - "⇚": { "codepoints": [8666], "characters": "\u21DA" }, - "⥫": { "codepoints": [10603], "characters": "\u296B" }, - "◺": { "codepoints": [9722], "characters": "\u25FA" }, - "Ŀ": { "codepoints": [319], "characters": "\u013F" }, - "ŀ": { "codepoints": [320], "characters": "\u0140" }, - "⎰": { "codepoints": [9136], "characters": "\u23B0" }, - "⎰": { "codepoints": [9136], "characters": "\u23B0" }, - "⪉": { "codepoints": [10889], "characters": "\u2A89" }, - "⪉": { "codepoints": [10889], "characters": "\u2A89" }, - "⪇": { "codepoints": [10887], "characters": "\u2A87" }, - "≨": { "codepoints": [8808], "characters": "\u2268" }, - "⪇": { "codepoints": [10887], "characters": "\u2A87" }, - "≨": { "codepoints": [8808], "characters": "\u2268" }, - "⋦": { "codepoints": [8934], "characters": "\u22E6" }, - "⟬": { "codepoints": [10220], "characters": "\u27EC" }, - "⇽": { "codepoints": [8701], "characters": "\u21FD" }, - "⟦": { "codepoints": [10214], "characters": "\u27E6" }, - "⟵": { "codepoints": [10229], "characters": "\u27F5" }, - "⟵": { "codepoints": [10229], "characters": "\u27F5" }, - "⟸": { "codepoints": [10232], "characters": "\u27F8" }, - "⟷": { "codepoints": [10231], "characters": "\u27F7" }, - "⟷": { "codepoints": [10231], "characters": "\u27F7" }, - "⟺": { "codepoints": [10234], "characters": "\u27FA" }, - "⟼": { "codepoints": [10236], "characters": "\u27FC" }, - "⟶": { "codepoints": [10230], "characters": "\u27F6" }, - "⟶": { "codepoints": [10230], "characters": "\u27F6" }, - "⟹": { "codepoints": [10233], "characters": "\u27F9" }, - "↫": { "codepoints": [8619], "characters": "\u21AB" }, - "↬": { "codepoints": [8620], "characters": "\u21AC" }, - "⦅": { "codepoints": [10629], "characters": "\u2985" }, - "𝕃": { "codepoints": [120131], "characters": "\uD835\uDD43" }, - "𝕝": { "codepoints": [120157], "characters": "\uD835\uDD5D" }, - "⨭": { "codepoints": [10797], "characters": "\u2A2D" }, - "⨴": { "codepoints": [10804], "characters": "\u2A34" }, - "∗": { "codepoints": [8727], "characters": "\u2217" }, - "_": { "codepoints": [95], "characters": "\u005F" }, - "↙": { "codepoints": [8601], "characters": "\u2199" }, - "↘": { "codepoints": [8600], "characters": "\u2198" }, - "◊": { "codepoints": [9674], "characters": "\u25CA" }, - "◊": { "codepoints": [9674], "characters": "\u25CA" }, - "⧫": { "codepoints": [10731], "characters": "\u29EB" }, - "(": { "codepoints": [40], "characters": "\u0028" }, - "⦓": { "codepoints": [10643], "characters": "\u2993" }, - "⇆": { "codepoints": [8646], "characters": "\u21C6" }, - "⌟": { "codepoints": [8991], "characters": "\u231F" }, - "⇋": { "codepoints": [8651], "characters": "\u21CB" }, - "⥭": { "codepoints": [10605], "characters": "\u296D" }, - "‎": { "codepoints": [8206], "characters": "\u200E" }, - "⊿": { "codepoints": [8895], "characters": "\u22BF" }, - "‹": { "codepoints": [8249], "characters": "\u2039" }, - "𝓁": { "codepoints": [120001], "characters": "\uD835\uDCC1" }, - "ℒ": { "codepoints": [8466], "characters": "\u2112" }, - "↰": { "codepoints": [8624], "characters": "\u21B0" }, - "↰": { "codepoints": [8624], "characters": "\u21B0" }, - "≲": { "codepoints": [8818], "characters": "\u2272" }, - "⪍": { "codepoints": [10893], "characters": "\u2A8D" }, - "⪏": { "codepoints": [10895], "characters": "\u2A8F" }, - "[": { "codepoints": [91], "characters": "\u005B" }, - "‘": { "codepoints": [8216], "characters": "\u2018" }, - "‚": { "codepoints": [8218], "characters": "\u201A" }, - "Ł": { "codepoints": [321], "characters": "\u0141" }, - "ł": { "codepoints": [322], "characters": "\u0142" }, - "⪦": { "codepoints": [10918], "characters": "\u2AA6" }, - "⩹": { "codepoints": [10873], "characters": "\u2A79" }, - "<": { "codepoints": [60], "characters": "\u003C" }, - "<": { "codepoints": [60], "characters": "\u003C" }, - "<": { "codepoints": [60], "characters": "\u003C" }, - "<": { "codepoints": [60], "characters": "\u003C" }, - "≪": { "codepoints": [8810], "characters": "\u226A" }, - "⋖": { "codepoints": [8918], "characters": "\u22D6" }, - "⋋": { "codepoints": [8907], "characters": "\u22CB" }, - "⋉": { "codepoints": [8905], "characters": "\u22C9" }, - "⥶": { "codepoints": [10614], "characters": "\u2976" }, - "⩻": { "codepoints": [10875], "characters": "\u2A7B" }, - "◃": { "codepoints": [9667], "characters": "\u25C3" }, - "⊴": { "codepoints": [8884], "characters": "\u22B4" }, - "◂": { "codepoints": [9666], "characters": "\u25C2" }, - "⦖": { "codepoints": [10646], "characters": "\u2996" }, - "⥊": { "codepoints": [10570], "characters": "\u294A" }, - "⥦": { "codepoints": [10598], "characters": "\u2966" }, - "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" }, - "≨︀": { "codepoints": [8808, 65024], "characters": "\u2268\uFE00" }, - "¯": { "codepoints": [175], "characters": "\u00AF" }, - "¯": { "codepoints": [175], "characters": "\u00AF" }, - "♂": { "codepoints": [9794], "characters": "\u2642" }, - "✠": { "codepoints": [10016], "characters": "\u2720" }, - "✠": { "codepoints": [10016], "characters": "\u2720" }, - "⤅": { "codepoints": [10501], "characters": "\u2905" }, - "↦": { "codepoints": [8614], "characters": "\u21A6" }, - "↦": { "codepoints": [8614], "characters": "\u21A6" }, - "↧": { "codepoints": [8615], "characters": "\u21A7" }, - "↤": { "codepoints": [8612], "characters": "\u21A4" }, - "↥": { "codepoints": [8613], "characters": "\u21A5" }, - "▮": { "codepoints": [9646], "characters": "\u25AE" }, - "⨩": { "codepoints": [10793], "characters": "\u2A29" }, - "М": { "codepoints": [1052], "characters": "\u041C" }, - "м": { "codepoints": [1084], "characters": "\u043C" }, - "—": { "codepoints": [8212], "characters": "\u2014" }, - "∺": { "codepoints": [8762], "characters": "\u223A" }, - "∡": { "codepoints": [8737], "characters": "\u2221" }, - " ": { "codepoints": [8287], "characters": "\u205F" }, - "ℳ": { "codepoints": [8499], "characters": "\u2133" }, - "𝔐": { "codepoints": [120080], "characters": "\uD835\uDD10" }, - "𝔪": { "codepoints": [120106], "characters": "\uD835\uDD2A" }, - "℧": { "codepoints": [8487], "characters": "\u2127" }, - "µ": { "codepoints": [181], "characters": "\u00B5" }, - "µ": { "codepoints": [181], "characters": "\u00B5" }, - "*": { "codepoints": [42], "characters": "\u002A" }, - "⫰": { "codepoints": [10992], "characters": "\u2AF0" }, - "∣": { "codepoints": [8739], "characters": "\u2223" }, - "·": { "codepoints": [183], "characters": "\u00B7" }, - "·": { "codepoints": [183], "characters": "\u00B7" }, - "⊟": { "codepoints": [8863], "characters": "\u229F" }, - "−": { "codepoints": [8722], "characters": "\u2212" }, - "∸": { "codepoints": [8760], "characters": "\u2238" }, - "⨪": { "codepoints": [10794], "characters": "\u2A2A" }, - "∓": { "codepoints": [8723], "characters": "\u2213" }, - "⫛": { "codepoints": [10971], "characters": "\u2ADB" }, - "…": { "codepoints": [8230], "characters": "\u2026" }, - "∓": { "codepoints": [8723], "characters": "\u2213" }, - "⊧": { "codepoints": [8871], "characters": "\u22A7" }, - "𝕄": { "codepoints": [120132], "characters": "\uD835\uDD44" }, - "𝕞": { "codepoints": [120158], "characters": "\uD835\uDD5E" }, - "∓": { "codepoints": [8723], "characters": "\u2213" }, - "𝓂": { "codepoints": [120002], "characters": "\uD835\uDCC2" }, - "ℳ": { "codepoints": [8499], "characters": "\u2133" }, - "∾": { "codepoints": [8766], "characters": "\u223E" }, - "Μ": { "codepoints": [924], "characters": "\u039C" }, - "μ": { "codepoints": [956], "characters": "\u03BC" }, - "⊸": { "codepoints": [8888], "characters": "\u22B8" }, - "⊸": { "codepoints": [8888], "characters": "\u22B8" }, - "∇": { "codepoints": [8711], "characters": "\u2207" }, - "Ń": { "codepoints": [323], "characters": "\u0143" }, - "ń": { "codepoints": [324], "characters": "\u0144" }, - "∠⃒": { "codepoints": [8736, 8402], "characters": "\u2220\u20D2" }, - "≉": { "codepoints": [8777], "characters": "\u2249" }, - "⩰̸": { "codepoints": [10864, 824], "characters": "\u2A70\u0338" }, - "≋̸": { "codepoints": [8779, 824], "characters": "\u224B\u0338" }, - "ʼn": { "codepoints": [329], "characters": "\u0149" }, - "≉": { "codepoints": [8777], "characters": "\u2249" }, - "♮": { "codepoints": [9838], "characters": "\u266E" }, - "ℕ": { "codepoints": [8469], "characters": "\u2115" }, - "♮": { "codepoints": [9838], "characters": "\u266E" }, - " ": { "codepoints": [160], "characters": "\u00A0" }, - " ": { "codepoints": [160], "characters": "\u00A0" }, - "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" }, - "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" }, - "⩃": { "codepoints": [10819], "characters": "\u2A43" }, - "Ň": { "codepoints": [327], "characters": "\u0147" }, - "ň": { "codepoints": [328], "characters": "\u0148" }, - "Ņ": { "codepoints": [325], "characters": "\u0145" }, - "ņ": { "codepoints": [326], "characters": "\u0146" }, - "≇": { "codepoints": [8775], "characters": "\u2247" }, - "⩭̸": { "codepoints": [10861, 824], "characters": "\u2A6D\u0338" }, - "⩂": { "codepoints": [10818], "characters": "\u2A42" }, - "Н": { "codepoints": [1053], "characters": "\u041D" }, - "н": { "codepoints": [1085], "characters": "\u043D" }, - "–": { "codepoints": [8211], "characters": "\u2013" }, - "⤤": { "codepoints": [10532], "characters": "\u2924" }, - "↗": { "codepoints": [8599], "characters": "\u2197" }, - "⇗": { "codepoints": [8663], "characters": "\u21D7" }, - "↗": { "codepoints": [8599], "characters": "\u2197" }, - "≠": { "codepoints": [8800], "characters": "\u2260" }, - "≐̸": { "codepoints": [8784, 824], "characters": "\u2250\u0338" }, - "​": { "codepoints": [8203], "characters": "\u200B" }, - "​": { "codepoints": [8203], "characters": "\u200B" }, - "​": { "codepoints": [8203], "characters": "\u200B" }, - "​": { "codepoints": [8203], "characters": "\u200B" }, - "≢": { "codepoints": [8802], "characters": "\u2262" }, - "⤨": { "codepoints": [10536], "characters": "\u2928" }, - "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" }, - "≫": { "codepoints": [8811], "characters": "\u226B" }, - "≪": { "codepoints": [8810], "characters": "\u226A" }, - " ": { "codepoints": [10], "characters": "\u000A" }, - "∄": { "codepoints": [8708], "characters": "\u2204" }, - "∄": { "codepoints": [8708], "characters": "\u2204" }, - "𝔑": { "codepoints": [120081], "characters": "\uD835\uDD11" }, - "𝔫": { "codepoints": [120107], "characters": "\uD835\uDD2B" }, - "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, - "≱": { "codepoints": [8817], "characters": "\u2271" }, - "≱": { "codepoints": [8817], "characters": "\u2271" }, - "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, - "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, - "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, - "⋙̸": { "codepoints": [8921, 824], "characters": "\u22D9\u0338" }, - "≵": { "codepoints": [8821], "characters": "\u2275" }, - "≫⃒": { "codepoints": [8811, 8402], "characters": "\u226B\u20D2" }, - "≯": { "codepoints": [8815], "characters": "\u226F" }, - "≯": { "codepoints": [8815], "characters": "\u226F" }, - "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" }, - "↮": { "codepoints": [8622], "characters": "\u21AE" }, - "⇎": { "codepoints": [8654], "characters": "\u21CE" }, - "⫲": { "codepoints": [10994], "characters": "\u2AF2" }, - "∋": { "codepoints": [8715], "characters": "\u220B" }, - "⋼": { "codepoints": [8956], "characters": "\u22FC" }, - "⋺": { "codepoints": [8954], "characters": "\u22FA" }, - "∋": { "codepoints": [8715], "characters": "\u220B" }, - "Њ": { "codepoints": [1034], "characters": "\u040A" }, - "њ": { "codepoints": [1114], "characters": "\u045A" }, - "↚": { "codepoints": [8602], "characters": "\u219A" }, - "⇍": { "codepoints": [8653], "characters": "\u21CD" }, - "‥": { "codepoints": [8229], "characters": "\u2025" }, - "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" }, - "≰": { "codepoints": [8816], "characters": "\u2270" }, - "↚": { "codepoints": [8602], "characters": "\u219A" }, - "⇍": { "codepoints": [8653], "characters": "\u21CD" }, - "↮": { "codepoints": [8622], "characters": "\u21AE" }, - "⇎": { "codepoints": [8654], "characters": "\u21CE" }, - "≰": { "codepoints": [8816], "characters": "\u2270" }, - "≦̸": { "codepoints": [8806, 824], "characters": "\u2266\u0338" }, - "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, - "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, - "≮": { "codepoints": [8814], "characters": "\u226E" }, - "⋘̸": { "codepoints": [8920, 824], "characters": "\u22D8\u0338" }, - "≴": { "codepoints": [8820], "characters": "\u2274" }, - "≪⃒": { "codepoints": [8810, 8402], "characters": "\u226A\u20D2" }, - "≮": { "codepoints": [8814], "characters": "\u226E" }, - "⋪": { "codepoints": [8938], "characters": "\u22EA" }, - "⋬": { "codepoints": [8940], "characters": "\u22EC" }, - "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" }, - "∤": { "codepoints": [8740], "characters": "\u2224" }, - "⁠": { "codepoints": [8288], "characters": "\u2060" }, - " ": { "codepoints": [160], "characters": "\u00A0" }, - "𝕟": { "codepoints": [120159], "characters": "\uD835\uDD5F" }, - "ℕ": { "codepoints": [8469], "characters": "\u2115" }, - "⫬": { "codepoints": [10988], "characters": "\u2AEC" }, - "¬": { "codepoints": [172], "characters": "\u00AC" }, - "¬": { "codepoints": [172], "characters": "\u00AC" }, - "≢": { "codepoints": [8802], "characters": "\u2262" }, - "≭": { "codepoints": [8813], "characters": "\u226D" }, - "∦": { "codepoints": [8742], "characters": "\u2226" }, - "∉": { "codepoints": [8713], "characters": "\u2209" }, - "≠": { "codepoints": [8800], "characters": "\u2260" }, - "≂̸": { "codepoints": [8770, 824], "characters": "\u2242\u0338" }, - "∄": { "codepoints": [8708], "characters": "\u2204" }, - "≯": { "codepoints": [8815], "characters": "\u226F" }, - "≱": { "codepoints": [8817], "characters": "\u2271" }, - "≧̸": { "codepoints": [8807, 824], "characters": "\u2267\u0338" }, - "≫̸": { "codepoints": [8811, 824], "characters": "\u226B\u0338" }, - "≹": { "codepoints": [8825], "characters": "\u2279" }, - "⩾̸": { "codepoints": [10878, 824], "characters": "\u2A7E\u0338" }, - "≵": { "codepoints": [8821], "characters": "\u2275" }, - "≎̸": { "codepoints": [8782, 824], "characters": "\u224E\u0338" }, - "≏̸": { "codepoints": [8783, 824], "characters": "\u224F\u0338" }, - "∉": { "codepoints": [8713], "characters": "\u2209" }, - "⋵̸": { "codepoints": [8949, 824], "characters": "\u22F5\u0338" }, - "⋹̸": { "codepoints": [8953, 824], "characters": "\u22F9\u0338" }, - "∉": { "codepoints": [8713], "characters": "\u2209" }, - "⋷": { "codepoints": [8951], "characters": "\u22F7" }, - "⋶": { "codepoints": [8950], "characters": "\u22F6" }, - "⧏̸": { "codepoints": [10703, 824], "characters": "\u29CF\u0338" }, - "⋪": { "codepoints": [8938], "characters": "\u22EA" }, - "⋬": { "codepoints": [8940], "characters": "\u22EC" }, - "≮": { "codepoints": [8814], "characters": "\u226E" }, - "≰": { "codepoints": [8816], "characters": "\u2270" }, - "≸": { "codepoints": [8824], "characters": "\u2278" }, - "≪̸": { "codepoints": [8810, 824], "characters": "\u226A\u0338" }, - "⩽̸": { "codepoints": [10877, 824], "characters": "\u2A7D\u0338" }, - "≴": { "codepoints": [8820], "characters": "\u2274" }, - "⪢̸": { "codepoints": [10914, 824], "characters": "\u2AA2\u0338" }, - "⪡̸": { "codepoints": [10913, 824], "characters": "\u2AA1\u0338" }, - "∌": { "codepoints": [8716], "characters": "\u220C" }, - "∌": { "codepoints": [8716], "characters": "\u220C" }, - "⋾": { "codepoints": [8958], "characters": "\u22FE" }, - "⋽": { "codepoints": [8957], "characters": "\u22FD" }, - "⊀": { "codepoints": [8832], "characters": "\u2280" }, - "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, - "⋠": { "codepoints": [8928], "characters": "\u22E0" }, - "∌": { "codepoints": [8716], "characters": "\u220C" }, - "⧐̸": { "codepoints": [10704, 824], "characters": "\u29D0\u0338" }, - "⋫": { "codepoints": [8939], "characters": "\u22EB" }, - "⋭": { "codepoints": [8941], "characters": "\u22ED" }, - "⊏̸": { "codepoints": [8847, 824], "characters": "\u228F\u0338" }, - "⋢": { "codepoints": [8930], "characters": "\u22E2" }, - "⊐̸": { "codepoints": [8848, 824], "characters": "\u2290\u0338" }, - "⋣": { "codepoints": [8931], "characters": "\u22E3" }, - "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, - "⊈": { "codepoints": [8840], "characters": "\u2288" }, - "⊁": { "codepoints": [8833], "characters": "\u2281" }, - "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, - "⋡": { "codepoints": [8929], "characters": "\u22E1" }, - "≿̸": { "codepoints": [8831, 824], "characters": "\u227F\u0338" }, - "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, - "⊉": { "codepoints": [8841], "characters": "\u2289" }, - "≁": { "codepoints": [8769], "characters": "\u2241" }, - "≄": { "codepoints": [8772], "characters": "\u2244" }, - "≇": { "codepoints": [8775], "characters": "\u2247" }, - "≉": { "codepoints": [8777], "characters": "\u2249" }, - "∤": { "codepoints": [8740], "characters": "\u2224" }, - "∦": { "codepoints": [8742], "characters": "\u2226" }, - "∦": { "codepoints": [8742], "characters": "\u2226" }, - "⫽⃥": { "codepoints": [11005, 8421], "characters": "\u2AFD\u20E5" }, - "∂̸": { "codepoints": [8706, 824], "characters": "\u2202\u0338" }, - "⨔": { "codepoints": [10772], "characters": "\u2A14" }, - "⊀": { "codepoints": [8832], "characters": "\u2280" }, - "⋠": { "codepoints": [8928], "characters": "\u22E0" }, - "⊀": { "codepoints": [8832], "characters": "\u2280" }, - "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, - "⪯̸": { "codepoints": [10927, 824], "characters": "\u2AAF\u0338" }, - "⤳̸": { "codepoints": [10547, 824], "characters": "\u2933\u0338" }, - "↛": { "codepoints": [8603], "characters": "\u219B" }, - "⇏": { "codepoints": [8655], "characters": "\u21CF" }, - "↝̸": { "codepoints": [8605, 824], "characters": "\u219D\u0338" }, - "↛": { "codepoints": [8603], "characters": "\u219B" }, - "⇏": { "codepoints": [8655], "characters": "\u21CF" }, - "⋫": { "codepoints": [8939], "characters": "\u22EB" }, - "⋭": { "codepoints": [8941], "characters": "\u22ED" }, - "⊁": { "codepoints": [8833], "characters": "\u2281" }, - "⋡": { "codepoints": [8929], "characters": "\u22E1" }, - "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, - "𝒩": { "codepoints": [119977], "characters": "\uD835\uDCA9" }, - "𝓃": { "codepoints": [120003], "characters": "\uD835\uDCC3" }, - "∤": { "codepoints": [8740], "characters": "\u2224" }, - "∦": { "codepoints": [8742], "characters": "\u2226" }, - "≁": { "codepoints": [8769], "characters": "\u2241" }, - "≄": { "codepoints": [8772], "characters": "\u2244" }, - "≄": { "codepoints": [8772], "characters": "\u2244" }, - "∤": { "codepoints": [8740], "characters": "\u2224" }, - "∦": { "codepoints": [8742], "characters": "\u2226" }, - "⋢": { "codepoints": [8930], "characters": "\u22E2" }, - "⋣": { "codepoints": [8931], "characters": "\u22E3" }, - "⊄": { "codepoints": [8836], "characters": "\u2284" }, - "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" }, - "⊈": { "codepoints": [8840], "characters": "\u2288" }, - "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, - "⊈": { "codepoints": [8840], "characters": "\u2288" }, - "⫅̸": { "codepoints": [10949, 824], "characters": "\u2AC5\u0338" }, - "⊁": { "codepoints": [8833], "characters": "\u2281" }, - "⪰̸": { "codepoints": [10928, 824], "characters": "\u2AB0\u0338" }, - "⊅": { "codepoints": [8837], "characters": "\u2285" }, - "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" }, - "⊉": { "codepoints": [8841], "characters": "\u2289" }, - "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, - "⊉": { "codepoints": [8841], "characters": "\u2289" }, - "⫆̸": { "codepoints": [10950, 824], "characters": "\u2AC6\u0338" }, - "≹": { "codepoints": [8825], "characters": "\u2279" }, - "Ñ": { "codepoints": [209], "characters": "\u00D1" }, - "Ñ": { "codepoints": [209], "characters": "\u00D1" }, - "ñ": { "codepoints": [241], "characters": "\u00F1" }, - "ñ": { "codepoints": [241], "characters": "\u00F1" }, - "≸": { "codepoints": [8824], "characters": "\u2278" }, - "⋪": { "codepoints": [8938], "characters": "\u22EA" }, - "⋬": { "codepoints": [8940], "characters": "\u22EC" }, - "⋫": { "codepoints": [8939], "characters": "\u22EB" }, - "⋭": { "codepoints": [8941], "characters": "\u22ED" }, - "Ν": { "codepoints": [925], "characters": "\u039D" }, - "ν": { "codepoints": [957], "characters": "\u03BD" }, - "#": { "codepoints": [35], "characters": "\u0023" }, - "№": { "codepoints": [8470], "characters": "\u2116" }, - " ": { "codepoints": [8199], "characters": "\u2007" }, - "≍⃒": { "codepoints": [8781, 8402], "characters": "\u224D\u20D2" }, - "⊬": { "codepoints": [8876], "characters": "\u22AC" }, - "⊭": { "codepoints": [8877], "characters": "\u22AD" }, - "⊮": { "codepoints": [8878], "characters": "\u22AE" }, - "⊯": { "codepoints": [8879], "characters": "\u22AF" }, - "≥⃒": { "codepoints": [8805, 8402], "characters": "\u2265\u20D2" }, - ">⃒": { "codepoints": [62, 8402], "characters": "\u003E\u20D2" }, - "⤄": { "codepoints": [10500], "characters": "\u2904" }, - "⧞": { "codepoints": [10718], "characters": "\u29DE" }, - "⤂": { "codepoints": [10498], "characters": "\u2902" }, - "≤⃒": { "codepoints": [8804, 8402], "characters": "\u2264\u20D2" }, - "<⃒": { "codepoints": [60, 8402], "characters": "\u003C\u20D2" }, - "⊴⃒": { "codepoints": [8884, 8402], "characters": "\u22B4\u20D2" }, - "⤃": { "codepoints": [10499], "characters": "\u2903" }, - "⊵⃒": { "codepoints": [8885, 8402], "characters": "\u22B5\u20D2" }, - "∼⃒": { "codepoints": [8764, 8402], "characters": "\u223C\u20D2" }, - "⤣": { "codepoints": [10531], "characters": "\u2923" }, - "↖": { "codepoints": [8598], "characters": "\u2196" }, - "⇖": { "codepoints": [8662], "characters": "\u21D6" }, - "↖": { "codepoints": [8598], "characters": "\u2196" }, - "⤧": { "codepoints": [10535], "characters": "\u2927" }, - "Ó": { "codepoints": [211], "characters": "\u00D3" }, - "Ó": { "codepoints": [211], "characters": "\u00D3" }, - "ó": { "codepoints": [243], "characters": "\u00F3" }, - "ó": { "codepoints": [243], "characters": "\u00F3" }, - "⊛": { "codepoints": [8859], "characters": "\u229B" }, - "Ô": { "codepoints": [212], "characters": "\u00D4" }, - "Ô": { "codepoints": [212], "characters": "\u00D4" }, - "ô": { "codepoints": [244], "characters": "\u00F4" }, - "ô": { "codepoints": [244], "characters": "\u00F4" }, - "⊚": { "codepoints": [8858], "characters": "\u229A" }, - "О": { "codepoints": [1054], "characters": "\u041E" }, - "о": { "codepoints": [1086], "characters": "\u043E" }, - "⊝": { "codepoints": [8861], "characters": "\u229D" }, - "Ő": { "codepoints": [336], "characters": "\u0150" }, - "ő": { "codepoints": [337], "characters": "\u0151" }, - "⨸": { "codepoints": [10808], "characters": "\u2A38" }, - "⊙": { "codepoints": [8857], "characters": "\u2299" }, - "⦼": { "codepoints": [10684], "characters": "\u29BC" }, - "Œ": { "codepoints": [338], "characters": "\u0152" }, - "œ": { "codepoints": [339], "characters": "\u0153" }, - "⦿": { "codepoints": [10687], "characters": "\u29BF" }, - "𝔒": { "codepoints": [120082], "characters": "\uD835\uDD12" }, - "𝔬": { "codepoints": [120108], "characters": "\uD835\uDD2C" }, - "˛": { "codepoints": [731], "characters": "\u02DB" }, - "Ò": { "codepoints": [210], "characters": "\u00D2" }, - "Ò": { "codepoints": [210], "characters": "\u00D2" }, - "ò": { "codepoints": [242], "characters": "\u00F2" }, - "ò": { "codepoints": [242], "characters": "\u00F2" }, - "⧁": { "codepoints": [10689], "characters": "\u29C1" }, - "⦵": { "codepoints": [10677], "characters": "\u29B5" }, - "Ω": { "codepoints": [937], "characters": "\u03A9" }, - "∮": { "codepoints": [8750], "characters": "\u222E" }, - "↺": { "codepoints": [8634], "characters": "\u21BA" }, - "⦾": { "codepoints": [10686], "characters": "\u29BE" }, - "⦻": { "codepoints": [10683], "characters": "\u29BB" }, - "‾": { "codepoints": [8254], "characters": "\u203E" }, - "⧀": { "codepoints": [10688], "characters": "\u29C0" }, - "Ō": { "codepoints": [332], "characters": "\u014C" }, - "ō": { "codepoints": [333], "characters": "\u014D" }, - "Ω": { "codepoints": [937], "characters": "\u03A9" }, - "ω": { "codepoints": [969], "characters": "\u03C9" }, - "Ο": { "codepoints": [927], "characters": "\u039F" }, - "ο": { "codepoints": [959], "characters": "\u03BF" }, - "⦶": { "codepoints": [10678], "characters": "\u29B6" }, - "⊖": { "codepoints": [8854], "characters": "\u2296" }, - "𝕆": { "codepoints": [120134], "characters": "\uD835\uDD46" }, - "𝕠": { "codepoints": [120160], "characters": "\uD835\uDD60" }, - "⦷": { "codepoints": [10679], "characters": "\u29B7" }, - "“": { "codepoints": [8220], "characters": "\u201C" }, - "‘": { "codepoints": [8216], "characters": "\u2018" }, - "⦹": { "codepoints": [10681], "characters": "\u29B9" }, - "⊕": { "codepoints": [8853], "characters": "\u2295" }, - "↻": { "codepoints": [8635], "characters": "\u21BB" }, - "⩔": { "codepoints": [10836], "characters": "\u2A54" }, - "∨": { "codepoints": [8744], "characters": "\u2228" }, - "⩝": { "codepoints": [10845], "characters": "\u2A5D" }, - "ℴ": { "codepoints": [8500], "characters": "\u2134" }, - "ℴ": { "codepoints": [8500], "characters": "\u2134" }, - "ª": { "codepoints": [170], "characters": "\u00AA" }, - "ª": { "codepoints": [170], "characters": "\u00AA" }, - "º": { "codepoints": [186], "characters": "\u00BA" }, - "º": { "codepoints": [186], "characters": "\u00BA" }, - "⊶": { "codepoints": [8886], "characters": "\u22B6" }, - "⩖": { "codepoints": [10838], "characters": "\u2A56" }, - "⩗": { "codepoints": [10839], "characters": "\u2A57" }, - "⩛": { "codepoints": [10843], "characters": "\u2A5B" }, - "Ⓢ": { "codepoints": [9416], "characters": "\u24C8" }, - "𝒪": { "codepoints": [119978], "characters": "\uD835\uDCAA" }, - "ℴ": { "codepoints": [8500], "characters": "\u2134" }, - "Ø": { "codepoints": [216], "characters": "\u00D8" }, - "Ø": { "codepoints": [216], "characters": "\u00D8" }, - "ø": { "codepoints": [248], "characters": "\u00F8" }, - "ø": { "codepoints": [248], "characters": "\u00F8" }, - "⊘": { "codepoints": [8856], "characters": "\u2298" }, - "Õ": { "codepoints": [213], "characters": "\u00D5" }, - "Õ": { "codepoints": [213], "characters": "\u00D5" }, - "õ": { "codepoints": [245], "characters": "\u00F5" }, - "õ": { "codepoints": [245], "characters": "\u00F5" }, - "⨶": { "codepoints": [10806], "characters": "\u2A36" }, - "⨷": { "codepoints": [10807], "characters": "\u2A37" }, - "⊗": { "codepoints": [8855], "characters": "\u2297" }, - "Ö": { "codepoints": [214], "characters": "\u00D6" }, - "Ö": { "codepoints": [214], "characters": "\u00D6" }, - "ö": { "codepoints": [246], "characters": "\u00F6" }, - "ö": { "codepoints": [246], "characters": "\u00F6" }, - "⌽": { "codepoints": [9021], "characters": "\u233D" }, - "‾": { "codepoints": [8254], "characters": "\u203E" }, - "⏞": { "codepoints": [9182], "characters": "\u23DE" }, - "⎴": { "codepoints": [9140], "characters": "\u23B4" }, - "⏜": { "codepoints": [9180], "characters": "\u23DC" }, - "¶": { "codepoints": [182], "characters": "\u00B6" }, - "¶": { "codepoints": [182], "characters": "\u00B6" }, - "∥": { "codepoints": [8741], "characters": "\u2225" }, - "∥": { "codepoints": [8741], "characters": "\u2225" }, - "⫳": { "codepoints": [10995], "characters": "\u2AF3" }, - "⫽": { "codepoints": [11005], "characters": "\u2AFD" }, - "∂": { "codepoints": [8706], "characters": "\u2202" }, - "∂": { "codepoints": [8706], "characters": "\u2202" }, - "П": { "codepoints": [1055], "characters": "\u041F" }, - "п": { "codepoints": [1087], "characters": "\u043F" }, - "%": { "codepoints": [37], "characters": "\u0025" }, - ".": { "codepoints": [46], "characters": "\u002E" }, - "‰": { "codepoints": [8240], "characters": "\u2030" }, - "⊥": { "codepoints": [8869], "characters": "\u22A5" }, - "‱": { "codepoints": [8241], "characters": "\u2031" }, - "𝔓": { "codepoints": [120083], "characters": "\uD835\uDD13" }, - "𝔭": { "codepoints": [120109], "characters": "\uD835\uDD2D" }, - "Φ": { "codepoints": [934], "characters": "\u03A6" }, - "φ": { "codepoints": [966], "characters": "\u03C6" }, - "ϕ": { "codepoints": [981], "characters": "\u03D5" }, - "ℳ": { "codepoints": [8499], "characters": "\u2133" }, - "☎": { "codepoints": [9742], "characters": "\u260E" }, - "Π": { "codepoints": [928], "characters": "\u03A0" }, - "π": { "codepoints": [960], "characters": "\u03C0" }, - "⋔": { "codepoints": [8916], "characters": "\u22D4" }, - "ϖ": { "codepoints": [982], "characters": "\u03D6" }, - "ℏ": { "codepoints": [8463], "characters": "\u210F" }, - "ℎ": { "codepoints": [8462], "characters": "\u210E" }, - "ℏ": { "codepoints": [8463], "characters": "\u210F" }, - "⨣": { "codepoints": [10787], "characters": "\u2A23" }, - "⊞": { "codepoints": [8862], "characters": "\u229E" }, - "⨢": { "codepoints": [10786], "characters": "\u2A22" }, - "+": { "codepoints": [43], "characters": "\u002B" }, - "∔": { "codepoints": [8724], "characters": "\u2214" }, - "⨥": { "codepoints": [10789], "characters": "\u2A25" }, - "⩲": { "codepoints": [10866], "characters": "\u2A72" }, - "±": { "codepoints": [177], "characters": "\u00B1" }, - "±": { "codepoints": [177], "characters": "\u00B1" }, - "±": { "codepoints": [177], "characters": "\u00B1" }, - "⨦": { "codepoints": [10790], "characters": "\u2A26" }, - "⨧": { "codepoints": [10791], "characters": "\u2A27" }, - "±": { "codepoints": [177], "characters": "\u00B1" }, - "ℌ": { "codepoints": [8460], "characters": "\u210C" }, - "⨕": { "codepoints": [10773], "characters": "\u2A15" }, - "𝕡": { "codepoints": [120161], "characters": "\uD835\uDD61" }, - "ℙ": { "codepoints": [8473], "characters": "\u2119" }, - "£": { "codepoints": [163], "characters": "\u00A3" }, - "£": { "codepoints": [163], "characters": "\u00A3" }, - "⪷": { "codepoints": [10935], "characters": "\u2AB7" }, - "⪻": { "codepoints": [10939], "characters": "\u2ABB" }, - "≺": { "codepoints": [8826], "characters": "\u227A" }, - "≼": { "codepoints": [8828], "characters": "\u227C" }, - "⪷": { "codepoints": [10935], "characters": "\u2AB7" }, - "≺": { "codepoints": [8826], "characters": "\u227A" }, - "≼": { "codepoints": [8828], "characters": "\u227C" }, - "≺": { "codepoints": [8826], "characters": "\u227A" }, - "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, - "≼": { "codepoints": [8828], "characters": "\u227C" }, - "≾": { "codepoints": [8830], "characters": "\u227E" }, - "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, - "⪹": { "codepoints": [10937], "characters": "\u2AB9" }, - "⪵": { "codepoints": [10933], "characters": "\u2AB5" }, - "⋨": { "codepoints": [8936], "characters": "\u22E8" }, - "⪯": { "codepoints": [10927], "characters": "\u2AAF" }, - "⪳": { "codepoints": [10931], "characters": "\u2AB3" }, - "≾": { "codepoints": [8830], "characters": "\u227E" }, - "′": { "codepoints": [8242], "characters": "\u2032" }, - "″": { "codepoints": [8243], "characters": "\u2033" }, - "ℙ": { "codepoints": [8473], "characters": "\u2119" }, - "⪹": { "codepoints": [10937], "characters": "\u2AB9" }, - "⪵": { "codepoints": [10933], "characters": "\u2AB5" }, - "⋨": { "codepoints": [8936], "characters": "\u22E8" }, - "∏": { "codepoints": [8719], "characters": "\u220F" }, - "∏": { "codepoints": [8719], "characters": "\u220F" }, - "⌮": { "codepoints": [9006], "characters": "\u232E" }, - "⌒": { "codepoints": [8978], "characters": "\u2312" }, - "⌓": { "codepoints": [8979], "characters": "\u2313" }, - "∝": { "codepoints": [8733], "characters": "\u221D" }, - "∝": { "codepoints": [8733], "characters": "\u221D" }, - "∷": { "codepoints": [8759], "characters": "\u2237" }, - "∝": { "codepoints": [8733], "characters": "\u221D" }, - "≾": { "codepoints": [8830], "characters": "\u227E" }, - "⊰": { "codepoints": [8880], "characters": "\u22B0" }, - "𝒫": { "codepoints": [119979], "characters": "\uD835\uDCAB" }, - "𝓅": { "codepoints": [120005], "characters": "\uD835\uDCC5" }, - "Ψ": { "codepoints": [936], "characters": "\u03A8" }, - "ψ": { "codepoints": [968], "characters": "\u03C8" }, - " ": { "codepoints": [8200], "characters": "\u2008" }, - "𝔔": { "codepoints": [120084], "characters": "\uD835\uDD14" }, - "𝔮": { "codepoints": [120110], "characters": "\uD835\uDD2E" }, - "⨌": { "codepoints": [10764], "characters": "\u2A0C" }, - "𝕢": { "codepoints": [120162], "characters": "\uD835\uDD62" }, - "ℚ": { "codepoints": [8474], "characters": "\u211A" }, - "⁗": { "codepoints": [8279], "characters": "\u2057" }, - "𝒬": { "codepoints": [119980], "characters": "\uD835\uDCAC" }, - "𝓆": { "codepoints": [120006], "characters": "\uD835\uDCC6" }, - "ℍ": { "codepoints": [8461], "characters": "\u210D" }, - "⨖": { "codepoints": [10774], "characters": "\u2A16" }, - "?": { "codepoints": [63], "characters": "\u003F" }, - "≟": { "codepoints": [8799], "characters": "\u225F" }, - """: { "codepoints": [34], "characters": "\u0022" }, - """: { "codepoints": [34], "characters": "\u0022" }, - """: { "codepoints": [34], "characters": "\u0022" }, - """: { "codepoints": [34], "characters": "\u0022" }, - "⇛": { "codepoints": [8667], "characters": "\u21DB" }, - "∽̱": { "codepoints": [8765, 817], "characters": "\u223D\u0331" }, - "Ŕ": { "codepoints": [340], "characters": "\u0154" }, - "ŕ": { "codepoints": [341], "characters": "\u0155" }, - "√": { "codepoints": [8730], "characters": "\u221A" }, - "⦳": { "codepoints": [10675], "characters": "\u29B3" }, - "⟩": { "codepoints": [10217], "characters": "\u27E9" }, - "⟫": { "codepoints": [10219], "characters": "\u27EB" }, - "⦒": { "codepoints": [10642], "characters": "\u2992" }, - "⦥": { "codepoints": [10661], "characters": "\u29A5" }, - "⟩": { "codepoints": [10217], "characters": "\u27E9" }, - "»": { "codepoints": [187], "characters": "\u00BB" }, - "»": { "codepoints": [187], "characters": "\u00BB" }, - "⥵": { "codepoints": [10613], "characters": "\u2975" }, - "⇥": { "codepoints": [8677], "characters": "\u21E5" }, - "⤠": { "codepoints": [10528], "characters": "\u2920" }, - "⤳": { "codepoints": [10547], "characters": "\u2933" }, - "→": { "codepoints": [8594], "characters": "\u2192" }, - "↠": { "codepoints": [8608], "characters": "\u21A0" }, - "⇒": { "codepoints": [8658], "characters": "\u21D2" }, - "⤞": { "codepoints": [10526], "characters": "\u291E" }, - "↪": { "codepoints": [8618], "characters": "\u21AA" }, - "↬": { "codepoints": [8620], "characters": "\u21AC" }, - "⥅": { "codepoints": [10565], "characters": "\u2945" }, - "⥴": { "codepoints": [10612], "characters": "\u2974" }, - "⤖": { "codepoints": [10518], "characters": "\u2916" }, - "↣": { "codepoints": [8611], "characters": "\u21A3" }, - "↝": { "codepoints": [8605], "characters": "\u219D" }, - "⤚": { "codepoints": [10522], "characters": "\u291A" }, - "⤜": { "codepoints": [10524], "characters": "\u291C" }, - "∶": { "codepoints": [8758], "characters": "\u2236" }, - "ℚ": { "codepoints": [8474], "characters": "\u211A" }, - "⤍": { "codepoints": [10509], "characters": "\u290D" }, - "⤏": { "codepoints": [10511], "characters": "\u290F" }, - "⤐": { "codepoints": [10512], "characters": "\u2910" }, - "❳": { "codepoints": [10099], "characters": "\u2773" }, - "}": { "codepoints": [125], "characters": "\u007D" }, - "]": { "codepoints": [93], "characters": "\u005D" }, - "⦌": { "codepoints": [10636], "characters": "\u298C" }, - "⦎": { "codepoints": [10638], "characters": "\u298E" }, - "⦐": { "codepoints": [10640], "characters": "\u2990" }, - "Ř": { "codepoints": [344], "characters": "\u0158" }, - "ř": { "codepoints": [345], "characters": "\u0159" }, - "Ŗ": { "codepoints": [342], "characters": "\u0156" }, - "ŗ": { "codepoints": [343], "characters": "\u0157" }, - "⌉": { "codepoints": [8969], "characters": "\u2309" }, - "}": { "codepoints": [125], "characters": "\u007D" }, - "Р": { "codepoints": [1056], "characters": "\u0420" }, - "р": { "codepoints": [1088], "characters": "\u0440" }, - "⤷": { "codepoints": [10551], "characters": "\u2937" }, - "⥩": { "codepoints": [10601], "characters": "\u2969" }, - "”": { "codepoints": [8221], "characters": "\u201D" }, - "”": { "codepoints": [8221], "characters": "\u201D" }, - "↳": { "codepoints": [8627], "characters": "\u21B3" }, - "ℜ": { "codepoints": [8476], "characters": "\u211C" }, - "ℛ": { "codepoints": [8475], "characters": "\u211B" }, - "ℜ": { "codepoints": [8476], "characters": "\u211C" }, - "ℝ": { "codepoints": [8477], "characters": "\u211D" }, - "ℜ": { "codepoints": [8476], "characters": "\u211C" }, - "▭": { "codepoints": [9645], "characters": "\u25AD" }, - "®": { "codepoints": [174], "characters": "\u00AE" }, - "®": { "codepoints": [174], "characters": "\u00AE" }, - "®": { "codepoints": [174], "characters": "\u00AE" }, - "®": { "codepoints": [174], "characters": "\u00AE" }, - "∋": { "codepoints": [8715], "characters": "\u220B" }, - "⇋": { "codepoints": [8651], "characters": "\u21CB" }, - "⥯": { "codepoints": [10607], "characters": "\u296F" }, - "⥽": { "codepoints": [10621], "characters": "\u297D" }, - "⌋": { "codepoints": [8971], "characters": "\u230B" }, - "𝔯": { "codepoints": [120111], "characters": "\uD835\uDD2F" }, - "ℜ": { "codepoints": [8476], "characters": "\u211C" }, - "⥤": { "codepoints": [10596], "characters": "\u2964" }, - "⇁": { "codepoints": [8641], "characters": "\u21C1" }, - "⇀": { "codepoints": [8640], "characters": "\u21C0" }, - "⥬": { "codepoints": [10604], "characters": "\u296C" }, - "Ρ": { "codepoints": [929], "characters": "\u03A1" }, - "ρ": { "codepoints": [961], "characters": "\u03C1" }, - "ϱ": { "codepoints": [1009], "characters": "\u03F1" }, - "⟩": { "codepoints": [10217], "characters": "\u27E9" }, - "⇥": { "codepoints": [8677], "characters": "\u21E5" }, - "→": { "codepoints": [8594], "characters": "\u2192" }, - "→": { "codepoints": [8594], "characters": "\u2192" }, - "⇒": { "codepoints": [8658], "characters": "\u21D2" }, - "⇄": { "codepoints": [8644], "characters": "\u21C4" }, - "↣": { "codepoints": [8611], "characters": "\u21A3" }, - "⌉": { "codepoints": [8969], "characters": "\u2309" }, - "⟧": { "codepoints": [10215], "characters": "\u27E7" }, - "⥝": { "codepoints": [10589], "characters": "\u295D" }, - "⥕": { "codepoints": [10581], "characters": "\u2955" }, - "⇂": { "codepoints": [8642], "characters": "\u21C2" }, - "⌋": { "codepoints": [8971], "characters": "\u230B" }, - "⇁": { "codepoints": [8641], "characters": "\u21C1" }, - "⇀": { "codepoints": [8640], "characters": "\u21C0" }, - "⇄": { "codepoints": [8644], "characters": "\u21C4" }, - "⇌": { "codepoints": [8652], "characters": "\u21CC" }, - "⇉": { "codepoints": [8649], "characters": "\u21C9" }, - "↝": { "codepoints": [8605], "characters": "\u219D" }, - "↦": { "codepoints": [8614], "characters": "\u21A6" }, - "⊢": { "codepoints": [8866], "characters": "\u22A2" }, - "⥛": { "codepoints": [10587], "characters": "\u295B" }, - "⋌": { "codepoints": [8908], "characters": "\u22CC" }, - "⧐": { "codepoints": [10704], "characters": "\u29D0" }, - "⊳": { "codepoints": [8883], "characters": "\u22B3" }, - "⊵": { "codepoints": [8885], "characters": "\u22B5" }, - "⥏": { "codepoints": [10575], "characters": "\u294F" }, - "⥜": { "codepoints": [10588], "characters": "\u295C" }, - "⥔": { "codepoints": [10580], "characters": "\u2954" }, - "↾": { "codepoints": [8638], "characters": "\u21BE" }, - "⥓": { "codepoints": [10579], "characters": "\u2953" }, - "⇀": { "codepoints": [8640], "characters": "\u21C0" }, - "˚": { "codepoints": [730], "characters": "\u02DA" }, - "≓": { "codepoints": [8787], "characters": "\u2253" }, - "⇄": { "codepoints": [8644], "characters": "\u21C4" }, - "⇌": { "codepoints": [8652], "characters": "\u21CC" }, - "‏": { "codepoints": [8207], "characters": "\u200F" }, - "⎱": { "codepoints": [9137], "characters": "\u23B1" }, - "⎱": { "codepoints": [9137], "characters": "\u23B1" }, - "⫮": { "codepoints": [10990], "characters": "\u2AEE" }, - "⟭": { "codepoints": [10221], "characters": "\u27ED" }, - "⇾": { "codepoints": [8702], "characters": "\u21FE" }, - "⟧": { "codepoints": [10215], "characters": "\u27E7" }, - "⦆": { "codepoints": [10630], "characters": "\u2986" }, - "𝕣": { "codepoints": [120163], "characters": "\uD835\uDD63" }, - "ℝ": { "codepoints": [8477], "characters": "\u211D" }, - "⨮": { "codepoints": [10798], "characters": "\u2A2E" }, - "⨵": { "codepoints": [10805], "characters": "\u2A35" }, - "⥰": { "codepoints": [10608], "characters": "\u2970" }, - ")": { "codepoints": [41], "characters": "\u0029" }, - "⦔": { "codepoints": [10644], "characters": "\u2994" }, - "⨒": { "codepoints": [10770], "characters": "\u2A12" }, - "⇉": { "codepoints": [8649], "characters": "\u21C9" }, - "⇛": { "codepoints": [8667], "characters": "\u21DB" }, - "›": { "codepoints": [8250], "characters": "\u203A" }, - "𝓇": { "codepoints": [120007], "characters": "\uD835\uDCC7" }, - "ℛ": { "codepoints": [8475], "characters": "\u211B" }, - "↱": { "codepoints": [8625], "characters": "\u21B1" }, - "↱": { "codepoints": [8625], "characters": "\u21B1" }, - "]": { "codepoints": [93], "characters": "\u005D" }, - "’": { "codepoints": [8217], "characters": "\u2019" }, - "’": { "codepoints": [8217], "characters": "\u2019" }, - "⋌": { "codepoints": [8908], "characters": "\u22CC" }, - "⋊": { "codepoints": [8906], "characters": "\u22CA" }, - "▹": { "codepoints": [9657], "characters": "\u25B9" }, - "⊵": { "codepoints": [8885], "characters": "\u22B5" }, - "▸": { "codepoints": [9656], "characters": "\u25B8" }, - "⧎": { "codepoints": [10702], "characters": "\u29CE" }, - "⧴": { "codepoints": [10740], "characters": "\u29F4" }, - "⥨": { "codepoints": [10600], "characters": "\u2968" }, - "℞": { "codepoints": [8478], "characters": "\u211E" }, - "Ś": { "codepoints": [346], "characters": "\u015A" }, - "ś": { "codepoints": [347], "characters": "\u015B" }, - "‚": { "codepoints": [8218], "characters": "\u201A" }, - "⪸": { "codepoints": [10936], "characters": "\u2AB8" }, - "Š": { "codepoints": [352], "characters": "\u0160" }, - "š": { "codepoints": [353], "characters": "\u0161" }, - "⪼": { "codepoints": [10940], "characters": "\u2ABC" }, - "≻": { "codepoints": [8827], "characters": "\u227B" }, - "≽": { "codepoints": [8829], "characters": "\u227D" }, - "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, - "⪴": { "codepoints": [10932], "characters": "\u2AB4" }, - "Ş": { "codepoints": [350], "characters": "\u015E" }, - "ş": { "codepoints": [351], "characters": "\u015F" }, - "Ŝ": { "codepoints": [348], "characters": "\u015C" }, - "ŝ": { "codepoints": [349], "characters": "\u015D" }, - "⪺": { "codepoints": [10938], "characters": "\u2ABA" }, - "⪶": { "codepoints": [10934], "characters": "\u2AB6" }, - "⋩": { "codepoints": [8937], "characters": "\u22E9" }, - "⨓": { "codepoints": [10771], "characters": "\u2A13" }, - "≿": { "codepoints": [8831], "characters": "\u227F" }, - "С": { "codepoints": [1057], "characters": "\u0421" }, - "с": { "codepoints": [1089], "characters": "\u0441" }, - "⊡": { "codepoints": [8865], "characters": "\u22A1" }, - "⋅": { "codepoints": [8901], "characters": "\u22C5" }, - "⩦": { "codepoints": [10854], "characters": "\u2A66" }, - "⤥": { "codepoints": [10533], "characters": "\u2925" }, - "↘": { "codepoints": [8600], "characters": "\u2198" }, - "⇘": { "codepoints": [8664], "characters": "\u21D8" }, - "↘": { "codepoints": [8600], "characters": "\u2198" }, - "§": { "codepoints": [167], "characters": "\u00A7" }, - "§": { "codepoints": [167], "characters": "\u00A7" }, - ";": { "codepoints": [59], "characters": "\u003B" }, - "⤩": { "codepoints": [10537], "characters": "\u2929" }, - "∖": { "codepoints": [8726], "characters": "\u2216" }, - "∖": { "codepoints": [8726], "characters": "\u2216" }, - "✶": { "codepoints": [10038], "characters": "\u2736" }, - "𝔖": { "codepoints": [120086], "characters": "\uD835\uDD16" }, - "𝔰": { "codepoints": [120112], "characters": "\uD835\uDD30" }, - "⌢": { "codepoints": [8994], "characters": "\u2322" }, - "♯": { "codepoints": [9839], "characters": "\u266F" }, - "Щ": { "codepoints": [1065], "characters": "\u0429" }, - "щ": { "codepoints": [1097], "characters": "\u0449" }, - "Ш": { "codepoints": [1064], "characters": "\u0428" }, - "ш": { "codepoints": [1096], "characters": "\u0448" }, - "↓": { "codepoints": [8595], "characters": "\u2193" }, - "←": { "codepoints": [8592], "characters": "\u2190" }, - "∣": { "codepoints": [8739], "characters": "\u2223" }, - "∥": { "codepoints": [8741], "characters": "\u2225" }, - "→": { "codepoints": [8594], "characters": "\u2192" }, - "↑": { "codepoints": [8593], "characters": "\u2191" }, - "­": { "codepoints": [173], "characters": "\u00AD" }, - "­": { "codepoints": [173], "characters": "\u00AD" }, - "Σ": { "codepoints": [931], "characters": "\u03A3" }, - "σ": { "codepoints": [963], "characters": "\u03C3" }, - "ς": { "codepoints": [962], "characters": "\u03C2" }, - "ς": { "codepoints": [962], "characters": "\u03C2" }, - "∼": { "codepoints": [8764], "characters": "\u223C" }, - "⩪": { "codepoints": [10858], "characters": "\u2A6A" }, - "≃": { "codepoints": [8771], "characters": "\u2243" }, - "≃": { "codepoints": [8771], "characters": "\u2243" }, - "⪞": { "codepoints": [10910], "characters": "\u2A9E" }, - "⪠": { "codepoints": [10912], "characters": "\u2AA0" }, - "⪝": { "codepoints": [10909], "characters": "\u2A9D" }, - "⪟": { "codepoints": [10911], "characters": "\u2A9F" }, - "≆": { "codepoints": [8774], "characters": "\u2246" }, - "⨤": { "codepoints": [10788], "characters": "\u2A24" }, - "⥲": { "codepoints": [10610], "characters": "\u2972" }, - "←": { "codepoints": [8592], "characters": "\u2190" }, - "∘": { "codepoints": [8728], "characters": "\u2218" }, - "∖": { "codepoints": [8726], "characters": "\u2216" }, - "⨳": { "codepoints": [10803], "characters": "\u2A33" }, - "⧤": { "codepoints": [10724], "characters": "\u29E4" }, - "∣": { "codepoints": [8739], "characters": "\u2223" }, - "⌣": { "codepoints": [8995], "characters": "\u2323" }, - "⪪": { "codepoints": [10922], "characters": "\u2AAA" }, - "⪬": { "codepoints": [10924], "characters": "\u2AAC" }, - "⪬︀": { "codepoints": [10924, 65024], "characters": "\u2AAC\uFE00" }, - "Ь": { "codepoints": [1068], "characters": "\u042C" }, - "ь": { "codepoints": [1100], "characters": "\u044C" }, - "⌿": { "codepoints": [9023], "characters": "\u233F" }, - "⧄": { "codepoints": [10692], "characters": "\u29C4" }, - "/": { "codepoints": [47], "characters": "\u002F" }, - "𝕊": { "codepoints": [120138], "characters": "\uD835\uDD4A" }, - "𝕤": { "codepoints": [120164], "characters": "\uD835\uDD64" }, - "♠": { "codepoints": [9824], "characters": "\u2660" }, - "♠": { "codepoints": [9824], "characters": "\u2660" }, - "∥": { "codepoints": [8741], "characters": "\u2225" }, - "⊓": { "codepoints": [8851], "characters": "\u2293" }, - "⊓︀": { "codepoints": [8851, 65024], "characters": "\u2293\uFE00" }, - "⊔": { "codepoints": [8852], "characters": "\u2294" }, - "⊔︀": { "codepoints": [8852, 65024], "characters": "\u2294\uFE00" }, - "√": { "codepoints": [8730], "characters": "\u221A" }, - "⊏": { "codepoints": [8847], "characters": "\u228F" }, - "⊑": { "codepoints": [8849], "characters": "\u2291" }, - "⊏": { "codepoints": [8847], "characters": "\u228F" }, - "⊑": { "codepoints": [8849], "characters": "\u2291" }, - "⊐": { "codepoints": [8848], "characters": "\u2290" }, - "⊒": { "codepoints": [8850], "characters": "\u2292" }, - "⊐": { "codepoints": [8848], "characters": "\u2290" }, - "⊒": { "codepoints": [8850], "characters": "\u2292" }, - "□": { "codepoints": [9633], "characters": "\u25A1" }, - "□": { "codepoints": [9633], "characters": "\u25A1" }, - "⊓": { "codepoints": [8851], "characters": "\u2293" }, - "⊏": { "codepoints": [8847], "characters": "\u228F" }, - "⊑": { "codepoints": [8849], "characters": "\u2291" }, - "⊐": { "codepoints": [8848], "characters": "\u2290" }, - "⊒": { "codepoints": [8850], "characters": "\u2292" }, - "⊔": { "codepoints": [8852], "characters": "\u2294" }, - "▪": { "codepoints": [9642], "characters": "\u25AA" }, - "□": { "codepoints": [9633], "characters": "\u25A1" }, - "▪": { "codepoints": [9642], "characters": "\u25AA" }, - "→": { "codepoints": [8594], "characters": "\u2192" }, - "𝒮": { "codepoints": [119982], "characters": "\uD835\uDCAE" }, - "𝓈": { "codepoints": [120008], "characters": "\uD835\uDCC8" }, - "∖": { "codepoints": [8726], "characters": "\u2216" }, - "⌣": { "codepoints": [8995], "characters": "\u2323" }, - "⋆": { "codepoints": [8902], "characters": "\u22C6" }, - "⋆": { "codepoints": [8902], "characters": "\u22C6" }, - "☆": { "codepoints": [9734], "characters": "\u2606" }, - "★": { "codepoints": [9733], "characters": "\u2605" }, - "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, - "ϕ": { "codepoints": [981], "characters": "\u03D5" }, - "¯": { "codepoints": [175], "characters": "\u00AF" }, - "⊂": { "codepoints": [8834], "characters": "\u2282" }, - "⋐": { "codepoints": [8912], "characters": "\u22D0" }, - "⪽": { "codepoints": [10941], "characters": "\u2ABD" }, - "⫅": { "codepoints": [10949], "characters": "\u2AC5" }, - "⊆": { "codepoints": [8838], "characters": "\u2286" }, - "⫃": { "codepoints": [10947], "characters": "\u2AC3" }, - "⫁": { "codepoints": [10945], "characters": "\u2AC1" }, - "⫋": { "codepoints": [10955], "characters": "\u2ACB" }, - "⊊": { "codepoints": [8842], "characters": "\u228A" }, - "⪿": { "codepoints": [10943], "characters": "\u2ABF" }, - "⥹": { "codepoints": [10617], "characters": "\u2979" }, - "⊂": { "codepoints": [8834], "characters": "\u2282" }, - "⋐": { "codepoints": [8912], "characters": "\u22D0" }, - "⊆": { "codepoints": [8838], "characters": "\u2286" }, - "⫅": { "codepoints": [10949], "characters": "\u2AC5" }, - "⊆": { "codepoints": [8838], "characters": "\u2286" }, - "⊊": { "codepoints": [8842], "characters": "\u228A" }, - "⫋": { "codepoints": [10955], "characters": "\u2ACB" }, - "⫇": { "codepoints": [10951], "characters": "\u2AC7" }, - "⫕": { "codepoints": [10965], "characters": "\u2AD5" }, - "⫓": { "codepoints": [10963], "characters": "\u2AD3" }, - "⪸": { "codepoints": [10936], "characters": "\u2AB8" }, - "≻": { "codepoints": [8827], "characters": "\u227B" }, - "≽": { "codepoints": [8829], "characters": "\u227D" }, - "≻": { "codepoints": [8827], "characters": "\u227B" }, - "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, - "≽": { "codepoints": [8829], "characters": "\u227D" }, - "≿": { "codepoints": [8831], "characters": "\u227F" }, - "⪰": { "codepoints": [10928], "characters": "\u2AB0" }, - "⪺": { "codepoints": [10938], "characters": "\u2ABA" }, - "⪶": { "codepoints": [10934], "characters": "\u2AB6" }, - "⋩": { "codepoints": [8937], "characters": "\u22E9" }, - "≿": { "codepoints": [8831], "characters": "\u227F" }, - "∋": { "codepoints": [8715], "characters": "\u220B" }, - "∑": { "codepoints": [8721], "characters": "\u2211" }, - "∑": { "codepoints": [8721], "characters": "\u2211" }, - "♪": { "codepoints": [9834], "characters": "\u266A" }, - "¹": { "codepoints": [185], "characters": "\u00B9" }, - "¹": { "codepoints": [185], "characters": "\u00B9" }, - "²": { "codepoints": [178], "characters": "\u00B2" }, - "²": { "codepoints": [178], "characters": "\u00B2" }, - "³": { "codepoints": [179], "characters": "\u00B3" }, - "³": { "codepoints": [179], "characters": "\u00B3" }, - "⊃": { "codepoints": [8835], "characters": "\u2283" }, - "⋑": { "codepoints": [8913], "characters": "\u22D1" }, - "⪾": { "codepoints": [10942], "characters": "\u2ABE" }, - "⫘": { "codepoints": [10968], "characters": "\u2AD8" }, - "⫆": { "codepoints": [10950], "characters": "\u2AC6" }, - "⊇": { "codepoints": [8839], "characters": "\u2287" }, - "⫄": { "codepoints": [10948], "characters": "\u2AC4" }, - "⊃": { "codepoints": [8835], "characters": "\u2283" }, - "⊇": { "codepoints": [8839], "characters": "\u2287" }, - "⟉": { "codepoints": [10185], "characters": "\u27C9" }, - "⫗": { "codepoints": [10967], "characters": "\u2AD7" }, - "⥻": { "codepoints": [10619], "characters": "\u297B" }, - "⫂": { "codepoints": [10946], "characters": "\u2AC2" }, - "⫌": { "codepoints": [10956], "characters": "\u2ACC" }, - "⊋": { "codepoints": [8843], "characters": "\u228B" }, - "⫀": { "codepoints": [10944], "characters": "\u2AC0" }, - "⊃": { "codepoints": [8835], "characters": "\u2283" }, - "⋑": { "codepoints": [8913], "characters": "\u22D1" }, - "⊇": { "codepoints": [8839], "characters": "\u2287" }, - "⫆": { "codepoints": [10950], "characters": "\u2AC6" }, - "⊋": { "codepoints": [8843], "characters": "\u228B" }, - "⫌": { "codepoints": [10956], "characters": "\u2ACC" }, - "⫈": { "codepoints": [10952], "characters": "\u2AC8" }, - "⫔": { "codepoints": [10964], "characters": "\u2AD4" }, - "⫖": { "codepoints": [10966], "characters": "\u2AD6" }, - "⤦": { "codepoints": [10534], "characters": "\u2926" }, - "↙": { "codepoints": [8601], "characters": "\u2199" }, - "⇙": { "codepoints": [8665], "characters": "\u21D9" }, - "↙": { "codepoints": [8601], "characters": "\u2199" }, - "⤪": { "codepoints": [10538], "characters": "\u292A" }, - "ß": { "codepoints": [223], "characters": "\u00DF" }, - "ß": { "codepoints": [223], "characters": "\u00DF" }, - " ": { "codepoints": [9], "characters": "\u0009" }, - "⌖": { "codepoints": [8982], "characters": "\u2316" }, - "Τ": { "codepoints": [932], "characters": "\u03A4" }, - "τ": { "codepoints": [964], "characters": "\u03C4" }, - "⎴": { "codepoints": [9140], "characters": "\u23B4" }, - "Ť": { "codepoints": [356], "characters": "\u0164" }, - "ť": { "codepoints": [357], "characters": "\u0165" }, - "Ţ": { "codepoints": [354], "characters": "\u0162" }, - "ţ": { "codepoints": [355], "characters": "\u0163" }, - "Т": { "codepoints": [1058], "characters": "\u0422" }, - "т": { "codepoints": [1090], "characters": "\u0442" }, - "⃛": { "codepoints": [8411], "characters": "\u20DB" }, - "⌕": { "codepoints": [8981], "characters": "\u2315" }, - "𝔗": { "codepoints": [120087], "characters": "\uD835\uDD17" }, - "𝔱": { "codepoints": [120113], "characters": "\uD835\uDD31" }, - "∴": { "codepoints": [8756], "characters": "\u2234" }, - "∴": { "codepoints": [8756], "characters": "\u2234" }, - "∴": { "codepoints": [8756], "characters": "\u2234" }, - "Θ": { "codepoints": [920], "characters": "\u0398" }, - "θ": { "codepoints": [952], "characters": "\u03B8" }, - "ϑ": { "codepoints": [977], "characters": "\u03D1" }, - "ϑ": { "codepoints": [977], "characters": "\u03D1" }, - "≈": { "codepoints": [8776], "characters": "\u2248" }, - "∼": { "codepoints": [8764], "characters": "\u223C" }, - "  ": { "codepoints": [8287, 8202], "characters": "\u205F\u200A" }, - " ": { "codepoints": [8201], "characters": "\u2009" }, - " ": { "codepoints": [8201], "characters": "\u2009" }, - "≈": { "codepoints": [8776], "characters": "\u2248" }, - "∼": { "codepoints": [8764], "characters": "\u223C" }, - "Þ": { "codepoints": [222], "characters": "\u00DE" }, - "Þ": { "codepoints": [222], "characters": "\u00DE" }, - "þ": { "codepoints": [254], "characters": "\u00FE" }, - "þ": { "codepoints": [254], "characters": "\u00FE" }, - "˜": { "codepoints": [732], "characters": "\u02DC" }, - "∼": { "codepoints": [8764], "characters": "\u223C" }, - "≃": { "codepoints": [8771], "characters": "\u2243" }, - "≅": { "codepoints": [8773], "characters": "\u2245" }, - "≈": { "codepoints": [8776], "characters": "\u2248" }, - "⨱": { "codepoints": [10801], "characters": "\u2A31" }, - "⊠": { "codepoints": [8864], "characters": "\u22A0" }, - "×": { "codepoints": [215], "characters": "\u00D7" }, - "×": { "codepoints": [215], "characters": "\u00D7" }, - "⨰": { "codepoints": [10800], "characters": "\u2A30" }, - "∭": { "codepoints": [8749], "characters": "\u222D" }, - "⤨": { "codepoints": [10536], "characters": "\u2928" }, - "⌶": { "codepoints": [9014], "characters": "\u2336" }, - "⫱": { "codepoints": [10993], "characters": "\u2AF1" }, - "⊤": { "codepoints": [8868], "characters": "\u22A4" }, - "𝕋": { "codepoints": [120139], "characters": "\uD835\uDD4B" }, - "𝕥": { "codepoints": [120165], "characters": "\uD835\uDD65" }, - "⫚": { "codepoints": [10970], "characters": "\u2ADA" }, - "⤩": { "codepoints": [10537], "characters": "\u2929" }, - "‴": { "codepoints": [8244], "characters": "\u2034" }, - "™": { "codepoints": [8482], "characters": "\u2122" }, - "™": { "codepoints": [8482], "characters": "\u2122" }, - "▵": { "codepoints": [9653], "characters": "\u25B5" }, - "▿": { "codepoints": [9663], "characters": "\u25BF" }, - "◃": { "codepoints": [9667], "characters": "\u25C3" }, - "⊴": { "codepoints": [8884], "characters": "\u22B4" }, - "≜": { "codepoints": [8796], "characters": "\u225C" }, - "▹": { "codepoints": [9657], "characters": "\u25B9" }, - "⊵": { "codepoints": [8885], "characters": "\u22B5" }, - "◬": { "codepoints": [9708], "characters": "\u25EC" }, - "≜": { "codepoints": [8796], "characters": "\u225C" }, - "⨺": { "codepoints": [10810], "characters": "\u2A3A" }, - "⃛": { "codepoints": [8411], "characters": "\u20DB" }, - "⨹": { "codepoints": [10809], "characters": "\u2A39" }, - "⧍": { "codepoints": [10701], "characters": "\u29CD" }, - "⨻": { "codepoints": [10811], "characters": "\u2A3B" }, - "⏢": { "codepoints": [9186], "characters": "\u23E2" }, - "𝒯": { "codepoints": [119983], "characters": "\uD835\uDCAF" }, - "𝓉": { "codepoints": [120009], "characters": "\uD835\uDCC9" }, - "Ц": { "codepoints": [1062], "characters": "\u0426" }, - "ц": { "codepoints": [1094], "characters": "\u0446" }, - "Ћ": { "codepoints": [1035], "characters": "\u040B" }, - "ћ": { "codepoints": [1115], "characters": "\u045B" }, - "Ŧ": { "codepoints": [358], "characters": "\u0166" }, - "ŧ": { "codepoints": [359], "characters": "\u0167" }, - "≬": { "codepoints": [8812], "characters": "\u226C" }, - "↞": { "codepoints": [8606], "characters": "\u219E" }, - "↠": { "codepoints": [8608], "characters": "\u21A0" }, - "Ú": { "codepoints": [218], "characters": "\u00DA" }, - "Ú": { "codepoints": [218], "characters": "\u00DA" }, - "ú": { "codepoints": [250], "characters": "\u00FA" }, - "ú": { "codepoints": [250], "characters": "\u00FA" }, - "↑": { "codepoints": [8593], "characters": "\u2191" }, - "↟": { "codepoints": [8607], "characters": "\u219F" }, - "⇑": { "codepoints": [8657], "characters": "\u21D1" }, - "⥉": { "codepoints": [10569], "characters": "\u2949" }, - "Ў": { "codepoints": [1038], "characters": "\u040E" }, - "ў": { "codepoints": [1118], "characters": "\u045E" }, - "Ŭ": { "codepoints": [364], "characters": "\u016C" }, - "ŭ": { "codepoints": [365], "characters": "\u016D" }, - "Û": { "codepoints": [219], "characters": "\u00DB" }, - "Û": { "codepoints": [219], "characters": "\u00DB" }, - "û": { "codepoints": [251], "characters": "\u00FB" }, - "û": { "codepoints": [251], "characters": "\u00FB" }, - "У": { "codepoints": [1059], "characters": "\u0423" }, - "у": { "codepoints": [1091], "characters": "\u0443" }, - "⇅": { "codepoints": [8645], "characters": "\u21C5" }, - "Ű": { "codepoints": [368], "characters": "\u0170" }, - "ű": { "codepoints": [369], "characters": "\u0171" }, - "⥮": { "codepoints": [10606], "characters": "\u296E" }, - "⥾": { "codepoints": [10622], "characters": "\u297E" }, - "𝔘": { "codepoints": [120088], "characters": "\uD835\uDD18" }, - "𝔲": { "codepoints": [120114], "characters": "\uD835\uDD32" }, - "Ù": { "codepoints": [217], "characters": "\u00D9" }, - "Ù": { "codepoints": [217], "characters": "\u00D9" }, - "ù": { "codepoints": [249], "characters": "\u00F9" }, - "ù": { "codepoints": [249], "characters": "\u00F9" }, - "⥣": { "codepoints": [10595], "characters": "\u2963" }, - "↿": { "codepoints": [8639], "characters": "\u21BF" }, - "↾": { "codepoints": [8638], "characters": "\u21BE" }, - "▀": { "codepoints": [9600], "characters": "\u2580" }, - "⌜": { "codepoints": [8988], "characters": "\u231C" }, - "⌜": { "codepoints": [8988], "characters": "\u231C" }, - "⌏": { "codepoints": [8975], "characters": "\u230F" }, - "◸": { "codepoints": [9720], "characters": "\u25F8" }, - "Ū": { "codepoints": [362], "characters": "\u016A" }, - "ū": { "codepoints": [363], "characters": "\u016B" }, - "¨": { "codepoints": [168], "characters": "\u00A8" }, - "¨": { "codepoints": [168], "characters": "\u00A8" }, - "_": { "codepoints": [95], "characters": "\u005F" }, - "⏟": { "codepoints": [9183], "characters": "\u23DF" }, - "⎵": { "codepoints": [9141], "characters": "\u23B5" }, - "⏝": { "codepoints": [9181], "characters": "\u23DD" }, - "⋃": { "codepoints": [8899], "characters": "\u22C3" }, - "⊎": { "codepoints": [8846], "characters": "\u228E" }, - "Ų": { "codepoints": [370], "characters": "\u0172" }, - "ų": { "codepoints": [371], "characters": "\u0173" }, - "𝕌": { "codepoints": [120140], "characters": "\uD835\uDD4C" }, - "𝕦": { "codepoints": [120166], "characters": "\uD835\uDD66" }, - "⤒": { "codepoints": [10514], "characters": "\u2912" }, - "↑": { "codepoints": [8593], "characters": "\u2191" }, - "↑": { "codepoints": [8593], "characters": "\u2191" }, - "⇑": { "codepoints": [8657], "characters": "\u21D1" }, - "⇅": { "codepoints": [8645], "characters": "\u21C5" }, - "↕": { "codepoints": [8597], "characters": "\u2195" }, - "↕": { "codepoints": [8597], "characters": "\u2195" }, - "⇕": { "codepoints": [8661], "characters": "\u21D5" }, - "⥮": { "codepoints": [10606], "characters": "\u296E" }, - "↿": { "codepoints": [8639], "characters": "\u21BF" }, - "↾": { "codepoints": [8638], "characters": "\u21BE" }, - "⊎": { "codepoints": [8846], "characters": "\u228E" }, - "↖": { "codepoints": [8598], "characters": "\u2196" }, - "↗": { "codepoints": [8599], "characters": "\u2197" }, - "υ": { "codepoints": [965], "characters": "\u03C5" }, - "ϒ": { "codepoints": [978], "characters": "\u03D2" }, - "ϒ": { "codepoints": [978], "characters": "\u03D2" }, - "Υ": { "codepoints": [933], "characters": "\u03A5" }, - "υ": { "codepoints": [965], "characters": "\u03C5" }, - "↥": { "codepoints": [8613], "characters": "\u21A5" }, - "⊥": { "codepoints": [8869], "characters": "\u22A5" }, - "⇈": { "codepoints": [8648], "characters": "\u21C8" }, - "⌝": { "codepoints": [8989], "characters": "\u231D" }, - "⌝": { "codepoints": [8989], "characters": "\u231D" }, - "⌎": { "codepoints": [8974], "characters": "\u230E" }, - "Ů": { "codepoints": [366], "characters": "\u016E" }, - "ů": { "codepoints": [367], "characters": "\u016F" }, - "◹": { "codepoints": [9721], "characters": "\u25F9" }, - "𝒰": { "codepoints": [119984], "characters": "\uD835\uDCB0" }, - "𝓊": { "codepoints": [120010], "characters": "\uD835\uDCCA" }, - "⋰": { "codepoints": [8944], "characters": "\u22F0" }, - "Ũ": { "codepoints": [360], "characters": "\u0168" }, - "ũ": { "codepoints": [361], "characters": "\u0169" }, - "▵": { "codepoints": [9653], "characters": "\u25B5" }, - "▴": { "codepoints": [9652], "characters": "\u25B4" }, - "⇈": { "codepoints": [8648], "characters": "\u21C8" }, - "Ü": { "codepoints": [220], "characters": "\u00DC" }, - "Ü": { "codepoints": [220], "characters": "\u00DC" }, - "ü": { "codepoints": [252], "characters": "\u00FC" }, - "ü": { "codepoints": [252], "characters": "\u00FC" }, - "⦧": { "codepoints": [10663], "characters": "\u29A7" }, - "⦜": { "codepoints": [10652], "characters": "\u299C" }, - "ϵ": { "codepoints": [1013], "characters": "\u03F5" }, - "ϰ": { "codepoints": [1008], "characters": "\u03F0" }, - "∅": { "codepoints": [8709], "characters": "\u2205" }, - "ϕ": { "codepoints": [981], "characters": "\u03D5" }, - "ϖ": { "codepoints": [982], "characters": "\u03D6" }, - "∝": { "codepoints": [8733], "characters": "\u221D" }, - "↕": { "codepoints": [8597], "characters": "\u2195" }, - "⇕": { "codepoints": [8661], "characters": "\u21D5" }, - "ϱ": { "codepoints": [1009], "characters": "\u03F1" }, - "ς": { "codepoints": [962], "characters": "\u03C2" }, - "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" }, - "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" }, - "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" }, - "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" }, - "ϑ": { "codepoints": [977], "characters": "\u03D1" }, - "⊲": { "codepoints": [8882], "characters": "\u22B2" }, - "⊳": { "codepoints": [8883], "characters": "\u22B3" }, - "⫨": { "codepoints": [10984], "characters": "\u2AE8" }, - "⫫": { "codepoints": [10987], "characters": "\u2AEB" }, - "⫩": { "codepoints": [10985], "characters": "\u2AE9" }, - "В": { "codepoints": [1042], "characters": "\u0412" }, - "в": { "codepoints": [1074], "characters": "\u0432" }, - "⊢": { "codepoints": [8866], "characters": "\u22A2" }, - "⊨": { "codepoints": [8872], "characters": "\u22A8" }, - "⊩": { "codepoints": [8873], "characters": "\u22A9" }, - "⊫": { "codepoints": [8875], "characters": "\u22AB" }, - "⫦": { "codepoints": [10982], "characters": "\u2AE6" }, - "⊻": { "codepoints": [8891], "characters": "\u22BB" }, - "∨": { "codepoints": [8744], "characters": "\u2228" }, - "⋁": { "codepoints": [8897], "characters": "\u22C1" }, - "≚": { "codepoints": [8794], "characters": "\u225A" }, - "⋮": { "codepoints": [8942], "characters": "\u22EE" }, - "|": { "codepoints": [124], "characters": "\u007C" }, - "‖": { "codepoints": [8214], "characters": "\u2016" }, - "|": { "codepoints": [124], "characters": "\u007C" }, - "‖": { "codepoints": [8214], "characters": "\u2016" }, - "∣": { "codepoints": [8739], "characters": "\u2223" }, - "|": { "codepoints": [124], "characters": "\u007C" }, - "❘": { "codepoints": [10072], "characters": "\u2758" }, - "≀": { "codepoints": [8768], "characters": "\u2240" }, - " ": { "codepoints": [8202], "characters": "\u200A" }, - "𝔙": { "codepoints": [120089], "characters": "\uD835\uDD19" }, - "𝔳": { "codepoints": [120115], "characters": "\uD835\uDD33" }, - "⊲": { "codepoints": [8882], "characters": "\u22B2" }, - "⊂⃒": { "codepoints": [8834, 8402], "characters": "\u2282\u20D2" }, - "⊃⃒": { "codepoints": [8835, 8402], "characters": "\u2283\u20D2" }, - "𝕍": { "codepoints": [120141], "characters": "\uD835\uDD4D" }, - "𝕧": { "codepoints": [120167], "characters": "\uD835\uDD67" }, - "∝": { "codepoints": [8733], "characters": "\u221D" }, - "⊳": { "codepoints": [8883], "characters": "\u22B3" }, - "𝒱": { "codepoints": [119985], "characters": "\uD835\uDCB1" }, - "𝓋": { "codepoints": [120011], "characters": "\uD835\uDCCB" }, - "⫋︀": { "codepoints": [10955, 65024], "characters": "\u2ACB\uFE00" }, - "⊊︀": { "codepoints": [8842, 65024], "characters": "\u228A\uFE00" }, - "⫌︀": { "codepoints": [10956, 65024], "characters": "\u2ACC\uFE00" }, - "⊋︀": { "codepoints": [8843, 65024], "characters": "\u228B\uFE00" }, - "⊪": { "codepoints": [8874], "characters": "\u22AA" }, - "⦚": { "codepoints": [10650], "characters": "\u299A" }, - "Ŵ": { "codepoints": [372], "characters": "\u0174" }, - "ŵ": { "codepoints": [373], "characters": "\u0175" }, - "⩟": { "codepoints": [10847], "characters": "\u2A5F" }, - "∧": { "codepoints": [8743], "characters": "\u2227" }, - "⋀": { "codepoints": [8896], "characters": "\u22C0" }, - "≙": { "codepoints": [8793], "characters": "\u2259" }, - "℘": { "codepoints": [8472], "characters": "\u2118" }, - "𝔚": { "codepoints": [120090], "characters": "\uD835\uDD1A" }, - "𝔴": { "codepoints": [120116], "characters": "\uD835\uDD34" }, - "𝕎": { "codepoints": [120142], "characters": "\uD835\uDD4E" }, - "𝕨": { "codepoints": [120168], "characters": "\uD835\uDD68" }, - "℘": { "codepoints": [8472], "characters": "\u2118" }, - "≀": { "codepoints": [8768], "characters": "\u2240" }, - "≀": { "codepoints": [8768], "characters": "\u2240" }, - "𝒲": { "codepoints": [119986], "characters": "\uD835\uDCB2" }, - "𝓌": { "codepoints": [120012], "characters": "\uD835\uDCCC" }, - "⋂": { "codepoints": [8898], "characters": "\u22C2" }, - "◯": { "codepoints": [9711], "characters": "\u25EF" }, - "⋃": { "codepoints": [8899], "characters": "\u22C3" }, - "▽": { "codepoints": [9661], "characters": "\u25BD" }, - "𝔛": { "codepoints": [120091], "characters": "\uD835\uDD1B" }, - "𝔵": { "codepoints": [120117], "characters": "\uD835\uDD35" }, - "⟷": { "codepoints": [10231], "characters": "\u27F7" }, - "⟺": { "codepoints": [10234], "characters": "\u27FA" }, - "Ξ": { "codepoints": [926], "characters": "\u039E" }, - "ξ": { "codepoints": [958], "characters": "\u03BE" }, - "⟵": { "codepoints": [10229], "characters": "\u27F5" }, - "⟸": { "codepoints": [10232], "characters": "\u27F8" }, - "⟼": { "codepoints": [10236], "characters": "\u27FC" }, - "⋻": { "codepoints": [8955], "characters": "\u22FB" }, - "⨀": { "codepoints": [10752], "characters": "\u2A00" }, - "𝕏": { "codepoints": [120143], "characters": "\uD835\uDD4F" }, - "𝕩": { "codepoints": [120169], "characters": "\uD835\uDD69" }, - "⨁": { "codepoints": [10753], "characters": "\u2A01" }, - "⨂": { "codepoints": [10754], "characters": "\u2A02" }, - "⟶": { "codepoints": [10230], "characters": "\u27F6" }, - "⟹": { "codepoints": [10233], "characters": "\u27F9" }, - "𝒳": { "codepoints": [119987], "characters": "\uD835\uDCB3" }, - "𝓍": { "codepoints": [120013], "characters": "\uD835\uDCCD" }, - "⨆": { "codepoints": [10758], "characters": "\u2A06" }, - "⨄": { "codepoints": [10756], "characters": "\u2A04" }, - "△": { "codepoints": [9651], "characters": "\u25B3" }, - "⋁": { "codepoints": [8897], "characters": "\u22C1" }, - "⋀": { "codepoints": [8896], "characters": "\u22C0" }, - "Ý": { "codepoints": [221], "characters": "\u00DD" }, - "Ý": { "codepoints": [221], "characters": "\u00DD" }, - "ý": { "codepoints": [253], "characters": "\u00FD" }, - "ý": { "codepoints": [253], "characters": "\u00FD" }, - "Я": { "codepoints": [1071], "characters": "\u042F" }, - "я": { "codepoints": [1103], "characters": "\u044F" }, - "Ŷ": { "codepoints": [374], "characters": "\u0176" }, - "ŷ": { "codepoints": [375], "characters": "\u0177" }, - "Ы": { "codepoints": [1067], "characters": "\u042B" }, - "ы": { "codepoints": [1099], "characters": "\u044B" }, - "¥": { "codepoints": [165], "characters": "\u00A5" }, - "¥": { "codepoints": [165], "characters": "\u00A5" }, - "𝔜": { "codepoints": [120092], "characters": "\uD835\uDD1C" }, - "𝔶": { "codepoints": [120118], "characters": "\uD835\uDD36" }, - "Ї": { "codepoints": [1031], "characters": "\u0407" }, - "ї": { "codepoints": [1111], "characters": "\u0457" }, - "𝕐": { "codepoints": [120144], "characters": "\uD835\uDD50" }, - "𝕪": { "codepoints": [120170], "characters": "\uD835\uDD6A" }, - "𝒴": { "codepoints": [119988], "characters": "\uD835\uDCB4" }, - "𝓎": { "codepoints": [120014], "characters": "\uD835\uDCCE" }, - "Ю": { "codepoints": [1070], "characters": "\u042E" }, - "ю": { "codepoints": [1102], "characters": "\u044E" }, - "ÿ": { "codepoints": [255], "characters": "\u00FF" }, - "ÿ": { "codepoints": [255], "characters": "\u00FF" }, - "Ÿ": { "codepoints": [376], "characters": "\u0178" }, - "Ź": { "codepoints": [377], "characters": "\u0179" }, - "ź": { "codepoints": [378], "characters": "\u017A" }, - "Ž": { "codepoints": [381], "characters": "\u017D" }, - "ž": { "codepoints": [382], "characters": "\u017E" }, - "З": { "codepoints": [1047], "characters": "\u0417" }, - "з": { "codepoints": [1079], "characters": "\u0437" }, - "Ż": { "codepoints": [379], "characters": "\u017B" }, - "ż": { "codepoints": [380], "characters": "\u017C" }, - "ℨ": { "codepoints": [8488], "characters": "\u2128" }, - "​": { "codepoints": [8203], "characters": "\u200B" }, - "Ζ": { "codepoints": [918], "characters": "\u0396" }, - "ζ": { "codepoints": [950], "characters": "\u03B6" }, - "𝔷": { "codepoints": [120119], "characters": "\uD835\uDD37" }, - "ℨ": { "codepoints": [8488], "characters": "\u2128" }, - "Ж": { "codepoints": [1046], "characters": "\u0416" }, - "ж": { "codepoints": [1078], "characters": "\u0436" }, - "⇝": { "codepoints": [8669], "characters": "\u21DD" }, - "𝕫": { "codepoints": [120171], "characters": "\uD835\uDD6B" }, - "ℤ": { "codepoints": [8484], "characters": "\u2124" }, - "𝒵": { "codepoints": [119989], "characters": "\uD835\uDCB5" }, - "𝓏": { "codepoints": [120015], "characters": "\uD835\uDCCF" }, - "‍": { "codepoints": [8205], "characters": "\u200D" }, - "‌": { "codepoints": [8204], "characters": "\u200C" } +const ENTITIES = { + 'Á': { codepoints: [193], characters: '\u00C1' }, + 'Á': { codepoints: [193], characters: '\u00C1' }, + 'á': { codepoints: [225], characters: '\u00E1' }, + 'á': { codepoints: [225], characters: '\u00E1' }, + 'Ă': { codepoints: [258], characters: '\u0102' }, + 'ă': { codepoints: [259], characters: '\u0103' }, + '∾': { codepoints: [8766], characters: '\u223E' }, + '∿': { codepoints: [8767], characters: '\u223F' }, + '∾̳': { codepoints: [8766, 819], characters: '\u223E\u0333' }, + 'Â': { codepoints: [194], characters: '\u00C2' }, + 'Â': { codepoints: [194], characters: '\u00C2' }, + 'â': { codepoints: [226], characters: '\u00E2' }, + 'â': { codepoints: [226], characters: '\u00E2' }, + '´': { codepoints: [180], characters: '\u00B4' }, + '´': { codepoints: [180], characters: '\u00B4' }, + 'А': { codepoints: [1040], characters: '\u0410' }, + 'а': { codepoints: [1072], characters: '\u0430' }, + 'Æ': { codepoints: [198], characters: '\u00C6' }, + 'Æ': { codepoints: [198], characters: '\u00C6' }, + 'æ': { codepoints: [230], characters: '\u00E6' }, + 'æ': { codepoints: [230], characters: '\u00E6' }, + '⁡': { codepoints: [8289], characters: '\u2061' }, + '𝔄': { codepoints: [120068], characters: '\uD835\uDD04' }, + '𝔞': { codepoints: [120094], characters: '\uD835\uDD1E' }, + 'À': { codepoints: [192], characters: '\u00C0' }, + 'À': { codepoints: [192], characters: '\u00C0' }, + 'à': { codepoints: [224], characters: '\u00E0' }, + 'à': { codepoints: [224], characters: '\u00E0' }, + 'ℵ': { codepoints: [8501], characters: '\u2135' }, + 'ℵ': { codepoints: [8501], characters: '\u2135' }, + 'Α': { codepoints: [913], characters: '\u0391' }, + 'α': { codepoints: [945], characters: '\u03B1' }, + 'Ā': { codepoints: [256], characters: '\u0100' }, + 'ā': { codepoints: [257], characters: '\u0101' }, + '⨿': { codepoints: [10815], characters: '\u2A3F' }, + '&': { codepoints: [38], characters: '\u0026' }, + '&': { codepoints: [38], characters: '\u0026' }, + '&': { codepoints: [38], characters: '\u0026' }, + '&': { codepoints: [38], characters: '\u0026' }, + '⩕': { codepoints: [10837], characters: '\u2A55' }, + '⩓': { codepoints: [10835], characters: '\u2A53' }, + '∧': { codepoints: [8743], characters: '\u2227' }, + '⩜': { codepoints: [10844], characters: '\u2A5C' }, + '⩘': { codepoints: [10840], characters: '\u2A58' }, + '⩚': { codepoints: [10842], characters: '\u2A5A' }, + '∠': { codepoints: [8736], characters: '\u2220' }, + '⦤': { codepoints: [10660], characters: '\u29A4' }, + '∠': { codepoints: [8736], characters: '\u2220' }, + '⦨': { codepoints: [10664], characters: '\u29A8' }, + '⦩': { codepoints: [10665], characters: '\u29A9' }, + '⦪': { codepoints: [10666], characters: '\u29AA' }, + '⦫': { codepoints: [10667], characters: '\u29AB' }, + '⦬': { codepoints: [10668], characters: '\u29AC' }, + '⦭': { codepoints: [10669], characters: '\u29AD' }, + '⦮': { codepoints: [10670], characters: '\u29AE' }, + '⦯': { codepoints: [10671], characters: '\u29AF' }, + '∡': { codepoints: [8737], characters: '\u2221' }, + '∟': { codepoints: [8735], characters: '\u221F' }, + '⊾': { codepoints: [8894], characters: '\u22BE' }, + '⦝': { codepoints: [10653], characters: '\u299D' }, + '∢': { codepoints: [8738], characters: '\u2222' }, + 'Å': { codepoints: [197], characters: '\u00C5' }, + '⍼': { codepoints: [9084], characters: '\u237C' }, + 'Ą': { codepoints: [260], characters: '\u0104' }, + 'ą': { codepoints: [261], characters: '\u0105' }, + '𝔸': { codepoints: [120120], characters: '\uD835\uDD38' }, + '𝕒': { codepoints: [120146], characters: '\uD835\uDD52' }, + '⩯': { codepoints: [10863], characters: '\u2A6F' }, + '≈': { codepoints: [8776], characters: '\u2248' }, + '⩰': { codepoints: [10864], characters: '\u2A70' }, + '≊': { codepoints: [8778], characters: '\u224A' }, + '≋': { codepoints: [8779], characters: '\u224B' }, + ''': { codepoints: [39], characters: '\u0027' }, + '⁡': { codepoints: [8289], characters: '\u2061' }, + '≈': { codepoints: [8776], characters: '\u2248' }, + '≊': { codepoints: [8778], characters: '\u224A' }, + 'Å': { codepoints: [197], characters: '\u00C5' }, + 'Å': { codepoints: [197], characters: '\u00C5' }, + 'å': { codepoints: [229], characters: '\u00E5' }, + 'å': { codepoints: [229], characters: '\u00E5' }, + '𝒜': { codepoints: [119964], characters: '\uD835\uDC9C' }, + '𝒶': { codepoints: [119990], characters: '\uD835\uDCB6' }, + '≔': { codepoints: [8788], characters: '\u2254' }, + '*': { codepoints: [42], characters: '\u002A' }, + '≈': { codepoints: [8776], characters: '\u2248' }, + '≍': { codepoints: [8781], characters: '\u224D' }, + 'Ã': { codepoints: [195], characters: '\u00C3' }, + 'Ã': { codepoints: [195], characters: '\u00C3' }, + 'ã': { codepoints: [227], characters: '\u00E3' }, + 'ã': { codepoints: [227], characters: '\u00E3' }, + 'Ä': { codepoints: [196], characters: '\u00C4' }, + 'Ä': { codepoints: [196], characters: '\u00C4' }, + 'ä': { codepoints: [228], characters: '\u00E4' }, + 'ä': { codepoints: [228], characters: '\u00E4' }, + '∳': { codepoints: [8755], characters: '\u2233' }, + '⨑': { codepoints: [10769], characters: '\u2A11' }, + '≌': { codepoints: [8780], characters: '\u224C' }, + '϶': { codepoints: [1014], characters: '\u03F6' }, + '‵': { codepoints: [8245], characters: '\u2035' }, + '∽': { codepoints: [8765], characters: '\u223D' }, + '⋍': { codepoints: [8909], characters: '\u22CD' }, + '∖': { codepoints: [8726], characters: '\u2216' }, + '⫧': { codepoints: [10983], characters: '\u2AE7' }, + '⊽': { codepoints: [8893], characters: '\u22BD' }, + '⌅': { codepoints: [8965], characters: '\u2305' }, + '⌆': { codepoints: [8966], characters: '\u2306' }, + '⌅': { codepoints: [8965], characters: '\u2305' }, + '⎵': { codepoints: [9141], characters: '\u23B5' }, + '⎶': { codepoints: [9142], characters: '\u23B6' }, + '≌': { codepoints: [8780], characters: '\u224C' }, + 'Б': { codepoints: [1041], characters: '\u0411' }, + 'б': { codepoints: [1073], characters: '\u0431' }, + '„': { codepoints: [8222], characters: '\u201E' }, + '∵': { codepoints: [8757], characters: '\u2235' }, + '∵': { codepoints: [8757], characters: '\u2235' }, + '∵': { codepoints: [8757], characters: '\u2235' }, + '⦰': { codepoints: [10672], characters: '\u29B0' }, + '϶': { codepoints: [1014], characters: '\u03F6' }, + 'ℬ': { codepoints: [8492], characters: '\u212C' }, + 'ℬ': { codepoints: [8492], characters: '\u212C' }, + 'Β': { codepoints: [914], characters: '\u0392' }, + 'β': { codepoints: [946], characters: '\u03B2' }, + 'ℶ': { codepoints: [8502], characters: '\u2136' }, + '≬': { codepoints: [8812], characters: '\u226C' }, + '𝔅': { codepoints: [120069], characters: '\uD835\uDD05' }, + '𝔟': { codepoints: [120095], characters: '\uD835\uDD1F' }, + '⋂': { codepoints: [8898], characters: '\u22C2' }, + '◯': { codepoints: [9711], characters: '\u25EF' }, + '⋃': { codepoints: [8899], characters: '\u22C3' }, + '⨀': { codepoints: [10752], characters: '\u2A00' }, + '⨁': { codepoints: [10753], characters: '\u2A01' }, + '⨂': { codepoints: [10754], characters: '\u2A02' }, + '⨆': { codepoints: [10758], characters: '\u2A06' }, + '★': { codepoints: [9733], characters: '\u2605' }, + '▽': { codepoints: [9661], characters: '\u25BD' }, + '△': { codepoints: [9651], characters: '\u25B3' }, + '⨄': { codepoints: [10756], characters: '\u2A04' }, + '⋁': { codepoints: [8897], characters: '\u22C1' }, + '⋀': { codepoints: [8896], characters: '\u22C0' }, + '⤍': { codepoints: [10509], characters: '\u290D' }, + '⧫': { codepoints: [10731], characters: '\u29EB' }, + '▪': { codepoints: [9642], characters: '\u25AA' }, + '▴': { codepoints: [9652], characters: '\u25B4' }, + '▾': { codepoints: [9662], characters: '\u25BE' }, + '◂': { codepoints: [9666], characters: '\u25C2' }, + '▸': { codepoints: [9656], characters: '\u25B8' }, + '␣': { codepoints: [9251], characters: '\u2423' }, + '▒': { codepoints: [9618], characters: '\u2592' }, + '░': { codepoints: [9617], characters: '\u2591' }, + '▓': { codepoints: [9619], characters: '\u2593' }, + '█': { codepoints: [9608], characters: '\u2588' }, + '=⃥': { codepoints: [61, 8421], characters: '\u003D\u20E5' }, + '≡⃥': { codepoints: [8801, 8421], characters: '\u2261\u20E5' }, + '⫭': { codepoints: [10989], characters: '\u2AED' }, + '⌐': { codepoints: [8976], characters: '\u2310' }, + '𝔹': { codepoints: [120121], characters: '\uD835\uDD39' }, + '𝕓': { codepoints: [120147], characters: '\uD835\uDD53' }, + '⊥': { codepoints: [8869], characters: '\u22A5' }, + '⊥': { codepoints: [8869], characters: '\u22A5' }, + '⋈': { codepoints: [8904], characters: '\u22C8' }, + '⧉': { codepoints: [10697], characters: '\u29C9' }, + '┐': { codepoints: [9488], characters: '\u2510' }, + '╕': { codepoints: [9557], characters: '\u2555' }, + '╖': { codepoints: [9558], characters: '\u2556' }, + '╗': { codepoints: [9559], characters: '\u2557' }, + '┌': { codepoints: [9484], characters: '\u250C' }, + '╒': { codepoints: [9554], characters: '\u2552' }, + '╓': { codepoints: [9555], characters: '\u2553' }, + '╔': { codepoints: [9556], characters: '\u2554' }, + '─': { codepoints: [9472], characters: '\u2500' }, + '═': { codepoints: [9552], characters: '\u2550' }, + '┬': { codepoints: [9516], characters: '\u252C' }, + '╤': { codepoints: [9572], characters: '\u2564' }, + '╥': { codepoints: [9573], characters: '\u2565' }, + '╦': { codepoints: [9574], characters: '\u2566' }, + '┴': { codepoints: [9524], characters: '\u2534' }, + '╧': { codepoints: [9575], characters: '\u2567' }, + '╨': { codepoints: [9576], characters: '\u2568' }, + '╩': { codepoints: [9577], characters: '\u2569' }, + '⊟': { codepoints: [8863], characters: '\u229F' }, + '⊞': { codepoints: [8862], characters: '\u229E' }, + '⊠': { codepoints: [8864], characters: '\u22A0' }, + '┘': { codepoints: [9496], characters: '\u2518' }, + '╛': { codepoints: [9563], characters: '\u255B' }, + '╜': { codepoints: [9564], characters: '\u255C' }, + '╝': { codepoints: [9565], characters: '\u255D' }, + '└': { codepoints: [9492], characters: '\u2514' }, + '╘': { codepoints: [9560], characters: '\u2558' }, + '╙': { codepoints: [9561], characters: '\u2559' }, + '╚': { codepoints: [9562], characters: '\u255A' }, + '│': { codepoints: [9474], characters: '\u2502' }, + '║': { codepoints: [9553], characters: '\u2551' }, + '┼': { codepoints: [9532], characters: '\u253C' }, + '╪': { codepoints: [9578], characters: '\u256A' }, + '╫': { codepoints: [9579], characters: '\u256B' }, + '╬': { codepoints: [9580], characters: '\u256C' }, + '┤': { codepoints: [9508], characters: '\u2524' }, + '╡': { codepoints: [9569], characters: '\u2561' }, + '╢': { codepoints: [9570], characters: '\u2562' }, + '╣': { codepoints: [9571], characters: '\u2563' }, + '├': { codepoints: [9500], characters: '\u251C' }, + '╞': { codepoints: [9566], characters: '\u255E' }, + '╟': { codepoints: [9567], characters: '\u255F' }, + '╠': { codepoints: [9568], characters: '\u2560' }, + '‵': { codepoints: [8245], characters: '\u2035' }, + '˘': { codepoints: [728], characters: '\u02D8' }, + '˘': { codepoints: [728], characters: '\u02D8' }, + '¦': { codepoints: [166], characters: '\u00A6' }, + '¦': { codepoints: [166], characters: '\u00A6' }, + '𝒷': { codepoints: [119991], characters: '\uD835\uDCB7' }, + 'ℬ': { codepoints: [8492], characters: '\u212C' }, + '⁏': { codepoints: [8271], characters: '\u204F' }, + '∽': { codepoints: [8765], characters: '\u223D' }, + '⋍': { codepoints: [8909], characters: '\u22CD' }, + '⧅': { codepoints: [10693], characters: '\u29C5' }, + '\': { codepoints: [92], characters: '\u005C' }, + '⟈': { codepoints: [10184], characters: '\u27C8' }, + '•': { codepoints: [8226], characters: '\u2022' }, + '•': { codepoints: [8226], characters: '\u2022' }, + '≎': { codepoints: [8782], characters: '\u224E' }, + '⪮': { codepoints: [10926], characters: '\u2AAE' }, + '≏': { codepoints: [8783], characters: '\u224F' }, + '≎': { codepoints: [8782], characters: '\u224E' }, + '≏': { codepoints: [8783], characters: '\u224F' }, + 'Ć': { codepoints: [262], characters: '\u0106' }, + 'ć': { codepoints: [263], characters: '\u0107' }, + '⩄': { codepoints: [10820], characters: '\u2A44' }, + '⩉': { codepoints: [10825], characters: '\u2A49' }, + '⩋': { codepoints: [10827], characters: '\u2A4B' }, + '∩': { codepoints: [8745], characters: '\u2229' }, + '⋒': { codepoints: [8914], characters: '\u22D2' }, + '⩇': { codepoints: [10823], characters: '\u2A47' }, + '⩀': { codepoints: [10816], characters: '\u2A40' }, + 'ⅅ': { codepoints: [8517], characters: '\u2145' }, + '∩︀': { codepoints: [8745, 65024], characters: '\u2229\uFE00' }, + '⁁': { codepoints: [8257], characters: '\u2041' }, + 'ˇ': { codepoints: [711], characters: '\u02C7' }, + 'ℭ': { codepoints: [8493], characters: '\u212D' }, + '⩍': { codepoints: [10829], characters: '\u2A4D' }, + 'Č': { codepoints: [268], characters: '\u010C' }, + 'č': { codepoints: [269], characters: '\u010D' }, + 'Ç': { codepoints: [199], characters: '\u00C7' }, + 'Ç': { codepoints: [199], characters: '\u00C7' }, + 'ç': { codepoints: [231], characters: '\u00E7' }, + 'ç': { codepoints: [231], characters: '\u00E7' }, + 'Ĉ': { codepoints: [264], characters: '\u0108' }, + 'ĉ': { codepoints: [265], characters: '\u0109' }, + '∰': { codepoints: [8752], characters: '\u2230' }, + '⩌': { codepoints: [10828], characters: '\u2A4C' }, + '⩐': { codepoints: [10832], characters: '\u2A50' }, + 'Ċ': { codepoints: [266], characters: '\u010A' }, + 'ċ': { codepoints: [267], characters: '\u010B' }, + '¸': { codepoints: [184], characters: '\u00B8' }, + '¸': { codepoints: [184], characters: '\u00B8' }, + '¸': { codepoints: [184], characters: '\u00B8' }, + '⦲': { codepoints: [10674], characters: '\u29B2' }, + '¢': { codepoints: [162], characters: '\u00A2' }, + '¢': { codepoints: [162], characters: '\u00A2' }, + '·': { codepoints: [183], characters: '\u00B7' }, + '·': { codepoints: [183], characters: '\u00B7' }, + '𝔠': { codepoints: [120096], characters: '\uD835\uDD20' }, + 'ℭ': { codepoints: [8493], characters: '\u212D' }, + 'Ч': { codepoints: [1063], characters: '\u0427' }, + 'ч': { codepoints: [1095], characters: '\u0447' }, + '✓': { codepoints: [10003], characters: '\u2713' }, + '✓': { codepoints: [10003], characters: '\u2713' }, + 'Χ': { codepoints: [935], characters: '\u03A7' }, + 'χ': { codepoints: [967], characters: '\u03C7' }, + 'ˆ': { codepoints: [710], characters: '\u02C6' }, + '≗': { codepoints: [8791], characters: '\u2257' }, + '↺': { codepoints: [8634], characters: '\u21BA' }, + '↻': { codepoints: [8635], characters: '\u21BB' }, + '⊛': { codepoints: [8859], characters: '\u229B' }, + '⊚': { codepoints: [8858], characters: '\u229A' }, + '⊝': { codepoints: [8861], characters: '\u229D' }, + '⊙': { codepoints: [8857], characters: '\u2299' }, + '®': { codepoints: [174], characters: '\u00AE' }, + 'Ⓢ': { codepoints: [9416], characters: '\u24C8' }, + '⊖': { codepoints: [8854], characters: '\u2296' }, + '⊕': { codepoints: [8853], characters: '\u2295' }, + '⊗': { codepoints: [8855], characters: '\u2297' }, + '○': { codepoints: [9675], characters: '\u25CB' }, + '⧃': { codepoints: [10691], characters: '\u29C3' }, + '≗': { codepoints: [8791], characters: '\u2257' }, + '⨐': { codepoints: [10768], characters: '\u2A10' }, + '⫯': { codepoints: [10991], characters: '\u2AEF' }, + '⧂': { codepoints: [10690], characters: '\u29C2' }, + '∲': { codepoints: [8754], characters: '\u2232' }, + '”': { codepoints: [8221], characters: '\u201D' }, + '’': { codepoints: [8217], characters: '\u2019' }, + '♣': { codepoints: [9827], characters: '\u2663' }, + '♣': { codepoints: [9827], characters: '\u2663' }, + ':': { codepoints: [58], characters: '\u003A' }, + '∷': { codepoints: [8759], characters: '\u2237' }, + '⩴': { codepoints: [10868], characters: '\u2A74' }, + '≔': { codepoints: [8788], characters: '\u2254' }, + '≔': { codepoints: [8788], characters: '\u2254' }, + ',': { codepoints: [44], characters: '\u002C' }, + '@': { codepoints: [64], characters: '\u0040' }, + '∁': { codepoints: [8705], characters: '\u2201' }, + '∘': { codepoints: [8728], characters: '\u2218' }, + '∁': { codepoints: [8705], characters: '\u2201' }, + 'ℂ': { codepoints: [8450], characters: '\u2102' }, + '≅': { codepoints: [8773], characters: '\u2245' }, + '⩭': { codepoints: [10861], characters: '\u2A6D' }, + '≡': { codepoints: [8801], characters: '\u2261' }, + '∮': { codepoints: [8750], characters: '\u222E' }, + '∯': { codepoints: [8751], characters: '\u222F' }, + '∮': { codepoints: [8750], characters: '\u222E' }, + '𝕔': { codepoints: [120148], characters: '\uD835\uDD54' }, + 'ℂ': { codepoints: [8450], characters: '\u2102' }, + '∐': { codepoints: [8720], characters: '\u2210' }, + '∐': { codepoints: [8720], characters: '\u2210' }, + '©': { codepoints: [169], characters: '\u00A9' }, + '©': { codepoints: [169], characters: '\u00A9' }, + '©': { codepoints: [169], characters: '\u00A9' }, + '©': { codepoints: [169], characters: '\u00A9' }, + '℗': { codepoints: [8471], characters: '\u2117' }, + '∳': { codepoints: [8755], characters: '\u2233' }, + '↵': { codepoints: [8629], characters: '\u21B5' }, + '✗': { codepoints: [10007], characters: '\u2717' }, + '⨯': { codepoints: [10799], characters: '\u2A2F' }, + '𝒞': { codepoints: [119966], characters: '\uD835\uDC9E' }, + '𝒸': { codepoints: [119992], characters: '\uD835\uDCB8' }, + '⫏': { codepoints: [10959], characters: '\u2ACF' }, + '⫑': { codepoints: [10961], characters: '\u2AD1' }, + '⫐': { codepoints: [10960], characters: '\u2AD0' }, + '⫒': { codepoints: [10962], characters: '\u2AD2' }, + '⋯': { codepoints: [8943], characters: '\u22EF' }, + '⤸': { codepoints: [10552], characters: '\u2938' }, + '⤵': { codepoints: [10549], characters: '\u2935' }, + '⋞': { codepoints: [8926], characters: '\u22DE' }, + '⋟': { codepoints: [8927], characters: '\u22DF' }, + '↶': { codepoints: [8630], characters: '\u21B6' }, + '⤽': { codepoints: [10557], characters: '\u293D' }, + '⩈': { codepoints: [10824], characters: '\u2A48' }, + '⩆': { codepoints: [10822], characters: '\u2A46' }, + '≍': { codepoints: [8781], characters: '\u224D' }, + '∪': { codepoints: [8746], characters: '\u222A' }, + '⋓': { codepoints: [8915], characters: '\u22D3' }, + '⩊': { codepoints: [10826], characters: '\u2A4A' }, + '⊍': { codepoints: [8845], characters: '\u228D' }, + '⩅': { codepoints: [10821], characters: '\u2A45' }, + '∪︀': { codepoints: [8746, 65024], characters: '\u222A\uFE00' }, + '↷': { codepoints: [8631], characters: '\u21B7' }, + '⤼': { codepoints: [10556], characters: '\u293C' }, + '⋞': { codepoints: [8926], characters: '\u22DE' }, + '⋟': { codepoints: [8927], characters: '\u22DF' }, + '⋎': { codepoints: [8910], characters: '\u22CE' }, + '⋏': { codepoints: [8911], characters: '\u22CF' }, + '¤': { codepoints: [164], characters: '\u00A4' }, + '¤': { codepoints: [164], characters: '\u00A4' }, + '↶': { codepoints: [8630], characters: '\u21B6' }, + '↷': { codepoints: [8631], characters: '\u21B7' }, + '⋎': { codepoints: [8910], characters: '\u22CE' }, + '⋏': { codepoints: [8911], characters: '\u22CF' }, + '∲': { codepoints: [8754], characters: '\u2232' }, + '∱': { codepoints: [8753], characters: '\u2231' }, + '⌭': { codepoints: [9005], characters: '\u232D' }, + '†': { codepoints: [8224], characters: '\u2020' }, + '‡': { codepoints: [8225], characters: '\u2021' }, + 'ℸ': { codepoints: [8504], characters: '\u2138' }, + '↓': { codepoints: [8595], characters: '\u2193' }, + '↡': { codepoints: [8609], characters: '\u21A1' }, + '⇓': { codepoints: [8659], characters: '\u21D3' }, + '‐': { codepoints: [8208], characters: '\u2010' }, + '⫤': { codepoints: [10980], characters: '\u2AE4' }, + '⊣': { codepoints: [8867], characters: '\u22A3' }, + '⤏': { codepoints: [10511], characters: '\u290F' }, + '˝': { codepoints: [733], characters: '\u02DD' }, + 'Ď': { codepoints: [270], characters: '\u010E' }, + 'ď': { codepoints: [271], characters: '\u010F' }, + 'Д': { codepoints: [1044], characters: '\u0414' }, + 'д': { codepoints: [1076], characters: '\u0434' }, + '‡': { codepoints: [8225], characters: '\u2021' }, + '⇊': { codepoints: [8650], characters: '\u21CA' }, + 'ⅅ': { codepoints: [8517], characters: '\u2145' }, + 'ⅆ': { codepoints: [8518], characters: '\u2146' }, + '⤑': { codepoints: [10513], characters: '\u2911' }, + '⩷': { codepoints: [10871], characters: '\u2A77' }, + '°': { codepoints: [176], characters: '\u00B0' }, + '°': { codepoints: [176], characters: '\u00B0' }, + '∇': { codepoints: [8711], characters: '\u2207' }, + 'Δ': { codepoints: [916], characters: '\u0394' }, + 'δ': { codepoints: [948], characters: '\u03B4' }, + '⦱': { codepoints: [10673], characters: '\u29B1' }, + '⥿': { codepoints: [10623], characters: '\u297F' }, + '𝔇': { codepoints: [120071], characters: '\uD835\uDD07' }, + '𝔡': { codepoints: [120097], characters: '\uD835\uDD21' }, + '⥥': { codepoints: [10597], characters: '\u2965' }, + '⇃': { codepoints: [8643], characters: '\u21C3' }, + '⇂': { codepoints: [8642], characters: '\u21C2' }, + '´': { codepoints: [180], characters: '\u00B4' }, + '˙': { codepoints: [729], characters: '\u02D9' }, + '˝': { codepoints: [733], characters: '\u02DD' }, + '`': { codepoints: [96], characters: '\u0060' }, + '˜': { codepoints: [732], characters: '\u02DC' }, + '⋄': { codepoints: [8900], characters: '\u22C4' }, + '⋄': { codepoints: [8900], characters: '\u22C4' }, + '⋄': { codepoints: [8900], characters: '\u22C4' }, + '♦': { codepoints: [9830], characters: '\u2666' }, + '♦': { codepoints: [9830], characters: '\u2666' }, + '¨': { codepoints: [168], characters: '\u00A8' }, + 'ⅆ': { codepoints: [8518], characters: '\u2146' }, + 'ϝ': { codepoints: [989], characters: '\u03DD' }, + '⋲': { codepoints: [8946], characters: '\u22F2' }, + '÷': { codepoints: [247], characters: '\u00F7' }, + '÷': { codepoints: [247], characters: '\u00F7' }, + '÷': { codepoints: [247], characters: '\u00F7' }, + '⋇': { codepoints: [8903], characters: '\u22C7' }, + '⋇': { codepoints: [8903], characters: '\u22C7' }, + 'Ђ': { codepoints: [1026], characters: '\u0402' }, + 'ђ': { codepoints: [1106], characters: '\u0452' }, + '⌞': { codepoints: [8990], characters: '\u231E' }, + '⌍': { codepoints: [8973], characters: '\u230D' }, + '$': { codepoints: [36], characters: '\u0024' }, + '𝔻': { codepoints: [120123], characters: '\uD835\uDD3B' }, + '𝕕': { codepoints: [120149], characters: '\uD835\uDD55' }, + '¨': { codepoints: [168], characters: '\u00A8' }, + '˙': { codepoints: [729], characters: '\u02D9' }, + '⃜': { codepoints: [8412], characters: '\u20DC' }, + '≐': { codepoints: [8784], characters: '\u2250' }, + '≑': { codepoints: [8785], characters: '\u2251' }, + '≐': { codepoints: [8784], characters: '\u2250' }, + '∸': { codepoints: [8760], characters: '\u2238' }, + '∔': { codepoints: [8724], characters: '\u2214' }, + '⊡': { codepoints: [8865], characters: '\u22A1' }, + '⌆': { codepoints: [8966], characters: '\u2306' }, + '∯': { codepoints: [8751], characters: '\u222F' }, + '¨': { codepoints: [168], characters: '\u00A8' }, + '⇓': { codepoints: [8659], characters: '\u21D3' }, + '⇐': { codepoints: [8656], characters: '\u21D0' }, + '⇔': { codepoints: [8660], characters: '\u21D4' }, + '⫤': { codepoints: [10980], characters: '\u2AE4' }, + '⟸': { codepoints: [10232], characters: '\u27F8' }, + '⟺': { codepoints: [10234], characters: '\u27FA' }, + '⟹': { codepoints: [10233], characters: '\u27F9' }, + '⇒': { codepoints: [8658], characters: '\u21D2' }, + '⊨': { codepoints: [8872], characters: '\u22A8' }, + '⇑': { codepoints: [8657], characters: '\u21D1' }, + '⇕': { codepoints: [8661], characters: '\u21D5' }, + '∥': { codepoints: [8741], characters: '\u2225' }, + '⤓': { codepoints: [10515], characters: '\u2913' }, + '↓': { codepoints: [8595], characters: '\u2193' }, + '↓': { codepoints: [8595], characters: '\u2193' }, + '⇓': { codepoints: [8659], characters: '\u21D3' }, + '⇵': { codepoints: [8693], characters: '\u21F5' }, + '̑': { codepoints: [785], characters: '\u0311' }, + '⇊': { codepoints: [8650], characters: '\u21CA' }, + '⇃': { codepoints: [8643], characters: '\u21C3' }, + '⇂': { codepoints: [8642], characters: '\u21C2' }, + '⥐': { codepoints: [10576], characters: '\u2950' }, + '⥞': { codepoints: [10590], characters: '\u295E' }, + '⥖': { codepoints: [10582], characters: '\u2956' }, + '↽': { codepoints: [8637], characters: '\u21BD' }, + '⥟': { codepoints: [10591], characters: '\u295F' }, + '⥗': { codepoints: [10583], characters: '\u2957' }, + '⇁': { codepoints: [8641], characters: '\u21C1' }, + '↧': { codepoints: [8615], characters: '\u21A7' }, + '⊤': { codepoints: [8868], characters: '\u22A4' }, + '⤐': { codepoints: [10512], characters: '\u2910' }, + '⌟': { codepoints: [8991], characters: '\u231F' }, + '⌌': { codepoints: [8972], characters: '\u230C' }, + '𝒟': { codepoints: [119967], characters: '\uD835\uDC9F' }, + '𝒹': { codepoints: [119993], characters: '\uD835\uDCB9' }, + 'Ѕ': { codepoints: [1029], characters: '\u0405' }, + 'ѕ': { codepoints: [1109], characters: '\u0455' }, + '⧶': { codepoints: [10742], characters: '\u29F6' }, + 'Đ': { codepoints: [272], characters: '\u0110' }, + 'đ': { codepoints: [273], characters: '\u0111' }, + '⋱': { codepoints: [8945], characters: '\u22F1' }, + '▿': { codepoints: [9663], characters: '\u25BF' }, + '▾': { codepoints: [9662], characters: '\u25BE' }, + '⇵': { codepoints: [8693], characters: '\u21F5' }, + '⥯': { codepoints: [10607], characters: '\u296F' }, + '⦦': { codepoints: [10662], characters: '\u29A6' }, + 'Џ': { codepoints: [1039], characters: '\u040F' }, + 'џ': { codepoints: [1119], characters: '\u045F' }, + '⟿': { codepoints: [10239], characters: '\u27FF' }, + 'É': { codepoints: [201], characters: '\u00C9' }, + 'É': { codepoints: [201], characters: '\u00C9' }, + 'é': { codepoints: [233], characters: '\u00E9' }, + 'é': { codepoints: [233], characters: '\u00E9' }, + '⩮': { codepoints: [10862], characters: '\u2A6E' }, + 'Ě': { codepoints: [282], characters: '\u011A' }, + 'ě': { codepoints: [283], characters: '\u011B' }, + 'Ê': { codepoints: [202], characters: '\u00CA' }, + 'Ê': { codepoints: [202], characters: '\u00CA' }, + 'ê': { codepoints: [234], characters: '\u00EA' }, + 'ê': { codepoints: [234], characters: '\u00EA' }, + '≖': { codepoints: [8790], characters: '\u2256' }, + '≕': { codepoints: [8789], characters: '\u2255' }, + 'Э': { codepoints: [1069], characters: '\u042D' }, + 'э': { codepoints: [1101], characters: '\u044D' }, + '⩷': { codepoints: [10871], characters: '\u2A77' }, + 'Ė': { codepoints: [278], characters: '\u0116' }, + 'ė': { codepoints: [279], characters: '\u0117' }, + '≑': { codepoints: [8785], characters: '\u2251' }, + 'ⅇ': { codepoints: [8519], characters: '\u2147' }, + '≒': { codepoints: [8786], characters: '\u2252' }, + '𝔈': { codepoints: [120072], characters: '\uD835\uDD08' }, + '𝔢': { codepoints: [120098], characters: '\uD835\uDD22' }, + '⪚': { codepoints: [10906], characters: '\u2A9A' }, + 'È': { codepoints: [200], characters: '\u00C8' }, + 'È': { codepoints: [200], characters: '\u00C8' }, + 'è': { codepoints: [232], characters: '\u00E8' }, + 'è': { codepoints: [232], characters: '\u00E8' }, + '⪖': { codepoints: [10902], characters: '\u2A96' }, + '⪘': { codepoints: [10904], characters: '\u2A98' }, + '⪙': { codepoints: [10905], characters: '\u2A99' }, + '∈': { codepoints: [8712], characters: '\u2208' }, + '⏧': { codepoints: [9191], characters: '\u23E7' }, + 'ℓ': { codepoints: [8467], characters: '\u2113' }, + '⪕': { codepoints: [10901], characters: '\u2A95' }, + '⪗': { codepoints: [10903], characters: '\u2A97' }, + 'Ē': { codepoints: [274], characters: '\u0112' }, + 'ē': { codepoints: [275], characters: '\u0113' }, + '∅': { codepoints: [8709], characters: '\u2205' }, + '∅': { codepoints: [8709], characters: '\u2205' }, + '◻': { codepoints: [9723], characters: '\u25FB' }, + '∅': { codepoints: [8709], characters: '\u2205' }, + '▫': { codepoints: [9643], characters: '\u25AB' }, + ' ': { codepoints: [8196], characters: '\u2004' }, + ' ': { codepoints: [8197], characters: '\u2005' }, + ' ': { codepoints: [8195], characters: '\u2003' }, + 'Ŋ': { codepoints: [330], characters: '\u014A' }, + 'ŋ': { codepoints: [331], characters: '\u014B' }, + ' ': { codepoints: [8194], characters: '\u2002' }, + 'Ę': { codepoints: [280], characters: '\u0118' }, + 'ę': { codepoints: [281], characters: '\u0119' }, + '𝔼': { codepoints: [120124], characters: '\uD835\uDD3C' }, + '𝕖': { codepoints: [120150], characters: '\uD835\uDD56' }, + '⋕': { codepoints: [8917], characters: '\u22D5' }, + '⧣': { codepoints: [10723], characters: '\u29E3' }, + '⩱': { codepoints: [10865], characters: '\u2A71' }, + 'ε': { codepoints: [949], characters: '\u03B5' }, + 'Ε': { codepoints: [917], characters: '\u0395' }, + 'ε': { codepoints: [949], characters: '\u03B5' }, + 'ϵ': { codepoints: [1013], characters: '\u03F5' }, + '≖': { codepoints: [8790], characters: '\u2256' }, + '≕': { codepoints: [8789], characters: '\u2255' }, + '≂': { codepoints: [8770], characters: '\u2242' }, + '⪖': { codepoints: [10902], characters: '\u2A96' }, + '⪕': { codepoints: [10901], characters: '\u2A95' }, + '⩵': { codepoints: [10869], characters: '\u2A75' }, + '=': { codepoints: [61], characters: '\u003D' }, + '≂': { codepoints: [8770], characters: '\u2242' }, + '≟': { codepoints: [8799], characters: '\u225F' }, + '⇌': { codepoints: [8652], characters: '\u21CC' }, + '≡': { codepoints: [8801], characters: '\u2261' }, + '⩸': { codepoints: [10872], characters: '\u2A78' }, + '⧥': { codepoints: [10725], characters: '\u29E5' }, + '⥱': { codepoints: [10609], characters: '\u2971' }, + '≓': { codepoints: [8787], characters: '\u2253' }, + 'ℯ': { codepoints: [8495], characters: '\u212F' }, + 'ℰ': { codepoints: [8496], characters: '\u2130' }, + '≐': { codepoints: [8784], characters: '\u2250' }, + '⩳': { codepoints: [10867], characters: '\u2A73' }, + '≂': { codepoints: [8770], characters: '\u2242' }, + 'Η': { codepoints: [919], characters: '\u0397' }, + 'η': { codepoints: [951], characters: '\u03B7' }, + 'Ð': { codepoints: [208], characters: '\u00D0' }, + 'Ð': { codepoints: [208], characters: '\u00D0' }, + 'ð': { codepoints: [240], characters: '\u00F0' }, + 'ð': { codepoints: [240], characters: '\u00F0' }, + 'Ë': { codepoints: [203], characters: '\u00CB' }, + 'Ë': { codepoints: [203], characters: '\u00CB' }, + 'ë': { codepoints: [235], characters: '\u00EB' }, + 'ë': { codepoints: [235], characters: '\u00EB' }, + '€': { codepoints: [8364], characters: '\u20AC' }, + '!': { codepoints: [33], characters: '\u0021' }, + '∃': { codepoints: [8707], characters: '\u2203' }, + '∃': { codepoints: [8707], characters: '\u2203' }, + 'ℰ': { codepoints: [8496], characters: '\u2130' }, + 'ⅇ': { codepoints: [8519], characters: '\u2147' }, + 'ⅇ': { codepoints: [8519], characters: '\u2147' }, + '≒': { codepoints: [8786], characters: '\u2252' }, + 'Ф': { codepoints: [1060], characters: '\u0424' }, + 'ф': { codepoints: [1092], characters: '\u0444' }, + '♀': { codepoints: [9792], characters: '\u2640' }, + 'ffi': { codepoints: [64259], characters: '\uFB03' }, + 'ff': { codepoints: [64256], characters: '\uFB00' }, + 'ffl': { codepoints: [64260], characters: '\uFB04' }, + '𝔉': { codepoints: [120073], characters: '\uD835\uDD09' }, + '𝔣': { codepoints: [120099], characters: '\uD835\uDD23' }, + 'fi': { codepoints: [64257], characters: '\uFB01' }, + '◼': { codepoints: [9724], characters: '\u25FC' }, + '▪': { codepoints: [9642], characters: '\u25AA' }, + 'fj': { codepoints: [102, 106], characters: '\u0066\u006A' }, + '♭': { codepoints: [9837], characters: '\u266D' }, + 'fl': { codepoints: [64258], characters: '\uFB02' }, + '▱': { codepoints: [9649], characters: '\u25B1' }, + 'ƒ': { codepoints: [402], characters: '\u0192' }, + '𝔽': { codepoints: [120125], characters: '\uD835\uDD3D' }, + '𝕗': { codepoints: [120151], characters: '\uD835\uDD57' }, + '∀': { codepoints: [8704], characters: '\u2200' }, + '∀': { codepoints: [8704], characters: '\u2200' }, + '⋔': { codepoints: [8916], characters: '\u22D4' }, + '⫙': { codepoints: [10969], characters: '\u2AD9' }, + 'ℱ': { codepoints: [8497], characters: '\u2131' }, + '⨍': { codepoints: [10765], characters: '\u2A0D' }, + '½': { codepoints: [189], characters: '\u00BD' }, + '½': { codepoints: [189], characters: '\u00BD' }, + '⅓': { codepoints: [8531], characters: '\u2153' }, + '¼': { codepoints: [188], characters: '\u00BC' }, + '¼': { codepoints: [188], characters: '\u00BC' }, + '⅕': { codepoints: [8533], characters: '\u2155' }, + '⅙': { codepoints: [8537], characters: '\u2159' }, + '⅛': { codepoints: [8539], characters: '\u215B' }, + '⅔': { codepoints: [8532], characters: '\u2154' }, + '⅖': { codepoints: [8534], characters: '\u2156' }, + '¾': { codepoints: [190], characters: '\u00BE' }, + '¾': { codepoints: [190], characters: '\u00BE' }, + '⅗': { codepoints: [8535], characters: '\u2157' }, + '⅜': { codepoints: [8540], characters: '\u215C' }, + '⅘': { codepoints: [8536], characters: '\u2158' }, + '⅚': { codepoints: [8538], characters: '\u215A' }, + '⅝': { codepoints: [8541], characters: '\u215D' }, + '⅞': { codepoints: [8542], characters: '\u215E' }, + '⁄': { codepoints: [8260], characters: '\u2044' }, + '⌢': { codepoints: [8994], characters: '\u2322' }, + '𝒻': { codepoints: [119995], characters: '\uD835\uDCBB' }, + 'ℱ': { codepoints: [8497], characters: '\u2131' }, + 'ǵ': { codepoints: [501], characters: '\u01F5' }, + 'Γ': { codepoints: [915], characters: '\u0393' }, + 'γ': { codepoints: [947], characters: '\u03B3' }, + 'Ϝ': { codepoints: [988], characters: '\u03DC' }, + 'ϝ': { codepoints: [989], characters: '\u03DD' }, + '⪆': { codepoints: [10886], characters: '\u2A86' }, + 'Ğ': { codepoints: [286], characters: '\u011E' }, + 'ğ': { codepoints: [287], characters: '\u011F' }, + 'Ģ': { codepoints: [290], characters: '\u0122' }, + 'Ĝ': { codepoints: [284], characters: '\u011C' }, + 'ĝ': { codepoints: [285], characters: '\u011D' }, + 'Г': { codepoints: [1043], characters: '\u0413' }, + 'г': { codepoints: [1075], characters: '\u0433' }, + 'Ġ': { codepoints: [288], characters: '\u0120' }, + 'ġ': { codepoints: [289], characters: '\u0121' }, + '≥': { codepoints: [8805], characters: '\u2265' }, + '≧': { codepoints: [8807], characters: '\u2267' }, + '⪌': { codepoints: [10892], characters: '\u2A8C' }, + '⋛': { codepoints: [8923], characters: '\u22DB' }, + '≥': { codepoints: [8805], characters: '\u2265' }, + '≧': { codepoints: [8807], characters: '\u2267' }, + '⩾': { codepoints: [10878], characters: '\u2A7E' }, + '⪩': { codepoints: [10921], characters: '\u2AA9' }, + '⩾': { codepoints: [10878], characters: '\u2A7E' }, + '⪀': { codepoints: [10880], characters: '\u2A80' }, + '⪂': { codepoints: [10882], characters: '\u2A82' }, + '⪄': { codepoints: [10884], characters: '\u2A84' }, + '⋛︀': { codepoints: [8923, 65024], characters: '\u22DB\uFE00' }, + '⪔': { codepoints: [10900], characters: '\u2A94' }, + '𝔊': { codepoints: [120074], characters: '\uD835\uDD0A' }, + '𝔤': { codepoints: [120100], characters: '\uD835\uDD24' }, + '≫': { codepoints: [8811], characters: '\u226B' }, + '⋙': { codepoints: [8921], characters: '\u22D9' }, + '⋙': { codepoints: [8921], characters: '\u22D9' }, + 'ℷ': { codepoints: [8503], characters: '\u2137' }, + 'Ѓ': { codepoints: [1027], characters: '\u0403' }, + 'ѓ': { codepoints: [1107], characters: '\u0453' }, + '⪥': { codepoints: [10917], characters: '\u2AA5' }, + '≷': { codepoints: [8823], characters: '\u2277' }, + '⪒': { codepoints: [10898], characters: '\u2A92' }, + '⪤': { codepoints: [10916], characters: '\u2AA4' }, + '⪊': { codepoints: [10890], characters: '\u2A8A' }, + '⪊': { codepoints: [10890], characters: '\u2A8A' }, + '⪈': { codepoints: [10888], characters: '\u2A88' }, + '≩': { codepoints: [8809], characters: '\u2269' }, + '⪈': { codepoints: [10888], characters: '\u2A88' }, + '≩': { codepoints: [8809], characters: '\u2269' }, + '⋧': { codepoints: [8935], characters: '\u22E7' }, + '𝔾': { codepoints: [120126], characters: '\uD835\uDD3E' }, + '𝕘': { codepoints: [120152], characters: '\uD835\uDD58' }, + '`': { codepoints: [96], characters: '\u0060' }, + '≥': { codepoints: [8805], characters: '\u2265' }, + '⋛': { codepoints: [8923], characters: '\u22DB' }, + '≧': { codepoints: [8807], characters: '\u2267' }, + '⪢': { codepoints: [10914], characters: '\u2AA2' }, + '≷': { codepoints: [8823], characters: '\u2277' }, + '⩾': { codepoints: [10878], characters: '\u2A7E' }, + '≳': { codepoints: [8819], characters: '\u2273' }, + '𝒢': { codepoints: [119970], characters: '\uD835\uDCA2' }, + 'ℊ': { codepoints: [8458], characters: '\u210A' }, + '≳': { codepoints: [8819], characters: '\u2273' }, + '⪎': { codepoints: [10894], characters: '\u2A8E' }, + '⪐': { codepoints: [10896], characters: '\u2A90' }, + '⪧': { codepoints: [10919], characters: '\u2AA7' }, + '⩺': { codepoints: [10874], characters: '\u2A7A' }, + '>': { codepoints: [62], characters: '\u003E' }, + '>': { codepoints: [62], characters: '\u003E' }, + '>': { codepoints: [62], characters: '\u003E' }, + '>': { codepoints: [62], characters: '\u003E' }, + '≫': { codepoints: [8811], characters: '\u226B' }, + '⋗': { codepoints: [8919], characters: '\u22D7' }, + '⦕': { codepoints: [10645], characters: '\u2995' }, + '⩼': { codepoints: [10876], characters: '\u2A7C' }, + '⪆': { codepoints: [10886], characters: '\u2A86' }, + '⥸': { codepoints: [10616], characters: '\u2978' }, + '⋗': { codepoints: [8919], characters: '\u22D7' }, + '⋛': { codepoints: [8923], characters: '\u22DB' }, + '⪌': { codepoints: [10892], characters: '\u2A8C' }, + '≷': { codepoints: [8823], characters: '\u2277' }, + '≳': { codepoints: [8819], characters: '\u2273' }, + '≩︀': { codepoints: [8809, 65024], characters: '\u2269\uFE00' }, + '≩︀': { codepoints: [8809, 65024], characters: '\u2269\uFE00' }, + 'ˇ': { codepoints: [711], characters: '\u02C7' }, + ' ': { codepoints: [8202], characters: '\u200A' }, + '½': { codepoints: [189], characters: '\u00BD' }, + 'ℋ': { codepoints: [8459], characters: '\u210B' }, + 'Ъ': { codepoints: [1066], characters: '\u042A' }, + 'ъ': { codepoints: [1098], characters: '\u044A' }, + '⥈': { codepoints: [10568], characters: '\u2948' }, + '↔': { codepoints: [8596], characters: '\u2194' }, + '⇔': { codepoints: [8660], characters: '\u21D4' }, + '↭': { codepoints: [8621], characters: '\u21AD' }, + '^': { codepoints: [94], characters: '\u005E' }, + 'ℏ': { codepoints: [8463], characters: '\u210F' }, + 'Ĥ': { codepoints: [292], characters: '\u0124' }, + 'ĥ': { codepoints: [293], characters: '\u0125' }, + '♥': { codepoints: [9829], characters: '\u2665' }, + '♥': { codepoints: [9829], characters: '\u2665' }, + '…': { codepoints: [8230], characters: '\u2026' }, + '⊹': { codepoints: [8889], characters: '\u22B9' }, + '𝔥': { codepoints: [120101], characters: '\uD835\uDD25' }, + 'ℌ': { codepoints: [8460], characters: '\u210C' }, + 'ℋ': { codepoints: [8459], characters: '\u210B' }, + '⤥': { codepoints: [10533], characters: '\u2925' }, + '⤦': { codepoints: [10534], characters: '\u2926' }, + '⇿': { codepoints: [8703], characters: '\u21FF' }, + '∻': { codepoints: [8763], characters: '\u223B' }, + '↩': { codepoints: [8617], characters: '\u21A9' }, + '↪': { codepoints: [8618], characters: '\u21AA' }, + '𝕙': { codepoints: [120153], characters: '\uD835\uDD59' }, + 'ℍ': { codepoints: [8461], characters: '\u210D' }, + '―': { codepoints: [8213], characters: '\u2015' }, + '─': { codepoints: [9472], characters: '\u2500' }, + '𝒽': { codepoints: [119997], characters: '\uD835\uDCBD' }, + 'ℋ': { codepoints: [8459], characters: '\u210B' }, + 'ℏ': { codepoints: [8463], characters: '\u210F' }, + 'Ħ': { codepoints: [294], characters: '\u0126' }, + 'ħ': { codepoints: [295], characters: '\u0127' }, + '≎': { codepoints: [8782], characters: '\u224E' }, + '≏': { codepoints: [8783], characters: '\u224F' }, + '⁃': { codepoints: [8259], characters: '\u2043' }, + '‐': { codepoints: [8208], characters: '\u2010' }, + 'Í': { codepoints: [205], characters: '\u00CD' }, + 'Í': { codepoints: [205], characters: '\u00CD' }, + 'í': { codepoints: [237], characters: '\u00ED' }, + 'í': { codepoints: [237], characters: '\u00ED' }, + '⁣': { codepoints: [8291], characters: '\u2063' }, + 'Î': { codepoints: [206], characters: '\u00CE' }, + 'Î': { codepoints: [206], characters: '\u00CE' }, + 'î': { codepoints: [238], characters: '\u00EE' }, + 'î': { codepoints: [238], characters: '\u00EE' }, + 'И': { codepoints: [1048], characters: '\u0418' }, + 'и': { codepoints: [1080], characters: '\u0438' }, + 'İ': { codepoints: [304], characters: '\u0130' }, + 'Е': { codepoints: [1045], characters: '\u0415' }, + 'е': { codepoints: [1077], characters: '\u0435' }, + '¡': { codepoints: [161], characters: '\u00A1' }, + '¡': { codepoints: [161], characters: '\u00A1' }, + '⇔': { codepoints: [8660], characters: '\u21D4' }, + '𝔦': { codepoints: [120102], characters: '\uD835\uDD26' }, + 'ℑ': { codepoints: [8465], characters: '\u2111' }, + 'Ì': { codepoints: [204], characters: '\u00CC' }, + 'Ì': { codepoints: [204], characters: '\u00CC' }, + 'ì': { codepoints: [236], characters: '\u00EC' }, + 'ì': { codepoints: [236], characters: '\u00EC' }, + 'ⅈ': { codepoints: [8520], characters: '\u2148' }, + '⨌': { codepoints: [10764], characters: '\u2A0C' }, + '∭': { codepoints: [8749], characters: '\u222D' }, + '⧜': { codepoints: [10716], characters: '\u29DC' }, + '℩': { codepoints: [8489], characters: '\u2129' }, + 'IJ': { codepoints: [306], characters: '\u0132' }, + 'ij': { codepoints: [307], characters: '\u0133' }, + 'Ī': { codepoints: [298], characters: '\u012A' }, + 'ī': { codepoints: [299], characters: '\u012B' }, + 'ℑ': { codepoints: [8465], characters: '\u2111' }, + 'ⅈ': { codepoints: [8520], characters: '\u2148' }, + 'ℐ': { codepoints: [8464], characters: '\u2110' }, + 'ℑ': { codepoints: [8465], characters: '\u2111' }, + 'ı': { codepoints: [305], characters: '\u0131' }, + 'ℑ': { codepoints: [8465], characters: '\u2111' }, + '⊷': { codepoints: [8887], characters: '\u22B7' }, + 'Ƶ': { codepoints: [437], characters: '\u01B5' }, + '⇒': { codepoints: [8658], characters: '\u21D2' }, + '℅': { codepoints: [8453], characters: '\u2105' }, + '∈': { codepoints: [8712], characters: '\u2208' }, + '∞': { codepoints: [8734], characters: '\u221E' }, + '⧝': { codepoints: [10717], characters: '\u29DD' }, + 'ı': { codepoints: [305], characters: '\u0131' }, + '⊺': { codepoints: [8890], characters: '\u22BA' }, + '∫': { codepoints: [8747], characters: '\u222B' }, + '∬': { codepoints: [8748], characters: '\u222C' }, + 'ℤ': { codepoints: [8484], characters: '\u2124' }, + '∫': { codepoints: [8747], characters: '\u222B' }, + '⊺': { codepoints: [8890], characters: '\u22BA' }, + '⋂': { codepoints: [8898], characters: '\u22C2' }, + '⨗': { codepoints: [10775], characters: '\u2A17' }, + '⨼': { codepoints: [10812], characters: '\u2A3C' }, + '⁣': { codepoints: [8291], characters: '\u2063' }, + '⁢': { codepoints: [8290], characters: '\u2062' }, + 'Ё': { codepoints: [1025], characters: '\u0401' }, + 'ё': { codepoints: [1105], characters: '\u0451' }, + 'Į': { codepoints: [302], characters: '\u012E' }, + 'į': { codepoints: [303], characters: '\u012F' }, + '𝕀': { codepoints: [120128], characters: '\uD835\uDD40' }, + '𝕚': { codepoints: [120154], characters: '\uD835\uDD5A' }, + 'Ι': { codepoints: [921], characters: '\u0399' }, + 'ι': { codepoints: [953], characters: '\u03B9' }, + '⨼': { codepoints: [10812], characters: '\u2A3C' }, + '¿': { codepoints: [191], characters: '\u00BF' }, + '¿': { codepoints: [191], characters: '\u00BF' }, + '𝒾': { codepoints: [119998], characters: '\uD835\uDCBE' }, + 'ℐ': { codepoints: [8464], characters: '\u2110' }, + '∈': { codepoints: [8712], characters: '\u2208' }, + '⋵': { codepoints: [8949], characters: '\u22F5' }, + '⋹': { codepoints: [8953], characters: '\u22F9' }, + '⋴': { codepoints: [8948], characters: '\u22F4' }, + '⋳': { codepoints: [8947], characters: '\u22F3' }, + '∈': { codepoints: [8712], characters: '\u2208' }, + '⁢': { codepoints: [8290], characters: '\u2062' }, + 'Ĩ': { codepoints: [296], characters: '\u0128' }, + 'ĩ': { codepoints: [297], characters: '\u0129' }, + 'І': { codepoints: [1030], characters: '\u0406' }, + 'і': { codepoints: [1110], characters: '\u0456' }, + 'Ï': { codepoints: [207], characters: '\u00CF' }, + 'Ï': { codepoints: [207], characters: '\u00CF' }, + 'ï': { codepoints: [239], characters: '\u00EF' }, + 'ï': { codepoints: [239], characters: '\u00EF' }, + 'Ĵ': { codepoints: [308], characters: '\u0134' }, + 'ĵ': { codepoints: [309], characters: '\u0135' }, + 'Й': { codepoints: [1049], characters: '\u0419' }, + 'й': { codepoints: [1081], characters: '\u0439' }, + '𝔍': { codepoints: [120077], characters: '\uD835\uDD0D' }, + '𝔧': { codepoints: [120103], characters: '\uD835\uDD27' }, + 'ȷ': { codepoints: [567], characters: '\u0237' }, + '𝕁': { codepoints: [120129], characters: '\uD835\uDD41' }, + '𝕛': { codepoints: [120155], characters: '\uD835\uDD5B' }, + '𝒥': { codepoints: [119973], characters: '\uD835\uDCA5' }, + '𝒿': { codepoints: [119999], characters: '\uD835\uDCBF' }, + 'Ј': { codepoints: [1032], characters: '\u0408' }, + 'ј': { codepoints: [1112], characters: '\u0458' }, + 'Є': { codepoints: [1028], characters: '\u0404' }, + 'є': { codepoints: [1108], characters: '\u0454' }, + 'Κ': { codepoints: [922], characters: '\u039A' }, + 'κ': { codepoints: [954], characters: '\u03BA' }, + 'ϰ': { codepoints: [1008], characters: '\u03F0' }, + 'Ķ': { codepoints: [310], characters: '\u0136' }, + 'ķ': { codepoints: [311], characters: '\u0137' }, + 'К': { codepoints: [1050], characters: '\u041A' }, + 'к': { codepoints: [1082], characters: '\u043A' }, + '𝔎': { codepoints: [120078], characters: '\uD835\uDD0E' }, + '𝔨': { codepoints: [120104], characters: '\uD835\uDD28' }, + 'ĸ': { codepoints: [312], characters: '\u0138' }, + 'Х': { codepoints: [1061], characters: '\u0425' }, + 'х': { codepoints: [1093], characters: '\u0445' }, + 'Ќ': { codepoints: [1036], characters: '\u040C' }, + 'ќ': { codepoints: [1116], characters: '\u045C' }, + '𝕂': { codepoints: [120130], characters: '\uD835\uDD42' }, + '𝕜': { codepoints: [120156], characters: '\uD835\uDD5C' }, + '𝒦': { codepoints: [119974], characters: '\uD835\uDCA6' }, + '𝓀': { codepoints: [120000], characters: '\uD835\uDCC0' }, + '⇚': { codepoints: [8666], characters: '\u21DA' }, + 'Ĺ': { codepoints: [313], characters: '\u0139' }, + 'ĺ': { codepoints: [314], characters: '\u013A' }, + '⦴': { codepoints: [10676], characters: '\u29B4' }, + 'ℒ': { codepoints: [8466], characters: '\u2112' }, + 'Λ': { codepoints: [923], characters: '\u039B' }, + 'λ': { codepoints: [955], characters: '\u03BB' }, + '⟨': { codepoints: [10216], characters: '\u27E8' }, + '⟪': { codepoints: [10218], characters: '\u27EA' }, + '⦑': { codepoints: [10641], characters: '\u2991' }, + '⟨': { codepoints: [10216], characters: '\u27E8' }, + '⪅': { codepoints: [10885], characters: '\u2A85' }, + 'ℒ': { codepoints: [8466], characters: '\u2112' }, + '«': { codepoints: [171], characters: '\u00AB' }, + '«': { codepoints: [171], characters: '\u00AB' }, + '⇤': { codepoints: [8676], characters: '\u21E4' }, + '⤟': { codepoints: [10527], characters: '\u291F' }, + '←': { codepoints: [8592], characters: '\u2190' }, + '↞': { codepoints: [8606], characters: '\u219E' }, + '⇐': { codepoints: [8656], characters: '\u21D0' }, + '⤝': { codepoints: [10525], characters: '\u291D' }, + '↩': { codepoints: [8617], characters: '\u21A9' }, + '↫': { codepoints: [8619], characters: '\u21AB' }, + '⤹': { codepoints: [10553], characters: '\u2939' }, + '⥳': { codepoints: [10611], characters: '\u2973' }, + '↢': { codepoints: [8610], characters: '\u21A2' }, + '⤙': { codepoints: [10521], characters: '\u2919' }, + '⤛': { codepoints: [10523], characters: '\u291B' }, + '⪫': { codepoints: [10923], characters: '\u2AAB' }, + '⪭': { codepoints: [10925], characters: '\u2AAD' }, + '⪭︀': { codepoints: [10925, 65024], characters: '\u2AAD\uFE00' }, + '⤌': { codepoints: [10508], characters: '\u290C' }, + '⤎': { codepoints: [10510], characters: '\u290E' }, + '❲': { codepoints: [10098], characters: '\u2772' }, + '{': { codepoints: [123], characters: '\u007B' }, + '[': { codepoints: [91], characters: '\u005B' }, + '⦋': { codepoints: [10635], characters: '\u298B' }, + '⦏': { codepoints: [10639], characters: '\u298F' }, + '⦍': { codepoints: [10637], characters: '\u298D' }, + 'Ľ': { codepoints: [317], characters: '\u013D' }, + 'ľ': { codepoints: [318], characters: '\u013E' }, + 'Ļ': { codepoints: [315], characters: '\u013B' }, + 'ļ': { codepoints: [316], characters: '\u013C' }, + '⌈': { codepoints: [8968], characters: '\u2308' }, + '{': { codepoints: [123], characters: '\u007B' }, + 'Л': { codepoints: [1051], characters: '\u041B' }, + 'л': { codepoints: [1083], characters: '\u043B' }, + '⤶': { codepoints: [10550], characters: '\u2936' }, + '“': { codepoints: [8220], characters: '\u201C' }, + '„': { codepoints: [8222], characters: '\u201E' }, + '⥧': { codepoints: [10599], characters: '\u2967' }, + '⥋': { codepoints: [10571], characters: '\u294B' }, + '↲': { codepoints: [8626], characters: '\u21B2' }, + '≤': { codepoints: [8804], characters: '\u2264' }, + '≦': { codepoints: [8806], characters: '\u2266' }, + '⟨': { codepoints: [10216], characters: '\u27E8' }, + '⇤': { codepoints: [8676], characters: '\u21E4' }, + '←': { codepoints: [8592], characters: '\u2190' }, + '←': { codepoints: [8592], characters: '\u2190' }, + '⇐': { codepoints: [8656], characters: '\u21D0' }, + '⇆': { codepoints: [8646], characters: '\u21C6' }, + '↢': { codepoints: [8610], characters: '\u21A2' }, + '⌈': { codepoints: [8968], characters: '\u2308' }, + '⟦': { codepoints: [10214], characters: '\u27E6' }, + '⥡': { codepoints: [10593], characters: '\u2961' }, + '⥙': { codepoints: [10585], characters: '\u2959' }, + '⇃': { codepoints: [8643], characters: '\u21C3' }, + '⌊': { codepoints: [8970], characters: '\u230A' }, + '↽': { codepoints: [8637], characters: '\u21BD' }, + '↼': { codepoints: [8636], characters: '\u21BC' }, + '⇇': { codepoints: [8647], characters: '\u21C7' }, + '↔': { codepoints: [8596], characters: '\u2194' }, + '↔': { codepoints: [8596], characters: '\u2194' }, + '⇔': { codepoints: [8660], characters: '\u21D4' }, + '⇆': { codepoints: [8646], characters: '\u21C6' }, + '⇋': { codepoints: [8651], characters: '\u21CB' }, + '↭': { codepoints: [8621], characters: '\u21AD' }, + '⥎': { codepoints: [10574], characters: '\u294E' }, + '↤': { codepoints: [8612], characters: '\u21A4' }, + '⊣': { codepoints: [8867], characters: '\u22A3' }, + '⥚': { codepoints: [10586], characters: '\u295A' }, + '⋋': { codepoints: [8907], characters: '\u22CB' }, + '⧏': { codepoints: [10703], characters: '\u29CF' }, + '⊲': { codepoints: [8882], characters: '\u22B2' }, + '⊴': { codepoints: [8884], characters: '\u22B4' }, + '⥑': { codepoints: [10577], characters: '\u2951' }, + '⥠': { codepoints: [10592], characters: '\u2960' }, + '⥘': { codepoints: [10584], characters: '\u2958' }, + '↿': { codepoints: [8639], characters: '\u21BF' }, + '⥒': { codepoints: [10578], characters: '\u2952' }, + '↼': { codepoints: [8636], characters: '\u21BC' }, + '⪋': { codepoints: [10891], characters: '\u2A8B' }, + '⋚': { codepoints: [8922], characters: '\u22DA' }, + '≤': { codepoints: [8804], characters: '\u2264' }, + '≦': { codepoints: [8806], characters: '\u2266' }, + '⩽': { codepoints: [10877], characters: '\u2A7D' }, + '⪨': { codepoints: [10920], characters: '\u2AA8' }, + '⩽': { codepoints: [10877], characters: '\u2A7D' }, + '⩿': { codepoints: [10879], characters: '\u2A7F' }, + '⪁': { codepoints: [10881], characters: '\u2A81' }, + '⪃': { codepoints: [10883], characters: '\u2A83' }, + '⋚︀': { codepoints: [8922, 65024], characters: '\u22DA\uFE00' }, + '⪓': { codepoints: [10899], characters: '\u2A93' }, + '⪅': { codepoints: [10885], characters: '\u2A85' }, + '⋖': { codepoints: [8918], characters: '\u22D6' }, + '⋚': { codepoints: [8922], characters: '\u22DA' }, + '⪋': { codepoints: [10891], characters: '\u2A8B' }, + '⋚': { codepoints: [8922], characters: '\u22DA' }, + '≦': { codepoints: [8806], characters: '\u2266' }, + '≶': { codepoints: [8822], characters: '\u2276' }, + '≶': { codepoints: [8822], characters: '\u2276' }, + '⪡': { codepoints: [10913], characters: '\u2AA1' }, + '≲': { codepoints: [8818], characters: '\u2272' }, + '⩽': { codepoints: [10877], characters: '\u2A7D' }, + '≲': { codepoints: [8818], characters: '\u2272' }, + '⥼': { codepoints: [10620], characters: '\u297C' }, + '⌊': { codepoints: [8970], characters: '\u230A' }, + '𝔏': { codepoints: [120079], characters: '\uD835\uDD0F' }, + '𝔩': { codepoints: [120105], characters: '\uD835\uDD29' }, + '≶': { codepoints: [8822], characters: '\u2276' }, + '⪑': { codepoints: [10897], characters: '\u2A91' }, + '⥢': { codepoints: [10594], characters: '\u2962' }, + '↽': { codepoints: [8637], characters: '\u21BD' }, + '↼': { codepoints: [8636], characters: '\u21BC' }, + '⥪': { codepoints: [10602], characters: '\u296A' }, + '▄': { codepoints: [9604], characters: '\u2584' }, + 'Љ': { codepoints: [1033], characters: '\u0409' }, + 'љ': { codepoints: [1113], characters: '\u0459' }, + '⇇': { codepoints: [8647], characters: '\u21C7' }, + '≪': { codepoints: [8810], characters: '\u226A' }, + '⋘': { codepoints: [8920], characters: '\u22D8' }, + '⌞': { codepoints: [8990], characters: '\u231E' }, + '⇚': { codepoints: [8666], characters: '\u21DA' }, + '⥫': { codepoints: [10603], characters: '\u296B' }, + '◺': { codepoints: [9722], characters: '\u25FA' }, + 'Ŀ': { codepoints: [319], characters: '\u013F' }, + 'ŀ': { codepoints: [320], characters: '\u0140' }, + '⎰': { codepoints: [9136], characters: '\u23B0' }, + '⎰': { codepoints: [9136], characters: '\u23B0' }, + '⪉': { codepoints: [10889], characters: '\u2A89' }, + '⪉': { codepoints: [10889], characters: '\u2A89' }, + '⪇': { codepoints: [10887], characters: '\u2A87' }, + '≨': { codepoints: [8808], characters: '\u2268' }, + '⪇': { codepoints: [10887], characters: '\u2A87' }, + '≨': { codepoints: [8808], characters: '\u2268' }, + '⋦': { codepoints: [8934], characters: '\u22E6' }, + '⟬': { codepoints: [10220], characters: '\u27EC' }, + '⇽': { codepoints: [8701], characters: '\u21FD' }, + '⟦': { codepoints: [10214], characters: '\u27E6' }, + '⟵': { codepoints: [10229], characters: '\u27F5' }, + '⟵': { codepoints: [10229], characters: '\u27F5' }, + '⟸': { codepoints: [10232], characters: '\u27F8' }, + '⟷': { codepoints: [10231], characters: '\u27F7' }, + '⟷': { codepoints: [10231], characters: '\u27F7' }, + '⟺': { codepoints: [10234], characters: '\u27FA' }, + '⟼': { codepoints: [10236], characters: '\u27FC' }, + '⟶': { codepoints: [10230], characters: '\u27F6' }, + '⟶': { codepoints: [10230], characters: '\u27F6' }, + '⟹': { codepoints: [10233], characters: '\u27F9' }, + '↫': { codepoints: [8619], characters: '\u21AB' }, + '↬': { codepoints: [8620], characters: '\u21AC' }, + '⦅': { codepoints: [10629], characters: '\u2985' }, + '𝕃': { codepoints: [120131], characters: '\uD835\uDD43' }, + '𝕝': { codepoints: [120157], characters: '\uD835\uDD5D' }, + '⨭': { codepoints: [10797], characters: '\u2A2D' }, + '⨴': { codepoints: [10804], characters: '\u2A34' }, + '∗': { codepoints: [8727], characters: '\u2217' }, + '_': { codepoints: [95], characters: '\u005F' }, + '↙': { codepoints: [8601], characters: '\u2199' }, + '↘': { codepoints: [8600], characters: '\u2198' }, + '◊': { codepoints: [9674], characters: '\u25CA' }, + '◊': { codepoints: [9674], characters: '\u25CA' }, + '⧫': { codepoints: [10731], characters: '\u29EB' }, + '(': { codepoints: [40], characters: '\u0028' }, + '⦓': { codepoints: [10643], characters: '\u2993' }, + '⇆': { codepoints: [8646], characters: '\u21C6' }, + '⌟': { codepoints: [8991], characters: '\u231F' }, + '⇋': { codepoints: [8651], characters: '\u21CB' }, + '⥭': { codepoints: [10605], characters: '\u296D' }, + '‎': { codepoints: [8206], characters: '\u200E' }, + '⊿': { codepoints: [8895], characters: '\u22BF' }, + '‹': { codepoints: [8249], characters: '\u2039' }, + '𝓁': { codepoints: [120001], characters: '\uD835\uDCC1' }, + 'ℒ': { codepoints: [8466], characters: '\u2112' }, + '↰': { codepoints: [8624], characters: '\u21B0' }, + '↰': { codepoints: [8624], characters: '\u21B0' }, + '≲': { codepoints: [8818], characters: '\u2272' }, + '⪍': { codepoints: [10893], characters: '\u2A8D' }, + '⪏': { codepoints: [10895], characters: '\u2A8F' }, + '[': { codepoints: [91], characters: '\u005B' }, + '‘': { codepoints: [8216], characters: '\u2018' }, + '‚': { codepoints: [8218], characters: '\u201A' }, + 'Ł': { codepoints: [321], characters: '\u0141' }, + 'ł': { codepoints: [322], characters: '\u0142' }, + '⪦': { codepoints: [10918], characters: '\u2AA6' }, + '⩹': { codepoints: [10873], characters: '\u2A79' }, + '<': { codepoints: [60], characters: '\u003C' }, + '<': { codepoints: [60], characters: '\u003C' }, + '<': { codepoints: [60], characters: '\u003C' }, + '<': { codepoints: [60], characters: '\u003C' }, + '≪': { codepoints: [8810], characters: '\u226A' }, + '⋖': { codepoints: [8918], characters: '\u22D6' }, + '⋋': { codepoints: [8907], characters: '\u22CB' }, + '⋉': { codepoints: [8905], characters: '\u22C9' }, + '⥶': { codepoints: [10614], characters: '\u2976' }, + '⩻': { codepoints: [10875], characters: '\u2A7B' }, + '◃': { codepoints: [9667], characters: '\u25C3' }, + '⊴': { codepoints: [8884], characters: '\u22B4' }, + '◂': { codepoints: [9666], characters: '\u25C2' }, + '⦖': { codepoints: [10646], characters: '\u2996' }, + '⥊': { codepoints: [10570], characters: '\u294A' }, + '⥦': { codepoints: [10598], characters: '\u2966' }, + '≨︀': { codepoints: [8808, 65024], characters: '\u2268\uFE00' }, + '≨︀': { codepoints: [8808, 65024], characters: '\u2268\uFE00' }, + '¯': { codepoints: [175], characters: '\u00AF' }, + '¯': { codepoints: [175], characters: '\u00AF' }, + '♂': { codepoints: [9794], characters: '\u2642' }, + '✠': { codepoints: [10016], characters: '\u2720' }, + '✠': { codepoints: [10016], characters: '\u2720' }, + '⤅': { codepoints: [10501], characters: '\u2905' }, + '↦': { codepoints: [8614], characters: '\u21A6' }, + '↦': { codepoints: [8614], characters: '\u21A6' }, + '↧': { codepoints: [8615], characters: '\u21A7' }, + '↤': { codepoints: [8612], characters: '\u21A4' }, + '↥': { codepoints: [8613], characters: '\u21A5' }, + '▮': { codepoints: [9646], characters: '\u25AE' }, + '⨩': { codepoints: [10793], characters: '\u2A29' }, + 'М': { codepoints: [1052], characters: '\u041C' }, + 'м': { codepoints: [1084], characters: '\u043C' }, + '—': { codepoints: [8212], characters: '\u2014' }, + '∺': { codepoints: [8762], characters: '\u223A' }, + '∡': { codepoints: [8737], characters: '\u2221' }, + ' ': { codepoints: [8287], characters: '\u205F' }, + 'ℳ': { codepoints: [8499], characters: '\u2133' }, + '𝔐': { codepoints: [120080], characters: '\uD835\uDD10' }, + '𝔪': { codepoints: [120106], characters: '\uD835\uDD2A' }, + '℧': { codepoints: [8487], characters: '\u2127' }, + 'µ': { codepoints: [181], characters: '\u00B5' }, + 'µ': { codepoints: [181], characters: '\u00B5' }, + '*': { codepoints: [42], characters: '\u002A' }, + '⫰': { codepoints: [10992], characters: '\u2AF0' }, + '∣': { codepoints: [8739], characters: '\u2223' }, + '·': { codepoints: [183], characters: '\u00B7' }, + '·': { codepoints: [183], characters: '\u00B7' }, + '⊟': { codepoints: [8863], characters: '\u229F' }, + '−': { codepoints: [8722], characters: '\u2212' }, + '∸': { codepoints: [8760], characters: '\u2238' }, + '⨪': { codepoints: [10794], characters: '\u2A2A' }, + '∓': { codepoints: [8723], characters: '\u2213' }, + '⫛': { codepoints: [10971], characters: '\u2ADB' }, + '…': { codepoints: [8230], characters: '\u2026' }, + '∓': { codepoints: [8723], characters: '\u2213' }, + '⊧': { codepoints: [8871], characters: '\u22A7' }, + '𝕄': { codepoints: [120132], characters: '\uD835\uDD44' }, + '𝕞': { codepoints: [120158], characters: '\uD835\uDD5E' }, + '∓': { codepoints: [8723], characters: '\u2213' }, + '𝓂': { codepoints: [120002], characters: '\uD835\uDCC2' }, + 'ℳ': { codepoints: [8499], characters: '\u2133' }, + '∾': { codepoints: [8766], characters: '\u223E' }, + 'Μ': { codepoints: [924], characters: '\u039C' }, + 'μ': { codepoints: [956], characters: '\u03BC' }, + '⊸': { codepoints: [8888], characters: '\u22B8' }, + '⊸': { codepoints: [8888], characters: '\u22B8' }, + '∇': { codepoints: [8711], characters: '\u2207' }, + 'Ń': { codepoints: [323], characters: '\u0143' }, + 'ń': { codepoints: [324], characters: '\u0144' }, + '∠⃒': { codepoints: [8736, 8402], characters: '\u2220\u20D2' }, + '≉': { codepoints: [8777], characters: '\u2249' }, + '⩰̸': { codepoints: [10864, 824], characters: '\u2A70\u0338' }, + '≋̸': { codepoints: [8779, 824], characters: '\u224B\u0338' }, + 'ʼn': { codepoints: [329], characters: '\u0149' }, + '≉': { codepoints: [8777], characters: '\u2249' }, + '♮': { codepoints: [9838], characters: '\u266E' }, + 'ℕ': { codepoints: [8469], characters: '\u2115' }, + '♮': { codepoints: [9838], characters: '\u266E' }, + ' ': { codepoints: [160], characters: '\u00A0' }, + ' ': { codepoints: [160], characters: '\u00A0' }, + '≎̸': { codepoints: [8782, 824], characters: '\u224E\u0338' }, + '≏̸': { codepoints: [8783, 824], characters: '\u224F\u0338' }, + '⩃': { codepoints: [10819], characters: '\u2A43' }, + 'Ň': { codepoints: [327], characters: '\u0147' }, + 'ň': { codepoints: [328], characters: '\u0148' }, + 'Ņ': { codepoints: [325], characters: '\u0145' }, + 'ņ': { codepoints: [326], characters: '\u0146' }, + '≇': { codepoints: [8775], characters: '\u2247' }, + '⩭̸': { codepoints: [10861, 824], characters: '\u2A6D\u0338' }, + '⩂': { codepoints: [10818], characters: '\u2A42' }, + 'Н': { codepoints: [1053], characters: '\u041D' }, + 'н': { codepoints: [1085], characters: '\u043D' }, + '–': { codepoints: [8211], characters: '\u2013' }, + '⤤': { codepoints: [10532], characters: '\u2924' }, + '↗': { codepoints: [8599], characters: '\u2197' }, + '⇗': { codepoints: [8663], characters: '\u21D7' }, + '↗': { codepoints: [8599], characters: '\u2197' }, + '≠': { codepoints: [8800], characters: '\u2260' }, + '≐̸': { codepoints: [8784, 824], characters: '\u2250\u0338' }, + '​': { codepoints: [8203], characters: '\u200B' }, + '​': { codepoints: [8203], characters: '\u200B' }, + '​': { codepoints: [8203], characters: '\u200B' }, + '​': { codepoints: [8203], characters: '\u200B' }, + '≢': { codepoints: [8802], characters: '\u2262' }, + '⤨': { codepoints: [10536], characters: '\u2928' }, + '≂̸': { codepoints: [8770, 824], characters: '\u2242\u0338' }, + '≫': { codepoints: [8811], characters: '\u226B' }, + '≪': { codepoints: [8810], characters: '\u226A' }, + ' ': { codepoints: [10], characters: '\u000A' }, + '∄': { codepoints: [8708], characters: '\u2204' }, + '∄': { codepoints: [8708], characters: '\u2204' }, + '𝔑': { codepoints: [120081], characters: '\uD835\uDD11' }, + '𝔫': { codepoints: [120107], characters: '\uD835\uDD2B' }, + '≧̸': { codepoints: [8807, 824], characters: '\u2267\u0338' }, + '≱': { codepoints: [8817], characters: '\u2271' }, + '≱': { codepoints: [8817], characters: '\u2271' }, + '≧̸': { codepoints: [8807, 824], characters: '\u2267\u0338' }, + '⩾̸': { codepoints: [10878, 824], characters: '\u2A7E\u0338' }, + '⩾̸': { codepoints: [10878, 824], characters: '\u2A7E\u0338' }, + '⋙̸': { codepoints: [8921, 824], characters: '\u22D9\u0338' }, + '≵': { codepoints: [8821], characters: '\u2275' }, + '≫⃒': { codepoints: [8811, 8402], characters: '\u226B\u20D2' }, + '≯': { codepoints: [8815], characters: '\u226F' }, + '≯': { codepoints: [8815], characters: '\u226F' }, + '≫̸': { codepoints: [8811, 824], characters: '\u226B\u0338' }, + '↮': { codepoints: [8622], characters: '\u21AE' }, + '⇎': { codepoints: [8654], characters: '\u21CE' }, + '⫲': { codepoints: [10994], characters: '\u2AF2' }, + '∋': { codepoints: [8715], characters: '\u220B' }, + '⋼': { codepoints: [8956], characters: '\u22FC' }, + '⋺': { codepoints: [8954], characters: '\u22FA' }, + '∋': { codepoints: [8715], characters: '\u220B' }, + 'Њ': { codepoints: [1034], characters: '\u040A' }, + 'њ': { codepoints: [1114], characters: '\u045A' }, + '↚': { codepoints: [8602], characters: '\u219A' }, + '⇍': { codepoints: [8653], characters: '\u21CD' }, + '‥': { codepoints: [8229], characters: '\u2025' }, + '≦̸': { codepoints: [8806, 824], characters: '\u2266\u0338' }, + '≰': { codepoints: [8816], characters: '\u2270' }, + '↚': { codepoints: [8602], characters: '\u219A' }, + '⇍': { codepoints: [8653], characters: '\u21CD' }, + '↮': { codepoints: [8622], characters: '\u21AE' }, + '⇎': { codepoints: [8654], characters: '\u21CE' }, + '≰': { codepoints: [8816], characters: '\u2270' }, + '≦̸': { codepoints: [8806, 824], characters: '\u2266\u0338' }, + '⩽̸': { codepoints: [10877, 824], characters: '\u2A7D\u0338' }, + '⩽̸': { codepoints: [10877, 824], characters: '\u2A7D\u0338' }, + '≮': { codepoints: [8814], characters: '\u226E' }, + '⋘̸': { codepoints: [8920, 824], characters: '\u22D8\u0338' }, + '≴': { codepoints: [8820], characters: '\u2274' }, + '≪⃒': { codepoints: [8810, 8402], characters: '\u226A\u20D2' }, + '≮': { codepoints: [8814], characters: '\u226E' }, + '⋪': { codepoints: [8938], characters: '\u22EA' }, + '⋬': { codepoints: [8940], characters: '\u22EC' }, + '≪̸': { codepoints: [8810, 824], characters: '\u226A\u0338' }, + '∤': { codepoints: [8740], characters: '\u2224' }, + '⁠': { codepoints: [8288], characters: '\u2060' }, + ' ': { codepoints: [160], characters: '\u00A0' }, + '𝕟': { codepoints: [120159], characters: '\uD835\uDD5F' }, + 'ℕ': { codepoints: [8469], characters: '\u2115' }, + '⫬': { codepoints: [10988], characters: '\u2AEC' }, + '¬': { codepoints: [172], characters: '\u00AC' }, + '¬': { codepoints: [172], characters: '\u00AC' }, + '≢': { codepoints: [8802], characters: '\u2262' }, + '≭': { codepoints: [8813], characters: '\u226D' }, + '∦': { codepoints: [8742], characters: '\u2226' }, + '∉': { codepoints: [8713], characters: '\u2209' }, + '≠': { codepoints: [8800], characters: '\u2260' }, + '≂̸': { codepoints: [8770, 824], characters: '\u2242\u0338' }, + '∄': { codepoints: [8708], characters: '\u2204' }, + '≯': { codepoints: [8815], characters: '\u226F' }, + '≱': { codepoints: [8817], characters: '\u2271' }, + '≧̸': { codepoints: [8807, 824], characters: '\u2267\u0338' }, + '≫̸': { codepoints: [8811, 824], characters: '\u226B\u0338' }, + '≹': { codepoints: [8825], characters: '\u2279' }, + '⩾̸': { codepoints: [10878, 824], characters: '\u2A7E\u0338' }, + '≵': { codepoints: [8821], characters: '\u2275' }, + '≎̸': { codepoints: [8782, 824], characters: '\u224E\u0338' }, + '≏̸': { codepoints: [8783, 824], characters: '\u224F\u0338' }, + '∉': { codepoints: [8713], characters: '\u2209' }, + '⋵̸': { codepoints: [8949, 824], characters: '\u22F5\u0338' }, + '⋹̸': { codepoints: [8953, 824], characters: '\u22F9\u0338' }, + '∉': { codepoints: [8713], characters: '\u2209' }, + '⋷': { codepoints: [8951], characters: '\u22F7' }, + '⋶': { codepoints: [8950], characters: '\u22F6' }, + '⧏̸': { codepoints: [10703, 824], characters: '\u29CF\u0338' }, + '⋪': { codepoints: [8938], characters: '\u22EA' }, + '⋬': { codepoints: [8940], characters: '\u22EC' }, + '≮': { codepoints: [8814], characters: '\u226E' }, + '≰': { codepoints: [8816], characters: '\u2270' }, + '≸': { codepoints: [8824], characters: '\u2278' }, + '≪̸': { codepoints: [8810, 824], characters: '\u226A\u0338' }, + '⩽̸': { codepoints: [10877, 824], characters: '\u2A7D\u0338' }, + '≴': { codepoints: [8820], characters: '\u2274' }, + '⪢̸': { codepoints: [10914, 824], characters: '\u2AA2\u0338' }, + '⪡̸': { codepoints: [10913, 824], characters: '\u2AA1\u0338' }, + '∌': { codepoints: [8716], characters: '\u220C' }, + '∌': { codepoints: [8716], characters: '\u220C' }, + '⋾': { codepoints: [8958], characters: '\u22FE' }, + '⋽': { codepoints: [8957], characters: '\u22FD' }, + '⊀': { codepoints: [8832], characters: '\u2280' }, + '⪯̸': { codepoints: [10927, 824], characters: '\u2AAF\u0338' }, + '⋠': { codepoints: [8928], characters: '\u22E0' }, + '∌': { codepoints: [8716], characters: '\u220C' }, + '⧐̸': { codepoints: [10704, 824], characters: '\u29D0\u0338' }, + '⋫': { codepoints: [8939], characters: '\u22EB' }, + '⋭': { codepoints: [8941], characters: '\u22ED' }, + '⊏̸': { codepoints: [8847, 824], characters: '\u228F\u0338' }, + '⋢': { codepoints: [8930], characters: '\u22E2' }, + '⊐̸': { codepoints: [8848, 824], characters: '\u2290\u0338' }, + '⋣': { codepoints: [8931], characters: '\u22E3' }, + '⊂⃒': { codepoints: [8834, 8402], characters: '\u2282\u20D2' }, + '⊈': { codepoints: [8840], characters: '\u2288' }, + '⊁': { codepoints: [8833], characters: '\u2281' }, + '⪰̸': { codepoints: [10928, 824], characters: '\u2AB0\u0338' }, + '⋡': { codepoints: [8929], characters: '\u22E1' }, + '≿̸': { codepoints: [8831, 824], characters: '\u227F\u0338' }, + '⊃⃒': { codepoints: [8835, 8402], characters: '\u2283\u20D2' }, + '⊉': { codepoints: [8841], characters: '\u2289' }, + '≁': { codepoints: [8769], characters: '\u2241' }, + '≄': { codepoints: [8772], characters: '\u2244' }, + '≇': { codepoints: [8775], characters: '\u2247' }, + '≉': { codepoints: [8777], characters: '\u2249' }, + '∤': { codepoints: [8740], characters: '\u2224' }, + '∦': { codepoints: [8742], characters: '\u2226' }, + '∦': { codepoints: [8742], characters: '\u2226' }, + '⫽⃥': { codepoints: [11005, 8421], characters: '\u2AFD\u20E5' }, + '∂̸': { codepoints: [8706, 824], characters: '\u2202\u0338' }, + '⨔': { codepoints: [10772], characters: '\u2A14' }, + '⊀': { codepoints: [8832], characters: '\u2280' }, + '⋠': { codepoints: [8928], characters: '\u22E0' }, + '⊀': { codepoints: [8832], characters: '\u2280' }, + '⪯̸': { codepoints: [10927, 824], characters: '\u2AAF\u0338' }, + '⪯̸': { codepoints: [10927, 824], characters: '\u2AAF\u0338' }, + '⤳̸': { codepoints: [10547, 824], characters: '\u2933\u0338' }, + '↛': { codepoints: [8603], characters: '\u219B' }, + '⇏': { codepoints: [8655], characters: '\u21CF' }, + '↝̸': { codepoints: [8605, 824], characters: '\u219D\u0338' }, + '↛': { codepoints: [8603], characters: '\u219B' }, + '⇏': { codepoints: [8655], characters: '\u21CF' }, + '⋫': { codepoints: [8939], characters: '\u22EB' }, + '⋭': { codepoints: [8941], characters: '\u22ED' }, + '⊁': { codepoints: [8833], characters: '\u2281' }, + '⋡': { codepoints: [8929], characters: '\u22E1' }, + '⪰̸': { codepoints: [10928, 824], characters: '\u2AB0\u0338' }, + '𝒩': { codepoints: [119977], characters: '\uD835\uDCA9' }, + '𝓃': { codepoints: [120003], characters: '\uD835\uDCC3' }, + '∤': { codepoints: [8740], characters: '\u2224' }, + '∦': { codepoints: [8742], characters: '\u2226' }, + '≁': { codepoints: [8769], characters: '\u2241' }, + '≄': { codepoints: [8772], characters: '\u2244' }, + '≄': { codepoints: [8772], characters: '\u2244' }, + '∤': { codepoints: [8740], characters: '\u2224' }, + '∦': { codepoints: [8742], characters: '\u2226' }, + '⋢': { codepoints: [8930], characters: '\u22E2' }, + '⋣': { codepoints: [8931], characters: '\u22E3' }, + '⊄': { codepoints: [8836], characters: '\u2284' }, + '⫅̸': { codepoints: [10949, 824], characters: '\u2AC5\u0338' }, + '⊈': { codepoints: [8840], characters: '\u2288' }, + '⊂⃒': { codepoints: [8834, 8402], characters: '\u2282\u20D2' }, + '⊈': { codepoints: [8840], characters: '\u2288' }, + '⫅̸': { codepoints: [10949, 824], characters: '\u2AC5\u0338' }, + '⊁': { codepoints: [8833], characters: '\u2281' }, + '⪰̸': { codepoints: [10928, 824], characters: '\u2AB0\u0338' }, + '⊅': { codepoints: [8837], characters: '\u2285' }, + '⫆̸': { codepoints: [10950, 824], characters: '\u2AC6\u0338' }, + '⊉': { codepoints: [8841], characters: '\u2289' }, + '⊃⃒': { codepoints: [8835, 8402], characters: '\u2283\u20D2' }, + '⊉': { codepoints: [8841], characters: '\u2289' }, + '⫆̸': { codepoints: [10950, 824], characters: '\u2AC6\u0338' }, + '≹': { codepoints: [8825], characters: '\u2279' }, + 'Ñ': { codepoints: [209], characters: '\u00D1' }, + 'Ñ': { codepoints: [209], characters: '\u00D1' }, + 'ñ': { codepoints: [241], characters: '\u00F1' }, + 'ñ': { codepoints: [241], characters: '\u00F1' }, + '≸': { codepoints: [8824], characters: '\u2278' }, + '⋪': { codepoints: [8938], characters: '\u22EA' }, + '⋬': { codepoints: [8940], characters: '\u22EC' }, + '⋫': { codepoints: [8939], characters: '\u22EB' }, + '⋭': { codepoints: [8941], characters: '\u22ED' }, + 'Ν': { codepoints: [925], characters: '\u039D' }, + 'ν': { codepoints: [957], characters: '\u03BD' }, + '#': { codepoints: [35], characters: '\u0023' }, + '№': { codepoints: [8470], characters: '\u2116' }, + ' ': { codepoints: [8199], characters: '\u2007' }, + '≍⃒': { codepoints: [8781, 8402], characters: '\u224D\u20D2' }, + '⊬': { codepoints: [8876], characters: '\u22AC' }, + '⊭': { codepoints: [8877], characters: '\u22AD' }, + '⊮': { codepoints: [8878], characters: '\u22AE' }, + '⊯': { codepoints: [8879], characters: '\u22AF' }, + '≥⃒': { codepoints: [8805, 8402], characters: '\u2265\u20D2' }, + '>⃒': { codepoints: [62, 8402], characters: '\u003E\u20D2' }, + '⤄': { codepoints: [10500], characters: '\u2904' }, + '⧞': { codepoints: [10718], characters: '\u29DE' }, + '⤂': { codepoints: [10498], characters: '\u2902' }, + '≤⃒': { codepoints: [8804, 8402], characters: '\u2264\u20D2' }, + '<⃒': { codepoints: [60, 8402], characters: '\u003C\u20D2' }, + '⊴⃒': { codepoints: [8884, 8402], characters: '\u22B4\u20D2' }, + '⤃': { codepoints: [10499], characters: '\u2903' }, + '⊵⃒': { codepoints: [8885, 8402], characters: '\u22B5\u20D2' }, + '∼⃒': { codepoints: [8764, 8402], characters: '\u223C\u20D2' }, + '⤣': { codepoints: [10531], characters: '\u2923' }, + '↖': { codepoints: [8598], characters: '\u2196' }, + '⇖': { codepoints: [8662], characters: '\u21D6' }, + '↖': { codepoints: [8598], characters: '\u2196' }, + '⤧': { codepoints: [10535], characters: '\u2927' }, + 'Ó': { codepoints: [211], characters: '\u00D3' }, + 'Ó': { codepoints: [211], characters: '\u00D3' }, + 'ó': { codepoints: [243], characters: '\u00F3' }, + 'ó': { codepoints: [243], characters: '\u00F3' }, + '⊛': { codepoints: [8859], characters: '\u229B' }, + 'Ô': { codepoints: [212], characters: '\u00D4' }, + 'Ô': { codepoints: [212], characters: '\u00D4' }, + 'ô': { codepoints: [244], characters: '\u00F4' }, + 'ô': { codepoints: [244], characters: '\u00F4' }, + '⊚': { codepoints: [8858], characters: '\u229A' }, + 'О': { codepoints: [1054], characters: '\u041E' }, + 'о': { codepoints: [1086], characters: '\u043E' }, + '⊝': { codepoints: [8861], characters: '\u229D' }, + 'Ő': { codepoints: [336], characters: '\u0150' }, + 'ő': { codepoints: [337], characters: '\u0151' }, + '⨸': { codepoints: [10808], characters: '\u2A38' }, + '⊙': { codepoints: [8857], characters: '\u2299' }, + '⦼': { codepoints: [10684], characters: '\u29BC' }, + 'Œ': { codepoints: [338], characters: '\u0152' }, + 'œ': { codepoints: [339], characters: '\u0153' }, + '⦿': { codepoints: [10687], characters: '\u29BF' }, + '𝔒': { codepoints: [120082], characters: '\uD835\uDD12' }, + '𝔬': { codepoints: [120108], characters: '\uD835\uDD2C' }, + '˛': { codepoints: [731], characters: '\u02DB' }, + 'Ò': { codepoints: [210], characters: '\u00D2' }, + 'Ò': { codepoints: [210], characters: '\u00D2' }, + 'ò': { codepoints: [242], characters: '\u00F2' }, + 'ò': { codepoints: [242], characters: '\u00F2' }, + '⧁': { codepoints: [10689], characters: '\u29C1' }, + '⦵': { codepoints: [10677], characters: '\u29B5' }, + 'Ω': { codepoints: [937], characters: '\u03A9' }, + '∮': { codepoints: [8750], characters: '\u222E' }, + '↺': { codepoints: [8634], characters: '\u21BA' }, + '⦾': { codepoints: [10686], characters: '\u29BE' }, + '⦻': { codepoints: [10683], characters: '\u29BB' }, + '‾': { codepoints: [8254], characters: '\u203E' }, + '⧀': { codepoints: [10688], characters: '\u29C0' }, + 'Ō': { codepoints: [332], characters: '\u014C' }, + 'ō': { codepoints: [333], characters: '\u014D' }, + 'Ω': { codepoints: [937], characters: '\u03A9' }, + 'ω': { codepoints: [969], characters: '\u03C9' }, + 'Ο': { codepoints: [927], characters: '\u039F' }, + 'ο': { codepoints: [959], characters: '\u03BF' }, + '⦶': { codepoints: [10678], characters: '\u29B6' }, + '⊖': { codepoints: [8854], characters: '\u2296' }, + '𝕆': { codepoints: [120134], characters: '\uD835\uDD46' }, + '𝕠': { codepoints: [120160], characters: '\uD835\uDD60' }, + '⦷': { codepoints: [10679], characters: '\u29B7' }, + '“': { codepoints: [8220], characters: '\u201C' }, + '‘': { codepoints: [8216], characters: '\u2018' }, + '⦹': { codepoints: [10681], characters: '\u29B9' }, + '⊕': { codepoints: [8853], characters: '\u2295' }, + '↻': { codepoints: [8635], characters: '\u21BB' }, + '⩔': { codepoints: [10836], characters: '\u2A54' }, + '∨': { codepoints: [8744], characters: '\u2228' }, + '⩝': { codepoints: [10845], characters: '\u2A5D' }, + 'ℴ': { codepoints: [8500], characters: '\u2134' }, + 'ℴ': { codepoints: [8500], characters: '\u2134' }, + 'ª': { codepoints: [170], characters: '\u00AA' }, + 'ª': { codepoints: [170], characters: '\u00AA' }, + 'º': { codepoints: [186], characters: '\u00BA' }, + 'º': { codepoints: [186], characters: '\u00BA' }, + '⊶': { codepoints: [8886], characters: '\u22B6' }, + '⩖': { codepoints: [10838], characters: '\u2A56' }, + '⩗': { codepoints: [10839], characters: '\u2A57' }, + '⩛': { codepoints: [10843], characters: '\u2A5B' }, + 'Ⓢ': { codepoints: [9416], characters: '\u24C8' }, + '𝒪': { codepoints: [119978], characters: '\uD835\uDCAA' }, + 'ℴ': { codepoints: [8500], characters: '\u2134' }, + 'Ø': { codepoints: [216], characters: '\u00D8' }, + 'Ø': { codepoints: [216], characters: '\u00D8' }, + 'ø': { codepoints: [248], characters: '\u00F8' }, + 'ø': { codepoints: [248], characters: '\u00F8' }, + '⊘': { codepoints: [8856], characters: '\u2298' }, + 'Õ': { codepoints: [213], characters: '\u00D5' }, + 'Õ': { codepoints: [213], characters: '\u00D5' }, + 'õ': { codepoints: [245], characters: '\u00F5' }, + 'õ': { codepoints: [245], characters: '\u00F5' }, + '⨶': { codepoints: [10806], characters: '\u2A36' }, + '⨷': { codepoints: [10807], characters: '\u2A37' }, + '⊗': { codepoints: [8855], characters: '\u2297' }, + 'Ö': { codepoints: [214], characters: '\u00D6' }, + 'Ö': { codepoints: [214], characters: '\u00D6' }, + 'ö': { codepoints: [246], characters: '\u00F6' }, + 'ö': { codepoints: [246], characters: '\u00F6' }, + '⌽': { codepoints: [9021], characters: '\u233D' }, + '‾': { codepoints: [8254], characters: '\u203E' }, + '⏞': { codepoints: [9182], characters: '\u23DE' }, + '⎴': { codepoints: [9140], characters: '\u23B4' }, + '⏜': { codepoints: [9180], characters: '\u23DC' }, + '¶': { codepoints: [182], characters: '\u00B6' }, + '¶': { codepoints: [182], characters: '\u00B6' }, + '∥': { codepoints: [8741], characters: '\u2225' }, + '∥': { codepoints: [8741], characters: '\u2225' }, + '⫳': { codepoints: [10995], characters: '\u2AF3' }, + '⫽': { codepoints: [11005], characters: '\u2AFD' }, + '∂': { codepoints: [8706], characters: '\u2202' }, + '∂': { codepoints: [8706], characters: '\u2202' }, + 'П': { codepoints: [1055], characters: '\u041F' }, + 'п': { codepoints: [1087], characters: '\u043F' }, + '%': { codepoints: [37], characters: '\u0025' }, + '.': { codepoints: [46], characters: '\u002E' }, + '‰': { codepoints: [8240], characters: '\u2030' }, + '⊥': { codepoints: [8869], characters: '\u22A5' }, + '‱': { codepoints: [8241], characters: '\u2031' }, + '𝔓': { codepoints: [120083], characters: '\uD835\uDD13' }, + '𝔭': { codepoints: [120109], characters: '\uD835\uDD2D' }, + 'Φ': { codepoints: [934], characters: '\u03A6' }, + 'φ': { codepoints: [966], characters: '\u03C6' }, + 'ϕ': { codepoints: [981], characters: '\u03D5' }, + 'ℳ': { codepoints: [8499], characters: '\u2133' }, + '☎': { codepoints: [9742], characters: '\u260E' }, + 'Π': { codepoints: [928], characters: '\u03A0' }, + 'π': { codepoints: [960], characters: '\u03C0' }, + '⋔': { codepoints: [8916], characters: '\u22D4' }, + 'ϖ': { codepoints: [982], characters: '\u03D6' }, + 'ℏ': { codepoints: [8463], characters: '\u210F' }, + 'ℎ': { codepoints: [8462], characters: '\u210E' }, + 'ℏ': { codepoints: [8463], characters: '\u210F' }, + '⨣': { codepoints: [10787], characters: '\u2A23' }, + '⊞': { codepoints: [8862], characters: '\u229E' }, + '⨢': { codepoints: [10786], characters: '\u2A22' }, + '+': { codepoints: [43], characters: '\u002B' }, + '∔': { codepoints: [8724], characters: '\u2214' }, + '⨥': { codepoints: [10789], characters: '\u2A25' }, + '⩲': { codepoints: [10866], characters: '\u2A72' }, + '±': { codepoints: [177], characters: '\u00B1' }, + '±': { codepoints: [177], characters: '\u00B1' }, + '±': { codepoints: [177], characters: '\u00B1' }, + '⨦': { codepoints: [10790], characters: '\u2A26' }, + '⨧': { codepoints: [10791], characters: '\u2A27' }, + '±': { codepoints: [177], characters: '\u00B1' }, + 'ℌ': { codepoints: [8460], characters: '\u210C' }, + '⨕': { codepoints: [10773], characters: '\u2A15' }, + '𝕡': { codepoints: [120161], characters: '\uD835\uDD61' }, + 'ℙ': { codepoints: [8473], characters: '\u2119' }, + '£': { codepoints: [163], characters: '\u00A3' }, + '£': { codepoints: [163], characters: '\u00A3' }, + '⪷': { codepoints: [10935], characters: '\u2AB7' }, + '⪻': { codepoints: [10939], characters: '\u2ABB' }, + '≺': { codepoints: [8826], characters: '\u227A' }, + '≼': { codepoints: [8828], characters: '\u227C' }, + '⪷': { codepoints: [10935], characters: '\u2AB7' }, + '≺': { codepoints: [8826], characters: '\u227A' }, + '≼': { codepoints: [8828], characters: '\u227C' }, + '≺': { codepoints: [8826], characters: '\u227A' }, + '⪯': { codepoints: [10927], characters: '\u2AAF' }, + '≼': { codepoints: [8828], characters: '\u227C' }, + '≾': { codepoints: [8830], characters: '\u227E' }, + '⪯': { codepoints: [10927], characters: '\u2AAF' }, + '⪹': { codepoints: [10937], characters: '\u2AB9' }, + '⪵': { codepoints: [10933], characters: '\u2AB5' }, + '⋨': { codepoints: [8936], characters: '\u22E8' }, + '⪯': { codepoints: [10927], characters: '\u2AAF' }, + '⪳': { codepoints: [10931], characters: '\u2AB3' }, + '≾': { codepoints: [8830], characters: '\u227E' }, + '′': { codepoints: [8242], characters: '\u2032' }, + '″': { codepoints: [8243], characters: '\u2033' }, + 'ℙ': { codepoints: [8473], characters: '\u2119' }, + '⪹': { codepoints: [10937], characters: '\u2AB9' }, + '⪵': { codepoints: [10933], characters: '\u2AB5' }, + '⋨': { codepoints: [8936], characters: '\u22E8' }, + '∏': { codepoints: [8719], characters: '\u220F' }, + '∏': { codepoints: [8719], characters: '\u220F' }, + '⌮': { codepoints: [9006], characters: '\u232E' }, + '⌒': { codepoints: [8978], characters: '\u2312' }, + '⌓': { codepoints: [8979], characters: '\u2313' }, + '∝': { codepoints: [8733], characters: '\u221D' }, + '∝': { codepoints: [8733], characters: '\u221D' }, + '∷': { codepoints: [8759], characters: '\u2237' }, + '∝': { codepoints: [8733], characters: '\u221D' }, + '≾': { codepoints: [8830], characters: '\u227E' }, + '⊰': { codepoints: [8880], characters: '\u22B0' }, + '𝒫': { codepoints: [119979], characters: '\uD835\uDCAB' }, + '𝓅': { codepoints: [120005], characters: '\uD835\uDCC5' }, + 'Ψ': { codepoints: [936], characters: '\u03A8' }, + 'ψ': { codepoints: [968], characters: '\u03C8' }, + ' ': { codepoints: [8200], characters: '\u2008' }, + '𝔔': { codepoints: [120084], characters: '\uD835\uDD14' }, + '𝔮': { codepoints: [120110], characters: '\uD835\uDD2E' }, + '⨌': { codepoints: [10764], characters: '\u2A0C' }, + '𝕢': { codepoints: [120162], characters: '\uD835\uDD62' }, + 'ℚ': { codepoints: [8474], characters: '\u211A' }, + '⁗': { codepoints: [8279], characters: '\u2057' }, + '𝒬': { codepoints: [119980], characters: '\uD835\uDCAC' }, + '𝓆': { codepoints: [120006], characters: '\uD835\uDCC6' }, + 'ℍ': { codepoints: [8461], characters: '\u210D' }, + '⨖': { codepoints: [10774], characters: '\u2A16' }, + '?': { codepoints: [63], characters: '\u003F' }, + '≟': { codepoints: [8799], characters: '\u225F' }, + '"': { codepoints: [34], characters: '\u0022' }, + '"': { codepoints: [34], characters: '\u0022' }, + '"': { codepoints: [34], characters: '\u0022' }, + '"': { codepoints: [34], characters: '\u0022' }, + '⇛': { codepoints: [8667], characters: '\u21DB' }, + '∽̱': { codepoints: [8765, 817], characters: '\u223D\u0331' }, + 'Ŕ': { codepoints: [340], characters: '\u0154' }, + 'ŕ': { codepoints: [341], characters: '\u0155' }, + '√': { codepoints: [8730], characters: '\u221A' }, + '⦳': { codepoints: [10675], characters: '\u29B3' }, + '⟩': { codepoints: [10217], characters: '\u27E9' }, + '⟫': { codepoints: [10219], characters: '\u27EB' }, + '⦒': { codepoints: [10642], characters: '\u2992' }, + '⦥': { codepoints: [10661], characters: '\u29A5' }, + '⟩': { codepoints: [10217], characters: '\u27E9' }, + '»': { codepoints: [187], characters: '\u00BB' }, + '»': { codepoints: [187], characters: '\u00BB' }, + '⥵': { codepoints: [10613], characters: '\u2975' }, + '⇥': { codepoints: [8677], characters: '\u21E5' }, + '⤠': { codepoints: [10528], characters: '\u2920' }, + '⤳': { codepoints: [10547], characters: '\u2933' }, + '→': { codepoints: [8594], characters: '\u2192' }, + '↠': { codepoints: [8608], characters: '\u21A0' }, + '⇒': { codepoints: [8658], characters: '\u21D2' }, + '⤞': { codepoints: [10526], characters: '\u291E' }, + '↪': { codepoints: [8618], characters: '\u21AA' }, + '↬': { codepoints: [8620], characters: '\u21AC' }, + '⥅': { codepoints: [10565], characters: '\u2945' }, + '⥴': { codepoints: [10612], characters: '\u2974' }, + '⤖': { codepoints: [10518], characters: '\u2916' }, + '↣': { codepoints: [8611], characters: '\u21A3' }, + '↝': { codepoints: [8605], characters: '\u219D' }, + '⤚': { codepoints: [10522], characters: '\u291A' }, + '⤜': { codepoints: [10524], characters: '\u291C' }, + '∶': { codepoints: [8758], characters: '\u2236' }, + 'ℚ': { codepoints: [8474], characters: '\u211A' }, + '⤍': { codepoints: [10509], characters: '\u290D' }, + '⤏': { codepoints: [10511], characters: '\u290F' }, + '⤐': { codepoints: [10512], characters: '\u2910' }, + '❳': { codepoints: [10099], characters: '\u2773' }, + '}': { codepoints: [125], characters: '\u007D' }, + ']': { codepoints: [93], characters: '\u005D' }, + '⦌': { codepoints: [10636], characters: '\u298C' }, + '⦎': { codepoints: [10638], characters: '\u298E' }, + '⦐': { codepoints: [10640], characters: '\u2990' }, + 'Ř': { codepoints: [344], characters: '\u0158' }, + 'ř': { codepoints: [345], characters: '\u0159' }, + 'Ŗ': { codepoints: [342], characters: '\u0156' }, + 'ŗ': { codepoints: [343], characters: '\u0157' }, + '⌉': { codepoints: [8969], characters: '\u2309' }, + '}': { codepoints: [125], characters: '\u007D' }, + 'Р': { codepoints: [1056], characters: '\u0420' }, + 'р': { codepoints: [1088], characters: '\u0440' }, + '⤷': { codepoints: [10551], characters: '\u2937' }, + '⥩': { codepoints: [10601], characters: '\u2969' }, + '”': { codepoints: [8221], characters: '\u201D' }, + '”': { codepoints: [8221], characters: '\u201D' }, + '↳': { codepoints: [8627], characters: '\u21B3' }, + 'ℜ': { codepoints: [8476], characters: '\u211C' }, + 'ℛ': { codepoints: [8475], characters: '\u211B' }, + 'ℜ': { codepoints: [8476], characters: '\u211C' }, + 'ℝ': { codepoints: [8477], characters: '\u211D' }, + 'ℜ': { codepoints: [8476], characters: '\u211C' }, + '▭': { codepoints: [9645], characters: '\u25AD' }, + '®': { codepoints: [174], characters: '\u00AE' }, + '®': { codepoints: [174], characters: '\u00AE' }, + '®': { codepoints: [174], characters: '\u00AE' }, + '®': { codepoints: [174], characters: '\u00AE' }, + '∋': { codepoints: [8715], characters: '\u220B' }, + '⇋': { codepoints: [8651], characters: '\u21CB' }, + '⥯': { codepoints: [10607], characters: '\u296F' }, + '⥽': { codepoints: [10621], characters: '\u297D' }, + '⌋': { codepoints: [8971], characters: '\u230B' }, + '𝔯': { codepoints: [120111], characters: '\uD835\uDD2F' }, + 'ℜ': { codepoints: [8476], characters: '\u211C' }, + '⥤': { codepoints: [10596], characters: '\u2964' }, + '⇁': { codepoints: [8641], characters: '\u21C1' }, + '⇀': { codepoints: [8640], characters: '\u21C0' }, + '⥬': { codepoints: [10604], characters: '\u296C' }, + 'Ρ': { codepoints: [929], characters: '\u03A1' }, + 'ρ': { codepoints: [961], characters: '\u03C1' }, + 'ϱ': { codepoints: [1009], characters: '\u03F1' }, + '⟩': { codepoints: [10217], characters: '\u27E9' }, + '⇥': { codepoints: [8677], characters: '\u21E5' }, + '→': { codepoints: [8594], characters: '\u2192' }, + '→': { codepoints: [8594], characters: '\u2192' }, + '⇒': { codepoints: [8658], characters: '\u21D2' }, + '⇄': { codepoints: [8644], characters: '\u21C4' }, + '↣': { codepoints: [8611], characters: '\u21A3' }, + '⌉': { codepoints: [8969], characters: '\u2309' }, + '⟧': { codepoints: [10215], characters: '\u27E7' }, + '⥝': { codepoints: [10589], characters: '\u295D' }, + '⥕': { codepoints: [10581], characters: '\u2955' }, + '⇂': { codepoints: [8642], characters: '\u21C2' }, + '⌋': { codepoints: [8971], characters: '\u230B' }, + '⇁': { codepoints: [8641], characters: '\u21C1' }, + '⇀': { codepoints: [8640], characters: '\u21C0' }, + '⇄': { codepoints: [8644], characters: '\u21C4' }, + '⇌': { codepoints: [8652], characters: '\u21CC' }, + '⇉': { codepoints: [8649], characters: '\u21C9' }, + '↝': { codepoints: [8605], characters: '\u219D' }, + '↦': { codepoints: [8614], characters: '\u21A6' }, + '⊢': { codepoints: [8866], characters: '\u22A2' }, + '⥛': { codepoints: [10587], characters: '\u295B' }, + '⋌': { codepoints: [8908], characters: '\u22CC' }, + '⧐': { codepoints: [10704], characters: '\u29D0' }, + '⊳': { codepoints: [8883], characters: '\u22B3' }, + '⊵': { codepoints: [8885], characters: '\u22B5' }, + '⥏': { codepoints: [10575], characters: '\u294F' }, + '⥜': { codepoints: [10588], characters: '\u295C' }, + '⥔': { codepoints: [10580], characters: '\u2954' }, + '↾': { codepoints: [8638], characters: '\u21BE' }, + '⥓': { codepoints: [10579], characters: '\u2953' }, + '⇀': { codepoints: [8640], characters: '\u21C0' }, + '˚': { codepoints: [730], characters: '\u02DA' }, + '≓': { codepoints: [8787], characters: '\u2253' }, + '⇄': { codepoints: [8644], characters: '\u21C4' }, + '⇌': { codepoints: [8652], characters: '\u21CC' }, + '‏': { codepoints: [8207], characters: '\u200F' }, + '⎱': { codepoints: [9137], characters: '\u23B1' }, + '⎱': { codepoints: [9137], characters: '\u23B1' }, + '⫮': { codepoints: [10990], characters: '\u2AEE' }, + '⟭': { codepoints: [10221], characters: '\u27ED' }, + '⇾': { codepoints: [8702], characters: '\u21FE' }, + '⟧': { codepoints: [10215], characters: '\u27E7' }, + '⦆': { codepoints: [10630], characters: '\u2986' }, + '𝕣': { codepoints: [120163], characters: '\uD835\uDD63' }, + 'ℝ': { codepoints: [8477], characters: '\u211D' }, + '⨮': { codepoints: [10798], characters: '\u2A2E' }, + '⨵': { codepoints: [10805], characters: '\u2A35' }, + '⥰': { codepoints: [10608], characters: '\u2970' }, + ')': { codepoints: [41], characters: '\u0029' }, + '⦔': { codepoints: [10644], characters: '\u2994' }, + '⨒': { codepoints: [10770], characters: '\u2A12' }, + '⇉': { codepoints: [8649], characters: '\u21C9' }, + '⇛': { codepoints: [8667], characters: '\u21DB' }, + '›': { codepoints: [8250], characters: '\u203A' }, + '𝓇': { codepoints: [120007], characters: '\uD835\uDCC7' }, + 'ℛ': { codepoints: [8475], characters: '\u211B' }, + '↱': { codepoints: [8625], characters: '\u21B1' }, + '↱': { codepoints: [8625], characters: '\u21B1' }, + ']': { codepoints: [93], characters: '\u005D' }, + '’': { codepoints: [8217], characters: '\u2019' }, + '’': { codepoints: [8217], characters: '\u2019' }, + '⋌': { codepoints: [8908], characters: '\u22CC' }, + '⋊': { codepoints: [8906], characters: '\u22CA' }, + '▹': { codepoints: [9657], characters: '\u25B9' }, + '⊵': { codepoints: [8885], characters: '\u22B5' }, + '▸': { codepoints: [9656], characters: '\u25B8' }, + '⧎': { codepoints: [10702], characters: '\u29CE' }, + '⧴': { codepoints: [10740], characters: '\u29F4' }, + '⥨': { codepoints: [10600], characters: '\u2968' }, + '℞': { codepoints: [8478], characters: '\u211E' }, + 'Ś': { codepoints: [346], characters: '\u015A' }, + 'ś': { codepoints: [347], characters: '\u015B' }, + '‚': { codepoints: [8218], characters: '\u201A' }, + '⪸': { codepoints: [10936], characters: '\u2AB8' }, + 'Š': { codepoints: [352], characters: '\u0160' }, + 'š': { codepoints: [353], characters: '\u0161' }, + '⪼': { codepoints: [10940], characters: '\u2ABC' }, + '≻': { codepoints: [8827], characters: '\u227B' }, + '≽': { codepoints: [8829], characters: '\u227D' }, + '⪰': { codepoints: [10928], characters: '\u2AB0' }, + '⪴': { codepoints: [10932], characters: '\u2AB4' }, + 'Ş': { codepoints: [350], characters: '\u015E' }, + 'ş': { codepoints: [351], characters: '\u015F' }, + 'Ŝ': { codepoints: [348], characters: '\u015C' }, + 'ŝ': { codepoints: [349], characters: '\u015D' }, + '⪺': { codepoints: [10938], characters: '\u2ABA' }, + '⪶': { codepoints: [10934], characters: '\u2AB6' }, + '⋩': { codepoints: [8937], characters: '\u22E9' }, + '⨓': { codepoints: [10771], characters: '\u2A13' }, + '≿': { codepoints: [8831], characters: '\u227F' }, + 'С': { codepoints: [1057], characters: '\u0421' }, + 'с': { codepoints: [1089], characters: '\u0441' }, + '⊡': { codepoints: [8865], characters: '\u22A1' }, + '⋅': { codepoints: [8901], characters: '\u22C5' }, + '⩦': { codepoints: [10854], characters: '\u2A66' }, + '⤥': { codepoints: [10533], characters: '\u2925' }, + '↘': { codepoints: [8600], characters: '\u2198' }, + '⇘': { codepoints: [8664], characters: '\u21D8' }, + '↘': { codepoints: [8600], characters: '\u2198' }, + '§': { codepoints: [167], characters: '\u00A7' }, + '§': { codepoints: [167], characters: '\u00A7' }, + ';': { codepoints: [59], characters: '\u003B' }, + '⤩': { codepoints: [10537], characters: '\u2929' }, + '∖': { codepoints: [8726], characters: '\u2216' }, + '∖': { codepoints: [8726], characters: '\u2216' }, + '✶': { codepoints: [10038], characters: '\u2736' }, + '𝔖': { codepoints: [120086], characters: '\uD835\uDD16' }, + '𝔰': { codepoints: [120112], characters: '\uD835\uDD30' }, + '⌢': { codepoints: [8994], characters: '\u2322' }, + '♯': { codepoints: [9839], characters: '\u266F' }, + 'Щ': { codepoints: [1065], characters: '\u0429' }, + 'щ': { codepoints: [1097], characters: '\u0449' }, + 'Ш': { codepoints: [1064], characters: '\u0428' }, + 'ш': { codepoints: [1096], characters: '\u0448' }, + '↓': { codepoints: [8595], characters: '\u2193' }, + '←': { codepoints: [8592], characters: '\u2190' }, + '∣': { codepoints: [8739], characters: '\u2223' }, + '∥': { codepoints: [8741], characters: '\u2225' }, + '→': { codepoints: [8594], characters: '\u2192' }, + '↑': { codepoints: [8593], characters: '\u2191' }, + '­': { codepoints: [173], characters: '\u00AD' }, + '­': { codepoints: [173], characters: '\u00AD' }, + 'Σ': { codepoints: [931], characters: '\u03A3' }, + 'σ': { codepoints: [963], characters: '\u03C3' }, + 'ς': { codepoints: [962], characters: '\u03C2' }, + 'ς': { codepoints: [962], characters: '\u03C2' }, + '∼': { codepoints: [8764], characters: '\u223C' }, + '⩪': { codepoints: [10858], characters: '\u2A6A' }, + '≃': { codepoints: [8771], characters: '\u2243' }, + '≃': { codepoints: [8771], characters: '\u2243' }, + '⪞': { codepoints: [10910], characters: '\u2A9E' }, + '⪠': { codepoints: [10912], characters: '\u2AA0' }, + '⪝': { codepoints: [10909], characters: '\u2A9D' }, + '⪟': { codepoints: [10911], characters: '\u2A9F' }, + '≆': { codepoints: [8774], characters: '\u2246' }, + '⨤': { codepoints: [10788], characters: '\u2A24' }, + '⥲': { codepoints: [10610], characters: '\u2972' }, + '←': { codepoints: [8592], characters: '\u2190' }, + '∘': { codepoints: [8728], characters: '\u2218' }, + '∖': { codepoints: [8726], characters: '\u2216' }, + '⨳': { codepoints: [10803], characters: '\u2A33' }, + '⧤': { codepoints: [10724], characters: '\u29E4' }, + '∣': { codepoints: [8739], characters: '\u2223' }, + '⌣': { codepoints: [8995], characters: '\u2323' }, + '⪪': { codepoints: [10922], characters: '\u2AAA' }, + '⪬': { codepoints: [10924], characters: '\u2AAC' }, + '⪬︀': { codepoints: [10924, 65024], characters: '\u2AAC\uFE00' }, + 'Ь': { codepoints: [1068], characters: '\u042C' }, + 'ь': { codepoints: [1100], characters: '\u044C' }, + '⌿': { codepoints: [9023], characters: '\u233F' }, + '⧄': { codepoints: [10692], characters: '\u29C4' }, + '/': { codepoints: [47], characters: '\u002F' }, + '𝕊': { codepoints: [120138], characters: '\uD835\uDD4A' }, + '𝕤': { codepoints: [120164], characters: '\uD835\uDD64' }, + '♠': { codepoints: [9824], characters: '\u2660' }, + '♠': { codepoints: [9824], characters: '\u2660' }, + '∥': { codepoints: [8741], characters: '\u2225' }, + '⊓': { codepoints: [8851], characters: '\u2293' }, + '⊓︀': { codepoints: [8851, 65024], characters: '\u2293\uFE00' }, + '⊔': { codepoints: [8852], characters: '\u2294' }, + '⊔︀': { codepoints: [8852, 65024], characters: '\u2294\uFE00' }, + '√': { codepoints: [8730], characters: '\u221A' }, + '⊏': { codepoints: [8847], characters: '\u228F' }, + '⊑': { codepoints: [8849], characters: '\u2291' }, + '⊏': { codepoints: [8847], characters: '\u228F' }, + '⊑': { codepoints: [8849], characters: '\u2291' }, + '⊐': { codepoints: [8848], characters: '\u2290' }, + '⊒': { codepoints: [8850], characters: '\u2292' }, + '⊐': { codepoints: [8848], characters: '\u2290' }, + '⊒': { codepoints: [8850], characters: '\u2292' }, + '□': { codepoints: [9633], characters: '\u25A1' }, + '□': { codepoints: [9633], characters: '\u25A1' }, + '⊓': { codepoints: [8851], characters: '\u2293' }, + '⊏': { codepoints: [8847], characters: '\u228F' }, + '⊑': { codepoints: [8849], characters: '\u2291' }, + '⊐': { codepoints: [8848], characters: '\u2290' }, + '⊒': { codepoints: [8850], characters: '\u2292' }, + '⊔': { codepoints: [8852], characters: '\u2294' }, + '▪': { codepoints: [9642], characters: '\u25AA' }, + '□': { codepoints: [9633], characters: '\u25A1' }, + '▪': { codepoints: [9642], characters: '\u25AA' }, + '→': { codepoints: [8594], characters: '\u2192' }, + '𝒮': { codepoints: [119982], characters: '\uD835\uDCAE' }, + '𝓈': { codepoints: [120008], characters: '\uD835\uDCC8' }, + '∖': { codepoints: [8726], characters: '\u2216' }, + '⌣': { codepoints: [8995], characters: '\u2323' }, + '⋆': { codepoints: [8902], characters: '\u22C6' }, + '⋆': { codepoints: [8902], characters: '\u22C6' }, + '☆': { codepoints: [9734], characters: '\u2606' }, + '★': { codepoints: [9733], characters: '\u2605' }, + 'ϵ': { codepoints: [1013], characters: '\u03F5' }, + 'ϕ': { codepoints: [981], characters: '\u03D5' }, + '¯': { codepoints: [175], characters: '\u00AF' }, + '⊂': { codepoints: [8834], characters: '\u2282' }, + '⋐': { codepoints: [8912], characters: '\u22D0' }, + '⪽': { codepoints: [10941], characters: '\u2ABD' }, + '⫅': { codepoints: [10949], characters: '\u2AC5' }, + '⊆': { codepoints: [8838], characters: '\u2286' }, + '⫃': { codepoints: [10947], characters: '\u2AC3' }, + '⫁': { codepoints: [10945], characters: '\u2AC1' }, + '⫋': { codepoints: [10955], characters: '\u2ACB' }, + '⊊': { codepoints: [8842], characters: '\u228A' }, + '⪿': { codepoints: [10943], characters: '\u2ABF' }, + '⥹': { codepoints: [10617], characters: '\u2979' }, + '⊂': { codepoints: [8834], characters: '\u2282' }, + '⋐': { codepoints: [8912], characters: '\u22D0' }, + '⊆': { codepoints: [8838], characters: '\u2286' }, + '⫅': { codepoints: [10949], characters: '\u2AC5' }, + '⊆': { codepoints: [8838], characters: '\u2286' }, + '⊊': { codepoints: [8842], characters: '\u228A' }, + '⫋': { codepoints: [10955], characters: '\u2ACB' }, + '⫇': { codepoints: [10951], characters: '\u2AC7' }, + '⫕': { codepoints: [10965], characters: '\u2AD5' }, + '⫓': { codepoints: [10963], characters: '\u2AD3' }, + '⪸': { codepoints: [10936], characters: '\u2AB8' }, + '≻': { codepoints: [8827], characters: '\u227B' }, + '≽': { codepoints: [8829], characters: '\u227D' }, + '≻': { codepoints: [8827], characters: '\u227B' }, + '⪰': { codepoints: [10928], characters: '\u2AB0' }, + '≽': { codepoints: [8829], characters: '\u227D' }, + '≿': { codepoints: [8831], characters: '\u227F' }, + '⪰': { codepoints: [10928], characters: '\u2AB0' }, + '⪺': { codepoints: [10938], characters: '\u2ABA' }, + '⪶': { codepoints: [10934], characters: '\u2AB6' }, + '⋩': { codepoints: [8937], characters: '\u22E9' }, + '≿': { codepoints: [8831], characters: '\u227F' }, + '∋': { codepoints: [8715], characters: '\u220B' }, + '∑': { codepoints: [8721], characters: '\u2211' }, + '∑': { codepoints: [8721], characters: '\u2211' }, + '♪': { codepoints: [9834], characters: '\u266A' }, + '¹': { codepoints: [185], characters: '\u00B9' }, + '¹': { codepoints: [185], characters: '\u00B9' }, + '²': { codepoints: [178], characters: '\u00B2' }, + '²': { codepoints: [178], characters: '\u00B2' }, + '³': { codepoints: [179], characters: '\u00B3' }, + '³': { codepoints: [179], characters: '\u00B3' }, + '⊃': { codepoints: [8835], characters: '\u2283' }, + '⋑': { codepoints: [8913], characters: '\u22D1' }, + '⪾': { codepoints: [10942], characters: '\u2ABE' }, + '⫘': { codepoints: [10968], characters: '\u2AD8' }, + '⫆': { codepoints: [10950], characters: '\u2AC6' }, + '⊇': { codepoints: [8839], characters: '\u2287' }, + '⫄': { codepoints: [10948], characters: '\u2AC4' }, + '⊃': { codepoints: [8835], characters: '\u2283' }, + '⊇': { codepoints: [8839], characters: '\u2287' }, + '⟉': { codepoints: [10185], characters: '\u27C9' }, + '⫗': { codepoints: [10967], characters: '\u2AD7' }, + '⥻': { codepoints: [10619], characters: '\u297B' }, + '⫂': { codepoints: [10946], characters: '\u2AC2' }, + '⫌': { codepoints: [10956], characters: '\u2ACC' }, + '⊋': { codepoints: [8843], characters: '\u228B' }, + '⫀': { codepoints: [10944], characters: '\u2AC0' }, + '⊃': { codepoints: [8835], characters: '\u2283' }, + '⋑': { codepoints: [8913], characters: '\u22D1' }, + '⊇': { codepoints: [8839], characters: '\u2287' }, + '⫆': { codepoints: [10950], characters: '\u2AC6' }, + '⊋': { codepoints: [8843], characters: '\u228B' }, + '⫌': { codepoints: [10956], characters: '\u2ACC' }, + '⫈': { codepoints: [10952], characters: '\u2AC8' }, + '⫔': { codepoints: [10964], characters: '\u2AD4' }, + '⫖': { codepoints: [10966], characters: '\u2AD6' }, + '⤦': { codepoints: [10534], characters: '\u2926' }, + '↙': { codepoints: [8601], characters: '\u2199' }, + '⇙': { codepoints: [8665], characters: '\u21D9' }, + '↙': { codepoints: [8601], characters: '\u2199' }, + '⤪': { codepoints: [10538], characters: '\u292A' }, + 'ß': { codepoints: [223], characters: '\u00DF' }, + 'ß': { codepoints: [223], characters: '\u00DF' }, + ' ': { codepoints: [9], characters: '\u0009' }, + '⌖': { codepoints: [8982], characters: '\u2316' }, + 'Τ': { codepoints: [932], characters: '\u03A4' }, + 'τ': { codepoints: [964], characters: '\u03C4' }, + '⎴': { codepoints: [9140], characters: '\u23B4' }, + 'Ť': { codepoints: [356], characters: '\u0164' }, + 'ť': { codepoints: [357], characters: '\u0165' }, + 'Ţ': { codepoints: [354], characters: '\u0162' }, + 'ţ': { codepoints: [355], characters: '\u0163' }, + 'Т': { codepoints: [1058], characters: '\u0422' }, + 'т': { codepoints: [1090], characters: '\u0442' }, + '⃛': { codepoints: [8411], characters: '\u20DB' }, + '⌕': { codepoints: [8981], characters: '\u2315' }, + '𝔗': { codepoints: [120087], characters: '\uD835\uDD17' }, + '𝔱': { codepoints: [120113], characters: '\uD835\uDD31' }, + '∴': { codepoints: [8756], characters: '\u2234' }, + '∴': { codepoints: [8756], characters: '\u2234' }, + '∴': { codepoints: [8756], characters: '\u2234' }, + 'Θ': { codepoints: [920], characters: '\u0398' }, + 'θ': { codepoints: [952], characters: '\u03B8' }, + 'ϑ': { codepoints: [977], characters: '\u03D1' }, + 'ϑ': { codepoints: [977], characters: '\u03D1' }, + '≈': { codepoints: [8776], characters: '\u2248' }, + '∼': { codepoints: [8764], characters: '\u223C' }, + '  ': { codepoints: [8287, 8202], characters: '\u205F\u200A' }, + ' ': { codepoints: [8201], characters: '\u2009' }, + ' ': { codepoints: [8201], characters: '\u2009' }, + '≈': { codepoints: [8776], characters: '\u2248' }, + '∼': { codepoints: [8764], characters: '\u223C' }, + 'Þ': { codepoints: [222], characters: '\u00DE' }, + 'Þ': { codepoints: [222], characters: '\u00DE' }, + 'þ': { codepoints: [254], characters: '\u00FE' }, + 'þ': { codepoints: [254], characters: '\u00FE' }, + '˜': { codepoints: [732], characters: '\u02DC' }, + '∼': { codepoints: [8764], characters: '\u223C' }, + '≃': { codepoints: [8771], characters: '\u2243' }, + '≅': { codepoints: [8773], characters: '\u2245' }, + '≈': { codepoints: [8776], characters: '\u2248' }, + '⨱': { codepoints: [10801], characters: '\u2A31' }, + '⊠': { codepoints: [8864], characters: '\u22A0' }, + '×': { codepoints: [215], characters: '\u00D7' }, + '×': { codepoints: [215], characters: '\u00D7' }, + '⨰': { codepoints: [10800], characters: '\u2A30' }, + '∭': { codepoints: [8749], characters: '\u222D' }, + '⤨': { codepoints: [10536], characters: '\u2928' }, + '⌶': { codepoints: [9014], characters: '\u2336' }, + '⫱': { codepoints: [10993], characters: '\u2AF1' }, + '⊤': { codepoints: [8868], characters: '\u22A4' }, + '𝕋': { codepoints: [120139], characters: '\uD835\uDD4B' }, + '𝕥': { codepoints: [120165], characters: '\uD835\uDD65' }, + '⫚': { codepoints: [10970], characters: '\u2ADA' }, + '⤩': { codepoints: [10537], characters: '\u2929' }, + '‴': { codepoints: [8244], characters: '\u2034' }, + '™': { codepoints: [8482], characters: '\u2122' }, + '™': { codepoints: [8482], characters: '\u2122' }, + '▵': { codepoints: [9653], characters: '\u25B5' }, + '▿': { codepoints: [9663], characters: '\u25BF' }, + '◃': { codepoints: [9667], characters: '\u25C3' }, + '⊴': { codepoints: [8884], characters: '\u22B4' }, + '≜': { codepoints: [8796], characters: '\u225C' }, + '▹': { codepoints: [9657], characters: '\u25B9' }, + '⊵': { codepoints: [8885], characters: '\u22B5' }, + '◬': { codepoints: [9708], characters: '\u25EC' }, + '≜': { codepoints: [8796], characters: '\u225C' }, + '⨺': { codepoints: [10810], characters: '\u2A3A' }, + '⃛': { codepoints: [8411], characters: '\u20DB' }, + '⨹': { codepoints: [10809], characters: '\u2A39' }, + '⧍': { codepoints: [10701], characters: '\u29CD' }, + '⨻': { codepoints: [10811], characters: '\u2A3B' }, + '⏢': { codepoints: [9186], characters: '\u23E2' }, + '𝒯': { codepoints: [119983], characters: '\uD835\uDCAF' }, + '𝓉': { codepoints: [120009], characters: '\uD835\uDCC9' }, + 'Ц': { codepoints: [1062], characters: '\u0426' }, + 'ц': { codepoints: [1094], characters: '\u0446' }, + 'Ћ': { codepoints: [1035], characters: '\u040B' }, + 'ћ': { codepoints: [1115], characters: '\u045B' }, + 'Ŧ': { codepoints: [358], characters: '\u0166' }, + 'ŧ': { codepoints: [359], characters: '\u0167' }, + '≬': { codepoints: [8812], characters: '\u226C' }, + '↞': { codepoints: [8606], characters: '\u219E' }, + '↠': { codepoints: [8608], characters: '\u21A0' }, + 'Ú': { codepoints: [218], characters: '\u00DA' }, + 'Ú': { codepoints: [218], characters: '\u00DA' }, + 'ú': { codepoints: [250], characters: '\u00FA' }, + 'ú': { codepoints: [250], characters: '\u00FA' }, + '↑': { codepoints: [8593], characters: '\u2191' }, + '↟': { codepoints: [8607], characters: '\u219F' }, + '⇑': { codepoints: [8657], characters: '\u21D1' }, + '⥉': { codepoints: [10569], characters: '\u2949' }, + 'Ў': { codepoints: [1038], characters: '\u040E' }, + 'ў': { codepoints: [1118], characters: '\u045E' }, + 'Ŭ': { codepoints: [364], characters: '\u016C' }, + 'ŭ': { codepoints: [365], characters: '\u016D' }, + 'Û': { codepoints: [219], characters: '\u00DB' }, + 'Û': { codepoints: [219], characters: '\u00DB' }, + 'û': { codepoints: [251], characters: '\u00FB' }, + 'û': { codepoints: [251], characters: '\u00FB' }, + 'У': { codepoints: [1059], characters: '\u0423' }, + 'у': { codepoints: [1091], characters: '\u0443' }, + '⇅': { codepoints: [8645], characters: '\u21C5' }, + 'Ű': { codepoints: [368], characters: '\u0170' }, + 'ű': { codepoints: [369], characters: '\u0171' }, + '⥮': { codepoints: [10606], characters: '\u296E' }, + '⥾': { codepoints: [10622], characters: '\u297E' }, + '𝔘': { codepoints: [120088], characters: '\uD835\uDD18' }, + '𝔲': { codepoints: [120114], characters: '\uD835\uDD32' }, + 'Ù': { codepoints: [217], characters: '\u00D9' }, + 'Ù': { codepoints: [217], characters: '\u00D9' }, + 'ù': { codepoints: [249], characters: '\u00F9' }, + 'ù': { codepoints: [249], characters: '\u00F9' }, + '⥣': { codepoints: [10595], characters: '\u2963' }, + '↿': { codepoints: [8639], characters: '\u21BF' }, + '↾': { codepoints: [8638], characters: '\u21BE' }, + '▀': { codepoints: [9600], characters: '\u2580' }, + '⌜': { codepoints: [8988], characters: '\u231C' }, + '⌜': { codepoints: [8988], characters: '\u231C' }, + '⌏': { codepoints: [8975], characters: '\u230F' }, + '◸': { codepoints: [9720], characters: '\u25F8' }, + 'Ū': { codepoints: [362], characters: '\u016A' }, + 'ū': { codepoints: [363], characters: '\u016B' }, + '¨': { codepoints: [168], characters: '\u00A8' }, + '¨': { codepoints: [168], characters: '\u00A8' }, + '_': { codepoints: [95], characters: '\u005F' }, + '⏟': { codepoints: [9183], characters: '\u23DF' }, + '⎵': { codepoints: [9141], characters: '\u23B5' }, + '⏝': { codepoints: [9181], characters: '\u23DD' }, + '⋃': { codepoints: [8899], characters: '\u22C3' }, + '⊎': { codepoints: [8846], characters: '\u228E' }, + 'Ų': { codepoints: [370], characters: '\u0172' }, + 'ų': { codepoints: [371], characters: '\u0173' }, + '𝕌': { codepoints: [120140], characters: '\uD835\uDD4C' }, + '𝕦': { codepoints: [120166], characters: '\uD835\uDD66' }, + '⤒': { codepoints: [10514], characters: '\u2912' }, + '↑': { codepoints: [8593], characters: '\u2191' }, + '↑': { codepoints: [8593], characters: '\u2191' }, + '⇑': { codepoints: [8657], characters: '\u21D1' }, + '⇅': { codepoints: [8645], characters: '\u21C5' }, + '↕': { codepoints: [8597], characters: '\u2195' }, + '↕': { codepoints: [8597], characters: '\u2195' }, + '⇕': { codepoints: [8661], characters: '\u21D5' }, + '⥮': { codepoints: [10606], characters: '\u296E' }, + '↿': { codepoints: [8639], characters: '\u21BF' }, + '↾': { codepoints: [8638], characters: '\u21BE' }, + '⊎': { codepoints: [8846], characters: '\u228E' }, + '↖': { codepoints: [8598], characters: '\u2196' }, + '↗': { codepoints: [8599], characters: '\u2197' }, + 'υ': { codepoints: [965], characters: '\u03C5' }, + 'ϒ': { codepoints: [978], characters: '\u03D2' }, + 'ϒ': { codepoints: [978], characters: '\u03D2' }, + 'Υ': { codepoints: [933], characters: '\u03A5' }, + 'υ': { codepoints: [965], characters: '\u03C5' }, + '↥': { codepoints: [8613], characters: '\u21A5' }, + '⊥': { codepoints: [8869], characters: '\u22A5' }, + '⇈': { codepoints: [8648], characters: '\u21C8' }, + '⌝': { codepoints: [8989], characters: '\u231D' }, + '⌝': { codepoints: [8989], characters: '\u231D' }, + '⌎': { codepoints: [8974], characters: '\u230E' }, + 'Ů': { codepoints: [366], characters: '\u016E' }, + 'ů': { codepoints: [367], characters: '\u016F' }, + '◹': { codepoints: [9721], characters: '\u25F9' }, + '𝒰': { codepoints: [119984], characters: '\uD835\uDCB0' }, + '𝓊': { codepoints: [120010], characters: '\uD835\uDCCA' }, + '⋰': { codepoints: [8944], characters: '\u22F0' }, + 'Ũ': { codepoints: [360], characters: '\u0168' }, + 'ũ': { codepoints: [361], characters: '\u0169' }, + '▵': { codepoints: [9653], characters: '\u25B5' }, + '▴': { codepoints: [9652], characters: '\u25B4' }, + '⇈': { codepoints: [8648], characters: '\u21C8' }, + 'Ü': { codepoints: [220], characters: '\u00DC' }, + 'Ü': { codepoints: [220], characters: '\u00DC' }, + 'ü': { codepoints: [252], characters: '\u00FC' }, + 'ü': { codepoints: [252], characters: '\u00FC' }, + '⦧': { codepoints: [10663], characters: '\u29A7' }, + '⦜': { codepoints: [10652], characters: '\u299C' }, + 'ϵ': { codepoints: [1013], characters: '\u03F5' }, + 'ϰ': { codepoints: [1008], characters: '\u03F0' }, + '∅': { codepoints: [8709], characters: '\u2205' }, + 'ϕ': { codepoints: [981], characters: '\u03D5' }, + 'ϖ': { codepoints: [982], characters: '\u03D6' }, + '∝': { codepoints: [8733], characters: '\u221D' }, + '↕': { codepoints: [8597], characters: '\u2195' }, + '⇕': { codepoints: [8661], characters: '\u21D5' }, + 'ϱ': { codepoints: [1009], characters: '\u03F1' }, + 'ς': { codepoints: [962], characters: '\u03C2' }, + '⊊︀': { codepoints: [8842, 65024], characters: '\u228A\uFE00' }, + '⫋︀': { codepoints: [10955, 65024], characters: '\u2ACB\uFE00' }, + '⊋︀': { codepoints: [8843, 65024], characters: '\u228B\uFE00' }, + '⫌︀': { codepoints: [10956, 65024], characters: '\u2ACC\uFE00' }, + 'ϑ': { codepoints: [977], characters: '\u03D1' }, + '⊲': { codepoints: [8882], characters: '\u22B2' }, + '⊳': { codepoints: [8883], characters: '\u22B3' }, + '⫨': { codepoints: [10984], characters: '\u2AE8' }, + '⫫': { codepoints: [10987], characters: '\u2AEB' }, + '⫩': { codepoints: [10985], characters: '\u2AE9' }, + 'В': { codepoints: [1042], characters: '\u0412' }, + 'в': { codepoints: [1074], characters: '\u0432' }, + '⊢': { codepoints: [8866], characters: '\u22A2' }, + '⊨': { codepoints: [8872], characters: '\u22A8' }, + '⊩': { codepoints: [8873], characters: '\u22A9' }, + '⊫': { codepoints: [8875], characters: '\u22AB' }, + '⫦': { codepoints: [10982], characters: '\u2AE6' }, + '⊻': { codepoints: [8891], characters: '\u22BB' }, + '∨': { codepoints: [8744], characters: '\u2228' }, + '⋁': { codepoints: [8897], characters: '\u22C1' }, + '≚': { codepoints: [8794], characters: '\u225A' }, + '⋮': { codepoints: [8942], characters: '\u22EE' }, + '|': { codepoints: [124], characters: '\u007C' }, + '‖': { codepoints: [8214], characters: '\u2016' }, + '|': { codepoints: [124], characters: '\u007C' }, + '‖': { codepoints: [8214], characters: '\u2016' }, + '∣': { codepoints: [8739], characters: '\u2223' }, + '|': { codepoints: [124], characters: '\u007C' }, + '❘': { codepoints: [10072], characters: '\u2758' }, + '≀': { codepoints: [8768], characters: '\u2240' }, + ' ': { codepoints: [8202], characters: '\u200A' }, + '𝔙': { codepoints: [120089], characters: '\uD835\uDD19' }, + '𝔳': { codepoints: [120115], characters: '\uD835\uDD33' }, + '⊲': { codepoints: [8882], characters: '\u22B2' }, + '⊂⃒': { codepoints: [8834, 8402], characters: '\u2282\u20D2' }, + '⊃⃒': { codepoints: [8835, 8402], characters: '\u2283\u20D2' }, + '𝕍': { codepoints: [120141], characters: '\uD835\uDD4D' }, + '𝕧': { codepoints: [120167], characters: '\uD835\uDD67' }, + '∝': { codepoints: [8733], characters: '\u221D' }, + '⊳': { codepoints: [8883], characters: '\u22B3' }, + '𝒱': { codepoints: [119985], characters: '\uD835\uDCB1' }, + '𝓋': { codepoints: [120011], characters: '\uD835\uDCCB' }, + '⫋︀': { codepoints: [10955, 65024], characters: '\u2ACB\uFE00' }, + '⊊︀': { codepoints: [8842, 65024], characters: '\u228A\uFE00' }, + '⫌︀': { codepoints: [10956, 65024], characters: '\u2ACC\uFE00' }, + '⊋︀': { codepoints: [8843, 65024], characters: '\u228B\uFE00' }, + '⊪': { codepoints: [8874], characters: '\u22AA' }, + '⦚': { codepoints: [10650], characters: '\u299A' }, + 'Ŵ': { codepoints: [372], characters: '\u0174' }, + 'ŵ': { codepoints: [373], characters: '\u0175' }, + '⩟': { codepoints: [10847], characters: '\u2A5F' }, + '∧': { codepoints: [8743], characters: '\u2227' }, + '⋀': { codepoints: [8896], characters: '\u22C0' }, + '≙': { codepoints: [8793], characters: '\u2259' }, + '℘': { codepoints: [8472], characters: '\u2118' }, + '𝔚': { codepoints: [120090], characters: '\uD835\uDD1A' }, + '𝔴': { codepoints: [120116], characters: '\uD835\uDD34' }, + '𝕎': { codepoints: [120142], characters: '\uD835\uDD4E' }, + '𝕨': { codepoints: [120168], characters: '\uD835\uDD68' }, + '℘': { codepoints: [8472], characters: '\u2118' }, + '≀': { codepoints: [8768], characters: '\u2240' }, + '≀': { codepoints: [8768], characters: '\u2240' }, + '𝒲': { codepoints: [119986], characters: '\uD835\uDCB2' }, + '𝓌': { codepoints: [120012], characters: '\uD835\uDCCC' }, + '⋂': { codepoints: [8898], characters: '\u22C2' }, + '◯': { codepoints: [9711], characters: '\u25EF' }, + '⋃': { codepoints: [8899], characters: '\u22C3' }, + '▽': { codepoints: [9661], characters: '\u25BD' }, + '𝔛': { codepoints: [120091], characters: '\uD835\uDD1B' }, + '𝔵': { codepoints: [120117], characters: '\uD835\uDD35' }, + '⟷': { codepoints: [10231], characters: '\u27F7' }, + '⟺': { codepoints: [10234], characters: '\u27FA' }, + 'Ξ': { codepoints: [926], characters: '\u039E' }, + 'ξ': { codepoints: [958], characters: '\u03BE' }, + '⟵': { codepoints: [10229], characters: '\u27F5' }, + '⟸': { codepoints: [10232], characters: '\u27F8' }, + '⟼': { codepoints: [10236], characters: '\u27FC' }, + '⋻': { codepoints: [8955], characters: '\u22FB' }, + '⨀': { codepoints: [10752], characters: '\u2A00' }, + '𝕏': { codepoints: [120143], characters: '\uD835\uDD4F' }, + '𝕩': { codepoints: [120169], characters: '\uD835\uDD69' }, + '⨁': { codepoints: [10753], characters: '\u2A01' }, + '⨂': { codepoints: [10754], characters: '\u2A02' }, + '⟶': { codepoints: [10230], characters: '\u27F6' }, + '⟹': { codepoints: [10233], characters: '\u27F9' }, + '𝒳': { codepoints: [119987], characters: '\uD835\uDCB3' }, + '𝓍': { codepoints: [120013], characters: '\uD835\uDCCD' }, + '⨆': { codepoints: [10758], characters: '\u2A06' }, + '⨄': { codepoints: [10756], characters: '\u2A04' }, + '△': { codepoints: [9651], characters: '\u25B3' }, + '⋁': { codepoints: [8897], characters: '\u22C1' }, + '⋀': { codepoints: [8896], characters: '\u22C0' }, + 'Ý': { codepoints: [221], characters: '\u00DD' }, + 'Ý': { codepoints: [221], characters: '\u00DD' }, + 'ý': { codepoints: [253], characters: '\u00FD' }, + 'ý': { codepoints: [253], characters: '\u00FD' }, + 'Я': { codepoints: [1071], characters: '\u042F' }, + 'я': { codepoints: [1103], characters: '\u044F' }, + 'Ŷ': { codepoints: [374], characters: '\u0176' }, + 'ŷ': { codepoints: [375], characters: '\u0177' }, + 'Ы': { codepoints: [1067], characters: '\u042B' }, + 'ы': { codepoints: [1099], characters: '\u044B' }, + '¥': { codepoints: [165], characters: '\u00A5' }, + '¥': { codepoints: [165], characters: '\u00A5' }, + '𝔜': { codepoints: [120092], characters: '\uD835\uDD1C' }, + '𝔶': { codepoints: [120118], characters: '\uD835\uDD36' }, + 'Ї': { codepoints: [1031], characters: '\u0407' }, + 'ї': { codepoints: [1111], characters: '\u0457' }, + '𝕐': { codepoints: [120144], characters: '\uD835\uDD50' }, + '𝕪': { codepoints: [120170], characters: '\uD835\uDD6A' }, + '𝒴': { codepoints: [119988], characters: '\uD835\uDCB4' }, + '𝓎': { codepoints: [120014], characters: '\uD835\uDCCE' }, + 'Ю': { codepoints: [1070], characters: '\u042E' }, + 'ю': { codepoints: [1102], characters: '\u044E' }, + 'ÿ': { codepoints: [255], characters: '\u00FF' }, + 'ÿ': { codepoints: [255], characters: '\u00FF' }, + 'Ÿ': { codepoints: [376], characters: '\u0178' }, + 'Ź': { codepoints: [377], characters: '\u0179' }, + 'ź': { codepoints: [378], characters: '\u017A' }, + 'Ž': { codepoints: [381], characters: '\u017D' }, + 'ž': { codepoints: [382], characters: '\u017E' }, + 'З': { codepoints: [1047], characters: '\u0417' }, + 'з': { codepoints: [1079], characters: '\u0437' }, + 'Ż': { codepoints: [379], characters: '\u017B' }, + 'ż': { codepoints: [380], characters: '\u017C' }, + 'ℨ': { codepoints: [8488], characters: '\u2128' }, + '​': { codepoints: [8203], characters: '\u200B' }, + 'Ζ': { codepoints: [918], characters: '\u0396' }, + 'ζ': { codepoints: [950], characters: '\u03B6' }, + '𝔷': { codepoints: [120119], characters: '\uD835\uDD37' }, + 'ℨ': { codepoints: [8488], characters: '\u2128' }, + 'Ж': { codepoints: [1046], characters: '\u0416' }, + 'ж': { codepoints: [1078], characters: '\u0436' }, + '⇝': { codepoints: [8669], characters: '\u21DD' }, + '𝕫': { codepoints: [120171], characters: '\uD835\uDD6B' }, + 'ℤ': { codepoints: [8484], characters: '\u2124' }, + '𝒵': { codepoints: [119989], characters: '\uD835\uDCB5' }, + '𝓏': { codepoints: [120015], characters: '\uD835\uDCCF' }, + '‍': { codepoints: [8205], characters: '\u200D' }, + '‌': { codepoints: [8204], characters: '\u200C' }, }; -var ALPHANUMERIC = /^[a-zA-Z0-9]/; -var getPossibleNamedEntityStart = makeRegexMatcher(/^&[a-zA-Z0-9]/); -var getApparentNamedEntity = makeRegexMatcher(/^&[a-zA-Z0-9]+;/); +const ALPHANUMERIC = /^[a-zA-Z0-9]/; +const getPossibleNamedEntityStart = makeRegexMatcher(/^&[a-zA-Z0-9]/); +const getApparentNamedEntity = makeRegexMatcher(/^&[a-zA-Z0-9]+;/); + +const getNamedEntityByFirstChar = {}; -var getNamedEntityByFirstChar = {}; (function () { - var namedEntitiesByFirstChar = {}; - for (var ent in ENTITIES) { - var chr = ent.charAt(1); - namedEntitiesByFirstChar[chr] = (namedEntitiesByFirstChar[chr] || []); - namedEntitiesByFirstChar[chr].push(ent.slice(2)); - } - for (var chr in namedEntitiesByFirstChar) { - getNamedEntityByFirstChar[chr] = makeRegexMatcher( - new RegExp('^&' + chr + '(?:' + - namedEntitiesByFirstChar[chr].join('|') + ')')); - } -})(); + const namedEntitiesByFirstChar = {}; + let char; + + Object.getOwnPropertyNames(ENTITIES).forEach(ent => { + char = ent.charAt(1); + namedEntitiesByFirstChar[char] = (namedEntitiesByFirstChar[char] || []); + namedEntitiesByFirstChar[char].push(ent.slice(2)); + }); + + Object.keys(namedEntitiesByFirstChar).forEach(chr => { + const regex = new RegExp(`^&${chr}(?:${namedEntitiesByFirstChar[chr].join('|')})`); + getNamedEntityByFirstChar[chr] = makeRegexMatcher(regex); + }); +}()); // Run a provided "matcher" function but reset the current position afterwards. // Fatal failure of the matcher is not suppressed. -var peekMatcher = function (scanner, matcher) { - var start = scanner.pos; - var result = matcher(scanner); +const peekMatcher = function (scanner, matcher) { + const start = scanner.pos; + const result = matcher(scanner); scanner.pos = start; + return result; }; // Returns a string like "&" or a falsy value if no match. Fails fatally // if something looks like a named entity but isn't. -var getNamedCharRef = function (scanner, inAttribute) { +const getNamedCharRef = function (scanner, inAttribute) { // look for `&` followed by alphanumeric - if (! peekMatcher(scanner, getPossibleNamedEntityStart)) + if (!peekMatcher(scanner, getPossibleNamedEntityStart)) { return null; + } - var matcher = getNamedEntityByFirstChar[scanner.rest().charAt(1)]; - var entity = null; - if (matcher) + const matcher = getNamedEntityByFirstChar[scanner.rest().charAt(1)]; + let entity = null; + + if (matcher) { entity = peekMatcher(scanner, matcher); + } if (entity) { if (entity.slice(-1) !== ';') { @@ -2288,62 +2293,70 @@ var getNamedCharRef = function (scanner, inAttribute) { // // This rule affects href attributes, for example, deeming "/?foo=bar<c=abc" // to be ok but "/?foo=bar<=abc" to not be. - if (inAttribute && ALPHANUMERIC.test(scanner.rest().charAt(entity.length))) + if (inAttribute && ALPHANUMERIC.test(scanner.rest().charAt(entity.length))) { return null; - scanner.fatal("Character reference requires semicolon: " + entity); - } else { - scanner.pos += entity.length; - return entity; + } + + scanner.fatal(`Character reference requires semicolon: ${entity}`); } - } else { - // we couldn't match any real entity, so see if this is a bad entity - // or something we can overlook. - var badEntity = peekMatcher(scanner, getApparentNamedEntity); - if (badEntity) - scanner.fatal("Invalid character reference: " + badEntity); - // `&aaaa` is ok with no semicolon - return null; + + scanner.pos += entity.length; + + return entity; } + + // we couldn't match any real entity, so see if this is a bad entity + // or something we can overlook. + const badEntity = peekMatcher(scanner, getApparentNamedEntity); + + if (badEntity) { + scanner.fatal(`Invalid character reference: ${badEntity}`); + } + + // `&aaaa` is ok with no semicolon + + return null; }; // Returns the sequence of one or two codepoints making up an entity as an array. // Codepoints in the array are integers and may be out of the single-char JavaScript // range. -var getCodePoints = function (namedEntity) { +const getCodePoints = function (namedEntity) { return ENTITIES[namedEntity].codepoints; }; -var ALLOWED_AFTER_AMP = /^[\u0009\u000a\u000c <&]/; +const ALLOWED_AFTER_AMP = /^[\u0009\u000a\u000c <&]/; -var getCharRefNumber = makeRegexMatcher(/^(?:[xX][0-9a-fA-F]+|[0-9]+);/); +const getCharRefNumber = makeRegexMatcher(/^(?:[xX][0-9a-fA-F]+|\d+);/); -var BIG_BAD_CODEPOINTS = (function (obj) { - var list = [0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, - 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, - 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, - 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, - 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, - 0x10FFFE, 0x10FFFF]; - for (var i = 0; i < list.length; i++) - obj[list[i]] = true; +const BIG_BAD_CODEPOINTS = (function (obj) { + const list = [0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, + 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, + 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, + 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, + 0xDFFFE, 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]; + + list.forEach(item => { + obj[item] = true; + }); return obj; -})({}); +}({})); -var isLegalCodepoint = function (cp) { +const isLegalCodepoint = function (cp) { if ((cp === 0) || - (cp >= 0x80 && cp <= 0x9f) || - (cp >= 0xd800 && cp <= 0xdfff) || - (cp >= 0x10ffff) || - (cp >= 0x1 && cp <= 0x8) || - (cp === 0xb) || - (cp >= 0xd && cp <= 0x1f) || - (cp >= 0x7f && cp <= 0x9f) || - (cp >= 0xfdd0 && cp <= 0xfdef) || - (cp === 0xfffe) || - (cp === 0xffff) || - (cp >= 0x10000 && BIG_BAD_CODEPOINTS[cp])) - return false; + (cp >= 0x80 && cp <= 0x9f) || + (cp >= 0xd800 && cp <= 0xdfff) || + (cp >= 0x10ffff) || + (cp >= 0x1 && cp <= 0x8) || + (cp === 0xb) || + (cp >= 0xd && cp <= 0x1f) || + (cp >= 0x7f && cp <= 0x9f) || + (cp >= 0xfdd0 && cp <= 0xfdef) || + (cp === 0xfffe) || + (cp === 0xffff) || + (cp >= 0x10000 && BIG_BAD_CODEPOINTS[cp])) return false; return true; }; @@ -2361,55 +2374,67 @@ var isLegalCodepoint = function (cp) { // either `"`, `'`, or `>` and is supplied when parsing attribute values. NOTE: In the current spec, the // value of `allowedChar` doesn't actually seem to end up mattering, but there is still some debate about // the right approach to ampersands. -export function getCharacterReference (scanner, inAttribute, allowedChar) { - if (scanner.peek() !== '&') +export function getCharacterReference(scanner, inAttribute, allowedChar) { + if (scanner.peek() !== '&') { // no ampersand return null; + } - var afterAmp = scanner.rest().charAt(1); + const afterAmp = scanner.rest().charAt(1); if (afterAmp === '#') { scanner.pos += 2; + // refNumber includes possible initial `x` and final semicolon - var refNumber = getCharRefNumber(scanner); + const refNumber = getCharRefNumber(scanner); + // At this point we've consumed the input, so we're committed to returning // something or failing fatally. - if (! refNumber) - scanner.fatal("Invalid numerical character reference starting with &#"); - var codepoint; + if (!refNumber) scanner.fatal('Invalid numerical character reference starting with &#'); + + let codepoint; + if (refNumber.charAt(0) === 'x' || refNumber.charAt(0) === 'X') { // hex - var hex = refNumber.slice(1, -1); - while (hex.charAt(0) === '0') - hex = hex.slice(1); - if (hex.length > 6) - scanner.fatal("Numerical character reference too large: 0x" + hex); - codepoint = parseInt(hex || "0", 16); + let hex = refNumber.slice(1, -1); + + while (hex.charAt(0) === '0') hex = hex.slice(1); + + if (hex.length > 6) scanner.fatal(`Numerical character reference too large: 0x${hex}`); + + codepoint = parseInt(hex || '0', 16); } else { - var dec = refNumber.slice(0, -1); - while (dec.charAt(0) === '0') - dec = dec.slice(1); - if (dec.length > 7) - scanner.fatal("Numerical character reference too large: " + dec); - codepoint = parseInt(dec || "0", 10); + let dec = refNumber.slice(0, -1); + + while (dec.charAt(0) === '0') dec = dec.slice(1); + + if (dec.length > 7) scanner.fatal(`Numerical character reference too large: ${dec}`); + + codepoint = parseInt(dec || '0', 10); } - if (! isLegalCodepoint(codepoint)) - scanner.fatal("Illegal codepoint in numerical character reference: &#" + refNumber); - return { t: 'CharRef', - v: '&#' + refNumber, - cp: [codepoint] }; - } else if ((! afterAmp) // EOF - || (allowedChar && afterAmp === allowedChar) - || ALLOWED_AFTER_AMP.test(afterAmp)) { + + if (!isLegalCodepoint(codepoint)) scanner.fatal(`Illegal codepoint in numerical character reference: &#${refNumber}`); + + return { + t: 'CharRef', + v: `&#${refNumber}`, + cp: [codepoint], + }; + } + if ((!afterAmp) // EOF + || (allowedChar && afterAmp === allowedChar) + || ALLOWED_AFTER_AMP.test(afterAmp)) { return null; - } else { - var namedEntity = getNamedCharRef(scanner, inAttribute); - if (namedEntity) { - return { t: 'CharRef', - v: namedEntity, - cp: getCodePoints(namedEntity) }; - } else { - return null; - } } + const namedEntity = getNamedCharRef(scanner, inAttribute); + + if (namedEntity) { + return { + t: 'CharRef', + v: namedEntity, + cp: getCodePoints(namedEntity), + }; + } + + return null; } diff --git a/packages/html-tools/charref_tests.js b/packages/html-tools/charref_tests.js index 2c7d555ad..fe1baac6e 100644 --- a/packages/html-tools/charref_tests.js +++ b/packages/html-tools/charref_tests.js @@ -1,12 +1,12 @@ +/* eslint-env meteor */ import { HTMLTools } from 'meteor/html-tools'; -var Scanner = HTMLTools.Scanner; -var getCharacterReference = HTMLTools.Parse.getCharacterReference; +const { Scanner } = HTMLTools; +const { getCharacterReference } = HTMLTools.Parse; -Tinytest.add("html-tools - entities", function (test) { - var succeed = function (input, match, codepoints) { - if (typeof input === 'string') - input = {input: input}; +Tinytest.add('html-tools - entities', function (test) { + const succeed = function (input, match, codepoints) { + if (typeof input === 'string') input = { input }; // match arg is optional; codepoints is never a string if (typeof match !== 'string') { @@ -14,43 +14,42 @@ Tinytest.add("html-tools - entities", function (test) { match = input.input; } - var scanner = new Scanner(input.input); - var result = getCharacterReference(scanner, input.inAttribute, input.allowedChar); + const scanner = new Scanner(input.input); + const result = getCharacterReference(scanner, input.inAttribute, input.allowedChar); test.isTrue(result); test.equal(scanner.pos, match.length); test.equal(result, { t: 'CharRef', v: match, cp: codepoints.map( - function (x) { return (typeof x === 'string' ? - x.charCodeAt(0) : x); }) + function (x) { + return (typeof x === 'string' ? + x.charCodeAt(0) : x); + }), }); }; - var ignore = function (input) { - if (typeof input === 'string') - input = {input: input}; + const ignore = function (input) { + if (typeof input === 'string') input = { input }; - var scanner = new Scanner(input.input); - var result = getCharacterReference(scanner, input.inAttribute, input.allowedChar); + const scanner = new Scanner(input.input); + const result = getCharacterReference(scanner, input.inAttribute, input.allowedChar); test.isFalse(result); test.equal(scanner.pos, 0); }; - var fatal = function (input, messageContains) { - if (typeof input === 'string') - input = {input: input}; + const fatal = function (input, messageContains) { + if (typeof input === 'string') input = { input }; - var scanner = new Scanner(input.input); - var error; + const scanner = new Scanner(input.input); + let error; try { getCharacterReference(scanner, input.inAttribute, input.allowedChar); } catch (e) { error = e; } test.isTrue(error); - if (error) - test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); + if (error) test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); }; ignore('a'); @@ -61,15 +60,15 @@ Tinytest.add("html-tools - entities", function (test) { fatal('&#', 'Invalid numerical character reference starting with &#'); ignore('&a'); fatal('&a;', 'Invalid character reference: &a;'); - ignore({input: '&"', allowedChar: '"'}); + ignore({ input: '&"', allowedChar: '"' }); ignore('&"'); succeed('>', ['>']); fatal('>', 'Character reference requires semicolon'); ignore('&aaa'); fatal('>a', 'Character reference requires semicolon'); - ignore({input: '>a', inAttribute: true}); - fatal({input: '>=', inAttribute: true}, 'Character reference requires semicolon: >'); + ignore({ input: '>a', inAttribute: true }); + fatal({ input: '>=', inAttribute: true }, 'Character reference requires semicolon: >'); succeed('>;', '>', ['>']); @@ -112,5 +111,4 @@ Tinytest.add("html-tools - entities", function (test) { fatal('􏿿', 'Illegal codepoint in numerical character reference'); fatal('􏿾', 'Illegal codepoint in numerical character reference'); succeed('􏿽', [0x10fffd]); - }); diff --git a/packages/html-tools/main.js b/packages/html-tools/main.js index 4250fb909..26673a78f 100644 --- a/packages/html-tools/main.js +++ b/packages/html-tools/main.js @@ -1,12 +1,11 @@ - import { getCharacterReference } from './charref'; -import { asciiLowerCase, properCaseTagName, properCaseAttributeName} from "./utils"; -import { TemplateTag } from './templatetag' +import { asciiLowerCase, properCaseTagName, properCaseAttributeName } from './utils'; +import { TemplateTag } from './templatetag'; import { Scanner } from './scanner'; import { parseFragment, codePointToString, getContent, getRCData } from './parse'; import { getComment, getDoctype, getHTMLToken, getTagToken, TEMPLATE_TAG_POSITION } from './tokenize'; -HTMLTools = { +export const HTMLTools = { asciiLowerCase, properCaseTagName, properCaseAttributeName, @@ -23,7 +22,5 @@ HTMLTools = { getDoctype, getHTMLToken, getTagToken, - } + }, }; - -export { HTMLTools }; diff --git a/packages/html-tools/package.js b/packages/html-tools/package.js index af5d8d183..ef09dad36 100644 --- a/packages/html-tools/package.js +++ b/packages/html-tools/package.js @@ -1,8 +1,9 @@ +/* eslint-env meteor */ Package.describe({ name: 'html-tools', - summary: "Standards-compliant HTML tools", - version: '1.1.3', - git: 'https://github.com/meteor/blaze.git' + summary: 'Standards-compliant HTML tools', + version: '1.2.0', + git: 'https://github.com/meteor/blaze.git', }); Package.onUse(function (api) { @@ -25,6 +26,6 @@ Package.onTest(function (api) { api.addFiles([ 'charref_tests.js', 'tokenize_tests.js', - 'parse_tests.js' + 'parse_tests.js', ]); }); diff --git a/packages/html-tools/parse.js b/packages/html-tools/parse.js index 248b1ab3c..84f4ae7ab 100644 --- a/packages/html-tools/parse.js +++ b/packages/html-tools/parse.js @@ -3,360 +3,368 @@ import { Scanner } from './scanner'; import { properCaseAttributeName } from './utils'; import { getHTMLToken, isLookingAtEndTag } from './tokenize'; -// Parse a "fragment" of HTML, up to the end of the input or a particular -// template tag (using the "shouldStop" option). -export function parseFragment(input, options) { - var scanner; - if (typeof input === 'string') - scanner = new Scanner(input); - else - // input can be a scanner. We'd better not have a different - // value for the "getTemplateTag" option as when the scanner - // was created, because we don't do anything special to reset - // the value (which is attached to the scanner). - scanner = input; - - // ``` - // { getTemplateTag: function (scanner, templateTagPosition) { - // if (templateTagPosition === HTMLTools.TEMPLATE_TAG_POSITION.ELEMENT) { - // ... - // ``` - if (options && options.getTemplateTag) - scanner.getTemplateTag = options.getTemplateTag; - - // function (scanner) -> boolean - var shouldStop = options && options.shouldStop; - - var result; - if (options && options.textMode) { - if (options.textMode === HTML.TEXTMODE.STRING) { - result = getRawText(scanner, null, shouldStop); - } else if (options.textMode === HTML.TEXTMODE.RCDATA) { - result = getRCData(scanner, null, shouldStop); - } else { - throw new Error("Unsupported textMode: " + options.textMode); - } +const pushOrAppendString = (items, string) => { + if (items.length && typeof items[items.length - 1] === 'string') { + items[items.length - 1] += string; } else { - result = getContent(scanner, shouldStop); + items.push(string); } - if (! scanner.isEOF()) { - // If we aren't at the end of the input, we either stopped at an unmatched - // HTML end tag or at a template tag (like `{{else}}` or `{{/if}}`). - // Detect the former case (stopped at an HTML end tag) and throw a good - // error. - - var posBefore = scanner.pos; - - try { - var endTag = getHTMLToken(scanner); - } catch (e) { - // ignore errors from getTemplateTag - } - - // XXX we make some assumptions about shouldStop here, like that it - // won't tell us to stop at an HTML end tag. Should refactor - // `shouldStop` into something more suitable. - if (endTag && endTag.t === 'Tag' && endTag.isEnd) { - var closeTag = endTag.n; - var isVoidElement = HTML.isVoidElement(closeTag); - scanner.fatal("Unexpected HTML close tag" + - (isVoidElement ? - '. <' + endTag.n + '> should have no close tag.' : '')); - } - scanner.pos = posBefore; // rewind, we'll continue parsing as usual + return items; +}; - // If no "shouldStop" option was provided, we should have consumed the whole - // input. - if (! shouldStop) - scanner.fatal("Expected EOF"); - } - - return result; -} // Take a numeric Unicode code point, which may be larger than 16 bits, // and encode it as a JavaScript UTF-16 string. // // Adapted from // http://stackoverflow.com/questions/7126384/expressing-utf-16-unicode-characters-in-javascript/7126661. -export function codePointToString(cp) { - if (cp >= 0 && cp <= 0xD7FF || cp >= 0xE000 && cp <= 0xFFFF) { - return String.fromCharCode(cp); - } else if (cp >= 0x10000 && cp <= 0x10FFFF) { - - // we substract 0x10000 from cp to get a 20-bit number +export function codePointToString(codePoint) { + if (codePoint >= 0 && codePoint <= 0xD7FF || codePoint >= 0xE000 && codePoint <= 0xFFFF) { + return String.fromCharCode(codePoint); + } + if (codePoint >= 0x10000 && codePoint <= 0x10FFFF) { + // we subtract 0x10000 from codePoint to get a 20-bit number // in the range 0..0xFFFF - cp -= 0x10000; + codePoint -= 0x10000; // we add 0xD800 to the number formed by the first 10 bits // to give the first byte - var first = ((0xffc00 & cp) >> 10) + 0xD800; + const first = ((0xffc00 & codePoint) >> 10) + 0xD800; // we add 0xDC00 to the number formed by the low 10 bits // to give the second byte - var second = (0x3ff & cp) + 0xDC00; + const second = (0x3ff & codePoint) + 0xDC00; return String.fromCharCode(first) + String.fromCharCode(second); - } else { - return ''; } + + return ''; } -export function getContent (scanner, shouldStopFunc) { - var items = []; - - while (! scanner.isEOF()) { - if (shouldStopFunc && shouldStopFunc(scanner)) - break; - - var posBefore = scanner.pos; - var token = getHTMLToken(scanner); - if (! token) - // tokenizer reached EOF on its own, e.g. while scanning - // template comments like `{{! foo}}`. - continue; - - if (token.t === 'Doctype') { - scanner.fatal("Unexpected Doctype"); - } else if (token.t === 'Chars') { - pushOrAppendString(items, token.v); - } else if (token.t === 'CharRef') { - items.push(convertCharRef(token)); - } else if (token.t === 'Comment') { - items.push(HTML.Comment(token.v)); - } else if (token.t === 'TemplateTag') { - items.push(token.v); - } else if (token.t === 'Tag') { - if (token.isEnd) { - // Stop when we encounter an end tag at the top level. - // Rewind; we'll re-parse the end tag later. - scanner.pos = posBefore; - break; - } +// Input: A token like `{ t: 'CharRef', v: '&', cp: [38] }`. +// +// Output: A tag like `HTML.CharRef({ html: '&', str: '&' })`. +const convertCharRef = token => { + const codePoints = token.cp; + let str = ''; + + for (const item of codePoints) str += codePointToString(item); + + return HTML.CharRef({ html: token.v, str }); +}; + +// Input is always a dictionary (even if zero attributes) and each +// value in the dictionary is an array of `Chars`, `CharRef`, +// and maybe `TemplateTag` tokens. +// +// Output is null if there are zero attributes, and otherwise a +// dictionary, or an array of dictionaries and template tags. +// Each value in the dictionary is HTMLjs (e.g. a +// string or an array of `Chars`, `CharRef`, and `TemplateTag` +// nodes). +// +// An attribute value with no input tokens is represented as "", +// not an empty array, in order to prop open empty attributes +// with no template tags. +const parseAttrs = attrs => { + let result = null; + + if (HTML.isArray(attrs)) { + // first element is non-dynamic attrs, rest are template tags + const nonDynamicAttrs = parseAttrs(attrs[0]); + + if (nonDynamicAttrs) { + result = (result || []); + result.push(nonDynamicAttrs); + } - var tagName = token.n; - // is this an element with no close tag (a BR, HR, IMG, etc.) based - // on its name? - var isVoid = HTML.isVoidElement(tagName); - if (token.isSelfClosing) { - if (! (isVoid || HTML.isKnownSVGElement(tagName) || tagName.indexOf(':') >= 0)) - scanner.fatal('Only certain elements like BR, HR, IMG, etc. (and foreign elements like SVG) are allowed to self-close'); + for (let i = 1; i < attrs.length; i++) { + const token = attrs[i]; + + if (token.t !== 'TemplateTag') throw new Error('Expected TemplateTag token'); + + result = (result || []); + result.push(token.v); + } + + return result; + } + + for (const k in attrs) { + if (!result) result = {}; + + const inValue = attrs[k]; + let outParts = []; + + inValue.forEach(token => { + switch (token.t) { + case 'Chars': + outParts = pushOrAppendString(outParts, token.v); + break; + case 'CharRef': + outParts.push(convertCharRef(token)); + break; + case 'TemplateTag': + outParts.push(token.v); + break; + default: + break; } + }); - // result of parseAttrs may be null - var attrs = parseAttrs(token.attrs); - // arrays need to be wrapped in HTML.Attrs(...) - // when used to construct tags - if (HTML.isArray(attrs)) - attrs = HTML.Attrs.apply(null, attrs); + const outValue = (inValue.length === 0 ? '' : (outParts.length === 1 ? outParts[0] : outParts)); + const properKey = properCaseAttributeName(k); - var tagFunc = HTML.getTag(tagName); - if (isVoid || token.isSelfClosing) { - items.push(attrs ? tagFunc(attrs) : tagFunc()); - } else { - // parse HTML tag contents. - - // HTML treats a final `/` in a tag as part of an attribute, as in ``, but the template author who writes ``, say, may not be thinking about that, so generate a good error message in the "looks like self-close" case. - var looksLikeSelfClose = (scanner.input.substr(scanner.pos - 2, 2) === '/>'); - - var content = null; - if (token.n === 'textarea') { - if (scanner.peek() === '\n') - scanner.pos++; - var textareaValue = getRCData(scanner, token.n, shouldStopFunc); - if (textareaValue) { - if (attrs instanceof HTML.Attrs) { - attrs = HTML.Attrs.apply( - null, attrs.value.concat([{value: textareaValue}])); - } else { - attrs = (attrs || {}); - attrs.value = textareaValue; - } - } - } else if (token.n === 'script' || token.n === 'style') { - content = getRawText(scanner, token.n, shouldStopFunc); - } else { - content = getContent(scanner, shouldStopFunc); - } + result[properKey] = outValue; + } - var endTag = getHTMLToken(scanner); + return result; +}; - if (! (endTag && endTag.t === 'Tag' && endTag.isEnd && endTag.n === tagName)) - scanner.fatal('Expected "' + tagName + '" end tag' + (looksLikeSelfClose ? ' -- if the "<' + token.n + ' />" tag was supposed to self-close, try adding a space before the "/"' : '')); +// Parse a "fragment" of HTML, up to the end of the input or a particular +const getRawText = (scanner, tagName, shouldStopFunc) => { + let items = []; - // XXX support implied end tags in cases allowed by the spec + while (!scanner.isEOF()) { + // break at appropriate end tag + if (tagName && isLookingAtEndTag(scanner, tagName)) break; - // make `content` into an array suitable for applying tag constructor - // as in `FOO.apply(null, content)`. - if (content == null) - content = []; - else if (! HTML.isArray(content)) - content = [content]; + if (shouldStopFunc && shouldStopFunc(scanner)) break; - items.push(HTML.getTag(tagName).apply( - null, (attrs ? [attrs] : []).concat(content))); + const token = getHTMLToken(scanner, 'rawtext'); + + /** + * Tokenizer has not reached EOF on its own, @example e.g. while scanning + * @example e.g. while scanning template comments like `{{! foo}}`. + */ + if (token) { + if (token.t === 'Chars') { + items = pushOrAppendString(items, token.v); + } else if (token.t === 'TemplateTag') { + items.push(token.v); + } else { + // (can't happen) + scanner.fatal(`Unknown or unexpected token type: ${token.t}`); } - } else { - scanner.fatal("Unknown token type: " + token.t); } } - if (items.length === 0) - return null; - else if (items.length === 1) - return items[0]; - else - return items; -} + if (items.length === 0) return null; + if (items.length === 1) return items[0]; -var pushOrAppendString = function (items, string) { - if (items.length && - typeof items[items.length - 1] === 'string') - items[items.length - 1] += string; - else - items.push(string); + return items; }; -// get RCDATA to go in the lowercase (or camel case) tagName (e.g. "textarea") +// Get RCDATA to go in the lowercase (or camel case) tagName (e.g. "textarea") export function getRCData(scanner, tagName, shouldStopFunc) { - var items = []; + let items = []; - while (! scanner.isEOF()) { + while (!scanner.isEOF()) { // break at appropriate end tag - if (tagName && isLookingAtEndTag(scanner, tagName)) - break; - - if (shouldStopFunc && shouldStopFunc(scanner)) - break; - - var token = getHTMLToken(scanner, 'rcdata'); - if (! token) - // tokenizer reached EOF on its own, e.g. while scanning - // template comments like `{{! foo}}`. - continue; - - if (token.t === 'Chars') { - pushOrAppendString(items, token.v); - } else if (token.t === 'CharRef') { - items.push(convertCharRef(token)); - } else if (token.t === 'TemplateTag') { - items.push(token.v); - } else { - // (can't happen) - scanner.fatal("Unknown or unexpected token type: " + token.t); + if (tagName && isLookingAtEndTag(scanner, tagName)) break; + + if (shouldStopFunc && shouldStopFunc(scanner)) break; + + const token = getHTMLToken(scanner, 'rcdata'); + + /** + * Tokenizer has not reached EOF on its own, @example e.g. while scanning + * @example e.g. while scanning template comments like `{{! foo}}`. + */ + if (token) { + switch (token.t) { + case 'Chars': + items = pushOrAppendString(items, token.v); + break; + case 'CharRef': + items.push(convertCharRef(token)); + break; + case 'TemplateTag': + items.push(token.v); + break; + default: + // (can't happen) + scanner.fatal(`Unknown or unexpected token type: ${token.t}`); + } } } - if (items.length === 0) - return null; - else if (items.length === 1) - return items[0]; - else - return items; + if (items.length === 0) return null; + if (items.length === 1) return items[0]; + + return items; } -var getRawText = function (scanner, tagName, shouldStopFunc) { - var items = []; +export function getContent(scanner, shouldStopFunc) { + let items = []; - while (! scanner.isEOF()) { - // break at appropriate end tag - if (tagName && isLookingAtEndTag(scanner, tagName)) - break; - - if (shouldStopFunc && shouldStopFunc(scanner)) - break; - - var token = getHTMLToken(scanner, 'rawtext'); - if (! token) - // tokenizer reached EOF on its own, e.g. while scanning - // template comments like `{{! foo}}`. - continue; - - if (token.t === 'Chars') { - pushOrAppendString(items, token.v); - } else if (token.t === 'TemplateTag') { - items.push(token.v); - } else { - // (can't happen) - scanner.fatal("Unknown or unexpected token type: " + token.t); + while (!scanner.isEOF()) { + if (shouldStopFunc && shouldStopFunc(scanner)) break; + + const posBefore = scanner.pos; + const token = getHTMLToken(scanner); + + /** + * Tokenizer has not reached EOF on its own, @example e.g. while scanning + * @example e.g. while scanning template comments like `{{! foo}}`. + */ + if (token) { + if (token.t === 'Doctype') { + scanner.fatal('Unexpected Doctype'); + } else if (token.t === 'Chars') { + items = pushOrAppendString(items, token.v); + } else if (token.t === 'CharRef') { + items.push(convertCharRef(token)); + } else if (token.t === 'Comment') { + items.push(HTML.Comment(token.v)); + } else if (token.t === 'TemplateTag') { + items.push(token.v); + } else if (token.t === 'Tag') { + if (token.isEnd) { + // Stop when we encounter an end tag at the top level. + // Rewind; we'll re-parse the end tag later. + scanner.pos = posBefore; + break; + } + + const tagName = token.n; + + // is this an element with no close tag (a BR, HR, IMG, etc.) based + // on its name? + const isVoid = HTML.isVoidElement(tagName); + + if (token.isSelfClosing) { + if (!(isVoid || HTML.isKnownSVGElement(tagName) || tagName.indexOf(':') >= 0)) scanner.fatal('Only certain elements like BR, HR, IMG, etc. (and foreign elements like SVG) are allowed to self-close'); + } + + // result of parseAttrs may be null + let attrs = parseAttrs(token.attrs); + + // arrays need to be wrapped in HTML.Attrs(...) + // when used to construct tags + if (HTML.isArray(attrs)) attrs = HTML.Attrs.apply(null, attrs); + + const tagFunc = HTML.getTag(tagName); + + if (isVoid || token.isSelfClosing) { + items.push(attrs ? tagFunc(attrs) : tagFunc()); + } else { + // parse HTML tag contents. + + // HTML treats a final `/` in a tag as part of an attribute, as in ``, but the template author who writes ``, say, may not be thinking about that, so generate a good error message in the "looks like self-close" case. + const looksLikeSelfClose = (scanner.input.substr(scanner.pos - 2, 2) === '/>'); + + let content = null; + + if (token.n === 'textarea') { + if (scanner.peek() === '\n') scanner.pos++; + const textareaValue = getRCData(scanner, token.n, shouldStopFunc); + if (textareaValue) { + if (attrs instanceof HTML.Attrs) { + attrs = HTML.Attrs.apply( + null, attrs.value.concat([{ value: textareaValue }])); + } else { + attrs = (attrs || {}); + attrs.value = textareaValue; + } + } + } else if (token.n === 'script' || token.n === 'style') { + content = getRawText(scanner, token.n, shouldStopFunc); + } else { + content = getContent(scanner, shouldStopFunc); + } + + const endTag = getHTMLToken(scanner); + + if (!(endTag && endTag.t === 'Tag' && endTag.isEnd && endTag.n === tagName)) scanner.fatal(`Expected "${tagName}" end tag${looksLikeSelfClose ? ` -- if the "<${token.n} />" tag was supposed to self-close, try adding a space before the "/"` : ''}`); + + // XXX support implied end tags in cases allowed by the spec + + // make `content` into an array suitable for applying tag constructor + // as in `FOO.apply(null, content)`. + if (content == null) content = []; + else if (!HTML.isArray(content)) content = [content]; + + items.push(HTML.getTag(tagName).apply(null, (attrs ? [attrs] : []).concat(content))); + } + } else { + scanner.fatal(`Unknown token type: ${token.t}`); + } } } - if (items.length === 0) - return null; - else if (items.length === 1) - return items[0]; - else - return items; -}; + if (items.length === 0) return null; + if (items.length === 1) return items[0]; -// Input: A token like `{ t: 'CharRef', v: '&', cp: [38] }`. -// -// Output: A tag like `HTML.CharRef({ html: '&', str: '&' })`. -var convertCharRef = function (token) { - var codePoints = token.cp; - var str = ''; - for (var i = 0; i < codePoints.length; i++) - str += codePointToString(codePoints[i]); - return HTML.CharRef({ html: token.v, str: str }); -}; + return items; +} -// Input is always a dictionary (even if zero attributes) and each -// value in the dictionary is an array of `Chars`, `CharRef`, -// and maybe `TemplateTag` tokens. -// -// Output is null if there are zero attributes, and otherwise a -// dictionary, or an array of dictionaries and template tags. -// Each value in the dictionary is HTMLjs (e.g. a -// string or an array of `Chars`, `CharRef`, and `TemplateTag` -// nodes). -// -// An attribute value with no input tokens is represented as "", -// not an empty array, in order to prop open empty attributes -// with no template tags. -var parseAttrs = function (attrs) { - var result = null; +// template tag (using the "shouldStop" option). +export function parseFragment(input, options) { + let scanner; - if (HTML.isArray(attrs)) { - // first element is nondynamic attrs, rest are template tags - var nondynamicAttrs = parseAttrs(attrs[0]); - if (nondynamicAttrs) { - result = (result || []); - result.push(nondynamicAttrs); - } - for (var i = 1; i < attrs.length; i++) { - var token = attrs[i]; - if (token.t !== 'TemplateTag') - throw new Error("Expected TemplateTag token"); - result = (result || []); - result.push(token.v); + if (typeof input === 'string') { + scanner = new Scanner(input); + } else { + // input can be a scanner. We'd better not have a different + // value for the "getTemplateTag" option as when the scanner + // was created, because we don't do anything special to reset + // the value (which is attached to the scanner). + scanner = input; + } + + if (options && options.getTemplateTag) { + scanner.getTemplateTag = options.getTemplateTag; + } + + // function (scanner) -> boolean + const shouldStop = options && options.shouldStop; + + let result; + + if (options && options.textMode) { + if (options.textMode === HTML.TEXTMODE.STRING) { + result = getRawText(scanner, null, shouldStop); + } else if (options.textMode === HTML.TEXTMODE.RCDATA) { + result = getRCData(scanner, null, shouldStop); + } else { + throw new Error(`Unsupported textMode: ${options.textMode}`); } - return result; + } else { + result = getContent(scanner, shouldStop); } - for (var k in attrs) { - if (! result) - result = {}; + if (!scanner.isEOF()) { + // If we aren't at the end of the input, we either stopped at an unmatched + // HTML end tag or at a template tag (like `{{else}}` or `{{/if}}`). + // Detect the former case (stopped at an HTML end tag) and throw a good + // error. - var inValue = attrs[k]; - var outParts = []; - for (var i = 0; i < inValue.length; i++) { - var token = inValue[i]; - if (token.t === 'CharRef') { - outParts.push(convertCharRef(token)); - } else if (token.t === 'TemplateTag') { - outParts.push(token.v); - } else if (token.t === 'Chars') { - pushOrAppendString(outParts, token.v); - } + const posBefore = scanner.pos; + let endTag; + + try { + endTag = getHTMLToken(scanner); + } catch (e) { + // ignore errors from getTemplateTag } - var outValue = (inValue.length === 0 ? '' : - (outParts.length === 1 ? outParts[0] : outParts)); - var properKey = properCaseAttributeName(k); - result[properKey] = outValue; + // XXX we make some assumptions about shouldStop here, like that it + // won't tell us to stop at an HTML end tag. Should refactor + // `shouldStop` into something more suitable. + if (endTag && endTag.t === 'Tag' && endTag.isEnd) { + const closeTag = endTag.n; + const isVoidElement = HTML.isVoidElement(closeTag); + scanner.fatal(`Unexpected HTML close tag${isVoidElement ? `. <${endTag.n}> should have no close tag.` : ''}`); + } + + scanner.pos = posBefore; // rewind, we'll continue parsing as usual + + // If no "shouldStop" option was provided, we should have consumed the whole + // input. + if (!shouldStop) scanner.fatal('Expected EOF'); } return result; -}; +} diff --git a/packages/html-tools/parse_tests.js b/packages/html-tools/parse_tests.js index 5029b6714..34a8c4016 100644 --- a/packages/html-tools/parse_tests.js +++ b/packages/html-tools/parse_tests.js @@ -1,60 +1,58 @@ +/* eslint-env meteor */ import { HTML } from 'meteor/htmljs'; import { HTMLTools } from 'meteor/html-tools'; -import { BlazeTools} from 'meteor/blaze-tools'; - -var Scanner = HTMLTools.Scanner; -var getContent = HTMLTools.Parse.getContent; - -var CharRef = HTML.CharRef; -var Comment = HTML.Comment; -var TemplateTag = HTMLTools.TemplateTag; -var Attrs = HTML.Attrs; - -var BR = HTML.BR; -var HR = HTML.HR; -var INPUT = HTML.INPUT; -var A = HTML.A; -var DIV = HTML.DIV; -var P = HTML.P; -var TEXTAREA = HTML.TEXTAREA; -var SCRIPT = HTML.SCRIPT; -var STYLE = HTML.STYLE; - -Tinytest.add("html-tools - parser getContent", function (test) { - - var succeed = function (input, expected) { - var endPos = input.indexOf('^^^'); - if (endPos < 0) - endPos = input.length; - - var scanner = new Scanner(input.replace('^^^', '')); - var result = getContent(scanner); +import { BlazeTools } from 'meteor/blaze-tools'; + +const { Scanner } = HTMLTools; +const { getContent } = HTMLTools.Parse; + +const { CharRef } = HTML; +const { Comment } = HTML; +const { TemplateTag } = HTMLTools; +const { Attrs } = HTML; + +const { BR } = HTML; +const { HR } = HTML; +const { INPUT } = HTML; +const { A } = HTML; +const { DIV } = HTML; +const { P } = HTML; +const { TEXTAREA } = HTML; +const { SCRIPT } = HTML; +const { STYLE } = HTML; + +Tinytest.add('html-tools - parser getContent', function (test) { + const succeed = function (input, expected) { + let endPos = input.indexOf('^^^'); + if (endPos < 0) endPos = input.length; + + const scanner = new Scanner(input.replace('^^^', '')); + const result = getContent(scanner); test.equal(scanner.pos, endPos); test.equal(BlazeTools.toJS(result), BlazeTools.toJS(expected)); }; - var fatal = function (input, messageContains) { - var scanner = new Scanner(input); - var error; + const fatal = function (input, messageContains) { + const scanner = new Scanner(input); + let error; try { getContent(scanner); } catch (e) { error = e; } test.isTrue(error); - if (messageContains) - test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); + if (messageContains) test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); }; succeed('', null); succeed('abc', 'abc'); succeed('abc^^^', 'abc'); - succeed('a<b', ['a', CharRef({html: '<', str: '<'}), 'b']); + succeed('a<b', ['a', CharRef({ html: '<', str: '<' }), 'b']); succeed('', Comment(' x ')); - succeed('∾̳', CharRef({html: '∾̳', str: '\u223e\u0333'})); - succeed('𝕫', CharRef({html: '𝕫', str: '\ud835\udd6b'})); - succeed('&&>&g>;', ['&&>&g', CharRef({html: '>', str: '>'}), ';']); + succeed('∾̳', CharRef({ html: '∾̳', str: '\u223e\u0333' })); + succeed('𝕫', CharRef({ html: '𝕫', str: '\ud835\udd6b' })); + succeed('&&>&g>;', ['&&>&g', CharRef({ html: '>', str: '>' }), ';']); // Can't have an unescaped `&` if followed by certain names like `gt` fatal('>&'); @@ -65,24 +63,24 @@ Tinytest.add("html-tools - parser getContent", function (test) { succeed('
', BR()); fatal('
', 'self-close'); - succeed('
', HR({id:'foo'})); - succeed('
', HR({id:[CharRef({html:'<', str:'<'}), + succeed('
', HR({ id: 'foo' })); + succeed('
', HR({ id: [CharRef({ html: '<', str: '<' }), 'foo', - CharRef({html:'>', str:'>'})]})); - succeed('', INPUT({selected: ''})); - succeed('', INPUT({selected: ''})); - succeed('', INPUT({selected: ''})); - var FOO = HTML.getTag('foo'); - succeed('', FOO({bar: ''})); - succeed('', FOO({bar: '', baz: ''})); + CharRef({ html: '>', str: '>' })] })); + succeed('', INPUT({ selected: '' })); + succeed('', INPUT({ selected: '' })); + succeed('', INPUT({ selected: '' })); + const FOO = HTML.getTag('foo'); + succeed('', FOO({ bar: '' })); + succeed('', FOO({ bar: '', baz: '' })); succeed('', - FOO({bar: 'x', baz: '', qux: 'y', blah: ''})); + FOO({ bar: 'x', baz: '', qux: 'y', blah: '' })); succeed('', - FOO({bar: 'x', baz: '', qux: 'y', blah: ''})); + FOO({ bar: 'x', baz: '', qux: 'y', blah: '' })); fatal(''); fatal(''); fatal(''); - succeed('
', BR({x: '&&&'})); + succeed('
', BR({ x: '&&&' })); succeed('


', [BR(), BR(), BR()]); succeed('aaa
\nbbb
\nccc
', ['aaa', BR(), '\nbbb', BR(), '\nccc', BR()]); @@ -95,17 +93,17 @@ Tinytest.add("html-tools - parser getContent", function (test) { fatal('
Apple', - A({href: "http://www.apple.com/"}, 'Apple')); + A({ href: 'http://www.apple.com/' }, 'Apple')); (function () { - var A = HTML.getTag('a'); - var B = HTML.getTag('b'); - var C = HTML.getTag('c'); - var D = HTML.getTag('d'); + const a = HTML.getTag('a'); + const b = HTML.getTag('b'); + const c = HTML.getTag('c'); + const d = HTML.getTag('d'); succeed('12345678', - [A('1', B('2', C('3', D('4'), '5'), '6'), '7'), '8']); - })(); + [a('1', b('2', c('3', d('4'), '5'), '6'), '7'), '8']); + }()); fatal('hello there world'); @@ -115,84 +113,84 @@ Tinytest.add("html-tools - parser getContent", function (test) { fatal('Foo'); fatal('Foo'); - succeed('', TEXTAREA({value: "asdf"})); - succeed('', TEXTAREA({x: "y", value: "asdf"})); - succeed('', TEXTAREA({value: "

"})); + succeed('', TEXTAREA({ value: 'asdf' })); + succeed('', TEXTAREA({ x: 'y', value: 'asdf' })); + succeed('', TEXTAREA({ value: '

' })); succeed('', - TEXTAREA({value: ["a", CharRef({html: '&', str: '&'}), "b"]})); - succeed('', TEXTAREA({value: "', TEXTAREA({ value: '\n', TEXTAREA()); - succeed('', TEXTAREA({value: "asdf"})); - succeed('', TEXTAREA({value: "\nasdf"})); - succeed('', TEXTAREA({value: "\n"})); - succeed('', TEXTAREA({value: "asdf\n"})); - succeed('', TEXTAREA({value: ""})); - succeed('', TEXTAREA({value: "asdf"})); + succeed('', TEXTAREA({ value: 'asdf' })); + succeed('', TEXTAREA({ value: '\nasdf' })); + succeed('', TEXTAREA({ value: '\n' })); + succeed('', TEXTAREA({ value: 'asdf\n' })); + succeed('', TEXTAREA({ value: '' })); + succeed('', TEXTAREA({ value: 'asdf' })); fatal(''); - succeed('', TEXTAREA({value: "&"})); + succeed('', TEXTAREA({ value: '&' })); succeed('asdf', - [TEXTAREA({value: "x

', [DIV("x"), TEXTAREA()]); + succeed('
x
', [DIV('x'), TEXTAREA()]); // CR/LF behavior - succeed('', BR({x:''})); - succeed('', BR({x:''})); - succeed('
', BR({x:'y'})); - succeed('
', BR({x:'y'})); - succeed('
', BR({x:'y'})); - succeed('
', BR({x:'y'})); - succeed('
', BR({x:'y'})); + succeed('', BR({ x: '' })); + succeed('', BR({ x: '' })); + succeed('
', BR({ x: 'y' })); + succeed('
', BR({ x: 'y' })); + succeed('
', BR({ x: 'y' })); + succeed('
', BR({ x: 'y' })); + succeed('
', BR({ x: 'y' })); succeed('', Comment('\n')); succeed('', Comment('\n')); - succeed('', TEXTAREA({value: 'a\nb\nc'})); - succeed('', TEXTAREA({value: 'a\nb\nc'})); - succeed('
', BR({x:'\n\n'})); - succeed('
', BR({x:'\n\n'})); - succeed('
', BR({x:'y'})); + succeed('', TEXTAREA({ value: 'a\nb\nc' })); + succeed('', TEXTAREA({ value: 'a\nb\nc' })); + succeed('
', BR({ x: '\n\n' })); + succeed('
', BR({ x: '\n\n' })); + succeed('
', BR({ x: 'y' })); fatal('
'); - succeed('',SCRIPT('var x="
";')); - succeed('',SCRIPT('var x=1 && 0;')); - - succeed('', SCRIPT("asdf")); - succeed('', SCRIPT({x: "y"}, "asdf")); - succeed('', SCRIPT("

")); - succeed('', SCRIPT("a&b")); - succeed('', SCRIPT("\n', SCRIPT("\n")); - succeed('', SCRIPT("")); - succeed('', SCRIPT("asdf")); + succeed('', SCRIPT('const x="

";')); + succeed('', SCRIPT('const x=1 && 0;')); + + succeed('', SCRIPT('asdf')); + succeed('', SCRIPT({ x: 'y' }, 'asdf')); + succeed('', SCRIPT('

')); + succeed('', SCRIPT('a&b')); + succeed('', SCRIPT('\n', SCRIPT('\n')); + succeed('', SCRIPT('')); + succeed('', SCRIPT('asdf')); fatal('', SCRIPT("&davidgreenspan;")); - succeed('', SCRIPT("&")); + succeed('', SCRIPT('&davidgreenspan;')); + succeed('', SCRIPT('&')); succeed('asdf', - [SCRIPT("asdf', STYLE("asdf")); - succeed('', STYLE({x: "y"}, "asdf")); - succeed('', STYLE("

")); - succeed('', STYLE("a&b")); - succeed('', STYLE("\n', STYLE("\n")); - succeed('', STYLE("")); - succeed('', STYLE("asdf")); + [SCRIPT('asdf', STYLE('asdf')); + succeed('', STYLE({ x: 'y' }, 'asdf')); + succeed('', STYLE('

')); + succeed('', STYLE('a&b')); + succeed('', STYLE('\n', STYLE('\n')); + succeed('', STYLE('')); + succeed('', STYLE('asdf')); fatal('', STYLE("&davidgreenspan;")); - succeed('', STYLE("&")); + succeed('', STYLE('&davidgreenspan;')); + succeed('', STYLE('&')); succeed('asdf', - [STYLE("

Hello

")), - BlazeTools.toJS(DIV(P({id:'foo'}, 'Hello')))); +Tinytest.add('html-tools - parseFragment', function (test) { + test.equal(BlazeTools.toJS(HTMLTools.parseFragment('

Hello

')), + BlazeTools.toJS(DIV(P({ id: 'foo' }, 'Hello')))); ['asdf
', '{{!foo}}
', '{{!foo}}
', 'asdf', '{{!foo}}', '{{!foo}} '].forEach(function (badFrag) { @@ -202,24 +200,24 @@ Tinytest.add("html-tools - parseFragment", function (test) { }); (function () { - var p = HTMLTools.parseFragment('

'); + const p = HTMLTools.parseFragment('

'); test.equal(p.tagName, 'p'); test.equal(p.attrs, null); test.isTrue(p instanceof HTML.Tag); test.equal(p.children.length, 0); - })(); + }()); (function () { - var p = HTMLTools.parseFragment('

x

'); + const p = HTMLTools.parseFragment('

x

'); test.equal(p.tagName, 'p'); test.equal(p.attrs, null); test.isTrue(p instanceof HTML.Tag); test.equal(p.children.length, 1); test.equal(p.children[0], 'x'); - })(); + }()); (function () { - var p = HTMLTools.parseFragment('

xA

'); + const p = HTMLTools.parseFragment('

xA

'); test.equal(p.tagName, 'p'); test.equal(p.attrs, null); test.isTrue(p instanceof HTML.Tag); @@ -229,10 +227,10 @@ Tinytest.add("html-tools - parseFragment", function (test) { test.isTrue(p.children[1] instanceof HTML.CharRef); test.equal(p.children[1].html, 'A'); test.equal(p.children[1].str, 'A'); - })(); + }()); (function () { - var pp = HTMLTools.parseFragment('

x

y

'); + const pp = HTMLTools.parseFragment('

x

y

'); test.isTrue(pp instanceof Array); test.equal(pp.length, 2); @@ -247,56 +245,52 @@ Tinytest.add("html-tools - parseFragment", function (test) { test.isTrue(pp[1] instanceof HTML.Tag); test.equal(pp[1].children.length, 1); test.equal(pp[1].children[0], 'y'); - })(); + }()); - var scanner = new Scanner('asdf'); + const scanner = new Scanner('asdf'); scanner.pos = 1; test.equal(HTMLTools.parseFragment(scanner), 'sdf'); test.throws(function () { - var scanner = new Scanner('asdf

'); - scanner.pos = 1; - HTMLTools.parseFragment(scanner); + const scannerTest = new Scanner('asdf

'); + scannerTest.pos = 1; + HTMLTools.parseFragment(scannerTest); }); }); -Tinytest.add("html-tools - getTemplateTag", function (test) { - +Tinytest.add('html-tools - getTemplateTag', function (test) { // match a simple tag consisting of `{{`, an optional `!`, one // or more ASCII letters, spaces or html tags, and a closing `}}`. - var mustache = /^\{\{(!?[a-zA-Z 0-9]+)\}\}/; + const mustache = /^\{\{(!?[a-zA-Z 0-9]+)\}\}/; // This implementation of `getTemplateTag` looks for "{{" and if it // finds it, it will match the regex above or fail fatally trying. // The object it returns is opaque to the tokenizer/parser and can // be anything we want. - var getTemplateTag = function (scanner, position) { - if (! (scanner.peek() === '{' && // one-char peek is just an optimization - scanner.rest().slice(0, 2) === '{{')) + const getTemplateTag = function (scanner, position) { + // one-char peek is just an optimization + if (!(scanner.peek() === '{' && scanner.rest().slice(0, 2) === '{{')) { return null; + } - var match = mustache.exec(scanner.rest()); - if (! match) - scanner.fatal("Bad mustache"); + const match = mustache.exec(scanner.rest()); + if (!match) scanner.fatal(`Bad mustache at ${position}`); scanner.pos += match[0].length; - if (match[1].charAt(0) === '!') - return null; // `{{!foo}}` is like a comment + if (match[1].charAt(0) === '!') return null; // `{{!foo}}` is like a comment return TemplateTag({ stuff: match[1] }); }; + const succeed = function (input, expected) { + let endPos = input.indexOf('^^^'); + if (endPos < 0) endPos = input.length; - var succeed = function (input, expected) { - var endPos = input.indexOf('^^^'); - if (endPos < 0) - endPos = input.length; - - var scanner = new Scanner(input.replace('^^^', '')); + const scanner = new Scanner(input.replace('^^^', '')); scanner.getTemplateTag = getTemplateTag; - var result; + let result; try { result = getContent(scanner); } catch (e) { @@ -306,31 +300,30 @@ Tinytest.add("html-tools - getTemplateTag", function (test) { test.equal(BlazeTools.toJS(result), BlazeTools.toJS(expected)); }; - var fatal = function (input, messageContains) { - var scanner = new Scanner(input); + const fatal = function (input, messageContains) { + const scanner = new Scanner(input); scanner.getTemplateTag = getTemplateTag; - var error; + let error; try { getContent(scanner); } catch (e) { error = e; } test.isTrue(error); - if (messageContains) - test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); + if (messageContains) test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); }; - succeed('{{foo}}', TemplateTag({stuff: 'foo'})); + succeed('{{foo}}', TemplateTag({ stuff: 'foo' })); succeed('{{foo}}', - A({href: "http://www.apple.com/"}, TemplateTag({stuff: 'foo'}))); + A({ href: 'http://www.apple.com/' }, TemplateTag({ stuff: 'foo' }))); // tags not parsed in comments - succeed('', Comment("{{foo}}")); - succeed('', Comment("{{foo")); + succeed('', Comment('{{foo}}')); + succeed('', Comment('{{foo')); - succeed('&am{{foo}}p;', ['&am', TemplateTag({stuff: 'foo'}), 'p;']); + succeed('&am{{foo}}p;', ['&am', TemplateTag({ stuff: 'foo' }), 'p;']); // can't start a mustache and not finish it fatal('{{foo'); @@ -343,58 +336,58 @@ Tinytest.add("html-tools - getTemplateTag", function (test) { // single curly brace is no biggie succeed('a{b', 'a{b'); - succeed('
', BR({x:'{'})); - succeed('
', BR({x:'{foo}'})); + succeed('
', BR({ x: '{' })); + succeed('
', BR({ x: '{foo}' })); - succeed('
', BR(Attrs(TemplateTag({stuff: 'x'})))); - succeed('
', BR(Attrs(TemplateTag({stuff: 'x'}), - TemplateTag({stuff: 'y'})))); - succeed('
', BR(Attrs({y: ''}, TemplateTag({stuff: 'x'})))); + succeed('
', BR(Attrs(TemplateTag({ stuff: 'x' })))); + succeed('
', BR(Attrs(TemplateTag({ stuff: 'x' }), + TemplateTag({ stuff: 'y' })))); + succeed('
', BR(Attrs({ y: '' }, TemplateTag({ stuff: 'x' })))); fatal('
'); fatal('
'); - succeed('
', BR({x: TemplateTag({stuff: 'y'}), z: ''})); - succeed('
', BR({x: ['y', TemplateTag({stuff: 'z'}), 'w']})); - succeed('
', BR({x: ['y', TemplateTag({stuff: 'z'}), 'w']})); - succeed('
', BR({x: ['y ', TemplateTag({stuff: 'z'}), - TemplateTag({stuff: 'w'}), ' v']})); + succeed('
', BR({ x: TemplateTag({ stuff: 'y' }), z: '' })); + succeed('
', BR({ x: ['y', TemplateTag({ stuff: 'z' }), 'w'] })); + succeed('
', BR({ x: ['y', TemplateTag({ stuff: 'z' }), 'w'] })); + succeed('
', BR({ x: ['y ', TemplateTag({ stuff: 'z' }), + TemplateTag({ stuff: 'w' }), ' v'] })); // Slash is parsed as part of unquoted attribute! This is consistent with // the HTML tokenization spec. It seems odd for some inputs but is probably // for cases like `` or ``. - succeed('
', BR({x: [TemplateTag({stuff: 'y'}), '/']})); - succeed('
', BR({x: [TemplateTag({stuff: 'z'}), - TemplateTag({stuff: 'w'})]})); + succeed('
', BR({ x: [TemplateTag({ stuff: 'y' }), '/'] })); + succeed('
', BR({ x: [TemplateTag({ stuff: 'z' }), + TemplateTag({ stuff: 'w' })] })); fatal('
'); - succeed('
', BR({x:CharRef({html: '&', str: '&'})})); + succeed('
', BR({ x: CharRef({ html: '&', str: '&' }) })); // check tokenization of stache tags with spaces - succeed('
', BR(Attrs(TemplateTag({stuff: 'x 1'})))); - succeed('
', BR(Attrs(TemplateTag({stuff: 'x 1'}), - TemplateTag({stuff: 'y 2'})))); - succeed('
', BR(Attrs({y:''}, TemplateTag({stuff: 'x 1'})))); + succeed('
', BR(Attrs(TemplateTag({ stuff: 'x 1' })))); + succeed('
', BR(Attrs(TemplateTag({ stuff: 'x 1' }), + TemplateTag({ stuff: 'y 2' })))); + succeed('
', BR(Attrs({ y: '' }, TemplateTag({ stuff: 'x 1' })))); fatal('
'); fatal('
'); - succeed('
', BR({x: TemplateTag({stuff: 'y 2'}), z: ''})); - succeed('
', BR({x: ['y', TemplateTag({stuff: 'z 3'}), 'w']})); - succeed('
', BR({x: ['y', TemplateTag({stuff: 'z 3'}), 'w']})); - succeed('
', BR({x: ['y ', TemplateTag({stuff: 'z 3'}), - TemplateTag({stuff: 'w 4'}), ' v']})); - succeed('
', BR({x: [TemplateTag({stuff: 'y 2'}), '/']})); - succeed('
', BR({x: [TemplateTag({stuff: 'z 3'}), - TemplateTag({stuff: 'w 4'})]})); + succeed('
', BR({ x: TemplateTag({ stuff: 'y 2' }), z: '' })); + succeed('
', BR({ x: ['y', TemplateTag({ stuff: 'z 3' }), 'w'] })); + succeed('
', BR({ x: ['y', TemplateTag({ stuff: 'z 3' }), 'w'] })); + succeed('
', BR({ x: ['y ', TemplateTag({ stuff: 'z 3' }), + TemplateTag({ stuff: 'w 4' }), ' v'] })); + succeed('
', BR({ x: [TemplateTag({ stuff: 'y 2' }), '/'] })); + succeed('
', BR({ x: [TemplateTag({ stuff: 'z 3' }), + TemplateTag({ stuff: 'w 4' })] })); succeed('

', P()); - succeed('x{{foo}}{{bar}}y', ['x', TemplateTag({stuff: 'foo'}), - TemplateTag({stuff: 'bar'}), 'y']); + succeed('x{{foo}}{{bar}}y', ['x', TemplateTag({ stuff: 'foo' }), + TemplateTag({ stuff: 'bar' }), 'y']); succeed('x{{!foo}}{{!bar}}y', 'xy'); - succeed('x{{!foo}}{{bar}}y', ['x', TemplateTag({stuff: 'bar'}), 'y']); - succeed('x{{foo}}{{!bar}}y', ['x', TemplateTag({stuff: 'foo'}), 'y']); + succeed('x{{!foo}}{{bar}}y', ['x', TemplateTag({ stuff: 'bar' }), 'y']); + succeed('x{{foo}}{{!bar}}y', ['x', TemplateTag({ stuff: 'foo' }), 'y']); succeed('
{{!foo}}{{!bar}}
', DIV()); succeed('
{{!foo}}
{{!bar}}
', DIV(BR())); - succeed('
{{!foo}} {{!bar}}
', DIV(" ")); - succeed('
{{!foo}}
{{!bar}}
', DIV(" ", BR(), " ")); + succeed('
{{!foo}} {{!bar}}
', DIV(' ')); + succeed('
{{!foo}}
{{!bar}}
', DIV(' ', BR(), ' ')); succeed('{{!
}}', null); succeed('{{!
}}', null); @@ -402,7 +395,6 @@ Tinytest.add("html-tools - getTemplateTag", function (test) { succeed('{{!foo}}', null); succeed('', - TEXTAREA(Attrs({x:"1"}, TemplateTag({stuff: 'a'}), - TemplateTag({stuff: 'b'})))); - + TEXTAREA(Attrs({ x: '1' }, TemplateTag({ stuff: 'a' }), + TemplateTag({ stuff: 'b' })))); }); diff --git a/packages/html-tools/scanner.js b/packages/html-tools/scanner.js index 6f1b51726..07ce48fa9 100644 --- a/packages/html-tools/scanner.js +++ b/packages/html-tools/scanner.js @@ -8,7 +8,6 @@ // * `scanner.peek()` - returns the character at `pos` // * `scanner.isEOF()` - true if `pos` is at or beyond the end of `input` // * `scanner.fatal(msg)` - throw an error indicating a problem at `pos` - export function Scanner (input) { this.input = input; // public, read-only this.pos = 0; // public, read-write @@ -23,31 +22,32 @@ Scanner.prototype.isEOF = function () { return this.pos >= this.input.length; }; -Scanner.prototype.fatal = function (msg) { - // despite this default, you should always provide a message! - msg = (msg || "Parse error"); +Scanner.prototype.fatal = function (msg = 'Parse error') { + const CONTEXT_AMOUNT = 20; + + const { input } = this; + const { pos } = this; + + let pastInput = input.substring(pos - CONTEXT_AMOUNT - 1, pos); - var CONTEXT_AMOUNT = 20; + if (pastInput.length > CONTEXT_AMOUNT) pastInput = `...${pastInput.substring(-CONTEXT_AMOUNT)}`; - var input = this.input; - var pos = this.pos; - var pastInput = input.substring(pos - CONTEXT_AMOUNT - 1, pos); - if (pastInput.length > CONTEXT_AMOUNT) - pastInput = '...' + pastInput.substring(-CONTEXT_AMOUNT); + let upcomingInput = input.substring(pos, pos + CONTEXT_AMOUNT + 1); - var upcomingInput = input.substring(pos, pos + CONTEXT_AMOUNT + 1); - if (upcomingInput.length > CONTEXT_AMOUNT) - upcomingInput = upcomingInput.substring(0, CONTEXT_AMOUNT) + '...'; + if (upcomingInput.length > CONTEXT_AMOUNT) upcomingInput = `${upcomingInput.substring(0, CONTEXT_AMOUNT)}...`; - var positionDisplay = ((pastInput + upcomingInput).replace(/\n/g, ' ') + '\n' + - (new Array(pastInput.length + 1).join(' ')) + "^"); + const positionDisplay = (`${(pastInput + upcomingInput) + .replace(/\n/g, ' ')}\n${new Array(pastInput.length + 1) + .join(' ')}^`); - var e = new Error(msg + "\n" + positionDisplay); + const e = new Error(`${msg}\n${positionDisplay}`); e.offset = pos; - var allPastInput = input.substring(0, pos); + const allPastInput = input.substring(0, pos); + e.line = (1 + (allPastInput.match(/\n/g) || []).length); e.col = (1 + pos - allPastInput.lastIndexOf('\n')); + e.scanner = this; throw e; @@ -70,11 +70,10 @@ Scanner.prototype.peek = function () { // current position is not advanced and a falsy value (typically null) // is returned. export function makeRegexMatcher(regex) { - return function (scanner) { - var match = regex.exec(scanner.rest()); + return (scanner) => { + const match = regex.exec(scanner.rest()); - if (! match) - return null; + if (!match) return null; scanner.pos += match[0].length; return match[1] || match[0]; diff --git a/packages/html-tools/templatetag.js b/packages/html-tools/templatetag.js index 3bc952db7..ae453652e 100644 --- a/packages/html-tools/templatetag.js +++ b/packages/html-tools/templatetag.js @@ -1,29 +1,15 @@ -// _assign is like _.extend or the upcoming Object.assign. -// Copy src's own, enumerable properties onto tgt and return -// tgt. -var _hasOwnProperty = Object.prototype.hasOwnProperty; -var _assign = function (tgt, src) { - for (var k in src) { - if (_hasOwnProperty.call(src, k)) - tgt[k] = src[k]; - } - return tgt; -}; - - -export function TemplateTag (props) { - if (! (this instanceof TemplateTag)) +export function TemplateTag(props) { + if (!(this instanceof TemplateTag)) { // called without `new` - return new TemplateTag; + return new TemplateTag(); + } - if (props) - _assign(this, props); + if (props) Object.assign(this, props); } -_assign(TemplateTag.prototype, { +Object.assign(TemplateTag.prototype, { constructorName: 'TemplateTag', - toJS: function (visitor) { - return visitor.generateCall(this.constructorName, - _assign({}, this)); - } + toJS(visitor) { + return visitor.generateCall(this.constructorName, Object.assign({}, this)); + }, }); diff --git a/packages/html-tools/tokenize.js b/packages/html-tools/tokenize.js index 55cbd3ecf..23a97d1b2 100644 --- a/packages/html-tools/tokenize.js +++ b/packages/html-tools/tokenize.js @@ -53,68 +53,66 @@ import { makeRegexMatcher } from './scanner'; // keep in mind as we go along that an LF might be represented by CRLF or CR. // In most cases, it doesn't actually matter what combination of whitespace // characters are present (e.g. inside tags). -var HTML_SPACE = /^[\f\n\r\t ]/; +const HTML_SPACE = /^[\f\n\r\t ]/; -var convertCRLF = function (str) { +const convertCRLF = function (str) { return str.replace(/\r\n?/g, '\n'); }; -export function getComment (scanner) { - if (scanner.rest().slice(0, 4) !== ''); - if (closePos < 0) - scanner.fatal("Unclosed HTML comment"); + const closePos = rest.indexOf('-->'); + if (closePos < 0) scanner.fatal('Unclosed HTML comment'); - var commentContents = rest.slice(0, closePos); - if (commentContents.slice(-1) === '-') - scanner.fatal("HTML comment must end at first `--`"); - if (commentContents.indexOf("--") >= 0) - scanner.fatal("HTML comment cannot contain `--` anywhere"); - if (commentContents.indexOf('\u0000') >= 0) - scanner.fatal("HTML comment cannot contain NULL"); + const commentContents = rest.slice(0, closePos); + if (commentContents.slice(-1) === '-') scanner.fatal('HTML comment must end at first `--`'); + if (commentContents.indexOf('--') >= 0) scanner.fatal('HTML comment cannot contain `--` anywhere'); + if (commentContents.indexOf('\u0000') >= 0) scanner.fatal('HTML comment cannot contain NULL'); scanner.pos += closePos + 3; - return { t: 'Comment', - v: convertCRLF(commentContents) }; + return { + t: 'Comment', + v: convertCRLF(commentContents), + }; } -var skipSpaces = function (scanner) { - while (HTML_SPACE.test(scanner.peek())) +const skipSpaces = function (scanner) { + while (HTML_SPACE.test(scanner.peek())) { scanner.pos++; + } }; -var requireSpaces = function (scanner) { - if (! HTML_SPACE.test(scanner.peek())) - scanner.fatal("Expected space"); +const requireSpaces = function (scanner) { + if (!HTML_SPACE.test(scanner.peek())) scanner.fatal('Expected space'); skipSpaces(scanner); }; -var getDoctypeQuotedString = function (scanner) { - var quote = scanner.peek(); - if (! (quote === '"' || quote === "'")) - scanner.fatal("Expected single or double quote in DOCTYPE"); +const getDoctypeQuotedString = function (scanner) { + const quote = scanner.peek(); + if (!(quote === '"' || quote === "'")) scanner.fatal('Expected single or double quote in DOCTYPE'); scanner.pos++; - if (scanner.peek() === quote) + if (scanner.peek() === quote) { // prevent a falsy return value (empty string) - scanner.fatal("Malformed DOCTYPE"); + scanner.fatal('Malformed DOCTYPE'); + } - var str = ''; - var ch; + let str = ''; + let ch; while ((ch = scanner.peek()), ch !== quote) { - if ((! ch) || (ch === '\u0000') || (ch === '>')) - scanner.fatal("Malformed DOCTYPE"); + if ((!ch) || (ch === '\u0000') || (ch === '>')) { + scanner.fatal('Malformed DOCTYPE'); + } + str += ch; scanner.pos++; } @@ -127,23 +125,20 @@ var getDoctypeQuotedString = function (scanner) { // See http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#the-doctype. // // If `getDocType` sees "') || (ch === '\u0000')) - scanner.fatal('Malformed DOCTYPE'); - var name = ch; + let ch = scanner.peek(); + if ((!ch) || (ch === '>') || (ch === '\u0000')) scanner.fatal('Malformed DOCTYPE'); + let name = ch; scanner.pos++; - while ((ch = scanner.peek()), ! (HTML_SPACE.test(ch) || ch === '>')) { - if ((! ch) || (ch === '\u0000')) - scanner.fatal('Malformed DOCTYPE'); + while ((ch = scanner.peek()), !(HTML_SPACE.test(ch) || ch === '>')) { + if ((!ch) || (ch === '\u0000')) scanner.fatal('Malformed DOCTYPE'); name += ch; scanner.pos++; } @@ -152,23 +147,22 @@ export function getDoctype (scanner) { // Now we're looking at a space or a `>`. skipSpaces(scanner); - var systemId = null; - var publicId = null; + let systemId = null; + let publicId = null; if (scanner.peek() !== '>') { // Now we're essentially in the "After DOCTYPE name state" of the tokenizer, // but we're not looking at space or `>`. // this should be "public" or "system". - var publicOrSystem = asciiLowerCase(scanner.rest().slice(0, 6)); + const publicOrSystem = asciiLowerCase(scanner.rest().slice(0, 6)); if (publicOrSystem === 'system') { scanner.pos += 6; requireSpaces(scanner); systemId = getDoctypeQuotedString(scanner); skipSpaces(scanner); - if (scanner.peek() !== '>') - scanner.fatal("Malformed DOCTYPE"); + if (scanner.peek() !== '>') scanner.fatal('Malformed DOCTYPE'); } else if (publicOrSystem === 'public') { scanner.pos += 6; requireSpaces(scanner); @@ -178,127 +172,60 @@ export function getDoctype (scanner) { if (scanner.peek() !== '>') { systemId = getDoctypeQuotedString(scanner); skipSpaces(scanner); - if (scanner.peek() !== '>') - scanner.fatal("Malformed DOCTYPE"); + if (scanner.peek() !== '>') scanner.fatal('Malformed DOCTYPE'); } } } else { - scanner.fatal("Expected PUBLIC or SYSTEM in DOCTYPE"); + scanner.fatal('Expected PUBLIC or SYSTEM in DOCTYPE'); } } // looking at `>` scanner.pos++; - var result = { t: 'Doctype', - v: scanner.input.slice(start, scanner.pos), - name: name }; + const result = { + t: 'Doctype', + v: scanner.input.slice(start, scanner.pos), + name, + }; - if (systemId) - result.systemId = systemId; - if (publicId) - result.publicId = publicId; + if (systemId) result.systemId = systemId; + if (publicId) result.publicId = publicId; return result; } // The special character `{` is only allowed as the first character // of a Chars, so that we have a chance to detect template tags. -var getChars = makeRegexMatcher(/^[^&<\u0000][^&<\u0000{]*/); +const getChars = makeRegexMatcher(/^[^&<\u0000][^&<\u0000{]*/); -var assertIsTemplateTag = function (x) { - if (! (x instanceof TemplateTag)) - throw new Error("Expected an instance of HTMLTools.TemplateTag"); +const assertIsTemplateTag = function (x) { + if (!(x instanceof TemplateTag)) throw new Error('Expected an instance of HTMLTools.TemplateTag'); return x; }; -// Returns the next HTML token, or `null` if we reach EOF. -// -// Note that if we have a `getTemplateTag` function that sometimes -// consumes characters and emits nothing (e.g. in the case of template -// comments), we may go from not-at-EOF to at-EOF and return `null`, -// while otherwise we always find some token to return. -export function getHTMLToken (scanner, dataMode) { - var result = null; - if (scanner.getTemplateTag) { - // Try to parse a template tag by calling out to the provided - // `getTemplateTag` function. If the function returns `null` but - // consumes characters, it must have parsed a comment or something, - // so we loop and try it again. If it ever returns `null` without - // consuming anything, that means it didn't see anything interesting - // so we look for a normal token. If it returns a truthy value, - // the value must be instanceof HTMLTools.TemplateTag. We wrap it - // in a Special token. - var lastPos = scanner.pos; - result = scanner.getTemplateTag( - scanner, - (dataMode === 'rcdata' ? TEMPLATE_TAG_POSITION.IN_RCDATA : - (dataMode === 'rawtext' ? TEMPLATE_TAG_POSITION.IN_RAWTEXT : - TEMPLATE_TAG_POSITION.ELEMENT))); - - if (result) - return { t: 'TemplateTag', v: assertIsTemplateTag(result) }; - else if (scanner.pos > lastPos) - return null; - } - - var chars = getChars(scanner); - if (chars) - return { t: 'Chars', - v: convertCRLF(chars) }; - - var ch = scanner.peek(); - if (! ch) - return null; // EOF - - if (ch === '\u0000') - scanner.fatal("Illegal NULL character"); - - if (ch === '&') { - if (dataMode !== 'rawtext') { - var charRef = getCharacterReference(scanner); - if (charRef) - return charRef; - } - - scanner.pos++; - return { t: 'Chars', - v: '&' }; - } - - // If we're here, we're looking at `<`. - - if (scanner.peek() === '<' && dataMode) { - // don't interpret tags - scanner.pos++; - return { t: 'Chars', - v: '<' }; - } - - // `getTag` will claim anything starting with `<` not followed by `!`. - // `getComment` takes `")), + test.equal(getComment(new Scanner('')), { t: 'Comment', v: ' hello ' }); - ignore(""); - ignore("'); + ignore('', ' hello - - world '); }); -Tinytest.add("html-tools - doctype", function (test) { - var succeed = function (input, expectedProps) { - var scanner = new Scanner(input); - var result = getDoctype(scanner); +Tinytest.add('html-tools - doctype', function (test) { + const succeed = function (input, expectedProps) { + const scanner = new Scanner(input); + const result = getDoctype(scanner); test.isTrue(result); test.equal(scanner.pos, result.v.length); test.equal(input.slice(0, result.v.length), result.v); - var actualProps = Object.assign({}, result); + const actualProps = Object.assign({}, result); delete actualProps.t; delete actualProps.v; test.equal(actualProps, expectedProps); }; - var fatal = function (input, messageContains) { - var scanner = new Scanner(input); - var error; + const fatal = function (input, messageContains) { + const scanner = new Scanner(input); + let error; try { getDoctype(scanner); } catch (e) { error = e; } test.isTrue(error); - if (messageContains) - test.isTrue(error.message.indexOf(messageContains) >= 0, error.message); + if (messageContains) test.isTrue(error.message.indexOf(messageContains) >= 0, error.message); }; - test.equal(getDoctype(new Scanner("x")), + test.equal(getDoctype(new Scanner('x')), { t: 'Doctype', v: '', name: 'html' }); @@ -132,12 +130,12 @@ Tinytest.add("html-tools - doctype", function (test) { publicId: '-//W3C//DTD HTML 4.0//EN', systemId: 'http://www.w3.org/TR/html4/strict.dtd' }); - succeed('', {name: 'html'}); - succeed('', {name: 'html'}); - succeed('', {name: 'html'}); - succeed('', {name: 'html'}); - succeed('', {name: 'html'}); - succeed('', {name: 'html'}); + succeed('', { name: 'html' }); + succeed('', { name: 'html' }); + succeed('', { name: 'html' }); + succeed('', { name: 'html' }); + succeed('', { name: 'html' }); + succeed('', { name: 'html' }); fatal('', 'Malformed DOCTYPE'); fatal('', {name: 'html', systemId: 'about:legacy-compat'}); - succeed('', {name: 'html', systemId: 'about:legacy-compat'}); - succeed("", {name: 'html', systemId: 'about:legacy-compat'}); - succeed("", {name: 'html', systemId: 'about:legacy-compat'}); - succeed('', {name: 'html', systemId: 'about:legacy-compat'}); + succeed('', { name: 'html', systemId: 'about:legacy-compat' }); + succeed('', { name: 'html', systemId: 'about:legacy-compat' }); + succeed("", { name: 'html', systemId: 'about:legacy-compat' }); + succeed("", { name: 'html', systemId: 'about:legacy-compat' }); + succeed('', { name: 'html', systemId: 'about:legacy-compat' }); fatal('', 'Expected PUBLIC or SYSTEM'); fatal('', 'Expected space'); @@ -171,26 +169,26 @@ Tinytest.add("html-tools - doctype", function (test) { succeed('', { name: 'html', - publicId: '-//W3C//DTD HTML 4.0//EN'}); + publicId: '-//W3C//DTD HTML 4.0//EN' }); succeed('', { name: 'html', - publicId: '-//W3C//DTD HTML 4.0//EN'}); + publicId: '-//W3C//DTD HTML 4.0//EN' }); succeed('', { name: 'html', publicId: '-//W3C//DTD HTML 4.0//EN', - systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd'}); + systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd' }); succeed('', { name: 'html', publicId: '-//W3C//DTD HTML 4.0//EN', - systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd'}); + systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd' }); succeed('', { name: 'html', publicId: '-//W3C//DTD HTML 4.0//EN', - systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd'}); + systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd' }); succeed('', { name: 'html', publicId: '-//W3C//DTD HTML 4.0//EN', - systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd'}); + systemId: 'http://www.w3.org/TR/REC-html40/strict.dtd' }); fatal(''); }); -Tinytest.add("html-tools - tokenize", function (test) { - - var fatal = function (input, messageContains) { - var error; +Tinytest.add('html-tools - tokenize', function (test) { + const fatal = function (input, messageContains) { + let error; try { tokenize(input); } catch (e) { error = e; } test.isTrue(error); - if (messageContains) - test.isTrue(error.message.indexOf(messageContains) >= 0, error.message); + if (messageContains) test.isTrue(error.message.indexOf(messageContains) >= 0, error.message); }; test.equal(tokenize(''), []); - test.equal(tokenize('abc'), [{t: 'Chars', v: 'abc'}]); - test.equal(tokenize('&'), [{t: 'Chars', v: '&'}]); - test.equal(tokenize('&'), [{t: 'CharRef', v: '&', cp: [38]}]); + test.equal(tokenize('abc'), [{ t: 'Chars', v: 'abc' }]); + test.equal(tokenize('&'), [{ t: 'Chars', v: '&' }]); + test.equal(tokenize('&'), [{ t: 'CharRef', v: '&', cp: [38] }]); test.equal(tokenize('ok fine'), - [{t: 'Chars', v: 'ok'}, - {t: 'CharRef', v: ' ', cp: [32]}, - {t: 'Chars', v: 'fine'}]); + [{ t: 'Chars', v: 'ok' }, + { t: 'CharRef', v: ' ', cp: [32] }, + { t: 'Chars', v: 'fine' }]); test.equal(tokenize('ac'), - [{t: 'Chars', - v: 'a'}, - {t: 'Comment', - v: 'b'}, - {t: 'Chars', - v: 'c'}]); + [{ t: 'Chars', + v: 'a' }, + { t: 'Comment', + v: 'b' }, + { t: 'Chars', + v: 'c' }]); - test.equal(tokenize('
'), [{t: 'Tag', n: 'a'}]); + test.equal(tokenize(''), [{ t: 'Tag', n: 'a' }]); fatal('<'); fatal(''), - [{t: 'Tag', n: 'x', - attrs: { a: [{t: 'Chars', v: 'b'}] }, - isSelfClosing: true}]); + [{ t: 'Tag', +n: 'x', + attrs: { a: [{ t: 'Chars', v: 'b' }] }, + isSelfClosing: true }]); test.equal(tokenize('X'), - [{t: 'Tag', n: 'a'}, - {t: 'Chars', v: 'X'}, - {t: 'Tag', n: 'a', isEnd: true}]); + [{ t: 'Tag', n: 'a' }, + { t: 'Chars', v: 'X' }, + { t: 'Tag', n: 'a', isEnd: true }]); fatal(''); // duplicate attribute value test.equal(tokenize(''), - [{t: 'Tag', n: 'a', attrs: { b: [] }}]); + [{ t: 'Tag', n: 'a', attrs: { b: [] } }]); fatal('< a>'); fatal('< /a>'); fatal(''); // Slash does not end an unquoted attribute, interestingly test.equal(tokenize(''), - [{t: 'Tag', n: 'a', attrs: { b: [{t: 'Chars', v: '/'}] }}]); + [{ t: 'Tag', n: 'a', attrs: { b: [{ t: 'Chars', v: '/' }] } }]); test.equal(tokenize(''), - [{t: 'Tag', n: 'a', - attrs: { b: [{t: 'Chars', v: 'c'}], - d: [{t: 'Chars', v: 'e'}], - f: [{t: 'Chars', v: 'g'}], - h: [] }}]); + [{ t: 'Tag', +n: 'a', + attrs: { b: [{ t: 'Chars', v: 'c' }], + d: [{ t: 'Chars', v: 'e' }], + f: [{ t: 'Chars', v: 'g' }], + h: [] } }]); fatal(''); fatal(''); fatal(''); - test.equal(tokenize(''), [{t: 'Tag', n: 'a', isSelfClosing: true}]); + test.equal(tokenize(''), [{ t: 'Tag', n: 'a', isSelfClosing: true }]); fatal(''); fatal(''); @@ -287,50 +285,55 @@ Tinytest.add("html-tools - tokenize", function (test) { fatal(''); test.equal(tokenize(''), - [{t: 'Tag', n: 'a#', - attrs: { b0: [{t: 'Chars', v: 'c@'}], - d1: [{t: 'Chars', v: 'e2'}], - 'f#': [{t: 'Chars', v: 'g '}], - h: [] }}]); + [{ t: 'Tag', +n: 'a#', + attrs: { b0: [{ t: 'Chars', v: 'c@' }], + d1: [{ t: 'Chars', v: 'e2' }], + 'f#': [{ t: 'Chars', v: 'g ' }], + h: [] } }]); test.equal(tokenize('
'), - [{t: 'Tag', n: 'div', attrs: { 'class': [] }}, - {t: 'Tag', n: 'div', isEnd: true}]); + [{ t: 'Tag', n: 'div', attrs: { class: [] } }, + { t: 'Tag', n: 'div', isEnd: true }]); test.equal(tokenize('
'), - [{t: 'Tag', n: 'div', attrs: { 'class': [{t: 'Chars', v: '&'}] }}]); + [{ t: 'Tag', n: 'div', attrs: { class: [{ t: 'Chars', v: '&' }] } }]); test.equal(tokenize('
'), - [{t: 'Tag', n: 'div', attrs: { 'class': [{t: 'Chars', v: '&'}] }}]); + [{ t: 'Tag', n: 'div', attrs: { class: [{ t: 'Chars', v: '&' }] } }]); test.equal(tokenize('
'), - [{t: 'Tag', n: 'div', attrs: { 'class': [{t: 'CharRef', v: '&', cp: [38]}] }}]); + [{ t: 'Tag', n: 'div', attrs: { class: [{ t: 'CharRef', v: '&', cp: [38] }] } }]); test.equal(tokenize('
'), - [{t: 'Tag', n: 'div', attrs: { 'class': [ - {t: 'Chars', v: 'aa&'}, - {t: 'CharRef', v: '𝕫', cp: [120171]}, - {t: 'CharRef', v: '∾̳', cp: [8766, 819]}, - {t: 'Chars', v: '&bb'} - ] }}]); + [{ t: 'Tag', +n: 'div', +attrs: { class: [ + { t: 'Chars', v: 'aa&' }, + { t: 'CharRef', v: '𝕫', cp: [120171] }, + { t: 'CharRef', v: '∾̳', cp: [8766, 819] }, + { t: 'Chars', v: '&bb' }, + ] } }]); test.equal(tokenize('
'), - [{t: 'Tag', n: 'div', attrs: { 'class': [ - {t: 'Chars', v: 'aa &'}, - {t: 'CharRef', v: '𝕫', cp: [120171]}, - {t: 'CharRef', v: '∾̳', cp: [8766, 819]}, - {t: 'Chars', v: '& bb'} - ] }}]); + [{ t: 'Tag', +n: 'div', +attrs: { class: [ + { t: 'Chars', v: 'aa &' }, + { t: 'CharRef', v: '𝕫', cp: [120171] }, + { t: 'CharRef', v: '∾̳', cp: [8766, 819] }, + { t: 'Chars', v: '& bb' }, + ] } }]); test.equal(tokenize(''), - [{t: 'Tag', n: 'a', attrs: { b: [{t: 'Chars', v: '\'`<>&'}] }}]); + [{ t: 'Tag', n: 'a', attrs: { b: [{ t: 'Chars', v: '\'`<>&' }] } }]); test.equal(tokenize('&\'>'), - [{t: 'Tag', n: 'a', attrs: { b: [{t: 'Chars', v: '"`<>&'}] }}]); + [{ t: 'Tag', n: 'a', attrs: { b: [{ t: 'Chars', v: '"`<>&' }] } }]); fatal('>'); fatal('>c'); test.equal(tokenize(''), - [{t: 'Tag', n: 'a', attrs: { b: [{t: 'Chars', v: '>c' }] }}]); + [{ t: 'Tag', n: 'a', attrs: { b: [{ t: 'Chars', v: '>c' }] } }]); test.equal(tokenize(''), - [{t: 'Tag', n: 'a', attrs: { b: [{t: 'Chars', v: '>c' }] }}]); + [{ t: 'Tag', n: 'a', attrs: { b: [{ t: 'Chars', v: '>c' }] } }]); fatal(''); fatal(''); fatal(''); diff --git a/packages/html-tools/utils.js b/packages/html-tools/utils.js index 195fa725a..b2ccdcc5d 100644 --- a/packages/html-tools/utils.js +++ b/packages/html-tools/utils.js @@ -6,22 +6,11 @@ export function asciiLowerCase (str) { }); } -var svgCamelCaseAttributes = 'attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef glyphRef gradientTransform gradientTransform gradientUnits gradientUnits kernelMatrix kernelUnitLength kernelUnitLength kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent specularExponent spreadMethod spreadMethod startOffset stdDeviation stitchTiles surfaceScale surfaceScale systemLanguage tableValues targetX targetY textLength textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan'.split(' '); - -var properAttributeCaseMap = (function (map) { - for (var i = 0; i < svgCamelCaseAttributes.length; i++) { - var a = svgCamelCaseAttributes[i]; - map[asciiLowerCase(a)] = a; - } - return map; -})({}); - -var properTagCaseMap = (function (map) { - var knownElements = HTML.knownElementNames; - for (var i = 0; i < knownElements.length; i++) { - var a = knownElements[i]; +const _properTagCaseMap = (map => { + const knownElements = HTML.knownElementNames; + knownElements.forEach(a => { map[asciiLowerCase(a)] = a; - } + }); return map; })({}); @@ -30,19 +19,26 @@ var properTagCaseMap = (function (map) { // Modern browsers let you embed SVG in HTML, but SVG elements are special // in that they have a case-sensitive DOM API (nodeName, getAttribute, // setAttribute). For example, it has to be `setAttribute("viewBox")`, -// not `"viewbox"`. However, the browser's HTML parser is NOT case sensitive +// not `"viewbox"`. However, the browser's HTML parser is NOT case-sensitive // and will fix the case for you, so if you write `` // you actually get a `"viewBox"` attribute. Any HTML-parsing toolchain // must do the same. export function properCaseTagName (name) { - var lowered = asciiLowerCase(name); - return properTagCaseMap.hasOwnProperty(lowered) ? - properTagCaseMap[lowered] : lowered; + const lowered = asciiLowerCase(name); + return _properTagCaseMap.hasOwnProperty(lowered) ? _properTagCaseMap[lowered] : lowered; } +const svgCamelCaseAttributes = 'attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef glyphRef gradientTransform gradientTransform gradientUnits gradientUnits kernelMatrix kernelUnitLength kernelUnitLength kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent specularExponent spreadMethod spreadMethod startOffset stdDeviation stitchTiles surfaceScale surfaceScale systemLanguage tableValues targetX targetY textLength textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan'.split(' '); + +const _properAttributeCaseMap = (map => { + svgCamelCaseAttributes.forEach(a => { + map[asciiLowerCase(a)] = a; + }); + return map; +})({}); + // See docs for properCaseTagName. export function properCaseAttributeName(name) { - var lowered = asciiLowerCase(name); - return properAttributeCaseMap.hasOwnProperty(lowered) ? - properAttributeCaseMap[lowered] : lowered; + const lowered = asciiLowerCase(name); + return _properAttributeCaseMap.hasOwnProperty(lowered) ? _properAttributeCaseMap[lowered] : lowered; } diff --git a/packages/htmljs/README.md b/packages/htmljs/README.md index d2b06c4b0..1ac4d80b6 100644 --- a/packages/htmljs/README.md +++ b/packages/htmljs/README.md @@ -5,7 +5,7 @@ syntax. It is used to render content in Blaze and to represent templates during compilation. ``` -var UL = HTML.UL, LI = HTML.LI, B = HTML.B; +let UL = HTML.UL, LI = HTML.LI, B = HTML.B; HTML.toHTML( UL({id: 'mylist'}, @@ -95,9 +95,9 @@ it must be written as `HTML.Attrs(attrs1, attrs2, ...)`, as in this example: ``` -var extraAttrs = {'class': "container"}; +let extraAttrs = {'class': "container"}; -var div = HTML.DIV(HTML.Attrs({id: "main"}, extraAttrs), +let div = HTML.DIV(HTML.Attrs({id: "main"}, extraAttrs), "This is the content."); div.attrs // => [{id: "main"}, {'class': "container"}] diff --git a/packages/htmljs/html.js b/packages/htmljs/html.js index db6ef3b99..7539da095 100644 --- a/packages/htmljs/html.js +++ b/packages/htmljs/html.js @@ -1,30 +1,75 @@ +export const Tag = function () { +}; -export const Tag = function () {}; Tag.prototype.tagName = ''; // this will be set per Tag subclass Tag.prototype.attrs = null; Tag.prototype.children = Object.freeze ? Object.freeze([]) : []; -Tag.prototype.htmljsType = Tag.htmljsType = ['Tag']; +Tag.htmljsType = ['Tag']; +Tag.prototype.htmljsType = Tag.htmljsType; + +export function isConstructedObject(x) { + // Figure out if `x` is "an instance of some class" or just a plain + // object literal. It correctly treats an object literal like + // `{ constructor: ... }` as an object literal. It won't detect + // instances of classes that lack a `constructor` property (e.g. + // if you assign to a prototype when setting up the class as in: + // `Foo = function () { ... }; Foo.prototype = { ... }`, then + // `(new Foo).constructor` is `Object`, not `Foo`). + if (!x || (typeof x !== 'object')) return false; + + // Is this a plain object? + let plain; + + if (Object.getPrototypeOf(x) === null) { + plain = true; + } else { + let proto = x; + + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + plain = Object.getPrototypeOf(x) === proto; + } + + return !plain && (typeof x.constructor === 'function') && (x instanceof x.constructor); +} + +// Not an HTMLjs node, but a wrapper to pass multiple attrs dictionaries +// to a tag (for the purpose of implementing dynamic attributes). +export function Attrs(...args) { + // Work with or without `new`. If not called with `new`, + // perform instantiation by recursively calling this constructor. + // We can't pass varargs, so pass no args. + const instance = (this instanceof Attrs) ? this : new Attrs(); + + instance.value = args; + + return instance; +} // Given "p" create the function `HTML.P`. -var makeTagConstructor = function (tagName) { - // Tag is the per-tagName constructor of a HTML.Tag subclass - var HTMLTag = function (...args) { +const makeTagConstructor = function (tagName) { + // Tag is the per-tagName constructor of an HTML.Tag subclass + const HTMLTag = function (...args) { // Work with or without `new`. If not called with `new`, // perform instantiation by recursively calling this constructor. // We can't pass varargs, so pass no args. - var instance = (this instanceof Tag) ? this : new HTMLTag; + const instance = (this instanceof Tag) ? this : new HTMLTag(); + + let i = 0; + const attrs = args.length && args[0]; - var i = 0; - var attrs = args.length && args[0]; if (attrs && (typeof attrs === 'object')) { - // Treat vanilla JS object as an attributes dictionary. - if (! isConstructedObject(attrs)) { + // Treat vanilla JS objects as an attributes' dictionary. + if (!isConstructedObject(attrs)) { instance.attrs = attrs; i++; } else if (attrs instanceof Attrs) { - var array = attrs.value; + const array = attrs.value; + if (array.length === 1) { - instance.attrs = array[0]; + instance.attrs = array[0]; /* eslint prefer-destructuring: ["error", {VariableDeclarator: {array: true}}] */ } else if (array.length > 1) { instance.attrs = array; } @@ -32,76 +77,60 @@ var makeTagConstructor = function (tagName) { } } - // If no children, don't create an array at all, use the prototype's // (frozen, empty) array. This way we don't create an empty array // every time someone creates a tag without `new` and this constructor // calls itself with no arguments (above). - if (i < args.length) + if (i < args.length) { instance.children = args.slice(i); + } return instance; }; - HTMLTag.prototype = new Tag; + + HTMLTag.prototype = new Tag(); HTMLTag.prototype.constructor = HTMLTag; HTMLTag.prototype.tagName = tagName; return HTMLTag; }; -// Not an HTMLjs node, but a wrapper to pass multiple attrs dictionaries -// to a tag (for the purpose of implementing dynamic attributes). -export function Attrs(...args) { - // Work with or without `new`. If not called with `new`, - // perform instantiation by recursively calling this constructor. - // We can't pass varargs, so pass no args. - var instance = (this instanceof Attrs) ? this : new Attrs; - - instance.value = args; +// KNOWN ELEMENTS +export const HTMLTags = {}; - return instance; +export function getSymbolName(tagName) { + // "foo-bar" -> "FOO_BAR" + return tagName.toUpperCase().replace(/-/g, '_'); } -////////////////////////////// KNOWN ELEMENTS -export const HTMLTags = {}; +export function getTag(tagName) { + const symbolName = getSymbolName(tagName); -export function getTag (tagName) { - var symbolName = getSymbolName(tagName); - if (symbolName === tagName) // all-caps tagName - throw new Error("Use the lowercase or camelCase form of '" + tagName + "' here"); + if (symbolName === tagName) { + // all-caps tagName + throw new Error(`Use the lowercase or camelCase form of "${tagName}" here`); + } - if (! HTMLTags[symbolName]) + if (!HTMLTags[symbolName]) { HTMLTags[symbolName] = makeTagConstructor(tagName); + } return HTMLTags[symbolName]; } -export function ensureTag(tagName) { - getTag(tagName); // don't return it -} - -export function isTagEnsured (tagName) { - return isKnownElement(tagName); -} - -export function getSymbolName (tagName) { - // "foo-bar" -> "FOO_BAR" - return tagName.toUpperCase().replace(/-/g, '_'); -} - +// HTML + SVG element names export const knownHTMLElementNames = 'a abbr acronym address applet area article aside audio b base basefont bdi bdo big blockquote body br button canvas caption center cite code col colgroup command data datagrid datalist dd del details dfn dir div dl dt em embed eventsource fieldset figcaption figure font footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins isindex kbd keygen label legend li link main map mark menu meta meter nav noframes noscript object ol optgroup option output p param pre progress q rp rt ruby s samp script section select small source span strike strong style sub summary sup table tbody td textarea tfoot th thead time title tr track tt u ul var video wbr'.split(' '); -// (we add the SVG ones below) - +// We add the SVG one's below export const knownSVGElementNames = 'altGlyph altGlyphDef altGlyphItem animate animateColor animateMotion animateTransform circle clipPath color-profile cursor defs desc ellipse feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence filter font font-face font-face-format font-face-name font-face-src font-face-uri foreignObject g glyph glyphRef hkern image line linearGradient marker mask metadata missing-glyph path pattern polygon polyline radialGradient rect set stop style svg switch symbol text textPath title tref tspan use view vkern'.split(' '); // Append SVG element names to list of known element names export const knownElementNames = knownHTMLElementNames.concat(knownSVGElementNames); +// VOID element names export const voidElementNames = 'area base br col command embed hr img input keygen link meta param source track wbr'.split(' '); - -var voidElementSet = new Set(voidElementNames); -var knownElementSet = new Set(knownElementNames); -var knownSVGElementSet = new Set(knownSVGElementNames); +const knownElementSet = new Set(knownElementNames); +const knownSVGElementSet = new Set(knownSVGElementNames); +const voidElementSet = new Set(voidElementNames); export function isKnownElement(tagName) { return knownElementSet.has(tagName); @@ -115,124 +144,119 @@ export function isVoidElement(tagName) { return voidElementSet.has(tagName); } +export function isTagEnsured(tagName) { + return isKnownElement(tagName); +} + +export function ensureTag(tagName) { + getTag(tagName); // don't return it +} // Ensure tags for all known elements knownElementNames.forEach(ensureTag); - export function CharRef(attrs) { - if (! (this instanceof CharRef)) + if (!(this instanceof CharRef)) { // called without `new` return new CharRef(attrs); + } - if (! (attrs && attrs.html && attrs.str)) - throw new Error( - "HTML.CharRef must be constructed with ({html:..., str:...})"); + if (!(attrs && attrs.html && attrs.str)) { + throw new Error('HTML.CharRef must be constructed with ({html:..., str:...})'); + } this.html = attrs.html; this.str = attrs.str; } -CharRef.prototype.htmljsType = CharRef.htmljsType = ['CharRef']; + +CharRef.htmljsType = ['CharRef']; +CharRef.prototype.htmljsType = CharRef.htmljsType; export function Comment(value) { - if (! (this instanceof Comment)) + if (!(this instanceof Comment)) { // called without `new` return new Comment(value); + } - if (typeof value !== 'string') + if (typeof value !== 'string') { throw new Error('HTML.Comment must be constructed with a string'); + } this.value = value; + // Kill illegal hyphens in comment value (no way to escape them in HTML) this.sanitizedValue = value.replace(/^-|--+|-$/g, ''); } -Comment.prototype.htmljsType = Comment.htmljsType = ['Comment']; + +Comment.htmljsType = ['Comment']; +Comment.prototype.htmljsType = Comment.htmljsType; export function Raw(value) { - if (! (this instanceof Raw)) + if (!(this instanceof Raw)) { // called without `new` return new Raw(value); + } - if (typeof value !== 'string') + if (typeof value !== 'string') { throw new Error('HTML.Raw must be constructed with a string'); + } this.value = value; } -Raw.prototype.htmljsType = Raw.htmljsType = ['Raw']; +Raw.htmljsType = ['Raw']; +Raw.prototype.htmljsType = Raw.htmljsType; -export function isArray (x) { +export function isArray(x) { return x instanceof Array || Array.isArray(x); } -export function isConstructedObject (x) { - // Figure out if `x` is "an instance of some class" or just a plain - // object literal. It correctly treats an object literal like - // `{ constructor: ... }` as an object literal. It won't detect - // instances of classes that lack a `constructor` property (e.g. - // if you assign to a prototype when setting up the class as in: - // `Foo = function () { ... }; Foo.prototype = { ... }`, then - // `(new Foo).constructor` is `Object`, not `Foo`). - if(!x || (typeof x !== 'object')) return false; - // Is this a plain object? - let plain = false; - if(Object.getPrototypeOf(x) === null) { - plain = true; - } else { - let proto = x; - while(Object.getPrototypeOf(proto) !== null) { - proto = Object.getPrototypeOf(proto); - } - plain = Object.getPrototypeOf(x) === proto; - } - - return !plain && - (typeof x.constructor === 'function') && - (x instanceof x.constructor); -} - -export function isNully (node) { - if (node == null) +export function isNully(node) { + if (node == null) { // null or undefined return true; - - if (isArray(node)) { - // is it an empty array or an array of all nully items? - for (var i = 0; i < node.length; i++) - if (! isNully(node[i])) - return false; - return true; } - return false; + return isArray(node) && node.every(isNully); } -export function isValidAttributeName (name) { - return /^[:_A-Za-z][:_A-Za-z0-9.\-]*/.test(name); +export function isValidAttributeName(name) { + return /^[:_A-Za-z][:_A-Za-z\d.-]*/.test(name); } // If `attrs` is an array of attributes dictionaries, combines them -// into one. Removes attributes that are "nully." -export function flattenAttributes (attrs) { - if (! attrs) +// into one. Remove attributes that are "nully." +export function flattenAttributes(attrs) { + if (!attrs) { return attrs; + } - var isList = isArray(attrs); - if (isList && attrs.length === 0) + const isList = isArray(attrs); + + if (isList && attrs.length === 0) { return null; + } + + const result = {}; + const n = (isList ? attrs.length : 1); - var result = {}; - for (var i = 0, N = (isList ? attrs.length : 1); i < N; i++) { - var oneAttrs = (isList ? attrs[i] : attrs); - if ((typeof oneAttrs !== 'object') || - isConstructedObject(oneAttrs)) - throw new Error("Expected plain JS object as attrs, found: " + oneAttrs); - for (var name in oneAttrs) { - if (! isValidAttributeName(name)) - throw new Error("Illegal HTML attribute name: " + name); - var value = oneAttrs[name]; - if (! isNully(value)) + for (let i = 0; i < n; i++) { + const oneAttrs = (isList ? attrs[i] : attrs); + + if ((typeof oneAttrs !== 'object') || isConstructedObject(oneAttrs)) { + throw new Error(`Expected plain JS object as attrs, found: ${oneAttrs}`); + } + + for (const name in oneAttrs) { + if (!isValidAttributeName(name)) { + throw new Error(`Illegal HTML attribute name: ${name}`); + } + + const value = oneAttrs[name]; + + if (!isNully(value)) { result[name] = value; + } } } diff --git a/packages/htmljs/htmljs_test.js b/packages/htmljs/htmljs_test.js index c20722ee5..bef1e3746 100644 --- a/packages/htmljs/htmljs_test.js +++ b/packages/htmljs/htmljs_test.js @@ -1,9 +1,10 @@ +/* eslint-env meteor */ import { HTML } from 'meteor/htmljs'; -Tinytest.add("htmljs - getTag", function (test) { - var FOO = HTML.getTag('foo'); +Tinytest.add('htmljs - getTag', function (test) { + const FOO = HTML.getTag('foo'); test.isTrue(HTML.FOO === FOO); - var x = FOO(); + const x = FOO(); test.equal(x.tagName, 'foo'); test.isTrue(x instanceof HTML.FOO); @@ -11,31 +12,32 @@ Tinytest.add("htmljs - getTag", function (test) { test.equal(x.children, []); test.equal(x.attrs, null); - test.isTrue((new FOO) instanceof HTML.FOO); - test.isTrue((new FOO) instanceof HTML.Tag); - test.isFalse((new HTML.P) instanceof HTML.FOO); + test.isTrue((new FOO()) instanceof HTML.FOO); + test.isTrue((new FOO()) instanceof HTML.Tag); + test.isFalse((new HTML.P()) instanceof HTML.FOO); - var result = HTML.ensureTag('Bar'); + const result = HTML.ensureTag('Bar'); // void function's return checked intentionally test.equal(typeof result, 'undefined'); - var BAR = HTML.BAR; + + const { BAR } = HTML; test.equal(BAR().tagName, 'Bar'); }); -Tinytest.add("htmljs - construction", function (test) { - var A = HTML.getTag('a'); - var B = HTML.getTag('b'); - var C = HTML.getTag('c'); +Tinytest.add('htmljs - construction', function (test) { + const A = HTML.getTag('a'); + const B = HTML.getTag('b'); + const C = HTML.getTag('c'); - var a = A(0, B({q:0}, C(A(B({})), 'foo'))); + const a = A(0, B({ q: 0 }, C(A(B({})), 'foo'))); test.equal(a.tagName, 'a'); test.equal(a.attrs, null); test.equal(a.children.length, 2); test.equal(a.children[0], 0); - var b = a.children[1]; + const b = a.children[1]; test.equal(b.tagName, 'b'); - test.equal(b.attrs, {q:0}); + test.equal(b.attrs, { q: 0 }); test.equal(b.children.length, 1); - var c = b.children[0]; + const c = b.children[0]; test.equal(c.tagName, 'c'); test.equal(c.attrs, null); test.equal(c.children.length, 2); @@ -47,51 +49,51 @@ Tinytest.add("htmljs - construction", function (test) { test.equal(c.children[0].children[0].attrs, {}); test.equal(c.children[1], 'foo'); - var a2 = new A({m:1}, {n:2}, B(), {o:3}, 'foo'); + const a2 = new A({ m: 1 }, { n: 2 }, B(), { o: 3 }, 'foo'); test.equal(a2.tagName, 'a'); - test.equal(a2.attrs, {m:1}); + test.equal(a2.attrs, { m: 1 }); test.equal(a2.children.length, 4); - test.equal(a2.children[0], {n:2}); + test.equal(a2.children[0], { n: 2 }); test.equal(a2.children[1].tagName, 'b'); - test.equal(a2.children[2], {o:3}); + test.equal(a2.children[2], { o: 3 }); test.equal(a2.children[3], 'foo'); // tests of HTML.isConstructedObject (indirectly) - test.equal(A({x:1}).children.length, 0); - var f = function () {}; - test.equal(A(new f).children.length, 1); - test.equal(A(new Date).children.length, 1); - test.equal(A({constructor: 'blah'}).children.length, 0); - test.equal(A({constructor: Object}).children.length, 0); - - test.equal(HTML.toHTML(HTML.CharRef({html: '&', str: '&'})), '&'); + test.equal(A({ x: 1 }).children.length, 0); + const F = function () { + }; + + test.equal(A(new F()).children.length, 1); + test.equal(A(new Date()).children.length, 1); + test.equal(A({ constructor: 'blah' }).children.length, 0); + test.equal(A({ constructor: Object }).children.length, 0); + + test.equal(HTML.toHTML(HTML.CharRef({ html: '&', str: '&' })), '&'); test.throws(function () { - HTML.CharRef({html: '&'}); // no 'str' + HTML.CharRef({ html: '&' }); // no 'str' }); }); // copied from here https://github.com/meteor/blaze/blob/ed9299ea32afdd04f33124957f22ce2b18b7f3ff/packages/html-tools/utils.js#L3 -// to avoid circular dependency between htmljs and html-tools pacakge. +// to avoid circular dependency between htmljs and html-tools package. // this circular dependency was blocking the publish process. -var asciiLowerCase = function (str) { +const asciiLowerCase = function (str) { return str.replace(/[A-Z]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) + 32); }); }; -Tinytest.add("htmljs - utils", function (test) { - - test.notEqual("\u00c9".toLowerCase(), "\u00c9"); - test.equal(asciiLowerCase("\u00c9"), "\u00c9"); - - test.equal(asciiLowerCase("Hello There"), "hello there"); +Tinytest.add('htmljs - utils', function (test) { + test.notEqual('\u00c9'.toLowerCase(), '\u00c9'); + test.equal(asciiLowerCase('\u00c9'), '\u00c9'); - test.isTrue(HTML.isVoidElement("br")); - test.isFalse(HTML.isVoidElement("div")); - test.isTrue(HTML.isKnownElement("div")); + test.equal(asciiLowerCase('Hello There'), 'hello there'); + test.isTrue(HTML.isVoidElement('br')); + test.isFalse(HTML.isVoidElement('div')); + test.isTrue(HTML.isKnownElement('div')); }); -Tinytest.add("htmljs - details", function (test) { - test.equal(HTML.toHTML(false), "false"); +Tinytest.add('htmljs - details', function (test) { + test.equal(HTML.toHTML(false), 'false'); }); diff --git a/packages/htmljs/package.js b/packages/htmljs/package.js index 1b9c26bc5..f084839a0 100644 --- a/packages/htmljs/package.js +++ b/packages/htmljs/package.js @@ -1,8 +1,9 @@ +/* eslint-env meteor */ Package.describe({ name: 'htmljs', - summary: "Small library for expressing HTML trees", - version: '1.1.1', - git: 'https://github.com/meteor/blaze.git' + summary: 'Small library for expressing HTML trees', + version: '1.2.0', + git: 'https://github.com/meteor/blaze.git', }); Package.onUse(function (api) { @@ -19,6 +20,6 @@ Package.onTest(function (api) { api.use('htmljs'); api.addFiles([ - 'htmljs_test.js' + 'htmljs_test.js', ]); }); diff --git a/packages/htmljs/preamble.js b/packages/htmljs/preamble.js index 7bff32886..d8e13cd58 100644 --- a/packages/htmljs/preamble.js +++ b/packages/htmljs/preamble.js @@ -30,7 +30,7 @@ import { ToTextVisitor, toHTML, TEXTMODE, - toText + toText, } from './visitors'; diff --git a/packages/htmljs/visitors.js b/packages/htmljs/visitors.js index 467fb4929..cf21f8a17 100644 --- a/packages/htmljs/visitors.js +++ b/packages/htmljs/visitors.js @@ -10,109 +10,106 @@ import { isVoidElement, } from './html'; - -var IDENTITY = function (x) { return x; }; - -// _assign is like _.extend or the upcoming Object.assign. -// Copy src's own, enumerable properties onto tgt and return -// tgt. -var _hasOwnProperty = Object.prototype.hasOwnProperty; -var _assign = function (tgt, src) { - for (var k in src) { - if (_hasOwnProperty.call(src, k)) - tgt[k] = src[k]; - } - return tgt; -}; +const IDENTITY = x => x; export const Visitor = function (props) { - _assign(this, props); + Object.assign(this, props); }; Visitor.def = function (options) { - _assign(this.prototype, options); + Object.assign(this.prototype, options); }; Visitor.extend = function (options) { - var curType = this; - var subType = function HTMLVisitorSubtype(/*arguments*/) { - Visitor.apply(this, arguments); + const CurType = this; + const subType = function HTMLVisitorSubtype(...args) { + Visitor.apply(this, args); }; - subType.prototype = new curType; - subType.extend = curType.extend; - subType.def = curType.def; - if (options) - _assign(subType.prototype, options); + subType.prototype = new CurType(); + subType.extend = CurType.extend; + subType.def = CurType.def; + + if (options) { + Object.assign(subType.prototype, options); + } + return subType; }; Visitor.def({ - visit: function (content/*, ...*/) { - if (content == null) + visit(...args) { + const [content] = args; + + if (content == null) { // null or undefined. - return this.visitNull.apply(this, arguments); + return this.visitNull.apply(this, args); + } if (typeof content === 'object') { if (content.htmljsType) { switch (content.htmljsType) { - case Tag.htmljsType: - return this.visitTag.apply(this, arguments); - case CharRef.htmljsType: - return this.visitCharRef.apply(this, arguments); - case Comment.htmljsType: - return this.visitComment.apply(this, arguments); - case Raw.htmljsType: - return this.visitRaw.apply(this, arguments); - default: - throw new Error("Unknown htmljs type: " + content.htmljsType); + case Tag.htmljsType: + return this.visitTag.apply(this, arguments); + case CharRef.htmljsType: + return this.visitCharRef.apply(this, arguments); + case Comment.htmljsType: + return this.visitComment.apply(this, arguments); + case Raw.htmljsType: + return this.visitRaw.apply(this, arguments); + default: + throw new Error(`Unknown htmljs type: ${content.htmljsType}`); } } - if (isArray(content)) - return this.visitArray.apply(this, arguments); + if (isArray(content)) return this.visitArray.apply(this, arguments); return this.visitObject.apply(this, arguments); - - } else if ((typeof content === 'string') || - (typeof content === 'boolean') || - (typeof content === 'number')) { + } + if ((typeof content === 'string') || + (typeof content === 'boolean') || + (typeof content === 'number')) { return this.visitPrimitive.apply(this, arguments); - - } else if (typeof content === 'function') { + } + if (typeof content === 'function') { return this.visitFunction.apply(this, arguments); } - throw new Error("Unexpected object in htmljs: " + content); - + throw new Error(`Unexpected object in htmljs: ${content}`); }, - visitNull: function (nullOrUndefined/*, ...*/) {}, - visitPrimitive: function (stringBooleanOrNumber/*, ...*/) {}, - visitArray: function (array/*, ...*/) {}, - visitComment: function (comment/*, ...*/) {}, - visitCharRef: function (charRef/*, ...*/) {}, - visitRaw: function (raw/*, ...*/) {}, - visitTag: function (tag/*, ...*/) {}, - visitObject: function (obj/*, ...*/) { - throw new Error("Unexpected object in htmljs: " + obj); + visitNull(nullOrUndefined/* , ... */) { + }, + visitPrimitive(stringBooleanOrNumber/* , ... */) { + }, + visitArray(array/* , ... */) { + }, + visitComment(comment/* , ... */) { + }, + visitCharRef(charRef/* , ... */) { + }, + visitRaw(raw/* , ... */) { + }, + visitTag(tag/* , ... */) { + }, + visitObject(obj/* , ... */) { + throw new Error(`Unexpected object in htmljs: ${obj}`); + }, + visitFunction(fn/* , ... */) { + throw new Error(`Unexpected function in htmljs: ${fn}`); }, - visitFunction: function (fn/*, ...*/) { - throw new Error("Unexpected function in htmljs: " + fn); - } }); export const TransformingVisitor = Visitor.extend(); TransformingVisitor.def({ visitNull: IDENTITY, visitPrimitive: IDENTITY, - visitArray: function (array, ...args) { - var result = array; - for (var i = 0; i < array.length; i++) { - var oldItem = array[i]; - var newItem = this.visit(oldItem, ...args); + visitArray(array, ...args) { + let result = array; + for (let i = 0; i < array.length; i++) { + const oldItem = array[i]; + const newItem = this.visit(oldItem, ...args); if (newItem !== oldItem) { // copy `array` on write - if (result === array) - result = array.slice(); + if (result === array) result = array.slice(); result[i] = newItem; } } @@ -121,50 +118,48 @@ TransformingVisitor.def({ visitComment: IDENTITY, visitCharRef: IDENTITY, visitRaw: IDENTITY, - visitObject: function(obj, ...args){ + visitObject(obj, ...args) { // Don't parse Markdown & RCData as HTML - if (obj.textMode != null){ + if (obj.textMode != null) { return obj; } if ('content' in obj) { obj.content = this.visit(obj.content, ...args); } - if ('elseContent' in obj){ + if ('elseContent' in obj) { obj.elseContent = this.visit(obj.elseContent, ...args); } return obj; }, visitFunction: IDENTITY, - visitTag: function (tag, ...args) { - var oldChildren = tag.children; - var newChildren = this.visitChildren(oldChildren, ...args); + visitTag(tag, ...args) { + const oldChildren = tag.children; + const newChildren = this.visitChildren(oldChildren, ...args); - var oldAttrs = tag.attrs; - var newAttrs = this.visitAttributes(oldAttrs, ...args); + const oldAttrs = tag.attrs; + const newAttrs = this.visitAttributes(oldAttrs, ...args); - if (newAttrs === oldAttrs && newChildren === oldChildren) - return tag; + if (newAttrs === oldAttrs && newChildren === oldChildren) return tag; - var newTag = getTag(tag.tagName).apply(null, newChildren); + const newTag = getTag(tag.tagName).apply(null, newChildren); newTag.attrs = newAttrs; return newTag; }, - visitChildren: function (children, ...args) { + visitChildren(children, ...args) { return this.visitArray(children, ...args); }, // Transform the `.attrs` property of a tag, which may be a dictionary, // an array, or in some uses, a foreign object (such as // a template tag). - visitAttributes: function (attrs, ...args) { + visitAttributes(attrs, ...args) { if (isArray(attrs)) { - var result = attrs; - for (var i = 0; i < attrs.length; i++) { - var oldItem = attrs[i]; - var newItem = this.visitAttributes(oldItem, ...args); + let result = attrs; + for (let i = 0; i < attrs.length; i++) { + const oldItem = attrs[i]; + const newItem = this.visitAttributes(oldItem, ...args); if (newItem !== oldItem) { // copy on write - if (result === attrs) - result = attrs.slice(); + if (result === attrs) result = attrs.slice(); result[i] = newItem; } } @@ -181,72 +176,82 @@ TransformingVisitor.def({ "visitAttributes for this case."); } - var oldAttrs = attrs; - var newAttrs = oldAttrs; + const oldAttrs = attrs; + let newAttrs = oldAttrs; if (oldAttrs) { - var attrArgs = [null, null]; + const attrArgs = [null, null]; attrArgs.push.apply(attrArgs, arguments); - for (var k in oldAttrs) { - var oldValue = oldAttrs[k]; + Object.getOwnPropertyNames(oldAttrs).forEach(k => { + const oldValue = oldAttrs[k]; attrArgs[0] = k; attrArgs[1] = oldValue; - var newValue = this.visitAttribute.apply(this, attrArgs); + const newValue = this.visitAttribute.apply(this, attrArgs); if (newValue !== oldValue) { // copy on write - if (newAttrs === oldAttrs) - newAttrs = _assign({}, oldAttrs); + if (newAttrs === oldAttrs) { + newAttrs = Object.assign({}, oldAttrs); + } + newAttrs[k] = newValue; } - } + }); } return newAttrs; }, // Transform the value of one attribute name/value in an // attributes dictionary. - visitAttribute: function (name, value, tag, ...args) { + visitAttribute(name, value, tag, ...args) { return this.visit(value, ...args); - } + }, }); +// Escaping modes for outputting text when generating HTML. +export const TEXTMODE = { + STRING: 1, + RCDATA: 2, + ATTRIBUTE: 3, +}; + +export function toHTML(content) { + return (new ToHTMLVisitor()).visit(content); +} export const ToTextVisitor = Visitor.extend(); ToTextVisitor.def({ - visitNull: function (nullOrUndefined) { + visitNull() { return ''; }, - visitPrimitive: function (stringBooleanOrNumber) { - var str = String(stringBooleanOrNumber); + visitPrimitive(stringBooleanOrNumber) { + const str = String(stringBooleanOrNumber); if (this.textMode === TEXTMODE.RCDATA) { return str.replace(/&/g, '&').replace(/'; + visitComment(comment) { + return ``; }, - visitCharRef: function (charRef) { + visitCharRef(charRef) { return charRef.html; }, - visitRaw: function (raw) { + visitRaw(raw) { return raw.value; }, - visitTag: function (tag) { - var attrStrs = []; + visitTag(tag) { + const attrStrs = []; - var tagName = tag.tagName; - var children = tag.children; + const { tagName } = tag; + let { children } = tag; - var attrs = tag.attrs; + let { attrs } = tag; if (attrs) { attrs = flattenAttributes(attrs); - for (var k in attrs) { + Object.getOwnPropertyNames(attrs).forEach(k => { if (k === 'value' && tagName === 'textarea') { children = [attrs[k], children]; } else { - var v = this.toText(attrs[k], TEXTMODE.ATTRIBUTE); - attrStrs.push(' ' + k + '="' + v + '"'); + const v = this.toText(attrs[k], TEXTMODE.ATTRIBUTE); + attrStrs.push(` ${k}="${v}"`); } - } + }); } - var startTag = '<' + tagName + attrStrs.join('') + '>'; + const startTag = `<${tagName}${attrStrs.join('')}>`; - var childStrs = []; - var content; + const childStrs = []; + let content; if (tagName === 'textarea') { - - for (var i = 0; i < children.length; i++) - childStrs.push(this.toText(children[i], TEXTMODE.RCDATA)); + for (let i = 0; i < children.length; i++) childStrs.push(this.toText(children[i], TEXTMODE.RCDATA)); content = childStrs.join(''); - if (content.slice(0, 1) === '\n') - // TEXTAREA will absorb a newline, so if we see one, add - // another one. - content = '\n' + content; - + if (content.slice(0, 1) === '\n') { + // TEXTAREA will absorb a newline, so if we see one, add another one. + content = `\n${content}`; + } } else { - for (var i = 0; i < children.length; i++) - childStrs.push(this.visit(children[i])); + for (let i = 0; i < children.length; i++) childStrs.push(this.visit(children[i])); content = childStrs.join(''); } - var result = startTag + content; + let result = startTag + content; - if (children.length || ! isVoidElement(tagName)) { + if (children.length || !isVoidElement(tagName)) { // "Void" elements like BR are the only ones that don't get a close // tag in HTML5. They shouldn't have contents, either, so we could // throw an error upon seeing contents here. - result += ''; + result += ``; } return result; }, - visitObject: function (x) { - throw new Error("Unexpected object in htmljs in toHTML: " + x); + visitObject(x) { + throw new Error(`Unexpected object in htmljs in toHTML: ${x}`); }, - toText: function (node, textMode) { + toText(node, textMode) { return toText(node, textMode); - } + }, }); - - - -////////////////////////////// TOHTML - -export function toHTML(content) { - return (new ToHTMLVisitor).visit(content); -} - -// Escaping modes for outputting text when generating HTML. -export const TEXTMODE = { - STRING: 1, - RCDATA: 2, - ATTRIBUTE: 3 -}; - - -export function toText(content, textMode) { - if (! textMode) - throw new Error("textMode required for HTML.toText"); - if (! (textMode === TEXTMODE.STRING || - textMode === TEXTMODE.RCDATA || - textMode === TEXTMODE.ATTRIBUTE)) - throw new Error("Unknown textMode: " + textMode); - - var visitor = new ToTextVisitor({textMode: textMode}); - return visitor.visit(content); -}