const unicodedict = Dict{Char, String}(
    '𝑅' => raw"\itR",
    '▐' => raw"\blockrighthalf",
    '♥' => raw"\varheartsuit",
    '⌒' => raw"\profline",
    'ⱼ' => raw"\_j",
    '▭' => raw"\hrectangle",
    '⌑' => raw"\sqlozenge",
    '♠' => raw"\spadesuit",
    '⭀' => raw"\equalleftarrow",
    '≪' => raw"\ll",
    '↾' => raw"\upharpoonleft",
    '𝛡' => raw"\bfvarpi",
    '𝞥' => raw"\bisansPhi",
    '↨' => raw"\updownarrowbar",
    '𝐖' => raw"\bfW",
    '⦠' => raw"\lpargt",
    '𝐂' => raw"\bfC",
    '⬺' => raw"\nVleftarrowtail",
    '𝘐' => raw"\isansI",
    '⋂' => raw"\bigcap",
    '⧶' => raw"\dsol",
    '𝕔' => raw"\bbc",
    'ŋ' => raw"\ng",
    '⨴' => raw"\otimeslhrim",
    '𝝌' => raw"\bichi",
    '𝟶' => raw"\ttzero",
    '𝙨' => raw"\bisanss",
    '◼' => raw"\mdblksquare",
    '𝖣' => raw"\sansD",
    '⨕' => raw"\pointint",
    '¥' => raw"\yen",
    '𝞸' => raw"\bisansomicron",
    '₍' => raw"\_(",
    'ɲ' => raw"\ltln",
    '𝑊' => raw"\itW",
    '⇕' => raw"\Updownarrow",
    '𝖸' => raw"\sansY",
    '⬟' => raw"\pentagonblack",
    '𝕮' => raw"\bfrakC",
    'ʋ' => raw"\pscrv",
    '⨰' => raw"\dottimes",
    '◜' => raw"\ularc",
    '⨅' => raw"\bigsqcap",
    '₃' => raw"\_3",
    '𝙧' => raw"\bisansr",
    '𝐪' => raw"\bfq",
    '↲' => raw"\Ldsh",
    '↬' => raw"\looparrowright",
    '𝒙' => raw"\bix",
    '𝘻' => raw"\isansz",
    '≲' => raw"\lesssim",
    'Å' => raw"\Angstrom",
    '⬞' => raw"\vysmwhtsquare",
    '𝘼' => raw"\bisansA",
    '≈' => raw"\approx",
    '⥮' => raw"\UpEquilibrium",
    '⬔' => raw"\squareurblack",
    '𝖒' => raw"\bfrakm",
    '𝝔' => raw"\bivarrho",
    '⅊' => raw"\PropertyLine",
    '𝙹' => raw"\ttJ",
    '⏟' => raw"\underbrace",
    '⥢' => raw"\leftharpoonsupdown",
    '̶' => raw"\sout",
    '⫗' => raw"\suphsub",
    '⅂' => raw"\sansLturned",
    '¬' => raw"\neg",
    '𝔉' => raw"\frakF",
    '⏣' => raw"\benzenr",
    '⨄' => raw"\biguplus",
    'ɥ' => raw"\trnh",
    '𝗵' => raw"\bsansh",
    '⅔' => raw"\2/3",
    '⋓' => raw"\Cup",
    '𝝁' => raw"\bimu",
    '̂' => raw"\hat",
    '𝕹' => raw"\bfrakN",
    '≰' => raw"\nleq",
    '𝝆' => raw"\birho",
    '⧇' => raw"\boxcircle",
    '𝚼' => raw"\bfUpsilon",
    '▦' => raw"\squarehvfill",
    '⥪' => raw"\leftharpoonupdash",
    '≀' => raw"\wr",
    '₅' => raw"\_5",
    '⤦' => raw"\hkswarow",
    '𝝤' => raw"\bsansOmicron",
    '⌓' => raw"\profsurf",
    '≸' => raw"\notlessgreater",
    '𝝙' => raw"\bsansDelta",
    '𝝩' => raw"\bsansTau",
    '𝖶' => raw"\sansW",
    '𝑖' => raw"\iti",
    '∣' => raw"\mid",
    '⨙' => raw"\intcap",
    '𝓗' => raw"\bscrH",
    '͍' => raw"\underleftrightarrow",
    '𝓰' => raw"\bscrg",
    '𝒹' => raw"\scrd",
    '𝐆' => raw"\bfG",
    '♾' => raw"\acidfree",
    '⏤' => raw"\strns",
    '⅗' => raw"\3/5",
    '▥' => raw"\squarevfill",
    '⩭' => raw"\congdot",
    '⤏' => raw"\dbkarow",
    '⪿' => raw"\subsetplus",
    '♂' => raw"\mars",
    '⩗' => raw"\bigslopedvee",
    '𝔞' => raw"\fraka",
    '𝟟' => raw"\bbseven",
    '𝛿' => raw"\itdelta",
    '𝓋' => raw"\scrv",
    '±' => raw"\pm",
    '⬠' => raw"\pentagon",
    'Œ' => raw"\OE",
    '▩' => raw"\squarecrossfill",
    '𝚋' => raw"\ttb",
    '𝕪' => raw"\bby",
    '𝑄' => raw"\itQ",
    '𝗫' => raw"\bsansX",
    'ʈ' => raw"\rtlt",
    '𝓈' => raw"\scrs",
    '𝘝' => raw"\isansV",
    '𝜃' => raw"\ittheta",
    '𝔄' => raw"\frakA",
    '≵' => raw"\ngtrsim",
    '𝟕' => raw"\bfseven",
    '⩱' => raw"\eqqplus",
    '⦾' => raw"\circledwhitebullet",
    '⥬' => raw"\rightharpoonupdash",
    '▽' => raw"\bigtriangledown",
    '⨽' => raw"\intprodr",
    '∝' => raw"\propto",
    '↹' => raw"\barleftarrowrightarrowbar",
    '𝝫' => raw"\bsansPhi",
    '⤠' => raw"\barrightarrowdiamond",
    '◔' => raw"\circleurquadblack",
    '𝔲' => raw"\fraku",
    '𝕄' => raw"\bbM",
    '𝛅' => raw"\bfdelta",
    '⤧' => raw"\tona",
    '⅒' => raw"\1/10",
    '⨿' => raw"\amalg",
    '♇' => raw"\pluto",
    '̋' => raw"\H",
    '◻' => raw"\mdwhtsquare",
    '∆' => raw"\increment",
    '𝘢' => raw"\isansa",
    '♭' => raw"\flat",
    '⁸' => raw"\^8",
    '⟺' => raw"\iff",
    '𝕞' => raw"\bbm",
    '𝗼' => raw"\bsanso",
    '∟' => raw"\rightangle",
    '𝘛' => raw"\isansT",
    '𝐶' => raw"\itC",
    '◧' => raw"\sqfl",
    '⦳' => raw"\emptysetoarr",
    '𝚩' => raw"\bfBeta",
    '⥤' => raw"\rightharpoonsupdown",
    'Ϝ' => raw"\Digamma",
    '𝗒' => raw"\sansy",
    '𝞰' => raw"\bisanseta",
    '☆' => raw"\bigwhitestar",
    'ᵧ' => raw"\_gamma",
    '⦴' => raw"\emptysetoarrl",
    '𝟂' => raw"\bisansomega",
    '𝘔' => raw"\isansM",
    '∯' => raw"\oiint",
    '”' => raw"\quotedblright",
    '⋁' => raw"\bigvee",
    '𝝎' => raw"\biomega",
    '𝛲' => raw"\itRho",
    '𝓉' => raw"\scrt",
    '⎔' => raw"\hexagon",
    '⇩' => raw"\downwhitearrow",
    '𝙉' => raw"\bisansN",
    '𝒘' => raw"\biw",
    '𝚰' => raw"\bfIota",
    '⊟' => raw"\boxminus",
    '𝐊' => raw"\bfK",
    'ℵ' => raw"\aleph",
    '𝒾' => raw"\scri",
    '℧' => raw"\mho",
    'ₕ' => raw"\_h",
    '𝙾' => raw"\ttO",
    '𝟤' => raw"\sanstwo",
    '𝞲' => raw"\bisansiota",
    '𝓲' => raw"\bscri",
    '𝕥' => raw"\bbt",
    '𝜈' => raw"\itnu",
    '𝞕' => raw"\bisansZeta",
    '⋚' => raw"\lesseqgtr",
    '⅙' => raw"\1/6",
    '⋷' => raw"\isinobar",
    '¦' => raw"\brokenbar",
    '𝗯' => raw"\bsansb",
    '♢' => raw"\diamondsuit",
    '∞' => raw"\infty",
    '⋶' => raw"\varisinobar",
    '˕' => raw"\low",
    '𝘵' => raw"\isanst",
    '′' => raw"\prime",
    '⏞' => raw"\overbrace",
    '𝕺' => raw"\bfrakO",
    '⟻' => raw"\longmapsfrom",
    '⬚' => raw"\dottedsquare",
    'ι' => raw"\iota",
    '⇈' => raw"\upuparrows",
    '⪧' => raw"\gtcc",
    '⊆' => raw"\subseteq",
    'τ' => raw"\tau",
    '𝝋' => raw"\biphi",
    '⏧' => raw"\elinters",
    '𝝟' => raw"\bsansKappa",
    '𝘿' => raw"\bisansD",
    '𝜜' => raw"\biAlpha",
    '⌗' => raw"\viewdata",
    '𝕾' => raw"\bfrakS",
    '↯' => raw"\downzigzagarrow",
    '″' => raw"\pprime",
    '𝗃' => raw"\sansj",
    'ȷ' => raw"\jmath",
    '⭈' => raw"\rightarrowbackapprox",
    '𝓷' => raw"\bscrn",
    '𝓠' => raw"\bscrQ",
    '↝' => raw"\rightwavearrow",
    '⃮' => raw"\underleftarrow",
    '♫' => raw"\twonotes",
    '⏥' => raw"\fltns",
    '̆' => raw"\breve",
    '⪯' => raw"\preceq",
    '𝖃' => raw"\bfrakX",
    '𝕶' => raw"\bfrakK",
    'ⅉ' => raw"\bbij",
    '↦' => raw"\mapsto",
    '𝐠' => raw"\bfg",
    '⨆' => raw"\bigsqcup",
    '⪺' => raw"\succnapprox",
    '𝞽' => raw"\bisanstau",
    '𝒓' => raw"\bir",
    '𝘋' => raw"\isansD",
    '𝜧' => raw"\biMu",
    'ϖ' => raw"\varpi",
    '⎷' => raw"\sqrtbottom",
    'ℒ' => raw"\scrL",
    '∳' => raw"\ointctrclockwise",
    '⋉' => raw"\ltimes",
    '⎵' => raw"\underbracket",
    '⃟' => raw"\enclosediamond",
    '𝒵' => raw"\scrZ",
    '⌂' => raw"\house",
    'ℨ' => raw"\frakZ",
    '𝟀' => raw"\bisanschi",
    '𝞅' => raw"\bsansphi",
    '𝑩' => raw"\biB",
    '⫀' => raw"\supsetplus",
    '⨊' => raw"\modtwosum",
    '⦝' => raw"\rightanglemdot",
    '₆' => raw"\_6",
    '𝜣' => raw"\biTheta",
    '𝐭' => raw"\bft",
    'Ϟ' => raw"\Koppa",
    '¹' => raw"\^1",
    '…' => raw"\ldots",
    '⬯' => raw"\whtvertoval",
    '𝚎' => raw"\tte",
    '𝛏' => raw"\bfxi",
    '⇛' => raw"\Rrightarrow",
    '⦛' => raw"\measuredangleleft",
    'ᶜ' => raw"\^c",
    '𝔀' => raw"\bscrw",
    '𝑛' => raw"\itn",
    '⨍' => raw"\intbar",
    '⌙' => raw"\turnednot",
    '≢' => raw"\nequiv",
    'ᴮ' => raw"\^B",
    '⨯' => raw"\Times",
    '⨑' => raw"\awint",
    '⚆' => raw"\circledrightdot",
    '⟕' => raw"\leftouterjoin",
    '⩻' => raw"\ltquest",
    '𝞤' => raw"\bisansUpsilon",
    '⦧' => raw"\wideangleup",
    '◒' => raw"\cirfb",
    '𝗳' => raw"\bsansf",
    '♯' => raw"\sharp",
    '⩠' => raw"\wedgedoublebar",
    '≟' => raw"\questeq",
    '𝖲' => raw"\sansS",
    '𝚯' => raw"\bfTheta",
    '⦲' => raw"\emptysetocirc",
    '⪫' => raw"\lat",
    '𝙥' => raw"\bisansp",
    '►' => raw"\blackpointerright",
    'ℊ' => raw"\scrg",
    '⋺' => raw"\nisd",
    '˜' => raw"\tildelow",
    'ᶻ' => raw"\^z",
    '𝝼' => raw"\bsansnu",
    '⪆' => raw"\gtrapprox",
    '⊎' => raw"\uplus",
    '◩' => raw"\squareulblack",
    '◡' => raw"\botsemicircle",
    '⋏' => raw"\curlywedge",
    '𝕓' => raw"\bbb",
    '‴' => raw"\ppprime",
    'ℑ' => raw"\Im",
    '𝝄' => raw"\biomicron",
    '𝜽' => raw"\bitheta",
    '⬻' => raw"\twoheadleftarrowtail",
    '𝐞' => raw"\bfe",
    '⇿' => raw"\leftrightarrowtriangle",
    '₎' => raw"\_)",
    '𝕫' => raw"\bbz",
    '𝝖' => raw"\bsansAlpha",
    'ℬ' => raw"\scrB",
    '𝒍' => raw"\bil",
    '◊' => raw"\lozenge",
    '𝘣' => raw"\isansb",
    '⋼' => raw"\nis",
    '⬦' => raw"\mdwhtdiamond",
    '∲' => raw"\varointclockwise",
    '●' => raw"\mdlgblkcircle",
    '↣' => raw"\rightarrowtail",
    '𝔖' => raw"\frakS",
    '𝞁' => raw"\bsansvarsigma",
    '𝐥' => raw"\bfl",
    '𝔫' => raw"\frakn",
    '⇔' => raw"\Leftrightarrow",
    '𝝃' => raw"\bixi",
    '⊃' => raw"\supset",
    '⪽' => raw"\subsetdot",
    '∅' => raw"\emptyset",
    '𝖿' => raw"\sansf",
    '𝟑' => raw"\bfthree",
    '𝗗' => raw"\bsansD",
    'º' => raw"\ordmasculine",
    '𝒏' => raw"\bin",
    '⫒' => raw"\csupe",
    '⅚' => raw"\5/6",
    '⥕' => raw"\RightDownVectorBar",
    '⚂' => raw"\diceiii",
    '𝑥' => raw"\itx",
    '⤱' => raw"\neovnwarrow",
    '⇑' => raw"\Uparrow",
    '𝚗' => raw"\ttn",
    '𝑢' => raw"\itu",
    '⬮' => raw"\blkvertoval",
    '◟' => raw"\llarc",
    '𝓕' => raw"\bscrF",
    'ǂ' => raw"\doublepipe",
    '¼' => raw"\1/4",
    '𝞉' => raw"\bsanspartial",
    '⃖' => raw"\overleftarrow",
    'ɷ' => raw"\clomeg",
    '𝙿' => raw"\ttP",
    '𝗕' => raw"\bsansB",
    '𝗞' => raw"\bsansK",
    '⁀' => raw"\tieconcat",
    '𝞱' => raw"\bisanstheta",
    '𝛶' => raw"\itUpsilon",
    '𝔢' => raw"\frake",
    '𝖀' => raw"\bfrakU",
    '𝐀' => raw"\bfA",
    '⥆' => raw"\leftarrowplus",
    '▯' => raw"\vrecto",
    'ϙ' => raw"\upoldkoppa",
    '𝚝' => raw"\ttt",
    '𝖽' => raw"\sansd",
    '𝜷' => raw"\bibeta",
    '𝕽' => raw"\bfrakR",
    '⬪' => raw"\smblklozenge",
    '⇇' => raw"\leftleftarrows",
    '𝙻' => raw"\ttL",
    'ℶ' => raw"\beth",
    '⊈' => raw"\nsubseteq",
    '𝒇' => raw"\bif",
    '𝘍' => raw"\isansF",
    '𝛫' => raw"\itKappa",
    '⟒' => raw"\upin",
    '⪵' => raw"\precneqq",
    '𝒸' => raw"\scrc",
    '≁' => raw"\nsim",
    '𝜴' => raw"\biOmega",
    '𝐹' => raw"\itF",
    '𝜾' => raw"\biiota",
    'ß' => raw"\ss",
    '⇍' => raw"\nLeftarrow",
    '⤒' => raw"\UpArrowBar",
    '⧅' => raw"\boxbslash",
    '⎶' => raw"\bbrktbrk",
    '𝚍' => raw"\ttd",
    '𝚄' => raw"\ttU",
    '𝞏' => raw"\bsansvarpi",
    '⩪' => raw"\dotsim",
    '⟑' => raw"\wedgedot",
    '̅' => raw"\overbar",
    '⤐' => raw"\drbkarrow",
    'ℙ' => raw"\bbP",
    '⭅' => raw"\LLeftarrow",
    'Φ' => raw"\Phi",
    '‰' => raw"\perthousand",
    '𝞆' => raw"\bsanschi",
    '◕' => raw"\blackcircleulquadwhite",
    '𝕒' => raw"\bba",
    '♃' => raw"\jupiter",
    '𝘡' => raw"\isansZ",
    '𝞻' => raw"\bisansvarsigma",
    '⌊' => raw"\lfloor",
    '⨪' => raw"\minusdot",
    '𝒳' => raw"\scrX",
    'ℭ' => raw"\frakC",
    '𝝍' => raw"\bipsi",
    '⪚' => raw"\eqqgtr",
    '𝝊' => raw"\biupsilon",
    '𝕣' => raw"\bbr",
    '⩚' => raw"\wedgemidvert",
    'ᵒ' => raw"\^o",
    '𝐍' => raw"\bfN",
    '𝜌' => raw"\itrho",
    '𝓪' => raw"\bscra",
    '𝞼' => raw"\bisanssigma",
    '𝚲' => raw"\bfLambda",
    '𝜚' => raw"\itvarrho",
    '▒' => raw"\blockhalfshaded",
    '⫉' => raw"\subsetapprox",
    '◠' => raw"\topsemicircle",
    '⦀' => raw"\Vvert",
    '⌋' => raw"\rfloor",
    '𝒌' => raw"\bik",
    '⪣' => raw"\partialmeetcontraction",
    '𝖌' => raw"\bfrakg",
    '𝞟' => raw"\bisansPi",
    '𝘜' => raw"\isansU",
    '⁽' => raw"\^(",
    '𝜲' => raw"\biChi",
    '⧷' => raw"\rsolbar",
    '𝜹' => raw"\bidelta",
    '⪭' => raw"\late",
    '𝗮' => raw"\bsansa",
    '𝗲' => raw"\bsanse",
    'ⱽ' => raw"\^V",
    '𝐲' => raw"\bfy",
    '𝒞' => raw"\scrC",
    '∍' => raw"\smallni",
    '⥡' => raw"\LeftDownTeeVector",
    '𝒕' => raw"\bit",
    'Ð' => raw"\DH",
    '𝜩' => raw"\biXi",
    '⇂' => raw"\downharpoonright",
    'ᴹ' => raw"\^M",
    '⩽' => raw"\nleqslant",
    '𝜅' => raw"\itkappa",
    'ɔ' => raw"\openo",
    '⤅' => raw"\twoheadmapsto",
    '▾' => raw"\blacktriangledown",
    '⫁' => raw"\submult",
    '𝞭' => raw"\bisansdelta",
    '⪼' => raw"\Succ",
    'ₘ' => raw"\_m",
    '⨥' => raw"\plusdot",
    '⪎' => raw"\gsime",
    'Ϡ' => raw"\Sampi",
    ' ' => raw"\quad",
    '∎' => raw"\QED",
    '𝑣' => raw"\itv",
    'ø' => raw"\o",
    '⋙' => raw"\ggg",
    '𝟬' => raw"\bsanszero",
    '𝐓' => raw"\bfT",
    'ℝ' => raw"\bbR",
    '𝚔' => raw"\ttk",
    '̄' => raw"\bar",
    '↠' => raw"\twoheadrightarrow",
    '𝒰' => raw"\scrU",
    '𝝣' => raw"\bsansXi",
    '↮' => raw"\nleftrightarrow",
    '≹' => raw"\notgreaterless",
    '⨮' => raw"\oplusrhrim",
    '⟱' => raw"\DDownarrow",
    '⦰' => raw"\revemptyset",
    '⩼' => raw"\gtquest",
    '⋤' => raw"\sqsubsetneq",
    '⧻' => raw"\tripleplus",
    '𝜫' => raw"\biPi",
    '℘' => raw"\wp",
    '𝚫' => raw"\bfDelta",
    '⌝' => raw"\urcorner",
    '𝜼' => raw"\bieta",
    '⟸' => raw"\Longleftarrow",
    '♪' => raw"\eighthnote",
    '↖' => raw"\nwarrow",
    '∷' => raw"\Colon",
    '⪢' => raw"\NotNestedGreaterGreater",
    '𝐳' => raw"\bfz",
    '⬲' => raw"\leftarrowonoplus",
    '⤍' => raw"\bkarow",
    '𝟎' => raw"\bfzero",
    '⪗' => raw"\elsdot",
    '⋀' => raw"\bigwedge",
    '∪' => raw"\cup",
    '⊠' => raw"\boxtimes",
    '𝟐' => raw"\bftwo",
    '≖' => raw"\eqcirc",
    '⦫' => raw"\measangleldtosw",
    '𝐢' => raw"\bfi",
    'ⁱ' => raw"\^i",
    '⌶' => raw"\topbot",
    '𝟩' => raw"\sansseven",
    'ɒ' => raw"\trnsa",
    '⎹' => raw"\rvboxline",
    '⋛' => raw"\gtreqless",
    '⧤' => raw"\smeparsl",
    '⪮' => raw"\bumpeqq",
    '♩' => raw"\quarternote",
    '⋈' => raw"\bowtie",
    '𝑫' => raw"\biD",
    '𝗥' => raw"\bsansR",
    '𝖤' => raw"\sansE",
    '𝑬' => raw"\biE",
    '𝙣' => raw"\bisansn",
    '♡' => raw"\heartsuit",
    '≤' => raw"\le",
    '⩒' => raw"\veeodot",
    '𝗌' => raw"\sanss",
    '𝐱' => raw"\bfx",
    '⨵' => raw"\otimesrhrim",
    '⤊' => raw"\Uuparrow",
    '↰' => raw"\Lsh",
    '𝟾' => raw"\tteight",
    '⇢' => raw"\rightdasharrow",
    '𝜞' => raw"\biGamma",
    'ɺ' => raw"\trnrl",
    '⩣' => raw"\veedoublebar",
    '𝖙' => raw"\bfrakt",
    '≳' => raw"\gtrsim",
    'Ⓢ' => raw"\circledS",
    'ɭ' => raw"\rtll",
    '𝞀' => raw"\bsansrho",
    'ʖ' => raw"\inglst",
    '⧀' => raw"\olessthan",
    '𝑒' => raw"\ite",
    '▫' => raw"\smwhtsquare",
    '𝑳' => raw"\biL",
    ' ' => raw"\thickspace",
    '𝙷' => raw"\ttH",
    '𝚘' => raw"\tto",
    '𝛣' => raw"\itBeta",
    '𝟿' => raw"\ttnine",
    '⃩' => raw"\widebridgeabove",
    '𝓥' => raw"\bscrV",
    '𝘁' => raw"\bsanst",
    '≬' => raw"\between",
    '⥦' => raw"\leftrightharpoonsup",
    '⟦' => raw"\openbracketleft",
    '∮' => raw"\oint",
    '₇' => raw"\_7",
    '𝖭' => raw"\sansN",
    '⪊' => raw"\gnapprox",
    '▹' => raw"\smalltriangleright",
    'ʂ' => raw"\rtls",
    'ᵛ' => raw"\^v",
    '⩊' => raw"\twocups",
    'ˌ' => raw"\verti",
    '𝙔' => raw"\bisansY",
    '⩺' => raw"\gtcir",
    '⁾' => raw"\^)",
    '̡' => raw"\palh",
    '𝞗' => raw"\bisansTheta",
    'ℳ' => raw"\scrM",
    '˘' => raw"\u",
    '𝞢' => raw"\bisansSigma",
    '𝜟' => raw"\biDelta",
    '⤀' => raw"\nvtwoheadrightarrow",
    '⇜' => raw"\leftsquigarrow",
    'ᵋ' => raw"\^epsilon",
    '𝗰' => raw"\bsansc",
    '𝘑' => raw"\isansJ",
    '⚈' => raw"\blackcircledrightdot",
    '𝕦' => raw"\bbu",
    '⊗' => raw"\otimes",
    '⌐' => raw"\invnot",
    '𝕆' => raw"\bbO",
    '𝝷' => raw"\bsanstheta",
    '𝑑' => raw"\itd",
    '≯' => raw"\ngtr",
    '♑' => raw"\capricornus",
    '𝝰' => raw"\bsansalpha",
    'Λ' => raw"\Lambda",
    '𝖬' => raw"\sansM",
    '½' => raw"\1/2",
    'Ρ' => raw"\Rho",
    '⊢' => raw"\vdash",
    '⚪' => raw"\mdwhtcircle",
    '𝒯' => raw"\scrT",
    '𝙀' => raw"\bisansE",
    '𝜛' => raw"\itvarpi",
    '𝔷' => raw"\frakz",
    '𝕀' => raw"\bbI",
    '⏎' => raw"\varcarriagereturn",
    ' ' => raw"\hspace",
    '⩵' => raw"\Equal",
    '𝝛' => raw"\bsansZeta",
    '♆' => raw"\neptune",
    '𝔏' => raw"\frakL",
    '□' => raw"\square",
    '⇺' => raw"\nVleftarrow",
    '𝞖' => raw"\bisansEta",
    '𝘂' => raw"\bsansu",
    '⪠' => raw"\simgE",
    '₀' => raw"\_0",
    'ɬ' => raw"\btdl",
    '⥫' => raw"\dashleftharpoondown",
    '𝕕' => raw"\bbd",
    '⋩' => raw"\succnsim",
    '⍀' => raw"\notbackslash",
    'ₙ' => raw"\_n",
    '𝗛' => raw"\bsansH",
    '⤗' => raw"\nvtwoheadrightarrowtail",
    'ₑ' => raw"\_e",
    '⫶' => raw"\tdcol",
    'ℸ' => raw"\daleth",
    '◯' => raw"\lgwhtcircle",
    '≼' => raw"\preccurlyeq",
    '𝝂' => raw"\binu",
    '𝚂' => raw"\ttS",
    '⋴' => raw"\isins",
    'ᴰ' => raw"\^D",
    '▌' => raw"\blocklefthalf",
    '𝟉' => raw"\bisansvarpi",
    '◥' => raw"\urblacktriangle",
    '◳' => raw"\squareurquad",
    '𝙖' => raw"\bisansa",
    '𝛊' => raw"\bfiota",
    '┆' => raw"\dshfnc",
    '〒' => raw"\postalmark",
    '⨭' => raw"\opluslhrim",
    '𝓓' => raw"\bscrD",
    '░' => raw"\blockqtrshaded",
    '⇪' => raw"\whitearrowupfrombar",
    '≂' => raw"\eqsim",
    '𝜊' => raw"\itomicron",
    '≭' => raw"\nasymp",
    '𝕃' => raw"\bbL",
    '⤕' => raw"\nVrightarrowtail",
    '⪉' => raw"\lnapprox",
    '∠' => raw"\angle",
    '⇽' => raw"\leftarrowtriangle",
    '𝖅' => raw"\bfrakZ",
    '‹' => raw"\guilsinglleft",
    'ʎ' => raw"\trny",
    '⤟' => raw"\diamondleftarrowbar",
    '𝜂' => raw"\iteta",
    '⌅' => raw"\varbarwedge",
    '𝔜' => raw"\frakY",
    '¯' => raw"\highminus",
    '∄' => raw"\nexists",
    '⩞' => raw"\perspcorrespond",
    '⁼' => raw"\^=",
    '▮' => raw"\vrectangleblack",
    '𝐬' => raw"\bfs",
    '∥' => raw"\parallel",
    '𝖍' => raw"\bfrakh",
    '⎰' => raw"\lmoustache",
    '𝑉' => raw"\itV",
    '𝓤' => raw"\bscrU",
    '⩛' => raw"\veemidvert",
    'Μ' => raw"\upMu",
    '𝖢' => raw"\sansC",
    '⋮' => raw"\vdots",
    '⥖' => raw"\DownLeftVectorBar",
    '⨬' => raw"\minusrdots",
    'ℂ' => raw"\bbC",
    'å' => raw"\aa",
    '▪' => raw"\smblksquare",
    '⤔' => raw"\nvrightarrowtail",
    '𝙩' => raw"\bisanst",
    '⁗' => raw"\pppprime",
    '☿' => raw"\mercury",
    '𝛤' => raw"\itGamma",
    '↔' => raw"\leftrightarrow",
    'ᵐ' => raw"\^m",
    '𝔡' => raw"\frakd",
    '⋝' => raw"\eqgtr",
    '˓' => raw"\sblhr",
    '⋘' => raw"\verymuchless",
    'ɐ' => raw"\trna",
    '⋧' => raw"\gnsim",
    '𝑝' => raw"\itp",
    '𝙤' => raw"\bisanso",
    '𝚽' => raw"\bfPhi",
    'Γ' => raw"\Gamma",
    '⟧' => raw"\rrbracket",
    '↻' => raw"\circlearrowright",
    '𝟞' => raw"\bbsix",
    '⇏' => raw"\nRightarrow",
    '⥍' => raw"\updownharpoonleftright",
    '𝜔' => raw"\itomega",
    '⪤' => raw"\glj",
    'ʍ' => raw"\invw",
    '𝒩' => raw"\scrN",
    '≡' => raw"\equiv",
    '𝗽' => raw"\bsansp",
    '⦟' => raw"\angdnr",
    '𝖝' => raw"\bfrakx",
    'γ' => raw"\gamma",
    '⧺' => raw"\doubleplus",
    '𝑼' => raw"\biU",
    '⩌' => raw"\closedvarcup",
    '𝜤' => raw"\biIota",
    '𝐒' => raw"\bfS",
    '∼' => raw"\sim",
    '𝚭' => raw"\bfZeta",
    '𝒚' => raw"\biy",
    '⋋' => raw"\leftthreetimes",
    '𝞔' => raw"\bisansEpsilon",
    '⚅' => raw"\dicevi",
    '⭇' => raw"\bsimilarrightarrow",
    '𝓣' => raw"\bscrT",
    '𝜻' => raw"\bizeta",
    '𝐁' => raw"\bfB",
    '𝘽' => raw"\bisansB",
    '𝐉' => raw"\bfJ",
    '⫴' => raw"\interleave",
    '◹' => raw"\urtriangle",
    '𝙢' => raw"\bisansm",
    '⪞' => raw"\simgtr",
    'ʼ' => raw"\rasp",
    '⭔' => raw"\rightpentagon",
    '⭓' => raw"\rightpentagonblack",
    '𝓫' => raw"\bscrb",
    '𝚌' => raw"\ttc",
    '𝓆' => raw"\scrq",
    '𝘆' => raw"\bsansy",
    'Ι' => raw"\Iota",
    '𝔘' => raw"\frakU",
    '𝔰' => raw"\fraks",
    '⪥' => raw"\gla",
    '‘' => raw"\lq",
    '𝓨' => raw"\bscrY",
    '⬖' => raw"\diamondleftblack",
    '𝚴' => raw"\bfNu",
    '𝙅' => raw"\bisansJ",
    '𝞎' => raw"\bsansvarrho",
    '≓' => raw"\risingdotseq",
    '𝜄' => raw"\itiota",
    '𝘮' => raw"\isansm",
    '⬨' => raw"\mdwhtlozenge",
    '𝕷' => raw"\bfrakL",
    '◈' => raw"\blackinwhitediamond",
    'Ŋ' => raw"\NG",
    'ℇ' => raw"\eulermascheroni",
    '⤂' => raw"\nvLeftarrow",
    'Ψ' => raw"\Psi",
    '𝞇' => raw"\bsanspsi",
    '𝝮' => raw"\bsansOmega",
    '⪻' => raw"\Prec",
    '𝗬' => raw"\bsansY",
    'ℾ' => raw"\bbGamma",
    '⭄' => raw"\rightarrowsupset",
    'μ' => raw"\mu",
    '⬿' => raw"\leftcurvedarrow",
    '✶' => raw"\varstar",
    '⩏' => raw"\Sqcup",
    '˒' => raw"\sbrhr",
    '𝙁' => raw"\bisansF",
    '⅞' => raw"\7/8",
    '≃' => raw"\simeq",
    '𝞡' => raw"\bisansvarTheta",
    '𝞂' => raw"\bsanssigma",
    '𝒪' => raw"\scrO",
    '𝟛' => raw"\bbthree",
    '𝒋' => raw"\bij",
    '⦨' => raw"\measanglerutone",
    '𝔻' => raw"\bbD",
    '𝞃' => raw"\bsanstau",
    '⟹' => raw"\Longrightarrow",
    'Υ' => raw"\Upsilon",
    '𝑮' => raw"\biG",
    '𝝥' => raw"\bsansPi",
    '⅀' => raw"\bbsum",
    '𝞞' => raw"\bisansOmicron",
    '⇊' => raw"\downdownarrows",
    '⁵' => raw"\^5",
    '𝑤' => raw"\itw",
    '⥄' => raw"\rLarr",
    '𝔩' => raw"\frakl",
    '𝟰' => raw"\bsansfour",
    '𝝴' => raw"\bsansepsilon",
    '𝙠' => raw"\bisansk",
    '𝟦' => raw"\sansfour",
    '𝓿' => raw"\bscrv",
    '𝜋' => raw"\itpi",
    '𝒁' => raw"\biZ",
    '𝑶' => raw"\biO",
    '𝕚' => raw"\bbi",
    '∴' => raw"\therefore",
    '⟀' => raw"\threedangle",
    '▤' => raw"\squarehfill",
    '𝞌' => raw"\bsansvarkappa",
    '𝕬' => raw"\bfrakA",
    '𝜮' => raw"\biSigma",
    '𝙽' => raw"\ttN",
    '𝓚' => raw"\bscrK",
    '𝑧' => raw"\itz",
    '𝔈' => raw"\frakE",
    '𝑔' => raw"\itg",
    '𝘀' => raw"\bsanss",
    '𝞘' => raw"\bisansIota",
    '𝜢' => raw"\biEta",
    '♤' => raw"\varspadesuit",
    '𝗘' => raw"\bsansE",
    '𝜰' => raw"\biUpsilon",
    '𝗏' => raw"\sansv",
    '⪅' => raw"\lessapprox",
    '⭑' => raw"\medblackstar",
    '𝟸' => raw"\tttwo",
    '𝗉' => raw"\sansp",
    '◲' => raw"\squarelrquad",
    '𝙑' => raw"\bisansV",
    '⨐' => raw"\cirfnint",
    '⥑' => raw"\LeftUpDownVector",
    '↫' => raw"\looparrowleft",
    '𝖥' => raw"\sansF",
    '↟' => raw"\twoheaduparrow",
    '𝜬' => raw"\biRho",
    '𝚥' => raw"\itjmath",
    'ᶿ' => raw"\^theta",
    '́' => raw"\acute",
    '𝘾' => raw"\bisansC",
    '⫺' => raw"\geqqslant",
    '𝒀' => raw"\biY",
    'ʐ' => raw"\rtlz",
    '♣' => raw"\clubsuit",
    '̢' => raw"\rh",
    '𝜨' => raw"\biNu",
    '𝙘' => raw"\bisansc",
    '⟈' => raw"\bsolhsub",
    '↵' => raw"\carriagereturn",
    '𝝐' => raw"\bivarepsilon",
    '𝑞' => raw"\itq",
    '≏' => raw"\bumpeq",
    '⥣' => raw"\upharpoonsleftright",
    '◢' => raw"\lrblacktriangle",
    '𝙦' => raw"\bisansq",
    'ς' => raw"\varsigma",
    '𝜪' => raw"\biOmicron",
    '𝕘' => raw"\bbg",
    '⇾' => raw"\rightarrowtriangle",
    'ᴶ' => raw"\^J",
    '⊛' => raw"\circledast",
    'ɽ' => raw"\rtlr",
    '∊' => raw"\smallin",
    '𝒊' => raw"\bii",
    '⊼' => raw"\barwedge",
    '⬰' => raw"\circleonleftarrow",
    '𝓢' => raw"\bscrS",
    '𝖺' => raw"\sansa",
    '⥧' => raw"\leftrightharpoonsdown",
    '𝝗' => raw"\bsansBeta",
    '↞' => raw"\twoheadleftarrow",
    '𝚕' => raw"\ttl",
    '𝖩' => raw"\sansJ",
    '⋆' => raw"\star",
    '𝝠' => raw"\bsansLambda",
    '⎴' => raw"\overbracket",
    '⥋' => raw"\leftrightharpoondownup",
    '▴' => raw"\blacktriangle",
    '𝖏' => raw"\bfrakj",
    '◿' => raw"\lrtriangle",
    'ɖ' => raw"\rtld",
    '𝗢' => raw"\bsansO",
    '▢' => raw"\squoval",
    '𝔯' => raw"\frakr",
    '𝙏' => raw"\bisansT",
    '⬣' => raw"\hexagonblack",
    '²' => raw"\^2",
    'ϟ' => raw"\upkoppa",
    '⪨' => raw"\lescc",
    '𝟵' => raw"\bsansnine",
    '𝗎' => raw"\sansu",
    'ı' => raw"\imath",
    '𝓭' => raw"\bscrd",
    '⬳' => raw"\longleftsquigarrow",
    '𝘙' => raw"\isansR",
    '̃' => raw"\tilde",
    '𝜡' => raw"\biZeta",
    '⬾' => raw"\leftarrowx",
    '∐' => raw"\coprod",
    '◤' => raw"\ulblacktriangle",
    '⊳' => raw"\vartriangleright",
    '⊹' => raw"\hermitconjmatrix",
    'ε' => raw"\varepsilon",
    '𝙱' => raw"\ttB",
    'ᵍ' => raw"\^g",
    '⦬' => raw"\measangleurtone",
    '⋣' => raw"\nsqsupseteq",
    '𝚢' => raw"\tty",
    '𝔧' => raw"\frakj",
    '𝗈' => raw"\sanso",
    '⅘' => raw"\4/5",
    '𝒟' => raw"\scrD",
    '𝙕' => raw"\bisansZ",
    '𝞐' => raw"\bisansAlpha",
    '⧊' => raw"\Lap",
    '𝒈' => raw"\big",
    '𝑗' => raw"\itj",
    '𝟆' => raw"\bisansvarkappa",
    '𝙗' => raw"\bisansb",
    '𝒮' => raw"\scrS",
    'ɸ' => raw"\ltphi",
    '𝗙' => raw"\bsansF",
    '⥝' => raw"\RightDownTeeVector",
    'ⅅ' => raw"\bbiD",
    '▵' => raw"\vartriangle",
    '𝛖' => raw"\bfupsilon",
    '⍰' => raw"\boxquestion",
    '𝚏' => raw"\ttf",
    '𝛰' => raw"\itOmicron",
    '𝙼' => raw"\ttM",
    '⩃' => raw"\barcap",
    '⩔' => raw"\Or",
    '𝘠' => raw"\isansY",
    '⪍' => raw"\lsime",
    '𝔚' => raw"\frakW",
    '↥' => raw"\mapsup",
    '𝑸' => raw"\biQ",
    '𝑍' => raw"\itZ",
    '⟵' => raw"\longleftarrow",
    '⊜' => raw"\circledequal",
    '𝛽' => raw"\itbeta",
    '⋟' => raw"\curlyeqsucc",
    '⨫' => raw"\minusfdots",
    '₋' => raw"\_-",
    '𝝬' => raw"\bsansChi",
    '𝟷' => raw"\ttone",
    'ϑ' => raw"\vartheta",
    '𝔹' => raw"\bbB",
    '₧' => raw"\pes",
    '𝘌' => raw"\isansE",
    '𝖘' => raw"\bfraks",
    '𝞮' => raw"\bisansepsilon",
    '𝐝' => raw"\bfd",
    '⃯' => raw"\underrightarrow",
    '𝔽' => raw"\bbF",
    '𝖉' => raw"\bfrakd",
    '↴' => raw"\linefeed",
    'ʷ' => raw"\^w",
    'ϱ' => raw"\varrho",
    '⇃' => raw"\downharpoonleft",
    '𝛓' => raw"\bfvarsigma",
    '➛' => raw"\draftingarrow",
    '̕' => raw"\ocommatopright",
    '⌬' => raw"\varhexagonlrbonds",
    '⇧' => raw"\upwhitearrow",
    '⟼' => raw"\longmapsto",
    '𝓻' => raw"\bscrr",
    '𝛧' => raw"\itZeta",
    '⋦' => raw"\lnsim",
    '𝓹' => raw"\bscrp",
    '◎' => raw"\bullseye",
    '⬧' => raw"\mdblklozenge",
    '𝔒' => raw"\frakO",
    '𝕙' => raw"\bbh",
    '𝟃' => raw"\bisanspartial",
    '⇨' => raw"\rightwhitearrow",
    '⤨' => raw"\toea",
    '⪃' => raw"\lesdotor",
    '♓' => raw"\pisces",
    '⋑' => raw"\Supset",
    '↘' => raw"\searrow",
    'Π' => raw"\Pi",
    '𝐕' => raw"\bfV",
    '⚥' => raw"\hermaphrodite",
    'ϐ' => raw"\upvarbeta",
    '𝘇' => raw"\bsansz",
    '†' => raw"\dagger",
    '∦' => raw"\nparallel",
    '𝐘' => raw"\bfY",
    '⤈' => raw"\downarrowbarred",
    '⊺' => raw"\intercal",
    '𝟊' => raw"\bfDigamma",
    '⌲' => raw"\conictaper",
    '𝒫' => raw"\scrP",
    '◉' => raw"\fisheye",
    'Ν' => raw"\upNu",
    '𝖠' => raw"\sansA",
    '⦷' => raw"\circledparallel",
    '𝐋' => raw"\bfL",
    '⥌' => raw"\updownharpoonrightleft",
    '⊨' => raw"\vDash",
    'Ω' => raw"\Omega",
    '𝗨' => raw"\bsansU",
    'ᵀ' => raw"\^T",
    '𝐤' => raw"\bfk",
    '≐' => raw"\doteq",
    'ᵟ' => raw"\^delta",
    '⌀' => raw"\diameter",
    '𝛂' => raw"\bfalpha",
    '⩯' => raw"\hatapprox",
    '𝔭' => raw"\frakp",
    '∫' => raw"\int",
    '𝙮' => raw"\bisansy",
    '𝚑' => raw"\tth",
    '⤆' => raw"\Mapsfrom",
    '⧥' => raw"\eqvparsl",
    '𝑰' => raw"\biI",
    '𝗿' => raw"\bsansr",
    '↭' => raw"\leftrightsquigarrow",
    '𝛈' => raw"\bfeta",
    '⋇' => raw"\divideontimes",
    '⊬' => raw"\nvdash",
    '𝔬' => raw"\frako",
    '↧' => raw"\mapsdown",
    '𝘥' => raw"\isansd",
    '𝑨' => raw"\biA",
    'ⅆ' => raw"\bbid",
    '⤓' => raw"\DownArrowBar",
    '𝔨' => raw"\frakk",
    '𝑹' => raw"\biR",
    '≿' => raw"\succsim",
    '𝛪' => raw"\itIota",
    '𝒦' => raw"\scrK",
    'ʤ' => raw"\dyogh",
    '≌' => raw"\allequal",
    '⭌' => raw"\rightarrowbsimilar",
    '𝘎' => raw"\isansG",
    '⤘' => raw"\nVtwoheadrightarrowtail",
    '⫖' => raw"\supsup",
    '𝘯' => raw"\isansn",
    '⩜' => raw"\midbarwedge",
    '𝗩' => raw"\bsansV",
    '⥅' => raw"\rightarrowplus",
    'ʸ' => raw"\^y",
    '⇓' => raw"\Downarrow",
    '𝝈' => raw"\bisigma",
    '↜' => raw"\leftwavearrow",
    '𝞦' => raw"\bisansChi",
    'ᵢ' => raw"\_i",
    'đ' => raw"\dj",
    'ℼ' => raw"\bbpi",
    '𝗚' => raw"\bsansG",
    '⬵' => raw"\nVtwoheadleftarrow",
    '⋹' => raw"\isinE",
    '𝙯' => raw"\bisansz",
    '⪴' => raw"\succeqq",
    '⏦' => raw"\accurrent",
    'ᵖ' => raw"\^p",
    '𝙌' => raw"\bisansQ",
    '♦' => raw"\vardiamondsuit",
    '𝚨' => raw"\bfAlpha",
    '𝑋' => raw"\itX",
    '▷' => raw"\triangleright",
    '𝘄' => raw"\bsansw",
    '𝝢' => raw"\bsansNu",
    '⪳' => raw"\preceqq",
    '⫃' => raw"\subedot",
    '‵' => raw"\backprime",
    '𝞄' => raw"\bsansupsilon",
    '≨' => raw"\lneqq",
    '⪡' => raw"\NestedLessLess",
    '⇀' => raw"\rightharpoonup",
    'ᵃ' => raw"\^a",
    '▬' => raw"\hrectangleblack",
    '⚄' => raw"\dicev",
    '⇣' => raw"\downdasharrow",
    '𝑜' => raw"\ito",
    '⦞' => raw"\angles",
    '𝝑' => raw"\bivartheta",
    '≫' => raw"\gg",
    '𝘟' => raw"\isansX",
    '⭉' => raw"\similarleftarrow",
    '𝓝' => raw"\bscrN",
    '⦯' => raw"\measangledltosw",
    '◇' => raw"\mdlgwhtdiamond",
    '𝙡' => raw"\bisansl",
    'ℐ' => raw"\scrI",
    '𝞵' => raw"\bisansmu",
    '⅑' => raw"\1/9",
    '𝛯' => raw"\itXi",
    '⪝' => raw"\simless",
    '⦿' => raw"\circledbullet",
    'ʇ' => raw"\trnt",
    '𝞠' => raw"\bisansRho",
    '₉' => raw"\_9",
    '𝟡' => raw"\bbnine",
    '𝑟' => raw"\itr",
    '𝝾' => raw"\bsansomicron",
    '𝞷' => raw"\bisansxi",
    '𝜁' => raw"\itzeta",
    '𝜎' => raw"\itsigma",
    'Ε' => raw"\Epsilon",
    '◪' => raw"\sqfse",
    '𝛮' => raw"\itNu",
    '≘' => raw"\arceq",
    '𝙜' => raw"\bisansg",
    '𝓙' => raw"\bscrJ",
    '⦦' => raw"\wideangledown",
    '𝞪' => raw"\bisansalpha",
    'ψ' => raw"\psi",
    '⋖' => raw"\lessdot",
    'Β' => raw"\Beta",
    '↷' => raw"\curvearrowright",
    '𝖑' => raw"\bfrakl",
    '⤬' => raw"\fdiagovrdiag",
    '⬕' => raw"\squarellblack",
    '𝗇' => raw"\sansn",
    '𝞬' => raw"\bisansgamma",
    '𝘷' => raw"\isansv",
    '𝕌' => raw"\bbU",
    '⥔' => raw"\RightUpVectorBar",
    '⬓' => raw"\squarebotblack",
    '𝙆' => raw"\bisansK",
    'ᵪ' => raw"\_chi",
    '𝘧' => raw"\isansf",
    'ₖ' => raw"\_k",
    '⇼' => raw"\nVleftrightarrow",
    '⇞' => raw"\nHuparrow",
    'ᵝ' => raw"\^beta",
    '≱' => raw"\ngeq",
    'ℏ' => raw"\hslash",
    'ᵩ' => raw"\_phi",
    '≥' => raw"\ge",
    '𝐦' => raw"\bfm",
    '∩' => raw"\cap",
    '𝐰' => raw"\bfw",
    '≾' => raw"\precsim",
    '⬢' => raw"\varhexagonblack",
    '𝚪' => raw"\bfGamma",
    '𝙬' => raw"\bisansw",
    '↓' => raw"\downarrow",
    '𝒃' => raw"\bib",
    '𝖹' => raw"\sansZ",
    '⊞' => raw"\boxplus",
    'Δ' => raw"\Delta",
    '⪩' => raw"\gescc",
    '𝕳' => raw"\bfrakH",
    '⧐' => raw"\NotRightTriangleBar",
    '⊶' => raw"\original",
    '𝛆' => raw"\bfepsilon",
    '𝕂' => raw"\bbK",
    '𝘰' => raw"\isanso",
    '𝒥' => raw"\scrJ",
    '𝖪' => raw"\sansK",
    'ₐ' => raw"\_a",
    '⊊' => raw"\varsubsetneqq",
    '𝙂' => raw"\bisansG",
    '𝘓' => raw"\isansL",
    'ᵘ' => raw"\^u",
    '⃑' => raw"\rightharpoonaccent",
    '𝑓' => raw"\itf",
    '⪙' => raw"\eqqless",
    '𝖱' => raw"\sansR",
    '⟽' => raw"\Longmapsfrom",
    '⨛' => raw"\upint",
    '⅃' => raw"\sansLmirrored",
    '𝘬' => raw"\isansk",
    '⬘' => raw"\diamondtopblack",
    '╲' => raw"\diagdown",
    '𝛱' => raw"\itPi",
    'ʳ' => raw"\^r",
    '𝞧' => raw"\bisansPsi",
    '𝟴' => raw"\bsanseight",
    '∭' => raw"\iiint",
    '𝗸' => raw"\bsansk",
    '⨏' => raw"\clockoint",
    '𝓃' => raw"\scrn",
    'ℴ' => raw"\scro",
    '𝐣' => raw"\bfj",
    '∨' => raw"\vee",
    '𝐚' => raw"\bfa",
    '𝑚' => raw"\itm",
    '⨼' => raw"\intprod",
    '◑' => raw"\cirfr",
    '𝜏' => raw"\ittau",
    '𝑃' => raw"\itP",
    'ʰ' => raw"\^h",
    '⊪' => raw"\Vvdash",
    '⬼' => raw"\nvtwoheadleftarrowtail",
    '𝙲' => raw"\ttC",
    '◚' => raw"\invwhiteupperhalfcircle",
    '‡' => raw"\ddagger",
    '𝙺' => raw"\ttK",
    '⩄' => raw"\capwedge",
    '𝚛' => raw"\ttr",
    '↳' => raw"\Rdsh",
    '☽' => raw"\rightmoon",
    '𝝇' => raw"\bivarsigma",
    '⩋' => raw"\twocaps",
    '𝓞' => raw"\bscrO",
    '𝘚' => raw"\isansS",
    '⥂' => raw"\Rlarr",
    '⋐' => raw"\Subset",
    '⊑' => raw"\sqsubseteq",
    '𝑪' => raw"\biC",
    '𝕤' => raw"\bbs",
    '𝐡' => raw"\bfh",
    '𝖚' => raw"\bfraku",
    '⦤' => raw"\angleubar",
    '𝚃' => raw"\ttT",
    '⇐' => raw"\Leftarrow",
    '⌢' => raw"\frown",
    '✪' => raw"\circledstar",
    '⨦' => raw"\plussim",
    '⟙' => raw"\bigtop",
    '⋵' => raw"\isindot",
    'ᵇ' => raw"\^b",
    '⇆' => raw"\leftrightarrows",
    'ᵈ' => raw"\^d",
    '⋽' => raw"\varniobar",
    '⧫' => raw"\blacklozenge",
    '𝝉' => raw"\bitau",
    '⅝' => raw"\5/8",
    '𝓎' => raw"\scry",
    'ᵦ' => raw"\_beta",
    'η' => raw"\eta",
    '⁴' => raw"\^4",
    '⤪' => raw"\towa",
    '𝒅' => raw"\bid",
    '⊙' => raw"\odot",
    '𝛷' => raw"\itPhi",
    '↿' => raw"\upharpoonright",
    '◙' => raw"\inversewhitecircle",
    '⩟' => raw"\minhat",
    '𝘕' => raw"\isansN",
    '𝝚' => raw"\bsansEpsilon",
    '𝒢' => raw"\scrG",
    '▸' => raw"\smallblacktriangleright",
    '𝟺' => raw"\ttfour",
    '⋅' => raw"\cdot",
    '𝐑' => raw"\bfR",
    '𝕰' => raw"\bfrakE",
    '⨨' => raw"\plustrif",
    '𝗂' => raw"\sansi",
    '∵' => raw"\because",
    '≇' => raw"\ncong",
    '𝔎' => raw"\frakK",
    '𝝸' => raw"\bsansiota",
    '⇻' => raw"\nVrightarrow",
    '𝘅' => raw"\bsansx",
    '≠' => raw"\ne",
    '𝞳' => raw"\bisanskappa",
    '⪑' => raw"\lgE",
    '𝜶' => raw"\bialpha",
    '⨹' => raw"\triangleplus",
    '·' => raw"\cdotp",
    '⤫' => raw"\rdiagovfdiag",
    '∬' => raw"\iint",
    '𝚹' => raw"\bfvarTheta",
    '𝔊' => raw"\frakG",
    '𝟔' => raw"\bfsix",
    '≎' => raw"\Bumpeq",
    '™' => raw"\trademark",
    '𝟧' => raw"\sansfive",
    '∱' => raw"\clwintegral",
    '⪪' => raw"\smt",
    '⥚' => raw"\LeftTeeVector",
    '⊝' => raw"\circleddash",
    'ℓ' => raw"\ell",
    '⎸' => raw"\lvboxline",
    'ρ' => raw"\rho",
    '𝕴' => raw"\bfrakI",
    '◬' => raw"\trianglecdot",
    '𝐽' => raw"\itJ",
    '𝛦' => raw"\itEpsilon",
    '𝝳' => raw"\bsansdelta",
    '𝕠' => raw"\bbo",
    'ʲ' => raw"\^j",
    '⫂' => raw"\supmult",
    'ˑ' => raw"\hlmrk",
    '⥥' => raw"\downharpoonsleftright",
    'æ' => raw"\ae",
    'ᵅ' => raw"\^alpha",
    '⋕' => raw"\equalparallel",
    'ᴺ' => raw"\^N",
    '𝗧' => raw"\bsansT",
    '𝛃' => raw"\bfbeta",
    '𝘳' => raw"\isansr",
    '⅜' => raw"\3/8",
    '⌆' => raw"\vardoublebarwedge",
    '⥗' => raw"\DownRightVectorBar",
    '𝓌' => raw"\scrw",
    '𝐿' => raw"\itL",
    '⨔' => raw"\npolint",
    '≒' => raw"\fallingdotseq",
    '𝑦' => raw"\ity",
    '⩂' => raw"\barcup",
    '𝓁' => raw"\scrl",
    '⫙' => raw"\forkv",
    '∜' => raw"\fourthroot",
    '⨩' => raw"\commaminus",
    '⅄' => raw"\Yup",
    '𝛼' => raw"\italpha",
    '₂' => raw"\_2",
    '⥙' => raw"\LeftDownVectorBar",
    '𝘲' => raw"\isansq",
    '𝛢' => raw"\itAlpha",
    '⨷' => raw"\Otimes",
    '≩' => raw"\gneqq",
    '◨' => raw"\sqfr",
    '⫇' => raw"\subsim",
    'ₒ' => raw"\_o",
    '⫹' => raw"\leqqslant",
    '𝜐' => raw"\itupsilon",
    '♊' => raw"\gemini",
    '𝛋' => raw"\bfkappa",
    '𝒖' => raw"\biu",
    '𝖖' => raw"\bfrakq",
    '⊿' => raw"\varlrtriangle",
    '≋' => raw"\tildetrpl",
    '≙' => raw"\wedgeq",
    '≚' => raw"\veeeq",
    '𝛉' => raw"\bftheta",
    '𝚉' => raw"\ttZ",
    '𝑷' => raw"\biP",
    '⫍' => raw"\lsqhook",
    '∑' => raw"\sum",
    'ₗ' => raw"\_l",
    '©' => raw"\copyright",
    '⬴' => raw"\nvtwoheadleftarrow",
    '⤇' => raw"\Mapsto",
    '⇗' => raw"\Nearrow",
    '⪜' => raw"\eqqslantgtr",
    '𝚓' => raw"\ttj",
    '𝒴' => raw"\scrY",
    '⅟' => raw"\1/",
    '𝐸' => raw"\itE",
    '𝜵' => raw"\binabla",
    '▿' => raw"\triangledown",
    '⁰' => raw"\^0",
    '𝟨' => raw"\sanssix",
    '⥒' => raw"\LeftVectorBar",
    '⩀' => raw"\capdot",
    '𝚡' => raw"\ttx",
    '◰' => raw"\squareulquad",
    '𝞙' => raw"\bisansKappa",
    '⋯' => raw"\cdots",
    '★' => raw"\bigstar",
    '⫌' => raw"\supsetneqq",
    'Κ' => raw"\Kappa",
    '𝖔' => raw"\bfrako",
    '⨝' => raw"\join",
    '𝕯' => raw"\bfrakD",
    '₄' => raw"\_4",
    '≺' => raw"\prec",
    '𝓅' => raw"\scrp",
    '𝛨' => raw"\itEta",
    '𝐯' => raw"\bfv",
    '𝗱' => raw"\bsansd",
    '⥯' => raw"\ReverseUpEquilibrium",
    '⪒' => raw"\glE",
    '▄' => raw"\blocklowhalf",
    '⤖' => raw"\twoheadrightarrowtail",
    'ⁿ' => raw"\^n",
    '𝚈' => raw"\ttY",
    '𝙸' => raw"\ttI",
    '𝖵' => raw"\sansV",
    '∂' => raw"\partial",
    'ʌ' => raw"\invv",
    'ˡ' => raw"\^l",
    '⪹' => raw"\precnapprox",
    '◾' => raw"\mdsmblksquare",
    '𝓜' => raw"\bscrM",
    '▼' => raw"\bigblacktriangledown",
    '⪏' => raw"\lsimg",
    '𝞨' => raw"\bisansOmega",
    '≊' => raw"\approxeq",
    '𝔼' => raw"\bbE",
    '∧' => raw"\wedge",
    '𝗔' => raw"\bsansA",
    '˔' => raw"\rais",
    '𝓀' => raw"\scrk",
    '𝛜' => raw"\bfvarepsilon",
    '⤌' => raw"\leftbkarrow",
    '𝜙' => raw"\itvarphi",
    '𝒒' => raw"\biq",
    '𝞚' => raw"\bisansLambda",
    '𝓛' => raw"\bscrL",
    '𝙰' => raw"\ttA",
    '⬙' => raw"\diamondbotblack",
    '‛' => raw"\reapos",
    '♋' => raw"\cancer",
    '⬽' => raw"\nVtwoheadleftarrowtail",
    '𝔸' => raw"\bbA",
    '𝝀' => raw"\bilambda",
    'ᴬ' => raw"\^A",
    '⦼' => raw"\odotslashdot",
    '≛' => raw"\starequal",
    '⩮' => raw"\asteq",
    'ᶥ' => raw"\^iota",
    '𝚣' => raw"\ttz",
    '𝙵' => raw"\ttF",
    '⌣' => raw"\smile",
    '𝖫' => raw"\sansL",
    '∡' => raw"\measuredangle",
    '⬗' => raw"\diamondrightblack",
    '⃧' => raw"\annuity",
    '𝝨' => raw"\bsansSigma",
    '𝐛' => raw"\bfb",
    '𝚞' => raw"\ttu",
    '⧄' => raw"\boxdiag",
    '𝞴' => raw"\bisanslambda",
    '𝙎' => raw"\bisansS",
    '⥰' => raw"\RoundImplies",
    '∘' => raw"\circ",
    '𝕋' => raw"\bbT",
    '◁' => raw"\triangleleft",
    '⇎' => raw"\nLeftrightarrow",
    '𝘏' => raw"\isansH",
    '⨧' => raw"\plussubtwo",
    '𝕖' => raw"\bbe",
    '𝔑' => raw"\frakN",
    '≆' => raw"\approxnotequal",
    'ℽ' => raw"\bbgamma",
    '𝕝' => raw"\bbl",
    '⊲' => raw"\vartriangleleft",
    '≅' => raw"\cong",
    '№' => raw"\numero",
    'Ⅎ' => raw"\Finv",
    '𝖜' => raw"\bfrakw",
    '𝐌' => raw"\bfM",
    '𝖆' => raw"\bfraka",
    '⭋' => raw"\leftarrowbsimilar",
    '✠' => raw"\maltese",
    '⌕' => raw"\recorder",
    '𝚻' => raw"\bfTau",
    '𝞩' => raw"\bisansnabla",
    '⟩' => raw"\rangle",
    '𝘴' => raw"\isanss",
    '⟂' => raw"\perp",
    '∸' => raw"\dotminus",
    '𝜆' => raw"\itlambda",
    '𝚅' => raw"\ttV",
    '⤰' => raw"\rdiagovsearrow",
    '°' => raw"\degree",
    '⊤' => raw"\top",
    '𝛗' => raw"\bfvarphi",
    '𝓬' => raw"\bscrc",
    '⊀' => raw"\nprec",
    '𝕍' => raw"\bbV",
    '𝙟' => raw"\bisansj",
    '⧋' => raw"\defas",
    '≗' => raw"\circeq",
    '𝑏' => raw"\itb",
    '█' => raw"\blockfull",
    '𝑾' => raw"\biW",
    '𝕸' => raw"\bfrakM",
    '⨘' => raw"\intx",
    '𝛥' => raw"\itDelta",
    '⪐' => raw"\gsiml",
    '𝖕' => raw"\bfrakp",
    '𝚚' => raw"\ttq",
    '𝗠' => raw"\bsansM",
    '╱' => raw"\diagup",
    '𝔾' => raw"\bbG",
    '₁' => raw"\_1",
    'ʕ' => raw"\reglst",
    '𝟘' => raw"\bbzero",
    'ʧ' => raw"\tesh",
    '𝘭' => raw"\isansl",
    '⩬' => raw"\simminussim",
    '⩾' => raw"\geqslant",
    '𝜒' => raw"\itchi",
    '⪔' => raw"\gesles",
    '𝘫' => raw"\isansj",
    '♉' => raw"\taurus",
    'Ł' => raw"\L",
    '▀' => raw"\blockuphalf",
    '𝐈' => raw"\bfI",
    '∺' => raw"\dotsminusdots",
    '∙' => raw"\vysmblkcircle",
    '𝗋' => raw"\sansr",
    '⃭' => raw"\underleftharpoondown",
    '𝘦' => raw"\isanse",
    '𝙐' => raw"\bisansU",
    '𝙫' => raw"\bisansv",
    '⋥' => raw"\sqspne",
    '𝕊' => raw"\bbS",
    '𝗍' => raw"\sanst",
    'ϛ' => raw"\upstigma",
    '⟖' => raw"\rightouterjoin",
    '𝐅' => raw"\bfF",
    '♀' => raw"\female",
    'ᴸ' => raw"\^L",
    '𝔥' => raw"\frakh",
    '◄' => raw"\blackpointerleft",
    '⪋' => raw"\lesseqqgtr",
    '⚲' => raw"\neuter",
    '⟷' => raw"\longleftrightarrow",
    '⬩' => raw"\smblkdiamond",
    '⫷' => raw"\lllnest",
    '𝔟' => raw"\frakb",
    '𝕜' => raw"\bbk",
    '𝘈' => raw"\isansA",
    '𝛬' => raw"\itLambda",
    '𝕻' => raw"\bfrakP",
    '∁' => raw"\complement",
    '⪲' => raw"\succneq",
    '𝘸' => raw"\isansw",
    '¾' => raw"\3/4",
    '⋄' => raw"\diamond",
    '𝒻' => raw"\scrf",
    '𝛟' => raw"\bfphi",
    '𝟻' => raw"\ttfive",
    '𝓖' => raw"\bscrG",
    '↕' => raw"\updownarrow",
    '◗' => raw"\blackrighthalfcircle",
    '𝟣' => raw"\sansone",
    '⇵' => raw"\DownArrowUpArrow",
    'ɳ' => raw"\rtln",
    '⦆' => raw"\Elroang",
    '⃤' => raw"\enclosetriangle",
    'ᴳ' => raw"\^G",
    '⪛' => raw"\eqqslantless",
    '𝘩' => raw"\isansh",
    '⁶' => raw"\^6",
    '⇤' => raw"\barleftarrow",
    '♧' => raw"\varclubsuit",
    '𝔣' => raw"\frakf",
    '𝛇' => raw"\bfzeta",
    '𝚵' => raw"\bfXi",
    '⩕' => raw"\wedgeonwedge",
    '⇸' => raw"\nvrightarrow",
    '𝓡' => raw"\bscrR",
    '⊂' => raw"\subset",
    '𝘪' => raw"\isansi",
    '𝜗' => raw"\itvartheta",
    '⊐' => raw"\NotSquareSuperset",
    '⥓' => raw"\RightVectorBar",
    'ℯ' => raw"\euler",
    '𝚷' => raw"\bfPi",
    '𝖨' => raw"\sansI",
    '𝜳' => raw"\biPsi",
    'ᴼ' => raw"\^O",
    '⊽' => raw"\barvee",
    '¶' => raw"\P",
    '⩑' => raw"\wedgeodot",
    '𝖦' => raw"\sansG",
    '⬹' => raw"\nvleftarrowtail",
    '𝟪' => raw"\sanseight",
    'Æ' => raw"\AE",
    '𝖮' => raw"\sansO",
    '⨺' => raw"\triangleminus",
    '∇' => raw"\nabla",
    '𝟝' => raw"\bbfive",
    '␢' => raw"\blanksymbol",
    '⟨' => raw"\langle",
    '𝟽' => raw"\ttseven",
    '̚' => raw"\droang",
    '◦' => raw"\smwhtcircle",
    '϶' => raw"\backepsilon",
    'ə' => raw"\schwa",
    '⧆' => raw"\boxast",
    '𝒄' => raw"\bic",
    '𝐵' => raw"\itB",
    '⩴' => raw"\Coloneq",
    '𝔵' => raw"\frakx",
    '⪾' => raw"\supsetdot",
    '𝛁' => raw"\bfnabla",
    '⧟' => raw"\dualmap",
    '𝒽' => raw"\scrh",
    '◌' => raw"\dottedcircle",
    '⪁' => raw"\lesdoto",
    '▧' => raw"\squarenwsefill",
    '⤯' => raw"\fdiagovnearrow",
    '⋳' => raw"\varisins",
    '𝕵' => raw"\bfrakJ",
    '𝜀' => raw"\itepsilon",
    '⨤' => raw"\simplus",
    '𝚾' => raw"\bfChi",
    '⁹' => raw"\^9",
    'ℕ' => raw"\bbN",
    '𝜍' => raw"\itvarsigma",
    '⧁' => raw"\ogreaterthan",
    '⩶' => raw"\eqeqeq",
    '𝑀' => raw"\itM",
    '◓' => raw"\circletophalfblack",
    '𝟖' => raw"\bfeight",
    '𝛄' => raw"\bfgamma",
    'ℜ' => raw"\Re",
    'β' => raw"\beta",
    '⫕' => raw"\subsub",
    '𝐃' => raw"\bfD",
    'ζ' => raw"\zeta",
    '𝜥' => raw"\biKappa",
    '⊧' => raw"\models",
    '𝚱' => raw"\bfKappa",
    '♌' => raw"\leo",
    '⫅' => raw"\subseteqq",
    '‶' => raw"\backpprime",
    '⤝' => raw"\diamondleftarrow",
    'χ' => raw"\chi",
    '⨃' => raw"\bigcupdot",
    '𝟗' => raw"\bfnine",
    '⊫' => raw"\VDash",
    '⬸' => raw"\leftdotarrow",
    '↩' => raw"\hookleftarrow",
    '𝘖' => raw"\isansO",
    '𝑻' => raw"\biT",
    '𝙄' => raw"\bisansI",
    '☡' => raw"\danger",
    '⋰' => raw"\adots",
    '♅' => raw"\uranus",
    '⅓' => raw"\1/3",
    '◂' => raw"\smallblacktriangleleft",
    '𝜦' => raw"\biLambda",
    '𝛑' => raw"\bfpi",
    '⌿' => raw"\notslash",
    '⥟' => raw"\DownRightTeeVector",
    '⦜' => raw"\Angle",
    '𝟏' => raw"\bfone",
    '𝝜' => raw"\bsansEta",
    '⊻' => raw"\xor",
    '𝓶' => raw"\bscrm",
    '⋍' => raw"\backsimeq",
    '̨' => raw"\k",
    '⤲' => raw"\nwovnearrow",
    '𝜺' => raw"\biepsilon",
    '𝙈' => raw"\bisansM",
    '≄' => raw"\nsime",
    'ð' => raw"\dh",
    '↱' => raw"\Rsh",
    '𝖰' => raw"\sansQ",
    '→' => raw"\rightarrow",
    '⫝̸' => raw"\forks",
    '𝒂' => raw"\bia",
    '⍓' => raw"\boxupcaret",
    '̒' => raw"\oturnedcomma",
    '⩰' => raw"\approxeqq",
    '⥇' => raw"\rarrx",
    '↑' => raw"\uparrow",
    '⬭' => raw"\whthorzoval",
    '𝛙' => raw"\bfpsi",
    '𝔇' => raw"\frakD",
    '⋭' => raw"\ntrianglerighteq",
    '⟉' => raw"\suphsol",
    '↗' => raw"\nearrow",
    'Σ' => raw"\Sigma",
    '𝑠' => raw"\its",
    'ℰ' => raw"\scrE",
    '𝚊' => raw"\tta",
    '𝟼' => raw"\ttsix",
    '𝝓' => raw"\bivarphi",
    '𝚙' => raw"\ttp",
    '⭂' => raw"\leftarrowbackapprox",
    '𝔶' => raw"\fraky",
    'Τ' => raw"\Tau",
    '≝' => raw"\eqdef",
    '♮' => raw"\natural",
    '𝙒' => raw"\bisansW",
    '𝖞' => raw"\bfraky",
    '∏' => raw"\prod",
    '⇚' => raw"\Lleftarrow",
    '÷' => raw"\div",
    '𝚇' => raw"\ttX",
    '𝗻' => raw"\bsansn",
    '̸' => raw"\not",
    'ν' => raw"\nu",
    '𝐨' => raw"\bfo",
    '𝜝' => raw"\biBeta",
    '⥘' => raw"\LeftUpVectorBar",
    '⫄' => raw"\supedot",
    '⋌' => raw"\rightthreetimes",
    '𝗦' => raw"\bsansS",
    '⇋' => raw"\leftrightharpoons",
    '◺' => raw"\lltriangle",
    '⦱' => raw"\emptysetobar",
    '𝓍' => raw"\scrx",
    '𝚟' => raw"\ttv",
    'ᵤ' => raw"\_u",
    '⩹' => raw"\ltcir",
    'ː' => raw"\lmrk",
    'φ' => raw"\varphi",
    '₊' => raw"\_+",
    '𝓾' => raw"\bscru",
    '𝞒' => raw"\bisansGamma",
    '𝝞' => raw"\bsansIota",
    '𝗖' => raw"\bsansC",
    'Ξ' => raw"\Xi",
    '∛' => raw"\cbrt",
    '⊉' => raw"\nsupseteq",
    '𝜯' => raw"\biTau",
    '𝞹' => raw"\bisanspi",
    '⧴' => raw"\RuleDelayed",
    '𝙊' => raw"\bisansO",
    '𝓱' => raw"\bscrh",
    '𝔪' => raw"\frakm",
    '’' => raw"\rq",
    '≴' => raw"\nlesssim",
    '𝒐' => raw"\bio",
    '◞' => raw"\lrarc",
    '𝟄' => raw"\bisansvarepsilon",
    '⥐' => raw"\DownLeftRightVector",
    '⦭' => raw"\measangleultonw",
    '𝝺' => raw"\bsanslambda",
    '⫘' => raw"\supdsub",
    '𝔛' => raw"\frakX",
    '⅁' => raw"\Game",
    '𝟭' => raw"\bsansone",
    '⨳' => raw"\smashtimes",
    '⁝' => raw"\tricolon",
    'ϝ' => raw"\digamma",
    '▨' => raw"\squareneswfill",
    '𝔗' => raw"\frakT",
    '⋲' => raw"\disin",
    '𝔍' => raw"\frakJ",
    '𝕿' => raw"\bfrakT",
    '𝟒' => raw"\bffour",
    '⦣' => raw"\revangle",
    '⥛' => raw"\RightTeeVector",
    '𝓯' => raw"\bscrf",
    'ℷ' => raw"\gimel",
    '⨒' => raw"\rppolint",
    '𝐐' => raw"\bfQ",
    '𝐴' => raw"\itA",
    '𝛐' => raw"\bfomicron",
    '♈' => raw"\aries",
    '⏢' => raw"\trapezium",
    '̀' => raw"\grave",
    '↙' => raw"\swarrow",
    '▲' => raw"\bigblacktriangleup",
    '⅖' => raw"\2/5",
    '≞' => raw"\measeq",
    '𝟥' => raw"\sansthree",
    'α' => raw"\alpha",
    '⋾' => raw"\niobar",
    'ᴿ' => raw"\^R",
    '⭒' => raw"\smwhitestar",
    '̐' => raw"\candra",
    '⪓' => raw"\lesges",
    'ℿ' => raw"\bbPi",
    '∓' => raw"\mp",
    '𝚐' => raw"\ttg",
    '←' => raw"\leftarrow",
    '𝒱' => raw"\scrV",
    '𝔐' => raw"\frakM",
    '∈' => raw"\in",
    '⫐' => raw"\csup",
    '◝' => raw"\urarc",
    '◀' => raw"\blacktriangleleft",
    '𝖯' => raw"\sansP",
    'ₚ' => raw"\_p",
    'ᴴ' => raw"\^H",
    '⦢' => raw"\turnangle",
    '◽' => raw"\mdsmwhtsquare",
    '𝐫' => raw"\bfr",
    '𝛌' => raw"\bflambda",
    'ɾ' => raw"\fhr",
    '⫑' => raw"\csube",
    '𝒛' => raw"\biz",
    '𝑴' => raw"\biM",
    'ᵁ' => raw"\^U",
    '¿' => raw"\questiondown",
    '∗' => raw"\ast",
    '𝙝' => raw"\bisansh",
    '𝗓' => raw"\sansz",
    'σ' => raw"\sigma",
    'Η' => raw"\Eta",
    '⩧' => raw"\dotequiv",
    '𝛒' => raw"\bfrho",
    '⃬' => raw"\underrightharpoondown",
    '𝟢' => raw"\sanszero",
    '𝓮' => raw"\bscre",
    '𝚁' => raw"\ttR",
    '𝟋' => raw"\bfdigamma",
    '𝝕' => raw"\bivarpi",
    'δ' => raw"\delta",
    '𝓼' => raw"\bscrs",
    '⥞' => raw"\DownLeftTeeVector",
    '𝞫' => raw"\bisansbeta",
    '𝕛' => raw"\bbj",
    '◴' => raw"\circleulquad",
    '♒' => raw"\aquarius",
    '⟘' => raw"\bigbot",
    '𝔳' => raw"\frakv",
    'ᵏ' => raw"\^k",
    '𝑽' => raw"\biV",
    '↤' => raw"\mapsfrom",
    '𝑙' => raw"\itl",
    '𝕟' => raw"\bbn",
    '𝙪' => raw"\bisansu",
    '⤩' => raw"\tosa",
    '̉' => raw"\ovhook",
    '𝛾' => raw"\itgamma",
    '↽' => raw"\leftharpoondown",
    '◘' => raw"\rvbull",
    '𝓩' => raw"\bscrZ",
    '𝜱' => raw"\biPhi",
    '𝗭' => raw"\bsansZ",
    '⥉' => raw"\twoheaduparrowcircle",
    '𝝶' => raw"\bsanseta",
    '⁷' => raw"\^7",
    '𝖡' => raw"\sansB",
    '𝕭' => raw"\bfrakB",
    '⫋' => raw"\subsetneqq",
    '⃜' => raw"\ddddot",
    '' => raw"\nolinebreak",
    'ᵡ' => raw"\^chi",
    '↉' => raw"\0/3",
    '⚀' => raw"\dicei",
    '⧡' => raw"\lrtriangleeq",
    '𝒑' => raw"\bip",
    '⩦' => raw"\eqdot",
    '𝟫' => raw"\sansnine",
    '⇥' => raw"\rightarrowbar",
    '⊴' => raw"\trianglelefteq",
    '⪬' => raw"\smte",
    '≷' => raw"\gtrless",
    '⫆' => raw"\nsupseteqq",
    '𝟇' => raw"\bisansvarphi",
    '𝗡' => raw"\bsansN",
    '𝐻' => raw"\itH",
    'ɱ' => raw"\ltlmr",
    '⨻' => raw"\triangletimes",
    '⪷' => raw"\precapprox",
    '⩲' => raw"\pluseqq",
    '⇝' => raw"\rightsquigarrow",
    '⨶' => raw"\otimeshat",
    'Ζ' => raw"\Zeta",
    '𝑱' => raw"\biJ",
    'θ' => raw"\theta",
    'ᴱ' => raw"\^E",
    '⃞' => raw"\enclosesquare",
    '‱' => raw"\pertenthousand",
    '⨀' => raw"\bigodot",
    '⇴' => raw"\circleonrightarrow",
    '𝞊' => raw"\bsansvarepsilon",
    '⋸' => raw"\isinvb",
    '♍' => raw"\virgo",
    '𝐄' => raw"\bfE",
    '𝓒' => raw"\bscrC",
    '⩓' => raw"\And",
    '⎱' => raw"\rmoustache",
    '⥈' => raw"\leftrightarrowcircle",
    '⋎' => raw"\curlyvee",
    'ɹ' => raw"\trnr",
    '𝑲' => raw"\biK",
    '⊾' => raw"\rightanglearc",
    '𝑈' => raw"\itU",
    '⩫' => raw"\simrdots",
    '𝘗' => raw"\isansP",
    '↢' => raw"\leftarrowtail",
    '⋜' => raw"\eqless",
    '■' => raw"\blacksquare",
    '𝘤' => raw"\isansc",
    '⭊' => raw"\leftarrowapprox",
    'ʒ' => raw"\yogh",
    '⩖' => raw"\ElOr",
    '⊏' => raw"\sqsubset",
    '𝚺' => raw"\bfSigma",
    '⪌' => raw"\gtreqqless",
    '̧' => raw"\c",
    '⊰' => raw"\prurel",
    '∋' => raw"\ni",
    '𝛔' => raw"\bfsigma",
    '𝟱' => raw"\bsansfive",
    '𝐾' => raw"\itK",
    '◫' => raw"\boxbar",
    '⟁' => raw"\whiteinwhitetriangle",
    '𝛘' => raw"\bfchi",
    '↡' => raw"\twoheaddownarrow",
    '⊇' => raw"\supseteq",
    'Α' => raw"\Alpha",
    'ₔ' => raw"\_schwa",
    '𝝽' => raw"\bsansxi",
    '⌈' => raw"\lceil",
    '̈' => raw"\ddot",
    '⋒' => raw"\Cap",
    '𝕼' => raw"\bfrakQ",
    '⋱' => raw"\ddots",
    '𝕩' => raw"\bbx",
    '𝚶' => raw"\bfOmicron",
    '𝚖' => raw"\ttm",
    '⌉' => raw"\rceil",
    '⚫' => raw"\mdblkcircle",
    '𝛎' => raw"\bfnu",
    '𝔱' => raw"\frakt",
    '𝛚' => raw"\bfomega",
    '⇟' => raw"\nHdownarrow",
    '𝗆' => raw"\sansm",
    '⋪' => raw"\ntriangleleft",
    '𝔓' => raw"\frakP",
    '⇙' => raw"\Swarrow",
    ' ' => raw"\enspace",
    '⨌' => raw"\iiiint",
    '⁺' => raw"\^+",
    '◍' => raw"\circlevertfill",
    '𝙍' => raw"\bisansR",
    '⭁' => raw"\bsimilarleftarrow",
    '𝐗' => raw"\bfX",
    '⨎' => raw"\intBar",
    '𝝻' => raw"\bsansmu",
    '𝙴' => raw"\ttE",
    '⨸' => raw"\odiv",
    '𝔙' => raw"\frakV",
    '𝟓' => raw"\bffive",
    '𝗶' => raw"\bsansi",
    '⩿' => raw"\lesdot",
    '£' => raw"\sterling",
    '⪟' => raw"\simlE",
    '⇒' => raw"\Rightarrow",
    '⋫' => raw"\ntriangleright",
    '₈' => raw"\_8",
    'ℍ' => raw"\bbH",
    '𝕧' => raw"\bbv",
    '𝛝' => raw"\bfvartheta",
    'Þ' => raw"\TH",
    '⫎' => raw"\rsqhook",
    '∾' => raw"\lazysinv",
    'ℌ' => raw"\frakH",
    '℞' => raw"\xrat",
    '𝞛' => raw"\bisansMu",
    'Å' => raw"\AA",
    '≣' => raw"\Equiv",
    '⊔' => raw"\sqcup",
    '𝔠' => raw"\frakc",
    '𝜘' => raw"\itvarkappa",
    '⇁' => raw"\rightharpoondown",
    '𝙙' => raw"\bisansd",
    '⪱' => raw"\precneq",
    '𝒲' => raw"\scrW",
    '⤄' => raw"\nvLeftrightarrow",
    '⩍' => raw"\closedvarcap",
    '𝓳' => raw"\bscrj",
    'ᵥ' => raw"\_v",
    '⋃' => raw"\bigcup",
    '𝔂' => raw"\bscry",
    '𝟈' => raw"\bisansvarrho",
    '∉' => raw"\notin",
    '⭃' => raw"\rightarrowgtr",
    '𝝭' => raw"\bsansPsi",
    '𝗪' => raw"\bsansW",
    '⋬' => raw"\ntrianglelefteq",
    '𝑐' => raw"\itc",
    '◛' => raw"\invwhitelowerhalfcircle",
    '𝓂' => raw"\scrm",
    '𝙛' => raw"\bisansf",
    '⇄' => raw"\rightleftarrows",
    '⊁' => raw"\nsucc",
    '▓' => raw"\blockthreeqtrshaded",
    '𝞓' => raw"\bisansDelta",
    '⨜' => raw"\lowint",
    '𝝱' => raw"\bsansbeta",
    'Ø' => raw"\O",
    'ϡ' => raw"\upsampi",
    '𝟠' => raw"\bbeight",
    '⨂' => raw"\bigotimes",
    '𝚳' => raw"\bfMu",
    '𝑿' => raw"\biX",
    'ˈ' => raw"\verts",
    '𝖷' => raw"\sansX",
    '⪇' => raw"\lneq",
    '𝝹' => raw"\bsanskappa",
    '◐' => raw"\cirfl",
    '𝑎' => raw"\ita",
    '⦥' => raw"\revangleubar",
    '𝛍' => raw"\bfmu",
    '𝛩' => raw"\itTheta",
    '⊓' => raw"\sqcap",
    '𝖾' => raw"\sanse",
    '–' => raw"\endash",
    '𝐩' => raw"\bfp",
    '⪂' => raw"\gesdoto",
    '⊖' => raw"\ominus",
    '𝜿' => raw"\bikappa",
    '𝓴' => raw"\bscrk",
    '≍' => raw"\asymp",
    'ɰ' => raw"\trnmlr",
    '⩡' => raw"\varveebar",
    '⇌' => raw"\rightleftharpoons",
    '↪' => raw"\hookrightarrow",
    '𝓵' => raw"\bscrl",
    '⧢' => raw"\shuffle",
    '𝕎' => raw"\bbW",
    '♄' => raw"\saturn",
    'ᵂ' => raw"\^W",
    'ʊ' => raw"\pupsil",
    '⫔' => raw"\supsub",
    '𝗝' => raw"\bsansJ",
    '⥎' => raw"\LeftRightVector",
    '┙' => raw"\sqfnw",
    '𝑡' => raw"\itt",
    '𝑘' => raw"\itk",
    '◃' => raw"\smalltriangleleft",
    '𝘘' => raw"\isansQ",
    '𝗤' => raw"\bsansQ",
    '𝔃' => raw"\bscrz",
    '𝙚' => raw"\bisanse",
    'ɻ' => raw"\rttrnr",
    '⫤' => raw"\Dashv",
    '○' => raw"\bigcirc",
    '⚇' => raw"\circledtwodots",
    '𝓘' => raw"\bscrI",
    'Θ' => raw"\Theta",
    '𝘊' => raw"\isansC",
    '𝜉' => raw"\itxi",
    '√' => raw"\sqrt",
    '⃗' => raw"\vec",
    '𝗣' => raw"\bsansP",
    '𝟮' => raw"\bsanstwo",
    '𝑁' => raw"\itN",
    '𝗺' => raw"\bsansm",
    '⌞' => raw"\llcorner",
    '𝗹' => raw"\bsansl",
    '𝙓' => raw"\bisansX",
    '⅕' => raw"\1/5",
    'ᴷ' => raw"\^K",
    '⅐' => raw"\1/7",
    '𝒉' => raw"\bih",
    '⭆' => raw"\RRightarrow",
    '𝙃' => raw"\bisansH",
    '⇘' => raw"\Searrow",
    '𝐏' => raw"\bfP",
    '‷' => raw"\backppprime",
    '⊒' => raw"\sqsupseteq",
    '∻' => raw"\kernelcontraction",
    'ʔ' => raw"\glst",
    '𝗜' => raw"\bsansI",
    '𝓧' => raw"\bscrX",
    '𝟯' => raw"\bsansthree",
    '𝖐' => raw"\bfrakk",
    '𝒷' => raw"\scrb",
    '𝞑' => raw"\bisansBeta",
    '⩸' => raw"\equivDD",
    '⋗' => raw"\gtrdot",
    '𝘹' => raw"\isansx",
    '𝜖' => raw"\itvarepsilon",
    'ɤ' => raw"\pbgam",
    '𝞈' => raw"\bsansomega",
    '𝕗' => raw"\bbf",
    '☼' => raw"\sun",
    '∰' => raw"\oiiint",
    '𝝿' => raw"\bsanspi",
    '⥠' => raw"\LeftUpTeeVector",
    '𝖼' => raw"\sansc",
    '⨋' => raw"\sumint",
    '⤃' => raw"\nvRightarrow",
    'ₓ' => raw"\_x",
    '𝜭' => raw"\bivarTheta",
    '𝙇' => raw"\bisansL",
    '𝗐' => raw"\sansw",
    '↛' => raw"\nrightarrow",
    '𝚬' => raw"\bfEpsilon",
    '⩢' => raw"\doublebarvee",
    '⥭' => raw"\dashrightharpoondown",
    '𝗅' => raw"\sansl",
    '€' => raw"\euro",
    '◷' => raw"\circleurquad",
    'Đ' => raw"\DJ",
    '𝒆' => raw"\bie",
    '⨁' => raw"\bigoplus",
    '𝝲' => raw"\bsansgamma",
    '𝐎' => raw"\bfO",
    '®' => raw"\circledR",
    '𝚒' => raw"\tti",
    '⌟' => raw"\lrcorner",
    '𝑺' => raw"\biS",
    '⊥' => raw"\bot",
    '⃐' => raw"\leftharpoonaccent",
    'ˢ' => raw"\^s",
    '𝔦' => raw"\fraki",
    '𝖗' => raw"\bfrakr",
    '𝘃' => raw"\bsansv",
    '↚' => raw"\nleftarrow",
    '⥩' => raw"\rightleftharpoonsdown",
    '𝖊' => raw"\bfrake",
    '⦮' => raw"\measangledrtose",
    '⋊' => raw"\rtimes",
    '≦' => raw"\leqq",
    '𝞝' => raw"\bisansXi",
    '⪘' => raw"\egsdot",
    '𝗊' => raw"\sansq",
    '𝘱' => raw"\isansp",
    '▻' => raw"\whitepointerright",
    'ξ' => raw"\xi",
    'œ' => raw"\oe",
    '𝗄' => raw"\sansk",
    '⇉' => raw"\rightrightarrows",
    '𝓇' => raw"\scrr",
    '≮' => raw"\nless",
    '𝖧' => raw"\sansH",
    '⫊' => raw"\supsetapprox",
    'ϵ' => raw"\epsilon",
    '𝖂' => raw"\bfrakW",
    '𝞺' => raw"\bisansrho",
    '𝓸' => raw"\bscro",
    'λ' => raw"\lambda",
    '𝖎' => raw"\bfraki",
    '⨇' => raw"\conjquant",
    '𝝒' => raw"\bivarkappa",
    '⨉' => raw"\bigtimes",
    '⬒' => raw"\squaretopblack",
    '⫛' => raw"\mlcp",
    'ₛ' => raw"\_s",
    '⪄' => raw"\gesdotol",
    'ɯ' => raw"\trnm",
    '◆' => raw"\mdlgblkdiamond",
    '𝓦' => raw"\bscrW",
    '𝑂' => raw"\itO",
    '≑' => raw"\Doteq",
    '≶' => raw"\lessgtr",
    '𝘨' => raw"\isansg",
    'ɼ' => raw"\rl",
    '𝜠' => raw"\biEpsilon",
    '𝝅' => raw"\bipi",
    'ᴾ' => raw"\^P",
    '𝗟' => raw"\bsansL",
    '⊅' => raw"\nsupset",
    '⇷' => raw"\nvleftarrow",
    '∤' => raw"\nmid",
    '𝖓' => raw"\bfrakn",
    'ϴ' => raw"\varTheta",
    '⬱' => raw"\leftthreearrows",
    '⇡' => raw"\updasharrow",
    '↼' => raw"\leftharpoonup",
    '⋢' => raw"\nsqsubseteq",
    '𝐧' => raw"\bfn",
    '⊱' => raw"\scurel",
    '𝓔' => raw"\bscrE",
    '𝛴' => raw"\itSigma",
    '⌽' => raw"\obar",
    '∿' => raw"\sinewave",
    '⚉' => raw"\blackcircledtwodots",
    '𝝏' => raw"\bipartial",
    '≜' => raw"\triangleq",
    '𝛠' => raw"\bfvarrho",
    '⤞' => raw"\rightarrowdiamond",
    '␣' => raw"\visiblespace",
    'ℱ' => raw"\scrF",
    '𝞾' => raw"\bisansupsilon",
    '⊘' => raw"\oslash",
    '⊯' => raw"\nVDash",
    '𝟹' => raw"\ttthree",
    '⥨' => raw"\rightleftharpoonsup",
    '⪶' => raw"\succneqq",
    '𝐇' => raw"\bfH",
    '𝖴' => raw"\sansU",
    '𝟅' => raw"\bisansvartheta",
    '𝖻' => raw"\sansb",
    '𝕲' => raw"\bfrakG",
    'ƞ' => raw"\nrleg",
    '𝟙' => raw"\bbone",
    '𝒿' => raw"\scrj",
    '𝐷' => raw"\itD",
    '⪈' => raw"\gneq",
    'ᵗ' => raw"\^t",
    '𝞣' => raw"\bisansTau",
    '⬝' => raw"\vysmblksquare",
    '⨖' => raw"\sqrint",
    'ħ' => raw"\hbar",
    '⭐' => raw"\medwhitestar",
    '⚁' => raw"\diceii",
    '◮' => raw"\trianglerightblack",
    '⇦' => raw"\leftwhitearrow",
    '𝘶' => raw"\isansu",
    '𝑇' => raw"\itT",
    '⨣' => raw"\plushat",
    '𝘞' => raw"\isansW",
    '𝖳' => raw"\sansT",
    '𝚮' => raw"\bfEta",
    'ₜ' => raw"\_t",
    'ᴵ' => raw"\^I",
    '𝒬' => raw"\scrQ",
    '𝟚' => raw"\bbtwo",
    '⫣' => raw"\dashV",
    '⋿' => raw"\bagmember",
    '◅' => raw"\whitepointerleft",
    '𝕡' => raw"\bbp",
    '⬜' => raw"\lgwhtsquare",
    '𝓺' => raw"\bscrq",
    '𝞍' => raw"\bsansvarphi",
    '⩳' => raw"\eqqsim",
    '𝛀' => raw"\bfOmega",
    '▣' => raw"\blackinwhitesquare",
    '⊩' => raw"\Vdash",
    '◸' => raw"\ultriangle",
    'ϰ' => raw"\varkappa",
    '℩' => raw"\turnediota",
    '𝞿' => raw"\bisansphi",
    '𝝝' => raw"\bsansTheta",
    '‖' => raw"\Vert",
    '≔' => raw"\coloneq",
    '⧏' => raw"\LeftTriangleBar",
    '̪' => raw"\sbbrg",
    '☻' => raw"\blacksmiley",
    '𝛺' => raw"\itOmega",
    '⊣' => raw"\dashv",
    '𝒶' => raw"\scra",
    '⤉' => raw"\uparrowbarred",
    '𝔴' => raw"\frakw",
    '𝙶' => raw"\ttG",
    '⩷' => raw"\ddotseq",
    '𝚜' => raw"\tts",
    '▰' => raw"\parallelogramblack",
    '∀' => raw"\forall",
    '⬶' => raw"\twoheadmapsfrom",
    '𝞋' => raw"\bsansvartheta",
    '⪸' => raw"\succapprox",
    'ℛ' => raw"\scrR",
    '𝒔' => raw"\bis",
    '𝖇' => raw"\bfrakb",
    '▶' => raw"\blacktriangleright",
    '𝚸' => raw"\bfRho",
    '𝛛' => raw"\bfpartial",
    '⥜' => raw"\RightUpTeeVector",
    '𝑌' => raw"\itY",
    'π' => raw"\pi",
    '⇠' => raw"\leftdasharrow",
    '𝐔' => raw"\bfU",
    'ᵠ' => raw"\^phi",
    '𝕐' => raw"\bbY",
    '◭' => raw"\triangleleftblack",
    '𝙳' => raw"\ttD",
    '𝝡' => raw"\bsansMu",
    '⊋' => raw"\varsupsetneq",
    '𝖄' => raw"\bfrakY",
    '𝕱' => raw"\bfrakF",
    '⊭' => raw"\nvDash",
    '𝗷' => raw"\bsansj",
    '⪀' => raw"\gesdot",
    '⫸' => raw"\gggnest",
    '𝐮' => raw"\bfu",
    'ℎ' => raw"\planck",
    '⩝' => raw"\midbarvee",
    '𝚀' => raw"\ttQ",
    'ω' => raw"\omega",
    'Ο' => raw"\upOmicron",
    'Ƶ' => raw"\Zbar",
    '✽' => raw"\dingasterisk",
    '⬫' => raw"\smwhtlozenge",
    '⤥' => raw"\hksearow",
    '◱' => raw"\squarellquad",
    '𝝦' => raw"\bsansRho",
    '𝟁' => raw"\bisanspsi",
    'ʞ' => raw"\turnk",
    '≉' => raw"\napprox",
    '𝞜' => raw"\bisansNu",
    '›' => raw"\guilsinglright",
    '×' => raw"\times",
    '𝙞' => raw"\bisansi",
    '⨈' => raw"\disjquant",
    '↺' => raw"\circlearrowleft",
    '≻' => raw"\succ",
    '⨱' => raw"\timesbar",
    '⩁' => raw"\uminus",
    '𝛹' => raw"\itPsi",
    '⃨' => raw"\threeunderdot",
    '⎣' => raw"\dlcorn",
    '⤋' => raw"\Ddownarrow",
    '◖' => raw"\blacklefthalfcircle",
    '𝟜' => raw"\bbfour",
    '◵' => raw"\circlellquad",
    '𝐟' => raw"\bff",
    'ⅈ' => raw"\bbii",
    'ʃ' => raw"\esh",
    '𝝵' => raw"\bsanszeta",
    '𝘉' => raw"\isansB",
    '∖' => raw"\setminus",
    '⫈' => raw"\supsim",
    '𝙋' => raw"\bisansP",
    'Ϙ' => raw"\upoldKoppa",
    '𝓊' => raw"\scru",
    '◶' => raw"\circlelrquad",
    '⃰' => raw"\asteraccent",
    '𝒗' => raw"\biv",
    '⨲' => raw"\btimes",
    'ℋ' => raw"\scrH",
    '𝚆' => raw"\ttW",
    '⅋' => raw"\upand",
    '∃' => raw"\exists",
    '⚬' => raw"\mdsmwhtcircle",
    '♐' => raw"\sagittarius",
    '³' => raw"\^3",
    '̌' => raw"\check",
    '▱' => raw"\parallelogram",
    '𝙭' => raw"\bisansx",
    '↶' => raw"\curvearrowleft",
    'ϕ' => raw"\phi",
    '−' => raw"\minus",
    '⩐' => raw"\closedvarcupsmashprod",
    '⤭' => raw"\seovnearrow",
    '⊍' => raw"\cupdot",
    '𝘺' => raw"\isansy",
    '𝝪' => raw"\bsansUpsilon",
    '𝐼' => raw"\itI",
    '⤎' => raw"\leftdbkarrow",
    '⩅' => raw"\cupvee",
    '𝑆' => raw"\itS",
    '𝛻' => raw"\itnabla",
    '𝒎' => raw"\bim",
    '⦙' => raw"\ddfnc",
    '⊵' => raw"\trianglerighteq",
    '♏' => raw"\scorpio",
    '𝛳' => raw"\itvarTheta",
    '⋠' => raw"\npreccurlyeq",
    '⤑' => raw"\rightdotarrow",
    'ł' => raw"\l",
    '𝜑' => raw"\itphi",
    '𝐺' => raw"\itG",
    '𝝧' => raw"\bsansvarTheta",
    '⇹' => raw"\nvleftrightarrow",
    '𝜓' => raw"\itpsi",
    '𝞶' => raw"\bisansnu",
    '𝐜' => raw"\bfc",
    '⪰' => raw"\nsucceq",
    '☾' => raw"\leftmoon",
    '𝝯' => raw"\bsansnabla",
    '⚃' => raw"\diceiv",
    '₌' => raw"\_=",
    '⩘' => raw"\bigslopedwedge",
    '⤁' => raw"\nVtwoheadrightarrow",
    '⪦' => raw"\ltcc",
    '⊚' => raw"\circledcirc",
    '⊷' => raw"\image",
    '𝝘' => raw"\bsansGamma",
    '𝗑' => raw"\sansx",
    '⟰' => raw"\UUparrow",
    '∔' => raw"\dotplus",
    '⦡' => raw"\sphericalangleup",
    '𝛕' => raw"\bftau",
    '𝛵' => raw"\itTau",
    ' ' => raw"\thinspace",
    '𝜇' => raw"\itmu",
    '⅛' => raw"\1/8",
    '⨚' => raw"\intcup",
    '𝘒' => raw"\isansK",
    '𝛸' => raw"\itChi",
    '⇖' => raw"\Nwarrow",
    '♎' => raw"\libra",
    '“' => raw"\quotedblleft",
    '☉' => raw"\astrosun",
    '△' => raw"\bigtriangleup",
    '∽' => raw"\backsim",
    '⨢' => raw"\ringplus",
    '𝗁' => raw"\sansh",
    '≕' => raw"\eqcolon",
    '§' => raw"\S",
    '𝔅' => raw"\frakB",
    '⬥' => raw"\mdblkdiamond",
    '̊' => raw"\ocirc",
    '𝗴' => raw"\bsansg",
    '𝓑' => raw"\bscrB",
    'ƕ' => raw"\hvlig",
    '⫝' => raw"\forksnot",
    '𝞯' => raw"\bisanszeta",
    '𝖛' => raw"\bfrakv",
    '⥏' => raw"\RightUpDownVector",
    'þ' => raw"\th",
    'Ϛ' => raw"\Stigma",
    '⦩' => raw"\measanglelutonw",
    '𝑯' => raw"\biH",
    '𝕁' => raw"\bbJ",
    'κ' => raw"\kappa",
    '𝗀' => raw"\sansg",
    '𝚤' => raw"\itimath",
    '⃡' => raw"\overleftrightarrow",
    '≧' => raw"\geqq",
    'ᵨ' => raw"\_rho",
    'ɣ' => raw"\pgamma",
    '⬛' => raw"\lgblksquare",
    'υ' => raw"\upsilon",
    'ℤ' => raw"\bbZ",
    '⌜' => raw"\ulcorner",
    '𝑭' => raw"\biF",
    '̇' => raw"\dot",
    '⃛' => raw"\dddot",
    '𝔮' => raw"\frakq",
    'ª' => raw"\ordfeminine",
    '𝓐' => raw"\bscrA",
    '⇅' => raw"\dblarrowupdown",
    '𝑵' => raw"\biN",
    '⩎' => raw"\Sqcap",
    '¡' => raw"\exclamdown",
    '⊡' => raw"\boxdot",
    '⦸' => raw"\obslash",
    'ᵉ' => raw"\^e",
    '𝜕' => raw"\itpartial",
    '◣' => raw"\llblacktriangle",
    '𝓽' => raw"\bscrt",
    '𝕏' => raw"\bbX",
    'ο' => raw"\upomicron",
    '⟶' => raw"\longrightarrow",
    '↸' => raw"\barovernorthwestarrow",
    '⊕' => raw"\oplus",
    '̰' => raw"\wideutilde",
    '⋔' => raw"\pitchfork",
    '⬡' => raw"\varhexagon",
    '̲' => raw"\underbar",
    '⬤' => raw"\lgblkcircle",
    '⥊' => raw"\leftrightharpoonupdown",
    '𝚠' => raw"\ttw",
    '⇶' => raw"\rightthreearrows",
    '✓' => raw"\checkmark",
    '⨓' => raw"\scpolint",
    '⦪' => raw"\measanglerdtose",
    '𝖋' => raw"\bfrakf",
    '𝟳' => raw"\bsansseven",
    '𝖈' => raw"\bfrakc",
    '⬷' => raw"\twoheadleftdbkarrow",
    '⟿' => raw"\longrightsquigarrow",
    '∌' => raw"\nni",
    '⃒' => raw"\vertoverlay",
    '⬬' => raw"\blkhorzoval",
    '𝐙' => raw"\bfZ",
    '≽' => raw"\succcurlyeq",
    '𝖟' => raw"\bfrakz",
    '⋡' => raw"\nsucccurlyeq",
    '⊄' => raw"\nsubset",
    '⫓' => raw"\subsup",
    'ˣ' => raw"\^x",
    'ᵣ' => raw"\_r",
    '⃝' => raw"\enclosecircle",
    '⊮' => raw"\nVdash",
    '𝟲' => raw"\bsanssix",
    '⟗' => raw"\fullouterjoin",
    '⋨' => raw"\precnsim",
    '𝜸' => raw"\bigamma",
    '∢' => raw"\sphericalangle",
    '⊸' => raw"\multimap",
    'ⅇ' => raw"\bbie",
    '𝒜' => raw"\scrA",
    '⟾' => raw"\Longmapsto",
    '⪕' => raw"\eqslantless",
    '⋞' => raw"\curlyeqprec",
    'ᵞ' => raw"\^gamma",
    '⧣' => raw"\eparsl",
    '𝛞' => raw"\bfvarkappa",
    '⪖' => raw"\eqslantgtr",
    '𝗾' => raw"\bsansq",
    '—' => raw"\emdash",
    '⁻' => raw"\^-",
    '𝕢' => raw"\bbq",
    '𝖁' => raw"\bfrakV",
    '𝛭' => raw"\itMu",
    '𝔤' => raw"\frakg",
    '𝔔' => raw"\frakQ",
    '⋻' => raw"\varnis",
    '𝓟' => raw"\bscrP",
    'ᶠ' => raw"\^f",
    '𝓏' => raw"\scrz",
    '𝚿' => raw"\bfPsi",
    '𝕨' => raw"\bbw",
    'ᶲ' => raw"\^Phi",
    '𝔁' => raw"\bscrx",
    '⫏' => raw"\csub",
    'ℚ' => raw"\bbQ",
    'Χ' => raw"\Chi",
    '⤮' => raw"\neovsearrow",
    '•' => raw"\bullet",
    )

function unicode2latex(str::String)
    isascii(str) && return str
    str_array = [get(unicodedict, char, char) for char in str]
    str_length = length(str_array)

    for (i, char) in enumerate(str)
        if str_array[i] isa String
            if i < str_length && str_array[i+1] isa Char && (isletter(str_array[i+1]) || isdigit(str_array[i+1]))
                str_array[i] = "{$(str_array[i])}"
            end
        end
    end

    str = join(str_array)

    str = replace(str, raw"\_"=>"_")
    str = replace(str, raw"\^"=>"^")
    str
end


using FastBEAST

function test_fullrank(N)
    store = Vector{MatrixView}(undef, N)
    n = 100
    for i=1:N
        store[i] = FullMatrixView(rand(n,n), [1; 2], [1; 2], 10, 20)
    end

    return store
end

function test_fullrank2(N)
    store = MatrixView[]
    n = 100
    for i=1:N
        push!(store, FullMatrixView(rand(n,n), [1; 2], [1; 2], 10, 20))
    end

    return store
end

function test_fullrank3(N)
    store = Vector{FullMatrixView{Float32,Int64}}(undef, N)
    n = 100
    for i=1:N
        store[i] = FullMatrixView(rand(n,n), [1; 2], [1; 2], 10, 20)
    end

    return store
end

function test_lowrank(N)
    store = Vector{MatrixView}(undef, N)
    n = 100
    for i=1:N
        store[i] = LowRankMatrixView(rand(n,n), rand(n,n), [1; 2], [1; 2], 10, 20)
    end

    return store
end

function test_lowrank2(N)
    store = MatrixView[]
    n = 100
    for i=1:N
        push!(store, LowRankMatrixView(rand(n,n), rand(n,n), [1; 2], [1; 2], 10, 20))
    end

    return store
end

function test_lowrank3(N)
    store = Vector{LowRankMatrixView}(undef, N)
    n = 100
    for i=1:N
        store[i] = LowRankMatrixView(rand(n,n), rand(n,n), [1; 2], [1; 2], 10, 20)
    end

    return store
end

function test_all(N)
@time    A = test_fullrank(N)
@time    A = test_fullrank2(N)
@time    A = test_fullrank3(N)
@time    A = test_lowrank(N)
@time    A = test_lowrank2(N)
@time    A = test_lowrank3(N)
end


#!/usr/bin/env julia

using Luxor

using Test

using Random
Random.seed!(42)

function arrow_test(fname)
  pagewidth, pageheight = 2000, 2000
  Drawing(pagewidth, pageheight, fname)
  origin() # move 0/0 to center
  background("ivory")
  setopacity(0.8)
  setline(2)
  pagetiles = Tiler(pagewidth, pageheight, 40, 8, margin=50)
  for (pos, n) in pagetiles
    setlinecap()
    setlinejoin()
    randomhue()
    gsave()
    arrow(pos, Point(pos.x + 200, pos.y),
      decorate = () -> begin
        setline(0.2)
        circle(O, 5, :stroke)
      end,
      decoration = range(0, stop=1, length=rand(2:10)),
      linewidth=rand(1:20),
      arrowheadlength=rand(1:30),
      arrowheadangle=rand(pi/20:pi/12:pi/3))
    # same length as a non-arrow line?
    line(Point(pos.x, pos.y + 10), Point(pos.x + 200, pos.y+10), :stroke)
    grestore()
  end
  @test finish() == true

end

Random.seed!(42)
fname = "arrow-line-test.pdf"
arrow_test(fname)
println("...finished test: output in $(fname)")


module TestECOS

using Test
import ECOS
import MathOptInterface

const MOI = MathOptInterface

function runtests()
    for name in names(@__MODULE__; all = true)
        if startswith("$(name)", "test_")
            @testset "$(name)" begin
                getfield(@__MODULE__, name)()
            end
        end
    end
    return
end

function test_runtests()
    model = MOI.instantiate(ECOS.Optimizer, with_bridge_type = Float64)
    MOI.set(model, MOI.Silent(), true)
    exclude = String[
        # Expected test failures:
        #   Problem is a nonconvex QP (fixed in MOI 0.10.6)
        "test_basic_ScalarQuadraticFunction_EqualTo",
        "test_basic_ScalarQuadraticFunction_GreaterThan",
        "test_basic_ScalarQuadraticFunction_Interval",
        "test_basic_VectorQuadraticFunction_",
        "test_quadratic_SecondOrderCone_basic",
        "test_quadratic_nonconvex_",
        #   MathOptInterface.jl issue #1431
        "test_model_LowerBoundAlreadySet",
        "test_model_UpperBoundAlreadySet",
    ]
    if Sys.WORD_SIZE == 32
        # These tests fail on x86 Linux, returning ITERATION_LIMIT instead of
        # proving {primal,dual}_INFEASIBLE.
        push!(exclude, "test_conic_linear_INFEASIBLE")
        push!(exclude, "test_solve_TerminationStatus_DUAL_INFEASIBLE")
    end
    MOI.Test.runtests(
        model,
        MOI.Test.Config(
            atol = 1e-3,
            rtol = 1e-3,
            exclude = Any[
                MOI.ConstraintBasisStatus,
                MOI.VariableBasisStatus,
                MOI.ObjectiveBound,
            ],
        ),
        exclude = exclude,
    )
    return
end

function test_RawOptimizerAttribute()
    model = ECOS.Optimizer()
    MOI.set(model, MOI.RawOptimizerAttribute("abstol"), 1e-5)
    @test MOI.get(model, MOI.RawOptimizerAttribute("abstol")) ≈ 1e-5
    MOI.set(model, MOI.RawOptimizerAttribute("abstol"), 2e-5)
    @test MOI.get(model, MOI.RawOptimizerAttribute("abstol")) == 2e-5
    return
end

function test_iteration_limit()
    v = [5.0, 3.0, 1.0]
    w = [2.0, 1.5, 0.3]
    solver = MOI.OptimizerWithAttributes(ECOS.Optimizer, MOI.Silent() => true)
    model = MOI.instantiate(solver, with_bridge_type = Float64)
    maxit = 1
    MOI.set(model, MOI.RawOptimizerAttribute("maxit"), maxit)
    MOI.set(model, MOI.Silent(), true)
    x = MOI.add_variables(model, 3)
    MOI.add_constraint.(model, x, MOI.Interval(0.0, 1.0))
    MOI.add_constraint(
        model,
        MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(w, x), 0.0),
        MOI.LessThan(3.0),
    )
    MOI.set(
        model,
        MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}}(),
        MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(v, x), 0.0),
    )
    MOI.set(model, MOI.ObjectiveSense(), MOI.MAX_SENSE)
    MOI.optimize!(model)
    @test MOI.get(model, MOI.TerminationStatus()) == MOI.ITERATION_LIMIT
    @test MOI.get(model, MOI.BarrierIterations()) == maxit
    return
end

end  # module

TestECOS.runtests()


module Aircraft_module

push!(LOAD_PATH, "./")

using CAS_module, Constants_module

export Dynamics, Observation, Sensor, Aircraft
export Nearest_Intruder_Tracker, Multi_Threat_Tracker

"""
	Define the Dynamics object
"""
mutable struct Dynamics
	x::Float64
	y::Float64
	dt::Float64
	v::Float64
	heading::Float64
	turn_rate::Float64
end

"""
	Define the Observation object
"""
mutable struct Observation
	rho::Float64 # Distance from ownship to intruder
	theta::Float64 # Angle to intruder relative to ownship heading direction
	psi::Float64 # Heading angle of intruder relative to ownship heading direction
	sos::Float64 # Speed of ownship
	soi::Float64 # Speed of intruder
	tau::Float64 # Time until loss of vertical separation
	pRA::Int64 # Previous advisory
	intruder_pos_angle::Float64
end

"""
	Define the Sensor object
"""
abstract type Sensor end

"""
	Define the tracking mode: nearest intruder
"""
mutable struct Nearest_Intruder_Tracker <: Sensor
	sensing_range::Float64
	obs::Array{Observation, 1}
	# default constructor
	function Nearest_Intruder_Tracker(; r::Float64=sensing_range)
		this = new()
		this.sensing_range = r
		this.obs = []
		return this
	end
end

"""
	Define the tracking mode: multi-threat
"""
mutable struct Multi_Threat_Tracker <: Sensor
	sensing_range::Float64
	obs::Array{Observation, 1}
	# default constructor
	function Multi_Threat_Tracker(; r::Float64=sensing_range)
		this = new()
		this.sensing_range = r
		this.obs = [] # empty array
		return this
	end
end

"""
	Define the Aircraft object
"""
mutable struct Aircraft
	id::Base.Random.UUID
	dyn::Dynamics

	x_init::Float64
	y_init::Float64

	x_dest::Float64 # within airspace
	y_dest::Float64 # within airspace

	colli::Bool
	desti::Bool

	advisory::Symbol # Current resolution advisory
	cas::CAS
	sensor::Sensor

	created_time::Int64
	nominal_route_len::Float64
	actual_route_len::Float64

	dist_to_dest::Float64

	# statistics for each individual agent (not global stats)
	t_to_nominal_t::Float64
	d_to_nominal_d::Float64
	cumulative_num_ac_encountered::Int64
	num_ac_encountered_arr::Array{Int64,1}
end

end # module


# Simple Distributions like object for testing purposes
struct NormalDistribution
    μ::Any
    σ::Any
end
Random.rand(d::NormalDistribution) = d.μ + d.σ * randn()

@testset "Random" begin
    rng_types = [MersenneTwister]
    isdefined(Random, :Xoshiro) && push!(rng_types, getfield(Random, :Xoshiro))

    @testset "$Rng" for Rng in rng_types
        @testset "no args" begin
            rng, dΩ = frule((5.0,), Rng)
            @test rng isa Rng
            @test dΩ isa ZeroTangent

            rng, pb = rrule(Rng)
            @test rng isa Rng
            @test first(pb(10)) isa typeof(NoTangent())
        end
        @testset "unary" begin
            rng, dΩ = frule((5.0, 4.0), Rng, 123)
            @test rng isa Rng
            @test dΩ isa ZeroTangent

            rng, pb = rrule(Rng, 123)
            @test rng isa Rng
            @test all(map(x -> x isa AbstractZero, pb(10)))
        end
    end

    @testset "rand" begin
        non_differentiables = [
            ((), Float64),
            ((MersenneTwister(123),), Float64),
            ((MersenneTwister(123), 2, 2), Matrix{<:Float64}),
            ((Float32,), Float32),
            ((Float32, 2, 2), Matrix{<:Float32}),
            ((Float32, (2, 2)), Matrix{<:Float32}),
            ((2, 2), Matrix{<:Float64}),
        ]
        if isdefined(Random, :Xoshiro)
            Xoshiro = getfield(Random, :Xoshiro)
            push!(non_differentiables, ((Xoshiro(123),), Float64))
            push!(non_differentiables, ((Xoshiro(123), 2, 2), Matrix{<:Float64}))
        end

        for (args, xType) in non_differentiables
            x, dΩ = frule((ZeroTangent(), randn(args...)), rand, args...)
            @test x isa xType
            @test dΩ isa NoTangent

            x, pb = rrule(rand, args...)
            @test x isa xType
            dself, dargs = Iterators.peel(pb(10.0))
            @test iszero(dself)
            @test all(darg isa NoTangent for darg in dargs)
        end

        # Make sure that we do *not* have these set as non_differentiable. as they are differentiable
        @test nothing === frule(
            (ZeroTangent(), Tangent{NormalDistribution}(; μ=0.5, σ=2.0)),
            rand,
            NormalDistribution(0.1, 1.5),
        )
        @test rrule(rand, NormalDistribution(0.1, 1.5)) === nothing
    end
end


using NQCDynamics
using Test
using StatsBase: mean

b = RingPolymerArray(rand(2,3,4), quantum=[2])
beads = RingPolymers.RingPolymerParameters{Float64}(4, 1.0, [2])

@testset "transform!" begin
    b_original = deepcopy(b)
    RingPolymers.transform!(beads, b)
    @test !(b ≈ b_original)
    RingPolymers.transform!(beads, b)
    @test b ≈ b_original
end

@testset "setindex!" begin
    b[1,1,1] = 1.0
    @test all(b[1,1,:] .≈ 1.0) # Test all classical atoms set to 1
    b[1,2,1] = 1.0
    !(b[1,2,2] ≈ 1.0) # Test quantum atoms not all 1
end

@testset "similar" begin
    c = similar(b)
    @test c.quantum_atoms == b.quantum_atoms
    @test c.classical_atoms == b.classical_atoms
    @test c.normal == b.normal
end

@testset "get_centroid" begin
    b_original = deepcopy(b)
    centroid_original = RingPolymers.get_centroid(b)
    RingPolymers.transform!(beads, b)
    @test !(b ≈ b_original)
    centroid_middle = RingPolymers.get_centroid(b)
    RingPolymers.transform!(beads, b)
    @test b ≈ b_original
    centroid_final = RingPolymers.get_centroid(b)

    @test centroid_original ≈ centroid_middle ≈ centroid_final

    R = rand(size(b)...)
    centroid = dropdims(mean(R; dims=3); dims=3)
    @test centroid ≈ RingPolymers.get_centroid(R)
    out = similar(centroid) .+ 10
    RingPolymers.get_centroid!(out, R)
    @test centroid ≈ out
end

@testset "broadcasting" begin
    data = rand(2,3,4)
    A = RingPolymerArray(data, quantum=[2])

    test_data = copy(data)
    RingPolymers.constrain_classical_atoms!(test_data, A.classical_atoms)

    B = A ./ 10
    @test test_data ./ 10 ≈ B.data

    A ./= 10
    @test test_data ./ 10 ≈ A.data
end


using TimerOutputs, Printf
using Oceananigans

const timer = TimerOutput()

Ni = 2   # Number of iterations before benchmarking starts.
Nt = 10  # Number of iterations to use for benchmarking time stepping.

# Model resolutions to benchmarks. Focusing on 3D models for GPU.
Ns = [# (1, 1, 512),
      # (1, 128, 128), (128, 1, 128), (128, 128, 1),
      (32, 32, 32), (64, 64, 64), (128, 128, 128), (256, 256, 256)]

float_types = [Float32, Float64]  # Float types to benchmark.
archs = [CPU()]  # Architectures to benchmark on.

@hascuda archs = [CPU(), GPU()]  # Benchmark GPU on systems with CUDA-enabled GPUs.

arch_name(::CPU) = "CPU"
arch_name(::GPU) = "GPU"

benchmark_name(N, id)               = benchmark_name(N, id, nothing, nothing)
benchmark_name(N, id, arch::Symbol) = benchmark_name(N, id, arch, nothing)
benchmark_name(N, id, ft::DataType) = benchmark_name(N, id, nothing, ft)

function benchmark_name(N, id, arch, ft; npad=3)
    Nx, Ny, Nz = N
    print_arch = typeof(arch) <: Architecture ? true : false
    print_ft   = typeof(ft) == DataType && ft <: AbstractFloat ? true : false

    bn = ""
    bn *= lpad(Nx, npad, " ") * "x" * lpad(Ny, npad, " ") * "x" * lpad(Nz, npad, " ")
    bn *= " $id"

    if print_arch && print_ft
        arch = arch_name(arch)
        bn *= " ($arch, $ft)"
    elseif print_arch && !print_ft
        arch = arch_name(arch)
        bn *= " ($arch)"
    elseif !print_arch && print_ft
        bn *= " ($ft)"
    end

    return bn
end

for arch in archs, float_type in float_types, N in Ns
    Nx, Ny, Nz = N
    Lx, Ly, Lz = 100, 100, 100

    model = Model(N=(Nx, Ny, Nz), L=(Lx, Ly, Lz), arch=arch, float_type=float_type)
    time_step!(model, Ni, 1)  # First 1-2 iterations usually slower.

    bn =  benchmark_name(N, "static ocean", arch, float_type)
    @printf("Running benchmark: %s...\n", bn)
    for i in 1:Nt
        @timeit timer bn time_step!(model, 1, 1)
    end
end

print_timer(timer, title="Oceananigans.jl benchmarks")

bid = "static ocean"  # Benchmark ID. We only have one right now.

println("\n\nCPU Float64 -> Float32 speedup:")
for N in Ns
    bn32 = benchmark_name(N, bid, CPU(), Float32)
    bn64 = benchmark_name(N, bid, CPU(), Float64)
    t32  = TimerOutputs.time(timer[bn32])
    t64  = TimerOutputs.time(timer[bn64])
    @printf("%s: %.3f\n", benchmark_name(N, bid), t64/t32)
end

@hascuda begin
    println("\nGPU Float64 -> Float32 speedup:")
    for N in Ns
        bn32 = benchmark_name(N, bid, GPU(), Float32)
        bn64 = benchmark_name(N, bid, GPU(), Float64)
        t32  = TimerOutputs.time(timer[bn32])
        t64  = TimerOutputs.time(timer[bn64])
        @printf("%s: %.3f\n", benchmark_name(N, bid), t64/t32)
    end

    println("\nCPU -> GPU speedup:")
    for N in Ns, ft in float_types
        bn_cpu = benchmark_name(N, bid, CPU(), ft)
        bn_gpu = benchmark_name(N, bid, GPU(), ft)
        t_cpu  = TimerOutputs.time(timer[bn_cpu])
        t_gpu  = TimerOutputs.time(timer[bn_gpu])
        @printf("%s: %.3f\n", benchmark_name(N, bid, ft), t_cpu/t_gpu)
    end
end


include("type_define.jl")
include("mesh_medium.jl")
include("boundary.jl")
include("fd_coefficient.jl")
include("mesh_wavefield.jl")
include("mesh_wavelet.jl")
# include("wavefield_parameter.jl")


@enum(ChannelAssignment,
      Independent,
      LeftSide,
      RightSide,
      MidSide)

@enum(FrameNumberType,
      FrameNumber,
      SampleNumber)

immutable FrameHeader
    blocksize::Cuint
    sample_rate::Cuint
    channels::Cuint
    channel_assignment::ChannelAssignment
    bits_per_sample::Cuint
    typ::FrameNumberType
    num::UInt32
    crc::UInt8
end

const FrameHeaderSync = 0x00003ffe

const MAX_CHANNELS = 0x00000008

immutable FrameFooter
    crc::UInt16
end

@enum(EntropyCodingMethodType,
      PartitionedRice,
      PartitionedRice2)

immutable PartitionedRiceContents
    parameters::Ptr{Cuint}
    raw_bits::Ptr{Cuint}
    capacity_by_order::Cuint
end

immutable PartitionedRiceT
    order::Cuint
    contents::Ptr{PartitionedRiceContents}
end

immutable EntropyCodingMethod
    typ::EntropyCodingMethodType
    data::PartitionedRiceT
end

@enum(SubframeType,
      SubframeConstant,
      SubframeVerbatim,
      SubframeFixed,
      SubframeLPC)

abstract Subframe

immutable Subframe_Constant <: Subframe
    value::Int32
end

immutable Subframe_Verbatim <: Subframe
    data::Ptr{Int32}
end

const MAX_FIXED_ORDER = 0x00000004

immutable SubFrame_Fixed <: Subframe
    method::EntropyCodingMethod
    order::Cuint
    warmup::NTuple{Int(MAX_FIXED_ORDER),Int32}
    residual::Ptr{Int32}
end

const MAX_LPC_ORDER = 0x00000020

immutable SubFrame_LPC <: Subframe
    method::EntropyCodingMethod
    order::Cuint
    qlp_coeff_precision::Cuint
    quantization_level::Cint
    qlp_coeff::NTuple{Int(MAX_LPC_ORDER),Int32}
    warmup::NTuple{Int(MAX_LPC_ORDER),Int32}
    residual::Ptr{Int32}
end

immutable SubFrame{SF <: Subframe}
    typ::SubframeType
    data::SF
    wasted_bits::Cuint
end

immutable Frame
    header::FrameHeader
    subframes::NTuple{Int(MAX_CHANNELS),SubFrame}
    footer::FrameFooter
end


using Compose
@doc """Line\n
-------------------------------\n
The circle object creates a drawable scalable vector graphic circle.\n
Circle(x,y,diameter,fillin)\n
pairs:: NTuple[Int64/float64] Vector2s determining line position.\n
color:: Fill color, takes Julia Symbol type.\n
line_example = Line([(-1,-1), (-1,1), (1,1)],:blue)"""
function Line(pairs, color=:black, width=2)
    tree() = introspect(composition)
    show() = composition
    composition = compose(context(), line(pairs), stroke(string(color)))
    color = string("\"",string(color),"\"")
    pairstring = ""
    for i in pairs
        s = string(i) * ","
        pairstring = pairstring * s
    end
    update(pairs) = string("line([",string(join(pairstring)),"]), stroke(", color, "), linewidth(",width,"mm),")
    (var)->(show;composition;tree;update;color;pairs)
end
@doc """Circle\n
-------------------------------\n
The circle object creates a drawable scalable vector graphic circle.\n
Circle(x,y,diameter,fillin)\n
x:: The X position of the Circle.\n
y:: The Y position of the Circle.\n
diameter:: The diameter of the circle.\n
fillin:: Fill color, takes Julia Symbol type.\n
big = Circle(.5,.5,.01,:orange)"""
function Circle(x,y,diameter,fillin=:orange,stroke=:black)
    composition = compose(context(), circle(x,y,diameter), fill(string(fillin)))
    color = string("\"",string(fillin),"\"")
    stroke = string("\"",string(stroke),"\"")
    tag = string("circle(",string(x),",",string(y),',',diameter,"), fill(", color , "),")
    tree() = introspect(composition)
    show() = composition
    x = x
    y = y
    update(x,y) =  string("circle(",string(x),",",string(y),',',diameter,"), fill(", color ,"), stroke(",stroke, "),")
    (var)->(show;composition;tree;tag;x;y;update;diameter)
end
function Rectangle(x,y,width,height,fillin=:blue)
    composition = compose(context(), rectangle(x,y,width,height), fill(["yellow,blue"]))
    color = string("\"",string(fillin),"\"")
    tag = string("rectangle(",string(x),",",string(y),',',width,',',height, "), fill(", color , "),")
    tree() = introspect(composition)
    show() = composition
    x = x
    y = y
    update(x,y) =  string("rectangle(",string(x),",",string(y),',',width,',',height, "), fill(", color , "),")
    (var)->(show;composition;tree;tag;x;y;update;diameter)
end
function Label(label,x,y,stroke="",size=5,fill=:gray)
    if stroke != ""
        stroke = string("stroke(","\"",string(stroke),"\"","),")
    end
    fill = string("\"", string(fill), "\"")
    label = string("\"",string(label),"\"")
    tag = string("text(",x, ",", y, ",", label, ",hcenter, vcenter),",
           stroke," fontsize(", size, "), fill(", fill, "),")
    expression = string("compose(context(), ",tag,")")
    exp = Meta.parse(expression)
    show() = eval(exp)
    update() = tag
    (var)->(show;expression;tag;exp)
end
#---------------------------------------------------


using Flux, Statistics, Trebuchet, Printf
using Flux.Tracker: data, grad, gradient
using Flux.Optimise: _update_params!
using DataStructures: CircularBuffer
using Distributions: sample

#using CuArrays

#=
# Description of the problem:
    There is Trebuchet, which throws a mass to a target. The mass is to be
    released at an angle, and at certain velocity so that it lands on the target.
    The velocity of release is determined by the counterweight of the Trebuchet.
    Given conditions of environment we are required to predict the angle of
    release and counterweight.

    The problem is gamified by introducing a threshold. The player gets 99
    attempts. The first attempt has threshold value of 1. Threshold determines
    the tolerable relative error between actual distance travelled by the Projectile
    and the target distance. This relative error has to be less than the threshold
    in order to continue playing the game. The game gets tougher at each attempts
    by reduction of threshold by 0.01.

# Input:  Wind speed,   Target distance
# Output: ReleaseAngle, Weight
=#

# ----------------------------- Parameters -------------------------------------

STATE_SIZE = 2
ACTION_SIZE = 2

DIST  = (2f1, 1f2)	# Maximum target distance
SPEED =   5f0 # Maximum wind speed

ACTION_BOUND = [DIST[2]-DIST[1], SPEED]
MAX_EP = 50_000
MAX_EP_LENGTH = 1000

BATCH_SIZE = 64
MEM_SIZE = 100_000
MIN_EXP_SIZE = 50_000

γ = 99f-2     # discount rate

τ = 1f-3 # for running average while updating target networks
η_act = 1f-4   # Learning rate
η_crit = 1f-3
L2_DECAY = 1f-2

# Ornstein-Uhlenbeck Noise params
μ = 0f0
θ = 15f-2
σ = 2f-1

# --------------------------------- Memory ------------------------------------

memory = CircularBuffer{Any}(MEM_SIZE)

function getData(batch_size = BATCH_SIZE)
  # Getting data in shape
  minibatch = sample(memory, batch_size)
  x = hcat(minibatch...)

  s      =   hcat(x[1, :]...) |> gpu
  a      =   hcat(x[2, :]...) |> gpu
  r      =   hcat(x[3, :]...) |> gpu
  s′     =   hcat(x[4, :]...) |> gpu
  s_mask = .!hcat(x[5, :]...) |> gpu

  return s, a, r, s′, s_mask
end

# -------------------------------- Action Noise --------------------------------

struct OUNoise
  μ
  θ
  σ
  X
end

ou = OUNoise(μ, θ, σ, zeros(Float32, ACTION_SIZE) |> gpu)

function sample_noise(ou::OUNoise)
  dx     = ou.θ * (ou.μ .- ou.X)
  dx   .+= ou.σ * randn(Float32, length(ou.X)) |> gpu
  ou.X .+= dx
end

# Noise scale
τ_ = 25
ϵ  = exp(-1f0 / τ_)
noise_scale = 1f0

# ----------------------------- Model Architecture -----------------------------

w_init(dims...) = 6f-3rand(Float32, dims...) .- 3f-3

actor = Chain(Dense(STATE_SIZE, 400, relu),
	      	  Dense(400, 300, relu),
              Dense(300, ACTION_SIZE, tanh, initW=w_init)) |> gpu
actor_target = deepcopy(actor)

struct crit
  state_crit
  act_crit
  sa_crit
end

Flux.@treelike crit

function (c::crit)(state, action)
  s = c.state_crit(state)
  a = c.act_crit(action)
  c.sa_crit(relu.(s .+ a))
end

Base.deepcopy(c::crit) = crit(deepcopy(c.state_crit),
                              deepcopy(c.act_crit),
			      			  deepcopy(c.sa_crit))

critic = crit(Chain(Dense(STATE_SIZE, 400, relu), Dense(400, 300)) |> gpu,
              	  	Dense(ACTION_SIZE, 300) |> gpu,
	      			Dense(300, 1, initW=w_init) |> gpu)
critic_target = deepcopy(critic)

# ------------------------------- Param Update Functions---------------------------------

function update_target!(target, model; τ = 1f0)
  for (p_t, p_m) in zip(params(target), params(model))
    p_t.data .= (1f0 - τ) * p_t.data .+ τ * p_m.data
  end
end

nullify_grad!(p) = p
nullify_grad!(p::TrackedArray) = (p.grad .= 0f0)

zero_grad!(model) = (model = mapleaves(nullify_grad!, model))

# ---------------------------------- Training ----------------------------------

function L2_loss(model)
  l2_loss = 0
  for p in params(model)
    l2_loss += sum(p .^ 2)
  end

  return L2_DECAY * l2_loss
end

opt_crit = ADAM(η_crit)
opt_act  = ADAM(η_act)

function replay()
  s, a, r, s′, s_mask = getData()

  # Update Critic
  a′ = data(actor_target(s′))
  v′ = data(critic_target(s′, a′))
  y = r .+ γ * v′ .* s_mask	# set v′ to 0 where s_ is terminal state
  @show size(s)
  v = critic(s, a)
  loss_crit = Flux.mse(y, v) + L2_loss(critic)

  zero_grad!(critic)
  Flux.back!(loss_crit)
  _update_params!(opt_crit, params(critic))

  # Update Actor
  actions = actor(s)
  crit_out = critic(s, actions)

  zero_grad!(actor)
  Flux.back!(-sum(crit_out))
  _update_params!(opt_act, params(actor))

  # Update Target models
  update_target!(actor_target, actor; τ = τ)
  update_target!(critic_target, critic; τ = τ)
end

# --------------------------- Helper Functions --------------------------------

lerp(x, lo, hi) = x*(hi-lo)+lo

target() = [randn() * SPEED, lerp(rand(), DIST...)]

# Stores tuple of state, action, reward, next_state, and done
remember(state, action, reward, next_state, done) =
  push!(memory, [data.((state, action, reward[1], next_state))..., done])

function action(state, train=true)
  state = reshape(state, size(state)..., 1)
  act_pred = data(actor(state |> gpu)) |> cpu
  if train
    act_pred .+= noise_scale * sample_noise(ou)
  end
  angle = clamp.(act_pred[1:1, :], -π, π) # returns action

  return vcat(angle, act_pred[2:2, :])
end

function shoot(wind, angle, weight)
  Trebuchet.shoot((wind, Trebuchet.deg2rad(angle), weight))[2]
end

function reward(wind, target_dist, angle, weight)
  actual_dist = shoot(wind, angle, weight)
  -(target_dist - actual_dist) ^ 2
end

function step!(state, action)
  r = reward(state..., action...)
  return r
end

function episode(train=true)
  wind, target_dist = target()
  s = [wind_speed, target_dist]
  a = action(s, train)
  r = step!(s, a)

  if train
    remember(s, a, zeros(Float32, 2), r, true)
    replay()
  end

  return √-r
end
# -------------------------------- Testing -------------------------------------

# Returns average score over 100 episodes
function test()
  score_mean = 0f0
  for _=1:100
    total_reward = episode(false)
    score_mean += total_reward / 100
  end
  return score_mean
end

# ------------------------------ Training --------------------------------------

# Populate memory with random actions

for e=1:MIN_EXP_SIZE
  s = target()
  a = 2rand(Float32, ACTION_SIZE) .* ACTION_BOUND .- ACTION_BOUND
  r = step!(s, a)
  remember(s, a, r, zeros(Float32, 2), true)
end

for e=1:MAX_EP
  global noise_scale
  total_reward = episode(true)
  total_reward = @sprintf "%9.3f" total_reward
  print("Episode: $e | Score: $total_reward | ")
  score_mean = test()
  score_mean = @sprintf "%9.3f" score_mean
  println("Mean score over 100 test episodes: $score_mean")
  noise_scale *= ϵ
end


import Base: @deprecate, @deprecate_binding

@deprecate triangulate{F<:Face}(t::Type{F}, f::Face) decompose(t, f)

@deprecate convert{N1, N2, T1, T2}(::Type{HyperRectangle{N1, T1}},
                                   geometry::Array{Point{N2, T2}}) HyperRectangle{N1,T1}(geometry::Array{Point{N2, T2}})

@deprecate_binding Rectangle SimpleRectangle

# TODO
# These are very tightly coupled to HomogenousMesh.
getindex{PT}(r::SimpleRectangle, t::Type{Point{2, PT}}) = decompose(t, r)
getindex{PT}(p::Pyramid, t::Type{Point{3, PT}}) = decompose(t, p)
getindex{ET}(q::Quad, t::Type{Point{3, ET}}) = decompose(t, q)
decompose{X}(t::Type{X}, m::AbstractMesh) = m[t]