content: {-# LANGUAGE UnicodeSyntax, NoImplicitPrelude #-}
  {-# LANGUAGE FlexibleContexts #-}
  
  module Lookup.Linux
      ( LinuxAction(..)
      , posAndKeycode
      , posAndScancode
      , posToScancode
      , charAndString
      , deadKeysAndLinuxDeadKeys
      , actionAndRedirect
      , actionAndLinuxAction
      , printLinuxAction
      , modifierAndSymbol
      , defaultModifierMaps
      , extraModifierMaps
      , modifierAndTypeModifier
      , modifierAndPressedModifier
      , virtualMods
      , singleIncludes
      , doubleIncludes
      , presetTypes
      , defaultTypes
      ) where
  
  import BasePrelude
  import Prelude.Unicode
  import Data.Monoid.Unicode ((⊕))
  import Util (show', (>$>), whenNothing, allBounded)
  
  import Control.Monad.Writer (tell)
  import Data.Map (Map)
  import qualified Data.Map as Map
  import Lens.Micro.Platform (over, _2)
  
  import qualified Layout.Action as A
  import qualified Layout.Modifier as M
  import qualified Layout.ModifierEffect as ME
  import qualified Layout.Pos as P
  import Layout.Types
  import PresetDeadKey (PresetDeadKey)
  import qualified PresetDeadKey as D
  
  posAndKeycode ∷ [(Pos, String)]
  posAndKeycode = over (traverse ∘ _2) (\s → "<" ⊕ s ⊕ ">") P.posAndXkbKeycode
  
  posAndScancode ∷ [(Pos, Int)]
  posAndScancode =
      [ (P.Tilde, 0x29)
      , (P.N1, 0x02)
      , (P.N2, 0x03)
      , (P.N3, 0x04)
      , (P.N4, 0x05)
      , (P.N5, 0x06)
      , (P.N6, 0x07)
      , (P.N7, 0x08)
      , (P.N8, 0x09)
      , (P.N9, 0x0A)
      , (P.N0, 0x0B)
      , (P.Minus, 0x0C)
      , (P.Plus, 0x0D)
      , (P.Backspace, 0x0E)
  
      , (P.Tab, 0x0F)
      , (P.Q, 0x10)
      , (P.W, 0x11)
      , (P.E, 0x12)
      , (P.R, 0x13)
      , (P.T, 0x14)
      , (P.Y, 0x15)
      , (P.U, 0x16)
      , (P.I, 0x17)
      , (P.O, 0x18)
      , (P.P, 0x19)
      , (P.Bracket_L, 0x1A)
      , (P.Bracket_R, 0x1B)
      , (P.Backslash, 0x2B)
  
      , (P.CapsLock, 0x3A)
      , (P.A, 0x1E)
      , (P.S, 0x1F)
      , (P.D, 0x20)
      , (P.F, 0x21)
      , (P.G, 0x22)
      , (P.H, 0x23)
      , (P.J, 0x24)
      , (P.K, 0x25)
      , (P.L, 0x26)
      , (P.Semicolon, 0x27)
      , (P.Apastrophe, 0x28)
      , (P.Enter, 0x1C)
  
      , (P.Shift_L, 0x2A)
      , (P.Iso, 0x56)
      , (P.Z, 0x2C)
      , (P.X, 0x2D)
      , (P.C, 0x2E)
      , (P.V, 0x2F)
      , (P.B, 0x30)
      , (P.N, 0x31)
      , (P.M, 0x32)
      , (P.Comma, 0x33)
      , (P.Period, 0x34)
      , (P.Slash, 0x35)
      , (P.Shift_R, 0x36)
  
      , (P.Control_L, 0x1D)
      , (P.Win_L, 0x7D)
      , (P.Alt_L, 0x38)
      , (P.Space, 0x39)
      , (P.Alt_R, 0x64)
      , (P.Win_R, 0x7E)
      , (P.Menu, 0x7F)
      , (P.Control_R, 0x61)
  
      , (P.Esc, 0x01)
      , (P.F1, 0x3B)
      , (P.F2, 0x3C)
      , (P.F3, 0x3D)
      , (P.F4, 0x3E)
      , (P.F5, 0x3F)
      , (P.F6, 0x40)
      , (P.F7, 0x41)
      , (P.F8, 0x42)
      , (P.F9, 0x43)
      , (P.F10, 0x44)
      , (P.F11, 0x57)
      , (P.F12, 0x58)
      , (P.PrintScreen, 0x63)
      , (P.ScrollLock, 0x36)
      , (P.Pause, 0x77)
  
      , (P.Insert, 0x6E)
      , (P.Delete, 0x6F)
      , (P.Home, 0x56)
      , (P.End, 0x6B)
      , (P.PageUp, 0x68)
      , (P.PageDown, 0x6D)
      , (P.Up, 0x67)
      , (P.Left, 0x6A)
      , (P.Down, 0x6C)
      , (P.Right, 0x69)
  
      , (P.NumLock, 0x45)
      , (P.KP_Div, 0x62)
      , (P.KP_Mult, 0x37)
      , (P.KP_Min, 0x4A)
      , (P.KP_7, 0x47)
      , (P.KP_8, 0x48)
      , (P.KP_9, 0x49)
      , (P.KP_Plus, 0x4E)
      , (P.KP_4, 0x4B)
      , (P.KP_5, 0x4C)
      , (P.KP_6, 0x4D)
      , (P.KP_Comma, 0x79)
      , (P.KP_1, 0x4F)
      , (P.KP_2, 0x50)
      , (P.KP_3, 0x51)
      , (P.KP_Enter, 0x60)
      , (P.KP_0, 0x52)
      , (P.KP_Dec, 0x53)
      , (P.KP_Eq, 0x75)
  
      , (P.AudioPlay, 0xCF)
      , (P.AudioPlay, 0xC8)
      , (P.AudioPause, 0xC9)
      , (P.PlayPause, 0xA4)
      , (P.Previous, 0xA5)
      , (P.Next, 0xA3)
      , (P.Stop, 0xA6)
  --    , (P.ToggleRepeat, 0x)
  --    , (P.ToggleRandom, 0x)
      , (P.AudioRewind, 0xA8)
      , (P.AudioForward, 0xD0)
      , (P.Mute, 0x71)
      , (P.VolumeDown, 0x72)
      , (P.VolumeUp, 0x73)
      , (P.BrightnessDown, 0xE5)
      , (P.BrightnessUp, 0xE6)
      , (P.Eject, 0xA1)
  
      , (P.Browser_Back, 0x9E)
      , (P.Browser_Forward, 0x9F)
      , (P.Browser_Refresh, 0xAD)
      , (P.Browser_Stop, 0x80)
      , (P.Browser_Search, 0xD9)
      , (P.Browser_Favorites, 0x9C)
  
      , (P.Calculator, 0x8C)
      , (P.MediaPlayer, 0xE2)
      , (P.Browser, 0xAC)
      , (P.Mail, 0x9B)
      , (P.Search, 0xD9)
      , (P.Explorer, 0x90)
      , (P.MyComputer, 0x96)
      , (P.WWW, 0x9D)
      , (P.Help, 0x8A)
  --    , (P.Launch0, 0x)
      , (P.Launch1, 0x94)
      , (P.Launch2, 0x95)
      , (P.Launch3, 0xCA)
      , (P.Launch4, 0xCB)
      , (P.Launch5, 0xC0)
      , (P.Launch6, 0xC1)
      , (P.Launch7, 0xC2)
      , (P.Launch8, 0xC3)
      , (P.Launch9, 0xC4)
      , (P.LaunchA, 0x78)
      , (P.LaunchB, 0xCC)
  --    , (P.LaunchC, 0x)
  --    , (P.LaunchD, 0x)
  --    , (P.LaunchE, 0x)
  --    , (P.LaunchF, 0x)
  
      , (P.Power, 0xA0)
      , (P.Sleep, 0x8E)
      , (P.Wake, 0x8F)
  
      , (P.F13, 0xB7)
      , (P.F14, 0xB8)
      , (P.F15, 0xB9)
      , (P.F16, 0xBA)
      , (P.F17, 0xBB)
      , (P.F18, 0xBC)
      , (P.F19, 0xBD)
      , (P.F20, 0xBE)
      , (P.F21, 0xBF)
      , (P.F22, 0xC0)
      , (P.F23, 0xC1)
      , (P.F24, 0xC2)
  --    , (P.Hash, 0x)
      , (P.Ro, 0x59)
      , (P.Yen, 0x7C)
      , (P.Muhenkan, 0x5E)
      , (P.Henkan, 0x5C)
      , (P.Katakana, 0x5B)
      ]
  
  posToScancode ∷ Pos → Maybe Int
  posToScancode = fmap (+8) ∘ (`lookup` posAndScancode)
  
  
  data LinuxAction
      = Symbol
          { __symbol ∷ String
          }
      | SetMods
          { __symbol  ∷ String
          , __addMods ∷ [Modifier]
          }
      | LatchMods
          { __symbol  ∷ String
          , __addMods ∷ [Modifier]
          }
      | LockMods
          { __symbol  ∷ String
          , __addMods ∷ [Modifier]
          }
      | MovePtr
          { __symbol ∷ String
          , __x, __y ∷ Int
          }
      | PtrBtn
          { __symbol ∷ String
          , __button ∷ String
          }
      | PtrDoubleClick
          { __symbol ∷ String
          , __button ∷ String
          }
      | LockPtrBtn
          { __symbol ∷ String
          , __button ∷ String
          }
      | SetPtrDflt
          { __symbol ∷ String
          , __button ∷ String
          }
      | LockControls
          { __symbol ∷ String
          , __controls ∷ String
          }
      | SwitchScreen
          { __symbol ∷ String
          , __screen ∷ Int
          }
      | XkbRedirect
          { __symbol    ∷ String
          , __actionPos ∷ Pos
          , __addMods   ∷ [Modifier]
          , __clearMods ∷ [Modifier]
          }
      deriving (Show, Read)
  
  printLinuxAction ∷ Logger m ⇒ LinuxAction → m String
  printLinuxAction (Symbol _) = pure "NoAction()"
  printLinuxAction (SetMods   _ mods) = printModsWithEffect Shift mods
  printLinuxAction (LatchMods _ mods) = printModsWithEffect Latch mods
  printLinuxAction (LockMods  _ mods) = printModsWithEffect Lock  mods
  printLinuxAction (MovePtr _ x y) = pure (printf "MovePtr(x=%+d,y=%+d)" x y)
  printLinuxAction (PtrBtn _ b) = pure ("PtrBtn(button=" ⊕ b ⊕ ")")
  printLinuxAction (PtrDoubleClick _ b) = pure ("PtrBtn(button=" ⊕ b ⊕ ",count=2)")
  printLinuxAction (LockPtrBtn _ b) = pure ("LockPtrBtn(button=" ⊕ b ⊕ ")")
  printLinuxAction (SetPtrDflt _ b) = pure ("SetPtrDflt(affect=defaultButton,button=" ⊕ b ⊕ ")")
  printLinuxAction (LockControls _ c) = pure ("LockControls(ctrls=" ⊕ c ⊕ ")")
  printLinuxAction (SwitchScreen _ s) = pure ("SwitchScreen(Screen=" ⊕ show s ⊕ ", !same)")
  printLinuxAction (XkbRedirect _ pos mods clearMods) = do
      printedMods ← printMods <$> printModsWithPlus mods
      printedClearMods ← printClearMods <$> printModsWithPlus clearMods
      case lookup pos posAndKeycode of
        Just keyCode → pure ("Redirect(key=" ⊕ keyCode ⊕ printedMods ⊕ printedClearMods ⊕ ")")
        Nothing → "NoAction()" <$ tell ["could not redirect to unsupported " ⊕ show' pos ⊕ " in XKB"]
    where
      printMods s
          | null s    = ""
          | otherwise = ",mods=" ⊕ s
      printClearMods s
          | null s    = ""
          | otherwise = ",clearMods=" ⊕ s
  printModsWithPlus ∷ Logger m ⇒ [Modifier] → m String
  printModsWithPlus =
      traverse (\m → whenNothing (e m) (lookup m modifierAndPressedModifier)) >$>
      intercalate "+" ∘ catMaybes
    where
      e ∷ Logger m ⇒ Modifier → m ()
      e modifier = tell [show' modifier ⊕ " is not supported in XKB"]
  printModsWithEffect ∷ Logger m ⇒ ModifierEffect → [Modifier] → m String
  printModsWithEffect effect =
      printModsWithPlus >$>
      \s → bool (action effect ⊕ "Mods(mods=" ⊕ s ⊕ ")") "NoAction()" (null s)
    where
      action Shift = "Set"
      action Latch = "Latch"
      action Lock  = "Lock"
  
  actionAndRedirect ∷ [(Action, Letter)]
  actionAndRedirect =
      [ (A.Esc, Redirect [] P.Esc)
      , (A.F1, Redirect [] P.F1)
      , (A.F2, Redirect [] P.F2)
      , (A.F3, Redirect [] P.F3)
      , (A.F4, Redirect [] P.F4)
      , (A.F5, Redirect [] P.F5)
      , (A.F6, Redirect [] P.F6)
      , (A.F7, Redirect [] P.F7)
      , (A.F8, Redirect [] P.F8)
      , (A.F9, Redirect [] P.F9)
      , (A.F10, Redirect [] P.F10)
      , (A.F11, Redirect [] P.F11)
      , (A.F12, Redirect [] P.F12)
      , (A.PrintScreen, Redirect [] P.PrintScreen)
      , (A.SysRq, Redirect [M.Alt] P.PrintScreen)
      , (A.ScrollLock, Redirect [] P.ScrollLock)
      , (A.Pause, Redirect [] P.Pause)
      , (A.ControlBreak, Redirect [M.Control] P.Pause)
      , (A.Insert, Redirect [] P.Insert)
      , (A.Delete, Redirect [] P.Delete)
      , (A.Home, Redirect [] P.Home)
      , (A.End, Redirect [] P.End)
      , (A.PageUp, Redirect [] P.PageUp)
      , (A.PageUp, Redirect [] P.PageUp)
      , (A.PageDown, Redirect [] P.PageDown)
      , (A.PageDown, Redirect [] P.PageDown)
      , (A.Up, Redirect [] P.Up)
      , (A.Left, Redirect [] P.Left)
      , (A.Down, Redirect [] P.Down)
      , (A.Right, Redirect [] P.Right)
      , (A.Backspace, Redirect [] P.Backspace)
      , (A.Tab, Redirect [] P.Tab)
      , (A.LeftTab, Redirect [M.Shift] P.Tab)
      , (A.Enter, Redirect [] P.Enter)
      , (A.Menu, Redirect [] P.Menu)
      , (A.Power, Redirect [] P.Power)
      , (A.Sleep, Redirect [] P.Sleep)
      , (A.Wake, Redirect [] P.Wake)
      , (A.Undo, Redirect [M.Control] P.Z)
      , (A.Redo, Redirect [M.Shift,M.Control] P.Z)
      , (A.Cut, Redirect [M.Control] P.X)
      , (A.Copy, Redirect [M.Control] P.C)
      , (A.Paste, Redirect [M.Control] P.V)
      , (A.Save, Redirect [M.Control] P.S)
      , (A.CloseTab, Redirect [M.Control] P.W)
      , (A.AudioPlay, Redirect [] P.AudioPlay)
      , (A.AudioPause, Redirect [] P.AudioPause)
      , (A.PlayPause, Redirect [] P.PlayPause)
      , (A.Previous, Redirect [] P.Previous)
      , (A.Next, Redirect [] P.Next)
      , (A.Stop, Redirect [] P.Stop)
      , (A.AudioRewind, Redirect [] P.AudioRewind)
      , (A.AudioForward, Redirect [] P.AudioForward)
      , (A.Mute, Redirect [] P.Mute)
      , (A.VolumeDown, Redirect [] P.VolumeDown)
      , (A.VolumeUp, Redirect [] P.VolumeUp)
      , (A.BrightnessDown, Redirect [] P.BrightnessDown)
      , (A.BrightnessUp, Redirect [] P.BrightnessUp)
      , (A.Eject, Redirect [] P.Eject)
  
      , (A.Browser_Back, Redirect [] P.Browser_Back)
      , (A.Browser_Forward, Redirect [] P.Browser_Forward)
      , (A.Browser_Refresh, Redirect [] P.Browser_Refresh)
      , (A.Browser_Stop, Redirect [] P.Browser_Stop)
      , (A.Browser_Search, Redirect [] P.Browser_Search)
      , (A.Browser_Favorites, Redirect [] P.Browser_Favorites)
  
      , (A.Calculator, Redirect [] P.Calculator)
      , (A.MediaPlayer, Redirect [] P.MediaPlayer)
      , (A.Browser, Redirect [] P.Browser)
      , (A.Mail, Redirect [] P.Mail)
      , (A.Search, Redirect [] P.Search)
      , (A.Explorer, Redirect [] P.Explorer)
      , (A.WWW, Redirect [] P.WWW)
      , (A.MyComputer, Redirect [] P.MyComputer)
      , (A.Launch0, Redirect [] P.Launch0)
      , (A.Launch1, Redirect [] P.Launch1)
      , (A.Launch2, Redirect [] P.Launch2)
      , (A.Launch3, Redirect [] P.Launch3)
      , (A.Launch4, Redirect [] P.Launch4)
      , (A.Launch5, Redirect [] P.Launch5)
      , (A.Launch6, Redirect [] P.Launch6)
      , (A.Launch7, Redirect [] P.Launch7)
      , (A.Launch8, Redirect [] P.Launch8)
      , (A.Launch9, Redirect [] P.Launch9)
      , (A.LaunchA, Redirect [] P.LaunchA)
      , (A.LaunchB, Redirect [] P.LaunchB)
      , (A.LaunchC, Redirect [] P.LaunchC)
      , (A.LaunchD, Redirect [] P.LaunchD)
      , (A.LaunchE, Redirect [] P.LaunchE)
      , (A.LaunchF, Redirect [] P.LaunchF)
      ]
  
  actionAndLinuxAction ∷ [(Action, LinuxAction)]
  actionAndLinuxAction =
      [ (A.Esc, Symbol "Escape")
      , (A.F1, Symbol "F1")
      , (A.F2, Symbol "F2")
      , (A.F3, Symbol "F3")
      , (A.F4, Symbol "F4")
      , (A.F5, Symbol "F5")
      , (A.F6, Symbol "F6")
      , (A.F7, Symbol "F7")
      , (A.F8, Symbol "F8")
      , (A.F9, Symbol "F9")
      , (A.F10, Symbol "F10")
      , (A.F11, Symbol "F11")
      , (A.F12, Symbol "F12")
      , (A.PrintScreen, Symbol "Print")
      , (A.SysRq, Symbol "Sys_Req")
      , (A.ScrollLock, Symbol "Scroll_Lock")
      , (A.Pause, Symbol "Pause")
      , (A.ControlBreak, Symbol "Break")
      , (A.Insert, Symbol "Insert")
      , (A.Delete, Symbol "Delete")
      , (A.Home, Symbol "Home")
      , (A.End, Symbol "End")
      , (A.PageUp, Symbol "Prior")
      , (A.PageUp, Symbol "Page_Up")
      , (A.PageDown, Symbol "Next")
      , (A.PageDown, Symbol "Page_Down")
      , (A.Up, Symbol "Up")
      , (A.Left, Symbol "Left")
      , (A.Down, Symbol "Down")
      , (A.Right, Symbol "Right")
      , (A.Backspace, Symbol "BackSpace")
      , (A.Tab, Symbol "Tab")
      , (A.LeftTab, Symbol "ISO_Left_Tab")
      , (A.Enter, Symbol "Return")
      , (A.Menu, Symbol "Menu")
      , (A.Power, Symbol "XF86PowerOff")
      , (A.Sleep, Symbol "XF86Sleep")
      , (A.Wake, Symbol "XF86WakeUp")
      , (A.Undo, Symbol "z")
      , (A.Redo, Symbol "Z")
      , (A.Cut, Symbol "x")
      , (A.Cut, Symbol "XF86Cut")
      , (A.Copy, Symbol "c")
      , (A.Copy, Symbol "XF86Copy")
      , (A.Paste, Symbol "v")
      , (A.Paste, Symbol "XF86Paste")
      , (A.AudioPlay, Symbol "XF86AudioPlay")
      , (A.AudioPause, Symbol "XF86AudioPause")
      , (A.PlayPause, Symbol "XF86AudioPlay")
      , (A.Previous, Symbol "XF86AudioPrev")
      , (A.Next, Symbol "XF86AudioNext")
      , (A.Stop, Symbol "XF86AudioStop")
      , (A.ToggleRepeat, Symbol "XF86AudioRepeat")
      , (A.ToggleRandom, Symbol "XF86AudioRandomPlay")
      , (A.AudioRewind, Symbol "XF86AudioRewind")
      , (A.AudioForward, Symbol "XF86AudioForward")
      , (A.Mute, Symbol "XF86AudioMute")
      , (A.VolumeDown, Symbol "XF86AudioLowerVolume")
      , (A.VolumeUp, Symbol "XF86AudioRaiseVolume")
      , (A.BrightnessDown, Symbol "XF86MonBrightnessDown")
      , (A.BrightnessUp, Symbol "XF86MonBrightnessUp")
      , (A.Eject, Symbol "XF86Eject")
  
      , (A.Browser_Back, Symbol "XF86Back")
      , (A.Browser_Forward, Symbol "XF86Forward")
      , (A.Browser_Refresh, Symbol "XF86Reload")
      , (A.Browser_Stop, Symbol "Cancel")
      , (A.Browser_Search, Symbol "XF86Search")
      , (A.Browser_Favorites, Symbol "XF86Favorites")
  
      , (A.Calculator, Symbol "XF86Calculator")
      , (A.MediaPlayer, Symbol "XF86AudioMedia")
      , (A.Browser, Symbol "XF86HomePage")
      , (A.Mail, Symbol "XF86Mail")
      , (A.Search, Symbol "XF86Search")
      , (A.Explorer, Symbol "XF86Explorer")
      , (A.WWW, Symbol "XF86WWW")
      , (A.MyComputer, Symbol "XF86MyComputer")
      , (A.Help, Symbol "Help")
      , (A.Launch0, Symbol "XF86Launch0")
      , (A.Launch1, Symbol "XF86Launch1")
      , (A.Launch2, Symbol "XF86Launch2")
      , (A.Launch3, Symbol "XF86Launch3")
      , (A.Launch4, Symbol "XF86Launch4")
      , (A.Launch5, Symbol "XF86Launch5")
      , (A.Launch6, Symbol "XF86Launch6")
      , (A.Launch7, Symbol "XF86Launch7")
      , (A.Launch8, Symbol "XF86Launch8")
      , (A.Launch9, Symbol "XF86Launch9")
      , (A.LaunchA, Symbol "XF86LaunchA")
      , (A.LaunchB, Symbol "XF86LaunchB")
      , (A.LaunchC, Symbol "XF86LaunchC")
      , (A.LaunchD, Symbol "XF86LaunchD")
      , (A.LaunchE, Symbol "XF86LaunchE")
      , (A.LaunchF, Symbol "XF86LaunchF")
  
      , (A.Switch_VT_1, SwitchScreen "XF86_Switch_VT_1" 1)
      , (A.Switch_VT_2, SwitchScreen "XF86_Switch_VT_2" 2)
      , (A.Switch_VT_3, SwitchScreen "XF86_Switch_VT_3" 3)
      , (A.Switch_VT_4, SwitchScreen "XF86_Switch_VT_4" 4)
      , (A.Switch_VT_5, SwitchScreen "XF86_Switch_VT_5" 5)
      , (A.Switch_VT_6, SwitchScreen "XF86_Switch_VT_6" 6)
      , (A.Switch_VT_7, SwitchScreen "XF86_Switch_VT_7" 7)
      , (A.Switch_VT_8, SwitchScreen "XF86_Switch_VT_8" 8)
      , (A.Switch_VT_9, SwitchScreen "XF86_Switch_VT_9" 9)
      , (A.Switch_VT_10, SwitchScreen "XF86_Switch_VT_10" 10)
      , (A.Switch_VT_11, SwitchScreen "XF86_Switch_VT_11" 11)
      , (A.Switch_VT_12, SwitchScreen "XF86_Switch_VT_12" 12)
  
      , (A.Button_Default, PtrBtn "Pointer_Button_Dflt" "default")
      , (A.Button_L, PtrBtn "Pointer_Button1" "1")
      , (A.Button_M, PtrBtn "Pointer_Button2" "2")
      , (A.Button_R, PtrBtn "Pointer_Button3" "3")
      , (A.Button_DoubleClick_Default, PtrDoubleClick "Pointer_DblClick_Dflt" "default")
      , (A.Button_DoubleClick_L, PtrDoubleClick "Pointer_DblClick1" "1")
      , (A.Button_DoubleClick_M, PtrDoubleClick "Pointer_DblClick2" "2")
      , (A.Button_DoubleClick_R, PtrDoubleClick "Pointer_DblClick3" "3")
      , (A.Button_Drag_Default, LockPtrBtn "Pointer_Drag_Dflt" "default")
      , (A.Button_Drag_L, LockPtrBtn "Pointer_Drag1" "1")
      , (A.Button_Drag_M, LockPtrBtn "Pointer_Drag2" "2")
      , (A.Button_Drag_R, LockPtrBtn "Pointer_Drag3" "3")
      , (A.Button_SetDefault_Next, SetPtrDflt "Pointer_DfltBtnNext" "+1")
      , (A.Button_SetDefault_Prev, SetPtrDflt "Pointer_DfltBtnPrev" "-1")
      , (A.Button_SetDefault_L, SetPtrDflt "VoidSymbol" "1")
      , (A.Button_SetDefault_M, SetPtrDflt "VoidSymbol" "2")
      , (A.Button_SetDefault_R, SetPtrDflt "VoidSymbol" "3")
      , (A.WheelUp, PtrBtn "XF86ScrollUp" "4")
      , (A.WheelDown, PtrBtn "XF86ScrollDown" "5")
      , (A.WheelRight, PtrBtn "XF86ScrollRight" "6")
      , (A.WheelLeft, PtrBtn "XF86ScrollLeft" "7")
      , (A.MouseEnable, LockControls "Pointer_EnableKeys" "MouseKeys")
      , (A.MouseLeft, MovePtr "Pointer_Left" (-8) 0)
      , (A.MouseRight, MovePtr "Pointer_Right" 8 0)
      , (A.MouseUp, MovePtr "Pointer_Up" 0 (-8))
      , (A.MouseDown, MovePtr "Pointer_Down" 0 8)
      , (A.MouseUpLeft, MovePtr "Pointer_UpLeft" (-8) (-8))
      , (A.MouseUpRight, MovePtr "Pointer_UpRight" 8 (-8))
      , (A.MouseDownLeft, MovePtr "Pointer_DownLeft" (-8) 8)
      , (A.MouseDownRight, MovePtr "Pointer_DownRight" 8 8)
  
      , (A.KP_Div, Symbol "KP_Divide")
      , (A.KP_Mult, Symbol "KP_Multiply")
      , (A.KP_Min, Symbol "KP_Subtract")
      , (A.KP_7, Symbol "KP_7")
      , (A.KP_8, Symbol "KP_8")
      , (A.KP_9, Symbol "KP_9")
      , (A.KP_Plus, Symbol "KP_Add")
      , (A.KP_4, Symbol "KP_4")
      , (A.KP_5, Symbol "KP_5")
      , (A.KP_6, Symbol "KP_6")
      , (A.KP_Comma, Symbol "KP_Separator")
      , (A.KP_1, Symbol "KP_1")
      , (A.KP_2, Symbol "KP_2")
      , (A.KP_3, Symbol "KP_3")
      , (A.KP_Enter, Symbol "KP_Enter")
      , (A.KP_0, Symbol "KP_0")
      , (A.KP_Dec, Symbol "KP_Decimal")
      , (A.KP_Eq, Symbol "KP_Equal")
  
      , (A.KP_Home, Symbol "KP_Home")
      , (A.KP_Up, Symbol "KP_Up")
      , (A.KP_PageUp, Symbol "KP_Prior")
      , (A.KP_Left, Symbol "KP_Left")
      , (A.KP_Begin, Symbol "KP_Begin")
      , (A.KP_Right, Symbol "KP_Right")
      , (A.KP_End, Symbol "KP_End")
      , (A.KP_Down, Symbol "KP_Down")
      , (A.KP_PageDown, Symbol "KP_Next")
      , (A.KP_Insert, Symbol "KP_Insert")
      , (A.KP_Delete, Symbol "KP_Delete")
  
      , (A.F13, Symbol "F13")
      , (A.F14, Symbol "F14")
      , (A.F15, Symbol "F15")
      , (A.F16, Symbol "F16")
      , (A.F17, Symbol "F17")
      , (A.F18, Symbol "F18")
      , (A.F19, Symbol "F19")
      , (A.F20, Symbol "F20")
      , (A.F21, Symbol "F21")
      , (A.F22, Symbol "F22")
      , (A.F23, Symbol "F23")
      , (A.F24, Symbol "F24")
      , (A.F25, Symbol "F25")
      , (A.F26, Symbol "F26")
      , (A.F27, Symbol "F27")
      , (A.F28, Symbol "F28")
      , (A.F29, Symbol "F29")
      , (A.F30, Symbol "F30")
      , (A.F31, Symbol "F31")
      , (A.F32, Symbol "F32")
      , (A.F33, Symbol "F33")
      , (A.F34, Symbol "F34")
      , (A.F35, Symbol "F35")
  
      , (A.Ro, Symbol "Romaji")
      , (A.Muhenkan, Symbol "Muhenkan")
      , (A.Henkan, Symbol "Henkan")
      , (A.Katakana, Symbol "Katakana")
      ]
  
  modifierAndSymbol ∷ [((ModifierEffect, Modifier), String)]
  modifierAndSymbol =
      [ ((ME.Shift, m),         "Shift_L") | m ← [M.Shift, M.Shift_L] ] ⧺
      [ ((ME.Shift, M.Shift_R), "Shift_R") ] ⧺
      [ ((ME.Latch, m),         "ISO_Level2_Latch") | m ← [M.Shift, M.Shift_L, M.Shift_R] ] ⧺
      [ ((ME.Lock,  m),         "Shift_Lock")       | m ← [M.Shift, M.Shift_L, M.Shift_R] ] ⧺
      [ ((effect, M.CapsLock),  "Caps_Lock") | effect ← reverse allBounded ] ⧺
      [ ((effect, m),           "Super_L")   | effect ← allBounded, m ← [M.Win, M.Win_L] ] ⧺
      [ ((effect, M.Win_R),     "Super_R")   | effect ← allBounded ] ⧺
      [ ((effect, m),           "Alt_L")     | effect ← allBounded, m ← [M.Alt, M.Alt_L]] ⧺
      [ ((effect, M.Alt_R),     "Alt_R")     | effect ← allBounded ] ⧺
      [ ((effect, m),           "Control_L") | effect ← allBounded, m ← [M.Control, M.Control_L] ] ⧺
      [ ((effect, M.Control_R), "Control_R") | effect ← allBounded ] ⧺
      [ ((effect, M.NumLock),   "Num_Lock")  | effect ← reverse allBounded ] ⧺
      [ ((ME.Shift, M.AltGr),   "ISO_Level3_Shift")
      , ((ME.Latch, M.AltGr),   "ISO_Level3_Latch")
      , ((ME.Lock,  M.AltGr),   "ISO_Level3_Lock")
      , ((ME.Shift, M.Extend),  "ISO_Level5_Shift")
      , ((ME.Latch, M.Extend),  "ISO_Level5_Latch")
      , ((ME.Lock,  M.Extend),  "ISO_Level5_Lock")
      ]
  
  defaultModifierMaps ∷ [(String, (String, Pos))]
  defaultModifierMaps =
      [ ("Shift_L", ("Shift", P.Shift_L))
      , ("Shift_R", ("Shift", P.Shift_R))
      , ("Caps_Lock", ("Lock", P.CapsLock))
      , ("Control_L", ("Control", P.Control_L))
      , ("Control_R", ("Control", P.Control_R))
      , ("Num_Lock", ("Mod2", P.NumLock))
      , ("Super_L", ("Mod4", P.Win_L))
      , ("Super_R", ("Mod4", P.Win_R))
      , ("Alt_L", ("Mod1", P.Alt_L))
      , ("Alt_R", ("Mod1", P.Alt_R))
      ]
  
  extraModifierMaps ∷ [(String, String)]
  extraModifierMaps =
      [ ("Shift", "ISO_Level2_Latch")
      , ("Shift", "Shift_Lock")
      , ("Mod5", "ISO_Level3_Shift")
      , ("Mod5", "ISO_Level3_Latch")
      , ("Mod5", "ISO_Level3_Lock")
      , ("Mod3", "ISO_Level5_Shift")
      , ("Mod3", "ISO_Level5_Latch")
      , ("Mod3", "ISO_Level5_Lock")
      ]
  
  modifierAndTypeModifier ∷ [(Modifier, String)]
  modifierAndTypeModifier =
      [ (M.Shift, "Shift")
      , (M.CapsLock, "Lock")
      , (M.Win, "Super")
      , (M.Alt, "Alt")
      , (M.Control, "Control")
      , (M.NumLock, "NumLock")
      , (M.AltGr, "LevelThree")
      , (M.Extend, "LevelFive")
      ]
  
  modifierAndPressedModifier ∷ [(Modifier, String)]
  modifierAndPressedModifier = modifierAndTypeModifier ⧺
      [ (M.Shift_L, "Shift")
      , (M.Shift_R, "Shift")
      , (M.Win_L, "Super")
      , (M.Win_R, "Super")
      , (M.Alt_L, "Alt")
      , (M.Alt_R, "Alt")
      , (M.Control_L, "Control")
      , (M.Control_R, "Control")
      ]
  
  virtualMods ∷ [Modifier]
  virtualMods = [M.Win, M.Win_L, M.Win_R, M.Alt, M.Alt_L, M.Alt_R, M.NumLock, M.AltGr, M.Extend]
  
  deadKeysAndLinuxDeadKeys ∷ [(PresetDeadKey, String)]
  deadKeysAndLinuxDeadKeys =
      [ (D.Grave, "dead_grave")
      , (D.Acute, "dead_acute")
      , (D.Circumflex, "dead_circumflex")
      , (D.Tilde, "dead_tilde")
      , (D.Macron, "dead_macron")
      , (D.Breve, "dead_breve")
      , (D.AboveDot, "dead_abovedot")
      , (D.Diaeresis, "dead_diaeresis")
      , (D.AboveRing, "dead_abovering")
      , (D.DoubleAcute, "dead_doubleacute")
      , (D.Caron, "dead_caron")
      , (D.Cedilla, "dead_cedilla")
      , (D.Ogonek, "dead_ogonek")
      , (D.Iota, "dead_iota")
      , (D.BelowDot, "dead_belowdot")
      , (D.Hook, "dead_hook")
      , (D.Horn, "dead_horn")
      , (D.Stroke, "dead_stroke")
      , (D.AboveComma, "dead_abovecomma")
      , (D.AboveReversedComma, "dead_abovereversedcomma")
      , (D.DoubleGrave, "dead_doublegrave")
      , (D.BelowRing, "dead_belowring")
      , (D.BelowMacron, "dead_belowmacron")
      , (D.BelowCircumflex, "dead_belowcircumflex")
      , (D.BelowTilde, "dead_belowtilde")
      , (D.BelowBreve, "dead_belowbreve")
      , (D.BelowDiaeresis, "dead_belowdiaeresis")
      , (D.InvertedBreve, "dead_invertedbreve")
      , (D.BelowComma, "dead_belowcomma")
      , (D.Currency, "dead_currency")
      , (D.Greek, "dead_greek")
      , (D.Compose, "Multi_key")
      ]
  
  singleIncludes ∷ [(SingletonKey, String)]
  singleIncludes =
      [ (SingletonKey P.Alt_R     (Modifiers Shift [M.AltGr]), "include \"level3(ralt_switch)\"")
      , (SingletonKey P.Alt_L     (Modifiers Shift [M.AltGr]), "include \"level3(lalt_switch)\"")
      , (SingletonKey P.Control_R (Modifiers Shift [M.AltGr]), "include \"level3(switch)\"")
      , (SingletonKey P.Menu      (Modifiers Shift [M.AltGr]), "include \"level3(menu_switch)\"")
      , (SingletonKey P.Win_L     (Modifiers Shift [M.AltGr]), "include \"level3(lwin_switch)\"")
      , (SingletonKey P.Win_R     (Modifiers Shift [M.AltGr]), "include \"level3(rwin_switch)\"")
      , (SingletonKey P.KP_Enter  (Modifiers Shift [M.AltGr]), "include \"level3(enter_switch)\"")
      , (SingletonKey P.CapsLock  (Modifiers Shift [M.AltGr]), "include \"level3(caps_switch)\"")
      , (SingletonKey P.Backslash (Modifiers Shift [M.AltGr]), "include \"level3(bksl_switch)\"")
      , (SingletonKey P.Iso       (Modifiers Shift [M.AltGr]), "include \"level3(lsgt_switch)\"")
  
      , (SingletonKey P.Control_R (Modifiers Shift [M.Extend]), "include \"level5(rctrl_switch)\"")
      , (SingletonKey P.Iso       (Modifiers Shift [M.Extend]), "include \"level5(lsgt_switch)\"")
      , (SingletonKey P.Alt_R     (Modifiers Shift [M.Extend]), "include \"level5(ralt_switch)\"")
  
      , (SingletonKey P.Alt_R       (Dead D.Compose), "include \"compose(ralt)\"")
      , (SingletonKey P.Win_L       (Dead D.Compose), "include \"compose(lwin)\"")
      , (SingletonKey P.Win_R       (Dead D.Compose), "include \"compose(rwin)\"")
      , (SingletonKey P.Menu        (Dead D.Compose), "include \"compose(menu)\"")
      , (SingletonKey P.Control_R   (Dead D.Compose), "include \"compose(rctrl)\"")
      , (SingletonKey P.Control_L   (Dead D.Compose), "include \"compose(lctrl)\"")
      , (SingletonKey P.CapsLock    (Dead D.Compose), "include \"compose(caps)\"")
      , (SingletonKey P.Iso         (Dead D.Compose), "include \"compose(102)\"")
      , (SingletonKey P.Pause       (Dead D.Compose), "include \"compose(paus)\"")
      , (SingletonKey P.PrintScreen (Dead D.Compose), "include \"compose(prsc)\"")
      , (SingletonKey P.ScrollLock  (Dead D.Compose), "include \"compose(sclk)\"")
  
      , (SingletonKey P.CapsLock (Modifiers Shift [M.Control]), "include \"ctrl(nocaps)\"")
      , (SingletonKey P.Menu     (Modifiers Shift [M.Control]), "include \"ctrl(menu_rctrl)\"")
      , (SingletonKey P.Alt_R    (Modifiers Shift [M.Control]), "include \"ctrl(ralt_rctrl)\"")
  
      , (SingletonKey P.CapsLock (Action A.Esc), "include \"capslock(escape)\"")
      , (SingletonKey P.CapsLock (Action A.Backspace), "include \"capslock(backspace)\"")
      , (SingletonKey P.CapsLock (Modifiers Shift [M.Win]), "include \"capslock(super)\"")
      , (SingletonKey P.CapsLock (Modifiers Shift [M.NumLock]), "include \"capslock(numlock)\"")
      ]
  
  doubleIncludes ∷ [((SingletonKey, SingletonKey), String)]
  doubleIncludes =
      [ ((SingletonKey P.CapsLock (Modifiers Shift [M.Control]), SingletonKey P.Control_L (Modifiers Lock [M.CapsLock])), "include \"ctrl(swapcaps)\"")
      , ((SingletonKey P.CapsLock (Action A.Esc), SingletonKey P.Esc (Modifiers Lock [M.CapsLock])), "include \"capslock(swapescape)\"")
      ]
  
  presetTypes ∷ [(String, String)]
  presetTypes =
      [ ("NONE", "ONE_LEVEL")
      , ("NONE_SHIFT", "TWO_LEVEL")
      , ("NONE_SHIFT_ALPHABETIC", "ALPHABETIC")
      , ("NONE_SHIFT_ALTGR_SHIFT+ALTGR", "FOUR_LEVEL")
      , ("NONE_SHIFT_ALTGR_SHIFT+ALTGR_ALPHABETIC", "FOUR_LEVEL_ALPHABETIC")
      , ("NONE_SUPER", "PC_SUPER_LEVEL2")
      , ("NONE_CONTROL", "PC_CONTROL_LEVEL2")
      , ("NONE_ALT", "PC_ALT_LEVEL2")
      , ("NONE_SHIFT_ALTGR_SHIFT+ALTGR_CONTROL+ALT", "CTRL+ALT")
      , ("NONE_NUMPAD", "KEYPAD")
      , ("NONE_NUMLOCK_SHIFT+NUMLOCK_CONTROL+ALT", "FOUR_LEVEL_MIXED_KEYPAD")
      , ("NONE_SHIFT+ALT", "SHIFT+ALT")
      ]
  
  defaultTypes ∷ Map Pos (Either Int ([Shiftlevel], Maybe Bool))
  defaultTypes = Map.fromList
      [ (P.Esc, Left 1)
      , (P.Iso, Left 4)
      , (P.Backslash, Left 2)
      , (P.Space, Left 1)
      , (P.Backspace, Left 2)
      , (P.Tab, Left 2)
      , (P.Enter, Left 1)
      , (P.CapsLock, Left 1)
      , (P.NumLock, Left 1)
      , (P.Shift_L, Left 1)
      , (P.Control_L, Left 1)
      , (P.Win_L, Left 1)
      , (P.Shift_R, Left 1)
      , (P.Control_R, Left 1)
      , (P.Win_R, Left 1)
      , (P.Menu, Left 1)
      , (P.Alt_L, Left 2)
      , (P.Alt_R, Right ([M.empty, M.singleton M.Shift], Just False))
      , (P.PrintScreen, Right ([M.empty, M.singleton M.Alt], Nothing))
      , (P.ScrollLock, Left 1)
      , (P.Pause, Right ([M.empty, M.singleton M.Control], Nothing))
      , (P.Insert, Left 1)
      , (P.Delete, Left 1)
      , (P.Home, Left 1)
      , (P.End, Left 1)
      , (P.PageUp, Left 1)
      , (P.PageDown, Left 1)
      , (P.Up, Left 1)
      , (P.Left, Left 1)
      , (P.Down, Left 1)
      , (P.Right, Left 1)
  
      , (P.F1, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F2, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F3, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F4, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F5, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F6, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F7, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F8, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F9, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F10, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F11, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      , (P.F12, Right ([M.empty, M.singleton M.Shift, M.singleton M.AltGr, M.fromList [M.Shift, M.AltGr], M.fromList [M.Control, M.Alt]], Just False))
      ]
  
  charAndString ∷ [(Char, String)]
  charAndString =
      [ (' ', "space")
      , ('!', "exclam")
      , ('"', "quotedbl")
      , ('#', "numbersign")
      , ('$', "dollar")
      , ('%', "percent")
      , ('&', "ampersand")
      , ('\'', "apostrophe")
      , ('(', "parenleft")
      , (')', "parenright")
      , ('*', "asterisk")
      , ('+', "plus")
      , (',', "comma")
      , ('-', "minus")
      , ('.', "period")
      , ('/', "slash")
      , ('0', "0")
      , ('1', "1")
      , ('2', "2")
      , ('3', "3")
      , ('4', "4")
      , ('5', "5")
      , ('6', "6")
      , ('7', "7")
      , ('8', "8")
      , ('9', "9")
      , (':', "colon")
      , (';', "semicolon")
      , ('<', "less")
      , ('=', "equal")
      , ('>', "greater")
      , ('?', "question")
      , ('@', "at")
      , ('A', "A")
      , ('B', "B")
      , ('C', "C")
      , ('D', "D")
      , ('E', "E")
      , ('F', "F")
      , ('G', "G")
      , ('H', "H")
      , ('I', "I")
      , ('J', "J")
      , ('K', "K")
      , ('L', "L")
      , ('M', "M")
      , ('N', "N")
      , ('O', "O")
      , ('P', "P")
      , ('Q', "Q")
      , ('R', "R")
      , ('S', "S")
      , ('T', "T")
      , ('U', "U")
      , ('V', "V")
      , ('W', "W")
      , ('X', "X")
      , ('Y', "Y")
      , ('Z', "Z")
      , ('[', "bracketleft")
      , ('\\', "backslash")
      , (']', "bracketright")
      , ('^', "asciicircum")
      , ('_', "underscore")
      , ('`', "grave")
      , ('a', "a")
      , ('b', "b")
      , ('c', "c")
      , ('d', "d")
      , ('e', "e")
      , ('f', "f")
      , ('g', "g")
      , ('h', "h")
      , ('i', "i")
      , ('j', "j")
      , ('k', "k")
      , ('l', "l")
      , ('m', "m")
      , ('n', "n")
      , ('o', "o")
      , ('p', "p")
      , ('q', "q")
      , ('r', "r")
      , ('s', "s")
      , ('t', "t")
      , ('u', "u")
      , ('v', "v")
      , ('w', "w")
      , ('x', "x")
      , ('y', "y")
      , ('z', "z")
      , ('{', "braceleft")
      , ('|', "bar")
      , ('}', "braceright")
      , ('~', "asciitilde")
      , (' ', "nobreakspace")
      , ('¡', "exclamdown")
      , ('¢', "cent")
      , ('£', "sterling")
      , ('¤', "currency")
      , ('¥', "yen")
      , ('¦', "brokenbar")
      , ('§', "section")
      , ('¨', "diaeresis")
      , ('©', "copyright")
      , ('ª', "ordfeminine")
      , ('«', "guillemotleft")
      , ('¬', "notsign")
      , ('\173', "hyphen")
      , ('®', "registered")
      , ('¯', "macron")
      , ('°', "degree")
      , ('±', "plusminus")
      , ('²', "twosuperior")
      , ('³', "threesuperior")
      , ('´', "acute")
      , ('µ', "mu")
      , ('¶', "paragraph")
      , ('·', "periodcentered")
      , ('¸', "cedilla")
      , ('¹', "onesuperior")
      , ('º', "masculine")
      , ('»', "guillemotright")
      , ('¼', "onequarter")
      , ('½', "onehalf")
      , ('¾', "threequarters")
      , ('¿', "questiondown")
      , ('À', "Agrave")
      , ('Á', "Aacute")
      , ('Â', "Acircumflex")
      , ('Ã', "Atilde")
      , ('Ä', "Adiaeresis")
      , ('Å', "Aring")
      , ('Æ', "AE")
      , ('Ç', "Ccedilla")
      , ('È', "Egrave")
      , ('É', "Eacute")
      , ('Ê', "Ecircumflex")
      , ('Ë', "Ediaeresis")
      , ('Ì', "Igrave")
      , ('Í', "Iacute")
      , ('Î', "Icircumflex")
      , ('Ï', "Idiaeresis")
      , ('Ð', "ETH")
      , ('Ñ', "Ntilde")
      , ('Ò', "Ograve")
      , ('Ó', "Oacute")
      , ('Ô', "Ocircumflex")
      , ('Õ', "Otilde")
      , ('Ö', "Odiaeresis")
      , ('×', "multiply")
      , ('Ø', "Oslash")
      , ('Ø', "Ooblique")
      , ('Ù', "Ugrave")
      , ('Ú', "Uacute")
      , ('Û', "Ucircumflex")
      , ('Ü', "Udiaeresis")
      , ('Ý', "Yacute")
      , ('Þ', "THORN")
      , ('ß', "ssharp")
      , ('à', "agrave")
      , ('á', "aacute")
      , ('â', "acircumflex")
      , ('ã', "atilde")
      , ('ä', "adiaeresis")
      , ('å', "aring")
      , ('æ', "ae")
      , ('ç', "ccedilla")
      , ('è', "egrave")
      , ('é', "eacute")
      , ('ê', "ecircumflex")
      , ('ë', "ediaeresis")
      , ('ì', "igrave")
      , ('í', "iacute")
      , ('î', "icircumflex")
      , ('ï', "idiaeresis")
      , ('ð', "eth")
      , ('ñ', "ntilde")
      , ('ò', "ograve")
      , ('ó', "oacute")
      , ('ô', "ocircumflex")
      , ('õ', "otilde")
      , ('ö', "odiaeresis")
      , ('÷', "division")
      , ('ø', "oslash")
      , ('ø', "ooblique")
      , ('ù', "ugrave")
      , ('ú', "uacute")
      , ('û', "ucircumflex")
      , ('ü', "udiaeresis")
      , ('ý', "yacute")
      , ('þ', "thorn")
      , ('ÿ', "ydiaeresis")
      , ('Ą', "Aogonek")
      , ('˘', "breve")
      , ('Ł', "Lstroke")
      , ('Ľ', "Lcaron")
      , ('Ś', "Sacute")
      , ('Š', "Scaron")
      , ('Ş', "Scedilla")
      , ('Ť', "Tcaron")
      , ('Ź', "Zacute")
      , ('Ž', "Zcaron")
      , ('Ż', "Zabovedot")
      , ('ą', "aogonek")
      , ('˛', "ogonek")
      , ('ł', "lstroke")
      , ('ľ', "lcaron")
      , ('ś', "sacute")
      , ('ˇ', "caron")
      , ('š', "scaron")
      , ('ş', "scedilla")
      , ('ť', "tcaron")
      , ('ź', "zacute")
      , ('˝', "doubleacute")
      , ('ž', "zcaron")
      , ('ż', "zabovedot")
      , ('Ŕ', "Racute")
      , ('Ă', "Abreve")
      , ('Ĺ', "Lacute")
      , ('Ć', "Cacute")
      , ('Č', "Ccaron")
      , ('Ę', "Eogonek")
      , ('Ě', "Ecaron")
      , ('Ď', "Dcaron")
      , ('Đ', "Dstroke")
      , ('Ń', "Nacute")
      , ('Ň', "Ncaron")
      , ('Ő', "Odoubleacute")
      , ('Ř', "Rcaron")
      , ('Ů', "Uring")
      , ('Ű', "Udoubleacute")
      , ('Ţ', "Tcedilla")
      , ('ŕ', "racute")
      , ('ă', "abreve")
      , ('ĺ', "lacute")
      , ('ć', "cacute")
      , ('č', "ccaron")
      , ('ę', "eogonek")
      , ('ě', "ecaron")
      , ('ď', "dcaron")
      , ('đ', "dstroke")
      , ('ń', "nacute")
      , ('ň', "ncaron")
      , ('ő', "odoubleacute")
      , ('ř', "rcaron")
      , ('ů', "uring")
      , ('ű', "udoubleacute")
      , ('ţ', "tcedilla")
      , ('˙', "abovedot")
      , ('Ħ', "Hstroke")
      , ('Ĥ', "Hcircumflex")
      , ('İ', "Iabovedot")
      , ('Ğ', "Gbreve")
      , ('Ĵ', "Jcircumflex")
      , ('ħ', "hstroke")
      , ('ĥ', "hcircumflex")
      , ('ı', "idotless")
      , ('ğ', "gbreve")
      , ('ĵ', "jcircumflex")
      , ('Ċ', "Cabovedot")
      , ('Ĉ', "Ccircumflex")
      , ('Ġ', "Gabovedot")
      , ('Ĝ', "Gcircumflex")
      , ('Ŭ', "Ubreve")
      , ('Ŝ', "Scircumflex")
      , ('ċ', "cabovedot")
      , ('ĉ', "ccircumflex")
      , ('ġ', "gabovedot")
      , ('ĝ', "gcircumflex")
      , ('ŭ', "ubreve")
      , ('ŝ', "scircumflex")
      , ('ĸ', "kra")
      , ('Ŗ', "Rcedilla")
      , ('Ĩ', "Itilde")
      , ('Ļ', "Lcedilla")
      , ('Ē', "Emacron")
      , ('Ģ', "Gcedilla")
      , ('Ŧ', "Tslash")
      , ('ŗ', "rcedilla")
      , ('ĩ', "itilde")
      , ('ļ', "lcedilla")
      , ('ē', "emacron")
      , ('ģ', "gcedilla")
      , ('ŧ', "tslash")
      , ('Ŋ', "ENG")
      , ('ŋ', "eng")
      , ('Ā', "Amacron")
      , ('Į', "Iogonek")
      , ('Ė', "Eabovedot")
      , ('Ī', "Imacron")
      , ('Ņ', "Ncedilla")
      , ('Ō', "Omacron")
      , ('Ķ', "Kcedilla")
      , ('Ų', "Uogonek")
      , ('Ũ', "Utilde")
      , ('Ū', "Umacron")
      , ('ā', "amacron")
      , ('į', "iogonek")
      , ('ė', "eabovedot")
      , ('ī', "imacron")
      , ('ņ', "ncedilla")
      , ('ō', "omacron")
      , ('ķ', "kcedilla")
      , ('ų', "uogonek")
      , ('ũ', "utilde")
      , ('ū', "umacron")
      , ('Ŵ', "Wcircumflex")
      , ('ŵ', "wcircumflex")
      , ('Ŷ', "Ycircumflex")
      , ('ŷ', "ycircumflex")
      , ('Ḃ', "Babovedot")
      , ('ḃ', "babovedot")
      , ('Ḋ', "Dabovedot")
      , ('ḋ', "dabovedot")
      , ('Ḟ', "Fabovedot")
      , ('ḟ', "fabovedot")
      , ('Ṁ', "Mabovedot")
      , ('ṁ', "mabovedot")
      , ('Ṗ', "Pabovedot")
      , ('ṗ', "pabovedot")
      , ('Ṡ', "Sabovedot")
      , ('ṡ', "sabovedot")
      , ('Ṫ', "Tabovedot")
      , ('ṫ', "tabovedot")
      , ('Ẁ', "Wgrave")
      , ('ẁ', "wgrave")
      , ('Ẃ', "Wacute")
      , ('ẃ', "wacute")
      , ('Ẅ', "Wdiaeresis")
      , ('ẅ', "wdiaeresis")
      , ('Ỳ', "Ygrave")
      , ('ỳ', "ygrave")
      , ('Œ', "OE")
      , ('œ', "oe")
      , ('Ÿ', "Ydiaeresis")
      , ('‾', "overline")
      , ('。', "kana_fullstop")
      , ('「', "kana_openingbracket")
      , ('」', "kana_closingbracket")
      , ('、', "kana_comma")
      , ('・', "kana_conjunctive")
      , ('ヲ', "kana_WO")
      , ('ァ', "kana_a")
      , ('ィ', "kana_i")
      , ('ゥ', "kana_u")
      , ('ェ', "kana_e")
      , ('ォ', "kana_o")
      , ('ャ', "kana_ya")
      , ('ュ', "kana_yu")
      , ('ョ', "kana_yo")
      , ('ッ', "kana_tsu")
      , ('ー', "prolongedsound")
      , ('ア', "kana_A")
      , ('イ', "kana_I")
      , ('ウ', "kana_U")
      , ('エ', "kana_E")
      , ('オ', "kana_O")
      , ('カ', "kana_KA")
      , ('キ', "kana_KI")
      , ('ク', "kana_KU")
      , ('ケ', "kana_KE")
      , ('コ', "kana_KO")
      , ('サ', "kana_SA")
      , ('シ', "kana_SHI")
      , ('ス', "kana_SU")
      , ('セ', "kana_SE")
      , ('ソ', "kana_SO")
      , ('タ', "kana_TA")
      , ('チ', "kana_CHI")
      , ('ツ', "kana_TSU")
      , ('テ', "kana_TE")
      , ('ト', "kana_TO")
      , ('ナ', "kana_NA")
      , ('ニ', "kana_NI")
      , ('ヌ', "kana_NU")
      , ('ネ', "kana_NE")
      , ('ノ', "kana_NO")
      , ('ハ', "kana_HA")
      , ('ヒ', "kana_HI")
      , ('フ', "kana_FU")
      , ('ヘ', "kana_HE")
      , ('ホ', "kana_HO")
      , ('マ', "kana_MA")
      , ('ミ', "kana_MI")
      , ('ム', "kana_MU")
      , ('メ', "kana_ME")
      , ('モ', "kana_MO")
      , ('ヤ', "kana_YA")
      , ('ユ', "kana_YU")
      , ('ヨ', "kana_YO")
      , ('ラ', "kana_RA")
      , ('リ', "kana_RI")
      , ('ル', "kana_RU")
      , ('レ', "kana_RE")
      , ('ロ', "kana_RO")
      , ('ワ', "kana_WA")
      , ('ン', "kana_N")
      , ('゛', "voicedsound")
      , ('゜', "semivoicedsound")
      , ('۰', "Farsi_0")
      , ('۱', "Farsi_1")
      , ('۲', "Farsi_2")
      , ('۳', "Farsi_3")
      , ('۴', "Farsi_4")
      , ('۵', "Farsi_5")
      , ('۶', "Farsi_6")
      , ('۷', "Farsi_7")
      , ('۸', "Farsi_8")
      , ('۹', "Farsi_9")
      , ('٪', "Arabic_percent")
      , ('ٰ', "Arabic_superscript_alef")
      , ('ٹ', "Arabic_tteh")
      , ('پ', "Arabic_peh")
      , ('چ', "Arabic_tcheh")
      , ('ڈ', "Arabic_ddal")
      , ('ڑ', "Arabic_rreh")
      , ('،', "Arabic_comma")
      , ('۔', "Arabic_fullstop")
      , ('٠', "Arabic_0")
      , ('١', "Arabic_1")
      , ('٢', "Arabic_2")
      , ('٣', "Arabic_3")
      , ('٤', "Arabic_4")
      , ('٥', "Arabic_5")
      , ('٦', "Arabic_6")
      , ('٧', "Arabic_7")
      , ('٨', "Arabic_8")
      , ('٩', "Arabic_9")
      , ('؛', "Arabic_semicolon")
      , ('؟', "Arabic_question_mark")
      , ('ء', "Arabic_hamza")
      , ('آ', "Arabic_maddaonalef")
      , ('أ', "Arabic_hamzaonalef")
      , ('ؤ', "Arabic_hamzaonwaw")
      , ('إ', "Arabic_hamzaunderalef")
      , ('ئ', "Arabic_hamzaonyeh")
      , ('ا', "Arabic_alef")
      , ('ب', "Arabic_beh")
      , ('ة', "Arabic_tehmarbuta")
      , ('ت', "Arabic_teh")
      , ('ث', "Arabic_theh")
      , ('ج', "Arabic_jeem")
      , ('ح', "Arabic_hah")
      , ('خ', "Arabic_khah")
      , ('د', "Arabic_dal")
      , ('ذ', "Arabic_thal")
      , ('ر', "Arabic_ra")
      , ('ز', "Arabic_zain")
      , ('س', "Arabic_seen")
      , ('ش', "Arabic_sheen")
      , ('ص', "Arabic_sad")
      , ('ض', "Arabic_dad")
      , ('ط', "Arabic_tah")
      , ('ظ', "Arabic_zah")
      , ('ع', "Arabic_ain")
      , ('غ', "Arabic_ghain")
      , ('ـ', "Arabic_tatweel")
      , ('ف', "Arabic_feh")
      , ('ق', "Arabic_qaf")
      , ('ك', "Arabic_kaf")
      , ('ل', "Arabic_lam")
      , ('م', "Arabic_meem")
      , ('ن', "Arabic_noon")
      , ('ه', "Arabic_ha")
      , ('و', "Arabic_waw")
      , ('ى', "Arabic_alefmaksura")
      , ('ي', "Arabic_yeh")
      , ('ً', "Arabic_fathatan")
      , ('ٌ', "Arabic_dammatan")
      , ('ٍ', "Arabic_kasratan")
      , ('َ', "Arabic_fatha")
      , ('ُ', "Arabic_damma")
      , ('ِ', "Arabic_kasra")
      , ('ّ', "Arabic_shadda")
      , ('ْ', "Arabic_sukun")
      , ('ٓ', "Arabic_madda_above")
      , ('ٔ', "Arabic_hamza_above")
      , ('ٕ', "Arabic_hamza_below")
      , ('ژ', "Arabic_jeh")
      , ('ڤ', "Arabic_veh")
      , ('ک', "Arabic_keheh")
      , ('گ', "Arabic_gaf")
      , ('ں', "Arabic_noon_ghunna")
      , ('ھ', "Arabic_heh_doachashmee")
      , ('ی', "Farsi_yeh")
      , ('ی', "Arabic_farsi_yeh")
      , ('ے', "Arabic_yeh_baree")
      , ('ہ', "Arabic_heh_goal")
      , ('Ғ', "Cyrillic_GHE_bar")
      , ('ғ', "Cyrillic_ghe_bar")
      , ('Җ', "Cyrillic_ZHE_descender")
      , ('җ', "Cyrillic_zhe_descender")
      , ('Қ', "Cyrillic_KA_descender")
      , ('қ', "Cyrillic_ka_descender")
      , ('Ҝ', "Cyrillic_KA_vertstroke")
      , ('ҝ', "Cyrillic_ka_vertstroke")
      , ('Ң', "Cyrillic_EN_descender")
      , ('ң', "Cyrillic_en_descender")
      , ('Ү', "Cyrillic_U_straight")
      , ('ү', "Cyrillic_u_straight")
      , ('Ұ', "Cyrillic_U_straight_bar")
      , ('ұ', "Cyrillic_u_straight_bar")
      , ('Ҳ', "Cyrillic_HA_descender")
      , ('ҳ', "Cyrillic_ha_descender")
      , ('Ҷ', "Cyrillic_CHE_descender")
      , ('ҷ', "Cyrillic_che_descender")
      , ('Ҹ', "Cyrillic_CHE_vertstroke")
      , ('ҹ', "Cyrillic_che_vertstroke")
      , ('Һ', "Cyrillic_SHHA")
      , ('һ', "Cyrillic_shha")
      , ('Ә', "Cyrillic_SCHWA")
      , ('ә', "Cyrillic_schwa")
      , ('Ӣ', "Cyrillic_I_macron")
      , ('ӣ', "Cyrillic_i_macron")
      , ('Ө', "Cyrillic_O_bar")
      , ('ө', "Cyrillic_o_bar")
      , ('Ӯ', "Cyrillic_U_macron")
      , ('ӯ', "Cyrillic_u_macron")
      , ('ђ', "Serbian_dje")
      , ('ѓ', "Macedonia_gje")
      , ('ё', "Cyrillic_io")
      , ('є', "Ukrainian_ie")
      , ('ѕ', "Macedonia_dse")
      , ('і', "Ukrainian_i")
      , ('ї', "Ukrainian_yi")
      , ('ј', "Cyrillic_je")
      , ('љ', "Cyrillic_lje")
      , ('њ', "Cyrillic_nje")
      , ('ћ', "Serbian_tshe")
      , ('ќ', "Macedonia_kje")
      , ('ґ', "Ukrainian_ghe_with_upturn")
      , ('ў', "Byelorussian_shortu")
      , ('џ', "Cyrillic_dzhe")
      , ('№', "numerosign")
      , ('Ђ', "Serbian_DJE")
      , ('Ѓ', "Macedonia_GJE")
      , ('Ё', "Cyrillic_IO")
      , ('Є', "Ukrainian_IE")
      , ('Ѕ', "Macedonia_DSE")
      , ('І', "Ukrainian_I")
      , ('Ї', "Ukrainian_YI")
      , ('Ј', "Cyrillic_JE")
      , ('Љ', "Cyrillic_LJE")
      , ('Њ', "Cyrillic_NJE")
      , ('Ћ', "Serbian_TSHE")
      , ('Ќ', "Macedonia_KJE")
      , ('Ґ', "Ukrainian_GHE_WITH_UPTURN")
      , ('Ў', "Byelorussian_SHORTU")
      , ('Џ', "Cyrillic_DZHE")
      , ('ю', "Cyrillic_yu")
      , ('а', "Cyrillic_a")
      , ('б', "Cyrillic_be")
      , ('ц', "Cyrillic_tse")
      , ('д', "Cyrillic_de")
      , ('е', "Cyrillic_ie")
      , ('ф', "Cyrillic_ef")
      , ('г', "Cyrillic_ghe")
      , ('х', "Cyrillic_ha")
      , ('и', "Cyrillic_i")
      , ('й', "Cyrillic_shorti")
      , ('к', "Cyrillic_ka")
      , ('л', "Cyrillic_el")
      , ('м', "Cyrillic_em")
      , ('н', "Cyrillic_en")
      , ('о', "Cyrillic_o")
      , ('п', "Cyrillic_pe")
      , ('я', "Cyrillic_ya")
      , ('р', "Cyrillic_er")
      , ('с', "Cyrillic_es")
      , ('т', "Cyrillic_te")
      , ('у', "Cyrillic_u")
      , ('ж', "Cyrillic_zhe")
      , ('в', "Cyrillic_ve")
      , ('ь', "Cyrillic_softsign")
      , ('ы', "Cyrillic_yeru")
      , ('з', "Cyrillic_ze")
      , ('ш', "Cyrillic_sha")
      , ('э', "Cyrillic_e")
      , ('щ', "Cyrillic_shcha")
      , ('ч', "Cyrillic_che")
      , ('ъ', "Cyrillic_hardsign")
      , ('Ю', "Cyrillic_YU")
      , ('А', "Cyrillic_A")
      , ('Б', "Cyrillic_BE")
      , ('Ц', "Cyrillic_TSE")
      , ('Д', "Cyrillic_DE")
      , ('Е', "Cyrillic_IE")
      , ('Ф', "Cyrillic_EF")
      , ('Г', "Cyrillic_GHE")
      , ('Х', "Cyrillic_HA")
      , ('И', "Cyrillic_I")
      , ('Й', "Cyrillic_SHORTI")
      , ('К', "Cyrillic_KA")
      , ('Л', "Cyrillic_EL")
      , ('М', "Cyrillic_EM")
      , ('Н', "Cyrillic_EN")
      , ('О', "Cyrillic_O")
      , ('П', "Cyrillic_PE")
      , ('Я', "Cyrillic_YA")
      , ('Р', "Cyrillic_ER")
      , ('С', "Cyrillic_ES")
      , ('Т', "Cyrillic_TE")
      , ('У', "Cyrillic_U")
      , ('Ж', "Cyrillic_ZHE")
      , ('В', "Cyrillic_VE")
      , ('Ь', "Cyrillic_SOFTSIGN")
      , ('Ы', "Cyrillic_YERU")
      , ('З', "Cyrillic_ZE")
      , ('Ш', "Cyrillic_SHA")
      , ('Э', "Cyrillic_E")
      , ('Щ', "Cyrillic_SHCHA")
      , ('Ч', "Cyrillic_CHE")
      , ('Ъ', "Cyrillic_HARDSIGN")
      , ('Ά', "Greek_ALPHAaccent")
      , ('Έ', "Greek_EPSILONaccent")
      , ('Ή', "Greek_ETAaccent")
      , ('Ί', "Greek_IOTAaccent")
      , ('Ϊ', "Greek_IOTAdieresis")
      , ('Ό', "Greek_OMICRONaccent")
      , ('Ύ', "Greek_UPSILONaccent")
      , ('Ϋ', "Greek_UPSILONdieresis")
      , ('Ώ', "Greek_OMEGAaccent")
      , ('΅', "Greek_accentdieresis")
      , ('―', "Greek_horizbar")
      , ('ά', "Greek_alphaaccent")
      , ('έ', "Greek_epsilonaccent")
      , ('ή', "Greek_etaaccent")
      , ('ί', "Greek_iotaaccent")
      , ('ϊ', "Greek_iotadieresis")
      , ('ΐ', "Greek_iotaaccentdieresis")
      , ('ό', "Greek_omicronaccent")
      , ('ύ', "Greek_upsilonaccent")
      , ('ϋ', "Greek_upsilondieresis")
      , ('ΰ', "Greek_upsilonaccentdieresis")
      , ('ώ', "Greek_omegaaccent")
      , ('Α', "Greek_ALPHA")
      , ('Β', "Greek_BETA")
      , ('Γ', "Greek_GAMMA")
      , ('Δ', "Greek_DELTA")
      , ('Ε', "Greek_EPSILON")
      , ('Ζ', "Greek_ZETA")
      , ('Η', "Greek_ETA")
      , ('Θ', "Greek_THETA")
      , ('Ι', "Greek_IOTA")
      , ('Κ', "Greek_KAPPA")
      , ('Λ', "Greek_LAMDA")
      , ('Λ', "Greek_LAMBDA")
      , ('Μ', "Greek_MU")
      , ('Ν', "Greek_NU")
      , ('Ξ', "Greek_XI")
      , ('Ο', "Greek_OMICRON")
      , ('Π', "Greek_PI")
      , ('Ρ', "Greek_RHO")
      , ('Σ', "Greek_SIGMA")
      , ('Τ', "Greek_TAU")
      , ('Υ', "Greek_UPSILON")
      , ('Φ', "Greek_PHI")
      , ('Χ', "Greek_CHI")
      , ('Ψ', "Greek_PSI")
      , ('Ω', "Greek_OMEGA")
      , ('α', "Greek_alpha")
      , ('β', "Greek_beta")
      , ('γ', "Greek_gamma")
      , ('δ', "Greek_delta")
      , ('ε', "Greek_epsilon")
      , ('ζ', "Greek_zeta")
      , ('η', "Greek_eta")
      , ('θ', "Greek_theta")
      , ('ι', "Greek_iota")
      , ('κ', "Greek_kappa")
      , ('λ', "Greek_lamda")
      , ('λ', "Greek_lambda")
      , ('μ', "Greek_mu")
      , ('ν', "Greek_nu")
      , ('ξ', "Greek_xi")
      , ('ο', "Greek_omicron")
      , ('π', "Greek_pi")
      , ('ρ', "Greek_rho")
      , ('σ', "Greek_sigma")
      , ('ς', "Greek_finalsmallsigma")
      , ('τ', "Greek_tau")
      , ('υ', "Greek_upsilon")
      , ('φ', "Greek_phi")
      , ('χ', "Greek_chi")
      , ('ψ', "Greek_psi")
      , ('ω', "Greek_omega")
      , ('⎷', "leftradical")
      , ('⌠', "topintegral")
      , ('⌡', "botintegral")
      , ('⎡', "topleftsqbracket")
      , ('⎣', "botleftsqbracket")
      , ('⎤', "toprightsqbracket")
      , ('⎦', "botrightsqbracket")
      , ('⎛', "topleftparens")
      , ('⎝', "botleftparens")
      , ('⎞', "toprightparens")
      , ('⎠', "botrightparens")
      , ('⎨', "leftmiddlecurlybrace")
      , ('⎬', "rightmiddlecurlybrace")
      , ('≤', "lessthanequal")
      , ('≠', "notequal")
      , ('≥', "greaterthanequal")
      , ('∫', "integral")
      , ('∴', "therefore")
      , ('∝', "variation")
      , ('∞', "infinity")
      , ('∇', "nabla")
      , ('∼', "approximate")
      , ('≃', "similarequal")
      , ('⇔', "ifonlyif")
      , ('⇒', "implies")
      , ('≡', "identical")
      , ('√', "radical")
      , ('⊂', "includedin")
      , ('⊃', "includes")
      , ('∩', "intersection")
      , ('∪', "union")
      , ('∧', "logicaland")
      , ('∨', "logicalor")
      , ('∂', "partialderivative")
      , ('ƒ', "function")
      , ('←', "leftarrow")
      , ('↑', "uparrow")
      , ('→', "rightarrow")
      , ('↓', "downarrow")
      , ('◆', "soliddiamond")
      , ('▒', "checkerboard")
      , ('␉', "ht")
      , ('␌', "ff")
      , ('␍', "cr")
      , ('␊', "lf")
      , ('␤', "nl")
      , ('␋', "vt")
      , ('┘', "lowrightcorner")
      , ('┐', "uprightcorner")
      , ('┌', "upleftcorner")
      , ('└', "lowleftcorner")
      , ('┼', "crossinglines")
      , ('⎺', "horizlinescan1")
      , ('⎻', "horizlinescan3")
      , ('─', "horizlinescan5")
      , ('⎼', "horizlinescan7")
      , ('⎽', "horizlinescan9")
      , ('├', "leftt")
      , ('┤', "rightt")
      , ('┴', "bott")
      , ('┬', "topt")
      , ('│', "vertbar")
      , (' ', "emspace")
      , (' ', "enspace")
      , (' ', "em3space")
      , (' ', "em4space")
      , (' ', "digitspace")
      , (' ', "punctspace")
      , (' ', "thinspace")
      , (' ', "hairspace")
      , ('—', "emdash")
      , ('–', "endash")
      , ('…', "ellipsis")
      , ('‥', "doubbaselinedot")
      , ('⅓', "onethird")
      , ('⅔', "twothirds")
      , ('⅕', "onefifth")
      , ('⅖', "twofifths")
      , ('⅗', "threefifths")
      , ('⅘', "fourfifths")
      , ('⅙', "onesixth")
      , ('⅚', "fivesixths")
      , ('℅', "careof")
      , ('‒', "figdash")
      , ('⅛', "oneeighth")
      , ('⅜', "threeeighths")
      , ('⅝', "fiveeighths")
      , ('⅞', "seveneighths")
      , ('™', "trademark")
      , ('‘', "leftsinglequotemark")
      , ('’', "rightsinglequotemark")
      , ('“', "leftdoublequotemark")
      , ('”', "rightdoublequotemark")
      , ('℞', "prescription")
      , ('‰', "permille")
      , ('′', "minutes")
      , ('″', "seconds")
      , ('✝', "latincross")
      , ('♣', "club")
      , ('♦', "diamond")
      , ('♥', "heart")
      , ('✠', "maltesecross")
      , ('†', "dagger")
      , ('‡', "doubledagger")
      , ('✓', "checkmark")
      , ('✗', "ballotcross")
      , ('♯', "musicalsharp")
      , ('♭', "musicalflat")
      , ('♂', "malesymbol")
      , ('♀', "femalesymbol")
      , ('☎', "telephone")
      , ('⌕', "telephonerecorder")
      , ('℗', "phonographcopyright")
      , ('‸', "caret")
      , ('‚', "singlelowquotemark")
      , ('„', "doublelowquotemark")
      , ('⊤', "downtack")
      , ('⌊', "downstile")
      , ('∘', "jot")
      , ('⎕', "quad")
      , ('⊥', "uptack")
      , ('○', "circle")
      , ('⌈', "upstile")
      , ('⊣', "lefttack")
      , ('⊢', "righttack")
      , ('‗', "hebrew_doublelowline")
      , ('א', "hebrew_aleph")
      , ('ב', "hebrew_bet")
      , ('ג', "hebrew_gimel")
      , ('ד', "hebrew_dalet")
      , ('ה', "hebrew_he")
      , ('ו', "hebrew_waw")
      , ('ז', "hebrew_zain")
      , ('ח', "hebrew_chet")
      , ('ט', "hebrew_tet")
      , ('י', "hebrew_yod")
      , ('ך', "hebrew_finalkaph")
      , ('כ', "hebrew_kaph")
      , ('ל', "hebrew_lamed")
      , ('ם', "hebrew_finalmem")
      , ('מ', "hebrew_mem")
      , ('ן', "hebrew_finalnun")
      , ('נ', "hebrew_nun")
      , ('ס', "hebrew_samech")
      , ('ע', "hebrew_ayin")
      , ('ף', "hebrew_finalpe")
      , ('פ', "hebrew_pe")
      , ('ץ', "hebrew_finalzade")
      , ('צ', "hebrew_zade")
      , ('ק', "hebrew_qoph")
      , ('ר', "hebrew_resh")
      , ('ש', "hebrew_shin")
      , ('ת', "hebrew_taw")
      , ('ก', "Thai_kokai")
      , ('ข', "Thai_khokhai")
      , ('ฃ', "Thai_khokhuat")
      , ('ค', "Thai_khokhwai")
      , ('ฅ', "Thai_khokhon")
      , ('ฆ', "Thai_khorakhang")
      , ('ง', "Thai_ngongu")
      , ('จ', "Thai_chochan")
      , ('ฉ', "Thai_choching")
      , ('ช', "Thai_chochang")
      , ('ซ', "Thai_soso")
      , ('ฌ', "Thai_chochoe")
      , ('ญ', "Thai_yoying")
      , ('ฎ', "Thai_dochada")
      , ('ฏ', "Thai_topatak")
      , ('ฐ', "Thai_thothan")
      , ('ฑ', "Thai_thonangmontho")
      , ('ฒ', "Thai_thophuthao")
      , ('ณ', "Thai_nonen")
      , ('ด', "Thai_dodek")
      , ('ต', "Thai_totao")
      , ('ถ', "Thai_thothung")
      , ('ท', "Thai_thothahan")
      , ('ธ', "Thai_thothong")
      , ('น', "Thai_nonu")
      , ('บ', "Thai_bobaimai")
      , ('ป', "Thai_popla")
      , ('ผ', "Thai_phophung")
      , ('ฝ', "Thai_fofa")
      , ('พ', "Thai_phophan")
      , ('ฟ', "Thai_fofan")
      , ('ภ', "Thai_phosamphao")
      , ('ม', "Thai_moma")
      , ('ย', "Thai_yoyak")
      , ('ร', "Thai_rorua")
      , ('ฤ', "Thai_ru")
      , ('ล', "Thai_loling")
      , ('ฦ', "Thai_lu")
      , ('ว', "Thai_wowaen")
      , ('ศ', "Thai_sosala")
      , ('ษ', "Thai_sorusi")
      , ('ส', "Thai_sosua")
      , ('ห', "Thai_hohip")
      , ('ฬ', "Thai_lochula")
      , ('อ', "Thai_oang")
      , ('ฮ', "Thai_honokhuk")
      , ('ฯ', "Thai_paiyannoi")
      , ('ะ', "Thai_saraa")
      , ('ั', "Thai_maihanakat")
      , ('า', "Thai_saraaa")
      , ('ำ', "Thai_saraam")
      , ('ิ', "Thai_sarai")
      , ('ี', "Thai_saraii")
      , ('ึ', "Thai_saraue")
      , ('ื', "Thai_sarauee")
      , ('ุ', "Thai_sarau")
      , ('ู', "Thai_sarauu")
      , ('ฺ', "Thai_phinthu")
      , ('฿', "Thai_baht")
      , ('เ', "Thai_sarae")
      , ('แ', "Thai_saraae")
      , ('โ', "Thai_sarao")
      , ('ใ', "Thai_saraaimaimuan")
      , ('ไ', "Thai_saraaimaimalai")
      , ('ๅ', "Thai_lakkhangyao")
      , ('ๆ', "Thai_maiyamok")
      , ('็', "Thai_maitaikhu")
      , ('่', "Thai_maiek")
      , ('้', "Thai_maitho")
      , ('๊', "Thai_maitri")
      , ('๋', "Thai_maichattawa")
      , ('์', "Thai_thanthakhat")
      , ('ํ', "Thai_nikhahit")
      , ('๐', "Thai_leksun")
      , ('๑', "Thai_leknung")
      , ('๒', "Thai_leksong")
      , ('๓', "Thai_leksam")
      , ('๔', "Thai_leksi")
      , ('๕', "Thai_lekha")
      , ('๖', "Thai_lekhok")
      , ('๗', "Thai_lekchet")
      , ('๘', "Thai_lekpaet")
      , ('๙', "Thai_lekkao")
      , ('ㄱ', "Hangul_Kiyeog")
      , ('ㄲ', "Hangul_SsangKiyeog")
      , ('ㄳ', "Hangul_KiyeogSios")
      , ('ㄴ', "Hangul_Nieun")
      , ('ㄵ', "Hangul_NieunJieuj")
      , ('ㄶ', "Hangul_NieunHieuh")
      , ('ㄷ', "Hangul_Dikeud")
      , ('ㄸ', "Hangul_SsangDikeud")
      , ('ㄹ', "Hangul_Rieul")
      , ('ㄺ', "Hangul_RieulKiyeog")
      , ('ㄻ', "Hangul_RieulMieum")
      , ('ㄼ', "Hangul_RieulPieub")
      , ('ㄽ', "Hangul_RieulSios")
      , ('ㄾ', "Hangul_RieulTieut")
      , ('ㄿ', "Hangul_RieulPhieuf")
      , ('ㅀ', "Hangul_RieulHieuh")
      , ('ㅁ', "Hangul_Mieum")
      , ('ㅂ', "Hangul_Pieub")
      , ('ㅃ', "Hangul_SsangPieub")
      , ('ㅄ', "Hangul_PieubSios")
      , ('ㅅ', "Hangul_Sios")
      , ('ㅆ', "Hangul_SsangSios")
      , ('ㅇ', "Hangul_Ieung")
      , ('ㅈ', "Hangul_Jieuj")
      , ('ㅉ', "Hangul_SsangJieuj")
      , ('ㅊ', "Hangul_Cieuc")
      , ('ㅋ', "Hangul_Khieuq")
      , ('ㅌ', "Hangul_Tieut")
      , ('ㅍ', "Hangul_Phieuf")
      , ('ㅎ', "Hangul_Hieuh")
      , ('ㅏ', "Hangul_A")
      , ('ㅐ', "Hangul_AE")
      , ('ㅑ', "Hangul_YA")
      , ('ㅒ', "Hangul_YAE")
      , ('ㅓ', "Hangul_EO")
      , ('ㅔ', "Hangul_E")
      , ('ㅕ', "Hangul_YEO")
      , ('ㅖ', "Hangul_YE")
      , ('ㅗ', "Hangul_O")
      , ('ㅘ', "Hangul_WA")
      , ('ㅙ', "Hangul_WAE")
      , ('ㅚ', "Hangul_OE")
      , ('ㅛ', "Hangul_YO")
      , ('ㅜ', "Hangul_U")
      , ('ㅝ', "Hangul_WEO")
      , ('ㅞ', "Hangul_WE")
      , ('ㅟ', "Hangul_WI")
      , ('ㅠ', "Hangul_YU")
      , ('ㅡ', "Hangul_EU")
      , ('ㅢ', "Hangul_YI")
      , ('ㅣ', "Hangul_I")
      , ('ᆨ', "Hangul_J_Kiyeog")
      , ('ᆩ', "Hangul_J_SsangKiyeog")
      , ('ᆪ', "Hangul_J_KiyeogSios")
      , ('ᆫ', "Hangul_J_Nieun")
      , ('ᆬ', "Hangul_J_NieunJieuj")
      , ('ᆭ', "Hangul_J_NieunHieuh")
      , ('ᆮ', "Hangul_J_Dikeud")
      , ('ᆯ', "Hangul_J_Rieul")
      , ('ᆰ', "Hangul_J_RieulKiyeog")
      , ('ᆱ', "Hangul_J_RieulMieum")
      , ('ᆲ', "Hangul_J_RieulPieub")
      , ('ᆳ', "Hangul_J_RieulSios")
      , ('ᆴ', "Hangul_J_RieulTieut")
      , ('ᆵ', "Hangul_J_RieulPhieuf")
      , ('ᆶ', "Hangul_J_RieulHieuh")
      , ('ᆷ', "Hangul_J_Mieum")
      , ('ᆸ', "Hangul_J_Pieub")
      , ('ᆹ', "Hangul_J_PieubSios")
      , ('ᆺ', "Hangul_J_Sios")
      , ('ᆻ', "Hangul_J_SsangSios")
      , ('ᆼ', "Hangul_J_Ieung")
      , ('ᆽ', "Hangul_J_Jieuj")
      , ('ᆾ', "Hangul_J_Cieuc")
      , ('ᆿ', "Hangul_J_Khieuq")
      , ('ᇀ', "Hangul_J_Tieut")
      , ('ᇁ', "Hangul_J_Phieuf")
      , ('ᇂ', "Hangul_J_Hieuh")
      , ('ㅭ', "Hangul_RieulYeorinHieuh")
      , ('ㅱ', "Hangul_SunkyeongeumMieum")
      , ('ㅸ', "Hangul_SunkyeongeumPieub")
      , ('ㅿ', "Hangul_PanSios")
      , ('ㆁ', "Hangul_KkogjiDalrinIeung")
      , ('ㆄ', "Hangul_SunkyeongeumPhieuf")
      , ('ㆆ', "Hangul_YeorinHieuh")
      , ('ㆍ', "Hangul_AraeA")
      , ('ㆎ', "Hangul_AraeAE")
      , ('ᇫ', "Hangul_J_PanSios")
      , ('ᇰ', "Hangul_J_KkogjiDalrinIeung")
      , ('ᇹ', "Hangul_J_YeorinHieuh")
      , ('և', "Armenian_ligature_ew")
      , ('։', "Armenian_full_stop")
      , ('։', "Armenian_verjaket")
      , ('՝', "Armenian_separation_mark")
      , ('՝', "Armenian_but")
      , ('֊', "Armenian_hyphen")
      , ('֊', "Armenian_yentamna")
      , ('՜', "Armenian_exclam")
      , ('՜', "Armenian_amanak")
      , ('՛', "Armenian_accent")
      , ('՛', "Armenian_shesht")
      , ('՞', "Armenian_question")
      , ('՞', "Armenian_paruyk")
      , ('Ա', "Armenian_AYB")
      , ('ա', "Armenian_ayb")
      , ('Բ', "Armenian_BEN")
      , ('բ', "Armenian_ben")
      , ('Գ', "Armenian_GIM")
      , ('գ', "Armenian_gim")
      , ('Դ', "Armenian_DA")
      , ('դ', "Armenian_da")
      , ('Ե', "Armenian_YECH")
      , ('ե', "Armenian_yech")
      , ('Զ', "Armenian_ZA")
      , ('զ', "Armenian_za")
      , ('Է', "Armenian_E")
      , ('է', "Armenian_e")
      , ('Ը', "Armenian_AT")
      , ('ը', "Armenian_at")
      , ('Թ', "Armenian_TO")
      , ('թ', "Armenian_to")
      , ('Ժ', "Armenian_ZHE")
      , ('ժ', "Armenian_zhe")
      , ('Ի', "Armenian_INI")
      , ('ի', "Armenian_ini")
      , ('Լ', "Armenian_LYUN")
      , ('լ', "Armenian_lyun")
      , ('Խ', "Armenian_KHE")
      , ('խ', "Armenian_khe")
      , ('Ծ', "Armenian_TSA")
      , ('ծ', "Armenian_tsa")
      , ('Կ', "Armenian_KEN")
      , ('կ', "Armenian_ken")
      , ('Հ', "Armenian_HO")
      , ('հ', "Armenian_ho")
      , ('Ձ', "Armenian_DZA")
      , ('ձ', "Armenian_dza")
      , ('Ղ', "Armenian_GHAT")
      , ('ղ', "Armenian_ghat")
      , ('Ճ', "Armenian_TCHE")
      , ('ճ', "Armenian_tche")
      , ('Մ', "Armenian_MEN")
      , ('մ', "Armenian_men")
      , ('Յ', "Armenian_HI")
      , ('յ', "Armenian_hi")
      , ('Ն', "Armenian_NU")
      , ('ն', "Armenian_nu")
      , ('Շ', "Armenian_SHA")
      , ('շ', "Armenian_sha")
      , ('Ո', "Armenian_VO")
      , ('ո', "Armenian_vo")
      , ('Չ', "Armenian_CHA")
      , ('չ', "Armenian_cha")
      , ('Պ', "Armenian_PE")
      , ('պ', "Armenian_pe")
      , ('Ջ', "Armenian_JE")
      , ('ջ', "Armenian_je")
      , ('Ռ', "Armenian_RA")
      , ('ռ', "Armenian_ra")
      , ('Ս', "Armenian_SE")
      , ('ս', "Armenian_se")
      , ('Վ', "Armenian_VEV")
      , ('վ', "Armenian_vev")
      , ('Տ', "Armenian_TYUN")
      , ('տ', "Armenian_tyun")
      , ('Ր', "Armenian_RE")
      , ('ր', "Armenian_re")
      , ('Ց', "Armenian_TSO")
      , ('ց', "Armenian_tso")
      , ('Ւ', "Armenian_VYUN")
      , ('ւ', "Armenian_vyun")
      , ('Փ', "Armenian_PYUR")
      , ('փ', "Armenian_pyur")
      , ('Ք', "Armenian_KE")
      , ('ք', "Armenian_ke")
      , ('Օ', "Armenian_O")
      , ('օ', "Armenian_o")
      , ('Ֆ', "Armenian_FE")
      , ('ֆ', "Armenian_fe")
      , ('՚', "Armenian_apostrophe")
      , ('ა', "Georgian_an")
      , ('ბ', "Georgian_ban")
      , ('გ', "Georgian_gan")
      , ('დ', "Georgian_don")
      , ('ე', "Georgian_en")
      , ('ვ', "Georgian_vin")
      , ('ზ', "Georgian_zen")
      , ('თ', "Georgian_tan")
      , ('ი', "Georgian_in")
      , ('კ', "Georgian_kan")
      , ('ლ', "Georgian_las")
      , ('მ', "Georgian_man")
      , ('ნ', "Georgian_nar")
      , ('ო', "Georgian_on")
      , ('პ', "Georgian_par")
      , ('ჟ', "Georgian_zhar")
      , ('რ', "Georgian_rae")
      , ('ს', "Georgian_san")
      , ('ტ', "Georgian_tar")
      , ('უ', "Georgian_un")
      , ('ფ', "Georgian_phar")
      , ('ქ', "Georgian_khar")
      , ('ღ', "Georgian_ghan")
      , ('ყ', "Georgian_qar")
      , ('შ', "Georgian_shin")
      , ('ჩ', "Georgian_chin")
      , ('ც', "Georgian_can")
      , ('ძ', "Georgian_jil")
      , ('წ', "Georgian_cil")
      , ('ჭ', "Georgian_char")
      , ('ხ', "Georgian_xan")
      , ('ჯ', "Georgian_jhan")
      , ('ჰ', "Georgian_hae")
      , ('ჱ', "Georgian_he")
      , ('ჲ', "Georgian_hie")
      , ('ჳ', "Georgian_we")
      , ('ჴ', "Georgian_har")
      , ('ჵ', "Georgian_hoe")
      , ('ჶ', "Georgian_fi")
      , ('Ẋ', "Xabovedot")
      , ('Ĭ', "Ibreve")
      , ('Ƶ', "Zstroke")
      , ('Ǧ', "Gcaron")
      , ('Ǒ', "Ocaron")
      , ('Ɵ', "Obarred")
      , ('ẋ', "xabovedot")
      , ('ĭ', "ibreve")
      , ('ƶ', "zstroke")
      , ('ǧ', "gcaron")
      , ('ǒ', "ocaron")
      , ('ɵ', "obarred")
      , ('Ə', "SCHWA")
      , ('ə', "schwa")
      , ('Ʒ', "EZH")
      , ('ʒ', "ezh")
      , ('Ḷ', "Lbelowdot")
      , ('ḷ', "lbelowdot")
      , ('Ạ', "Abelowdot")
      , ('ạ', "abelowdot")
      , ('Ả', "Ahook")
      , ('ả', "ahook")
      , ('Ấ', "Acircumflexacute")
      , ('ấ', "acircumflexacute")
      , ('Ầ', "Acircumflexgrave")
      , ('ầ', "acircumflexgrave")
      , ('Ẩ', "Acircumflexhook")
      , ('ẩ', "acircumflexhook")
      , ('Ẫ', "Acircumflextilde")
      , ('ẫ', "acircumflextilde")
      , ('Ậ', "Acircumflexbelowdot")
      , ('ậ', "acircumflexbelowdot")
      , ('Ắ', "Abreveacute")
      , ('ắ', "abreveacute")
      , ('Ằ', "Abrevegrave")
      , ('ằ', "abrevegrave")
      , ('Ẳ', "Abrevehook")
      , ('ẳ', "abrevehook")
      , ('Ẵ', "Abrevetilde")
      , ('ẵ', "abrevetilde")
      , ('Ặ', "Abrevebelowdot")
      , ('ặ', "abrevebelowdot")
      , ('Ẹ', "Ebelowdot")
      , ('ẹ', "ebelowdot")
      , ('Ẻ', "Ehook")
      , ('ẻ', "ehook")
      , ('Ẽ', "Etilde")
      , ('ẽ', "etilde")
      , ('Ế', "Ecircumflexacute")
      , ('ế', "ecircumflexacute")
      , ('Ề', "Ecircumflexgrave")
      , ('ề', "ecircumflexgrave")
      , ('Ể', "Ecircumflexhook")
      , ('ể', "ecircumflexhook")
      , ('Ễ', "Ecircumflextilde")
      , ('ễ', "ecircumflextilde")
      , ('Ệ', "Ecircumflexbelowdot")
      , ('ệ', "ecircumflexbelowdot")
      , ('Ỉ', "Ihook")
      , ('ỉ', "ihook")
      , ('Ị', "Ibelowdot")
      , ('ị', "ibelowdot")
      , ('Ọ', "Obelowdot")
      , ('ọ', "obelowdot")
      , ('Ỏ', "Ohook")
      , ('ỏ', "ohook")
      , ('Ố', "Ocircumflexacute")
      , ('ố', "ocircumflexacute")
      , ('Ồ', "Ocircumflexgrave")
      , ('ồ', "ocircumflexgrave")
      , ('Ổ', "Ocircumflexhook")
      , ('ổ', "ocircumflexhook")
      , ('Ỗ', "Ocircumflextilde")
      , ('ỗ', "ocircumflextilde")
      , ('Ộ', "Ocircumflexbelowdot")
      , ('ộ', "ocircumflexbelowdot")
      , ('Ớ', "Ohornacute")
      , ('ớ', "ohornacute")
      , ('Ờ', "Ohorngrave")
      , ('ờ', "ohorngrave")
      , ('Ở', "Ohornhook")
      , ('ở', "ohornhook")
      , ('Ỡ', "Ohorntilde")
      , ('ỡ', "ohorntilde")
      , ('Ợ', "Ohornbelowdot")
      , ('ợ', "ohornbelowdot")
      , ('Ụ', "Ubelowdot")
      , ('ụ', "ubelowdot")
      , ('Ủ', "Uhook")
      , ('ủ', "uhook")
      , ('Ứ', "Uhornacute")
      , ('ứ', "uhornacute")
      , ('Ừ', "Uhorngrave")
      , ('ừ', "uhorngrave")
      , ('Ử', "Uhornhook")
      , ('ử', "uhornhook")
      , ('Ữ', "Uhorntilde")
      , ('ữ', "uhorntilde")
      , ('Ự', "Uhornbelowdot")
      , ('ự', "uhornbelowdot")
      , ('Ỵ', "Ybelowdot")
      , ('ỵ', "ybelowdot")
      , ('Ỷ', "Yhook")
      , ('ỷ', "yhook")
      , ('Ỹ', "Ytilde")
      , ('ỹ', "ytilde")
      , ('Ơ', "Ohorn")
      , ('ơ', "ohorn")
      , ('Ư', "Uhorn")
      , ('ư', "uhorn")
      , ('̃', "combining_tilde")
      , ('̀', "combining_grave")
      , ('́', "combining_acute")
      , ('̉', "combining_hook")
      , ('̣', "combining_belowdot")
      , ('₠', "EcuSign")
      , ('₡', "ColonSign")
      , ('₢', "CruzeiroSign")
      , ('₣', "FFrancSign")
      , ('₤', "LiraSign")
      , ('₥', "MillSign")
      , ('₦', "NairaSign")
      , ('₧', "PesetaSign")
      , ('₨', "RupeeSign")
      , ('₩', "WonSign")
      , ('₪', "NewSheqelSign")
      , ('₫', "DongSign")
      , ('€', "EuroSign")
      , ('⁰', "zerosuperior")
      , ('⁴', "foursuperior")
      , ('⁵', "fivesuperior")
      , ('⁶', "sixsuperior")
      , ('⁷', "sevensuperior")
      , ('⁸', "eightsuperior")
      , ('⁹', "ninesuperior")
      , ('₀', "zerosubscript")
      , ('₁', "onesubscript")
      , ('₂', "twosubscript")
      , ('₃', "threesubscript")
      , ('₄', "foursubscript")
      , ('₅', "fivesubscript")
      , ('₆', "sixsubscript")
      , ('₇', "sevensubscript")
      , ('₈', "eightsubscript")
      , ('₉', "ninesubscript")
      , ('∂', "partdifferential")
      , ('∅', "emptyset")
      , ('∈', "elementof")
      , ('∉', "notelementof")
      , ('∋', "containsas")
      , ('√', "squareroot")
      , ('∛', "cuberoot")
      , ('∜', "fourthroot")
      , ('∬', "dintegral")
      , ('∭', "tintegral")
      , ('∵', "because")
      , ('≢', "notidentical")
      , ('≣', "stricteq")
      , ('⠀', "braille_blank")
      , ('⠁', "braille_dots_1")
      , ('⠂', "braille_dots_2")
      , ('⠃', "braille_dots_12")
      , ('⠄', "braille_dots_3")
      , ('⠅', "braille_dots_13")
      , ('⠆', "braille_dots_23")
      , ('⠇', "braille_dots_123")
      , ('⠈', "braille_dots_4")
      , ('⠉', "braille_dots_14")
      , ('⠊', "braille_dots_24")
      , ('⠋', "braille_dots_124")
      , ('⠌', "braille_dots_34")
      , ('⠍', "braille_dots_134")
      , ('⠎', "braille_dots_234")
      , ('⠏', "braille_dots_1234")
      , ('⠐', "braille_dots_5")
      , ('⠑', "braille_dots_15")
      , ('⠒', "braille_dots_25")
      , ('⠓', "braille_dots_125")
      , ('⠔', "braille_dots_35")
      , ('⠕', "braille_dots_135")
      , ('⠖', "braille_dots_235")
      , ('⠗', "braille_dots_1235")
      , ('⠘', "braille_dots_45")
      , ('⠙', "braille_dots_145")
      , ('⠚', "braille_dots_245")
      , ('⠛', "braille_dots_1245")
      , ('⠜', "braille_dots_345")
      , ('⠝', "braille_dots_1345")
      , ('⠞', "braille_dots_2345")
      , ('⠟', "braille_dots_12345")
      , ('⠠', "braille_dots_6")
      , ('⠡', "braille_dots_16")
      , ('⠢', "braille_dots_26")
      , ('⠣', "braille_dots_126")
      , ('⠤', "braille_dots_36")
      , ('⠥', "braille_dots_136")
      , ('⠦', "braille_dots_236")
      , ('⠧', "braille_dots_1236")
      , ('⠨', "braille_dots_46")
      , ('⠩', "braille_dots_146")
      , ('⠪', "braille_dots_246")
      , ('⠫', "braille_dots_1246")
      , ('⠬', "braille_dots_346")
      , ('⠭', "braille_dots_1346")
      , ('⠮', "braille_dots_2346")
      , ('⠯', "braille_dots_12346")
      , ('⠰', "braille_dots_56")
      , ('⠱', "braille_dots_156")
      , ('⠲', "braille_dots_256")
      , ('⠳', "braille_dots_1256")
      , ('⠴', "braille_dots_356")
      , ('⠵', "braille_dots_1356")
      , ('⠶', "braille_dots_2356")
      , ('⠷', "braille_dots_12356")
      , ('⠸', "braille_dots_456")
      , ('⠹', "braille_dots_1456")
      , ('⠺', "braille_dots_2456")
      , ('⠻', "braille_dots_12456")
      , ('⠼', "braille_dots_3456")
      , ('⠽', "braille_dots_13456")
      , ('⠾', "braille_dots_23456")
      , ('⠿', "braille_dots_123456")
      , ('⡀', "braille_dots_7")
      , ('⡁', "braille_dots_17")
      , ('⡂', "braille_dots_27")
      , ('⡃', "braille_dots_127")
      , ('⡄', "braille_dots_37")
      , ('⡅', "braille_dots_137")
      , ('⡆', "braille_dots_237")
      , ('⡇', "braille_dots_1237")
      , ('⡈', "braille_dots_47")
      , ('⡉', "braille_dots_147")
      , ('⡊', "braille_dots_247")
      , ('⡋', "braille_dots_1247")
      , ('⡌', "braille_dots_347")
      , ('⡍', "braille_dots_1347")
      , ('⡎', "braille_dots_2347")
      , ('⡏', "braille_dots_12347")
      , ('⡐', "braille_dots_57")
      , ('⡑', "braille_dots_157")
      , ('⡒', "braille_dots_257")
      , ('⡓', "braille_dots_1257")
      , ('⡔', "braille_dots_357")
      , ('⡕', "braille_dots_1357")
      , ('⡖', "braille_dots_2357")
      , ('⡗', "braille_dots_12357")
      , ('⡘', "braille_dots_457")
      , ('⡙', "braille_dots_1457")
      , ('⡚', "braille_dots_2457")
      , ('⡛', "braille_dots_12457")
      , ('⡜', "braille_dots_3457")
      , ('⡝', "braille_dots_13457")
      , ('⡞', "braille_dots_23457")
      , ('⡟', "braille_dots_123457")
      , ('⡠', "braille_dots_67")
      , ('⡡', "braille_dots_167")
      , ('⡢', "braille_dots_267")
      , ('⡣', "braille_dots_1267")
      , ('⡤', "braille_dots_367")
      , ('⡥', "braille_dots_1367")
      , ('⡦', "braille_dots_2367")
      , ('⡧', "braille_dots_12367")
      , ('⡨', "braille_dots_467")
      , ('⡩', "braille_dots_1467")
      , ('⡪', "braille_dots_2467")
      , ('⡫', "braille_dots_12467")
      , ('⡬', "braille_dots_3467")
      , ('⡭', "braille_dots_13467")
      , ('⡮', "braille_dots_23467")
      , ('⡯', "braille_dots_123467")
      , ('⡰', "braille_dots_567")
      , ('⡱', "braille_dots_1567")
      , ('⡲', "braille_dots_2567")
      , ('⡳', "braille_dots_12567")
      , ('⡴', "braille_dots_3567")
      , ('⡵', "braille_dots_13567")
      , ('⡶', "braille_dots_23567")
      , ('⡷', "braille_dots_123567")
      , ('⡸', "braille_dots_4567")
      , ('⡹', "braille_dots_14567")
      , ('⡺', "braille_dots_24567")
      , ('⡻', "braille_dots_124567")
      , ('⡼', "braille_dots_34567")
      , ('⡽', "braille_dots_134567")
      , ('⡾', "braille_dots_234567")
      , ('⡿', "braille_dots_1234567")
      , ('⢀', "braille_dots_8")
      , ('⢁', "braille_dots_18")
      , ('⢂', "braille_dots_28")
      , ('⢃', "braille_dots_128")
      , ('⢄', "braille_dots_38")
      , ('⢅', "braille_dots_138")
      , ('⢆', "braille_dots_238")
      , ('⢇', "braille_dots_1238")
      , ('⢈', "braille_dots_48")
      , ('⢉', "braille_dots_148")
      , ('⢊', "braille_dots_248")
      , ('⢋', "braille_dots_1248")
      , ('⢌', "braille_dots_348")
      , ('⢍', "braille_dots_1348")
      , ('⢎', "braille_dots_2348")
      , ('⢏', "braille_dots_12348")
      , ('⢐', "braille_dots_58")
      , ('⢑', "braille_dots_158")
      , ('⢒', "braille_dots_258")
      , ('⢓', "braille_dots_1258")
      , ('⢔', "braille_dots_358")
      , ('⢕', "braille_dots_1358")
      , ('⢖', "braille_dots_2358")
      , ('⢗', "braille_dots_12358")
      , ('⢘', "braille_dots_458")
      , ('⢙', "braille_dots_1458")
      , ('⢚', "braille_dots_2458")
      , ('⢛', "braille_dots_12458")
      , ('⢜', "braille_dots_3458")
      , ('⢝', "braille_dots_13458")
      , ('⢞', "braille_dots_23458")
      , ('⢟', "braille_dots_123458")
      , ('⢠', "braille_dots_68")
      , ('⢡', "braille_dots_168")
      , ('⢢', "braille_dots_268")
      , ('⢣', "braille_dots_1268")
      , ('⢤', "braille_dots_368")
      , ('⢥', "braille_dots_1368")
      , ('⢦', "braille_dots_2368")
      , ('⢧', "braille_dots_12368")
      , ('⢨', "braille_dots_468")
      , ('⢩', "braille_dots_1468")
      , ('⢪', "braille_dots_2468")
      , ('⢫', "braille_dots_12468")
      , ('⢬', "braille_dots_3468")
      , ('⢭', "braille_dots_13468")
      , ('⢮', "braille_dots_23468")
      , ('⢯', "braille_dots_123468")
      , ('⢰', "braille_dots_568")
      , ('⢱', "braille_dots_1568")
      , ('⢲', "braille_dots_2568")
      , ('⢳', "braille_dots_12568")
      , ('⢴', "braille_dots_3568")
      , ('⢵', "braille_dots_13568")
      , ('⢶', "braille_dots_23568")
      , ('⢷', "braille_dots_123568")
      , ('⢸', "braille_dots_4568")
      , ('⢹', "braille_dots_14568")
      , ('⢺', "braille_dots_24568")
      , ('⢻', "braille_dots_124568")
      , ('⢼', "braille_dots_34568")
      , ('⢽', "braille_dots_134568")
      , ('⢾', "braille_dots_234568")
      , ('⢿', "braille_dots_1234568")
      , ('⣀', "braille_dots_78")
      , ('⣁', "braille_dots_178")
      , ('⣂', "braille_dots_278")
      , ('⣃', "braille_dots_1278")
      , ('⣄', "braille_dots_378")
      , ('⣅', "braille_dots_1378")
      , ('⣆', "braille_dots_2378")
      , ('⣇', "braille_dots_12378")
      , ('⣈', "braille_dots_478")
      , ('⣉', "braille_dots_1478")
      , ('⣊', "braille_dots_2478")
      , ('⣋', "braille_dots_12478")
      , ('⣌', "braille_dots_3478")
      , ('⣍', "braille_dots_13478")
      , ('⣎', "braille_dots_23478")
      , ('⣏', "braille_dots_123478")
      , ('⣐', "braille_dots_578")
      , ('⣑', "braille_dots_1578")
      , ('⣒', "braille_dots_2578")
      , ('⣓', "braille_dots_12578")
      , ('⣔', "braille_dots_3578")
      , ('⣕', "braille_dots_13578")
      , ('⣖', "braille_dots_23578")
      , ('⣗', "braille_dots_123578")
      , ('⣘', "braille_dots_4578")
      , ('⣙', "braille_dots_14578")
      , ('⣚', "braille_dots_24578")
      , ('⣛', "braille_dots_124578")
      , ('⣜', "braille_dots_34578")
      , ('⣝', "braille_dots_134578")
      , ('⣞', "braille_dots_234578")
      , ('⣟', "braille_dots_1234578")
      , ('⣠', "braille_dots_678")
      , ('⣡', "braille_dots_1678")
      , ('⣢', "braille_dots_2678")
      , ('⣣', "braille_dots_12678")
      , ('⣤', "braille_dots_3678")
      , ('⣥', "braille_dots_13678")
      , ('⣦', "braille_dots_23678")
      , ('⣧', "braille_dots_123678")
      , ('⣨', "braille_dots_4678")
      , ('⣩', "braille_dots_14678")
      , ('⣪', "braille_dots_24678")
      , ('⣫', "braille_dots_124678")
      , ('⣬', "braille_dots_34678")
      , ('⣭', "braille_dots_134678")
      , ('⣮', "braille_dots_234678")
      , ('⣯', "braille_dots_1234678")
      , ('⣰', "braille_dots_5678")
      , ('⣱', "braille_dots_15678")
      , ('⣲', "braille_dots_25678")
      , ('⣳', "braille_dots_125678")
      , ('⣴', "braille_dots_35678")
      , ('⣵', "braille_dots_135678")
      , ('⣶', "braille_dots_235678")
      , ('⣷', "braille_dots_1235678")
      , ('⣸', "braille_dots_45678")
      , ('⣹', "braille_dots_145678")
      , ('⣺', "braille_dots_245678")
      , ('⣻', "braille_dots_1245678")
      , ('⣼', "braille_dots_345678")
      , ('⣽', "braille_dots_1345678")
      , ('⣾', "braille_dots_2345678")
      , ('⣿', "braille_dots_12345678")
      , ('ං', "Sinh_ng")
      , ('ඃ', "Sinh_h2")
      , ('අ', "Sinh_a")
      , ('ආ', "Sinh_aa")
      , ('ඇ', "Sinh_ae")
      , ('ඈ', "Sinh_aee")
      , ('ඉ', "Sinh_i")
      , ('ඊ', "Sinh_ii")
      , ('උ', "Sinh_u")
      , ('ඌ', "Sinh_uu")
      , ('ඍ', "Sinh_ri")
      , ('ඎ', "Sinh_rii")
      , ('ඏ', "Sinh_lu")
      , ('ඐ', "Sinh_luu")
      , ('එ', "Sinh_e")
      , ('ඒ', "Sinh_ee")
      , ('ඓ', "Sinh_ai")
      , ('ඔ', "Sinh_o")
      , ('ඕ', "Sinh_oo")
      , ('ඖ', "Sinh_au")
      , ('ක', "Sinh_ka")
      , ('ඛ', "Sinh_kha")
      , ('ග', "Sinh_ga")
      , ('ඝ', "Sinh_gha")
      , ('ඞ', "Sinh_ng2")
      , ('ඟ', "Sinh_nga")
      , ('ච', "Sinh_ca")
      , ('ඡ', "Sinh_cha")
      , ('ජ', "Sinh_ja")
      , ('ඣ', "Sinh_jha")
      , ('ඤ', "Sinh_nya")
      , ('ඥ', "Sinh_jnya")
      , ('ඦ', "Sinh_nja")
      , ('ට', "Sinh_tta")
      , ('ඨ', "Sinh_ttha")
      , ('ඩ', "Sinh_dda")
      , ('ඪ', "Sinh_ddha")
      , ('ණ', "Sinh_nna")
      , ('ඬ', "Sinh_ndda")
      , ('ත', "Sinh_tha")
      , ('ථ', "Sinh_thha")
      , ('ද', "Sinh_dha")
      , ('ධ', "Sinh_dhha")
      , ('න', "Sinh_na")
      , ('ඳ', "Sinh_ndha")
      , ('ප', "Sinh_pa")
      , ('ඵ', "Sinh_pha")
      , ('බ', "Sinh_ba")
      , ('භ', "Sinh_bha")
      , ('ම', "Sinh_ma")
      , ('ඹ', "Sinh_mba")
      , ('ය', "Sinh_ya")
      , ('ර', "Sinh_ra")
      , ('ල', "Sinh_la")
      , ('ව', "Sinh_va")
      , ('ශ', "Sinh_sha")
      , ('ෂ', "Sinh_ssha")
      , ('ස', "Sinh_sa")
      , ('හ', "Sinh_ha")
      , ('ළ', "Sinh_lla")
      , ('ෆ', "Sinh_fa")
      , ('්', "Sinh_al")
      , ('ා', "Sinh_aa2")
      , ('ැ', "Sinh_ae2")
      , ('ෑ', "Sinh_aee2")
      , ('ි', "Sinh_i2")
      , ('ී', "Sinh_ii2")
      , ('ු', "Sinh_u2")
      , ('ූ', "Sinh_uu2")
      , ('ෘ', "Sinh_ru2")
      , ('ෙ', "Sinh_e2")
      , ('ේ', "Sinh_ee2")
      , ('ෛ', "Sinh_ai2")
      , ('ො', "Sinh_o2")
      , ('ෝ', "Sinh_oo2")
      , ('ෞ', "Sinh_au2")
      , ('ෟ', "Sinh_lu2")
      , ('ෲ', "Sinh_ruu2")
      , ('ෳ', "Sinh_luu2")
      , ('෴', "Sinh_kunddaliya")
      ]
  