From 02aa99f3015ee7b882625661879f304cece6d7fa Mon Sep 17 00:00:00 2001 From: Ben Reaves Date: Sat, 12 Dec 2020 12:11:46 -0600 Subject: [PATCH] - Removed all unused files and references --- .xkb/symbols/chromebook | 5 - .xkb/symbols/mac_gui | 781 ---- .xkb/symbols/mac_term | 210 - .xkb/symbols/mac_term_chromebook | 100 - .xkb/types/mac_gui | 53 - .xkb/types/mac_term | 53 - kinto_old/defaults.json | 86 - kinto_old/keyswap_service.sh | 26 - kinto_old/kintox11/binary/kintox11 | Bin 265416 -> 0 bytes kinto_old/kintox11/src/Makefile | 5 - kinto_old/kintox11/src/kintox11.c | 694 ---- kinto_old/setup.py | 631 --- kinto_old/system-config/.chrome-nw | 7 - kinto_old/system-config/.chrome-ww | 5 - kinto_old/system-config/.firefox-nw | 7 - .../system-config/budgie-daemon_10.5.1.md5 | 1 - .../system-config/budgie-desktop_10.5.1.md5 | 1 - kinto_old/system-config/caret_status.sh | 10 - kinto_old/system-config/caret_status_xkey.sh | 78 - kinto_old/system-config/cleanup.sh | 10 - kinto_old/system-config/keyboard.ids | 3630 ----------------- kinto_old/system-config/keyswap.service | 16 - kinto_old/system-config/keyswap.timer | 11 - kinto_old/system-config/keyswap_toggle.sh | 40 - kinto_old/system-config/kinto.desktop | 8 - kinto_old/system-config/xactive.sh | 10 - kinto_old/user_config.json | 76 - kinto_old/xkeysnail_service.sh | 508 --- .../linux.sublime-keybinds.chromebook | 705 ---- .../sublime-text3/linux.sublime-keybinds.mac | 706 ---- .../sublime-text3/linux.sublime-keybinds.org | 734 ---- .../sublime-text3/mac.sublime-keybinds.json | 706 ---- references/builtin-keyboard.json | 432 -- references/kintopy/kinto.py | 115 - references/old-files/chromebook.sh | 16 - references/old-files/install.py | 176 - references/old-files/mac_only.sh | 15 - references/old-files/mac_wordwise.sh | 15 - references/old-files/old_uninstall.sh | 9 - references/old-files/test.py | 316 -- references/shortcuts | 75 - references/symbol_names.txt | 1411 ------- 42 files changed, 12493 deletions(-) delete mode 100644 .xkb/symbols/chromebook delete mode 100644 .xkb/symbols/mac_gui delete mode 100644 .xkb/symbols/mac_term delete mode 100644 .xkb/symbols/mac_term_chromebook delete mode 100644 .xkb/types/mac_gui delete mode 100644 .xkb/types/mac_term delete mode 100644 kinto_old/defaults.json delete mode 100644 kinto_old/keyswap_service.sh delete mode 100644 kinto_old/kintox11/binary/kintox11 delete mode 100644 kinto_old/kintox11/src/Makefile delete mode 100644 kinto_old/kintox11/src/kintox11.c delete mode 100644 kinto_old/setup.py delete mode 100644 kinto_old/system-config/.chrome-nw delete mode 100644 kinto_old/system-config/.chrome-ww delete mode 100644 kinto_old/system-config/.firefox-nw delete mode 100644 kinto_old/system-config/budgie-daemon_10.5.1.md5 delete mode 100644 kinto_old/system-config/budgie-desktop_10.5.1.md5 delete mode 100644 kinto_old/system-config/caret_status.sh delete mode 100644 kinto_old/system-config/caret_status_xkey.sh delete mode 100644 kinto_old/system-config/cleanup.sh delete mode 100644 kinto_old/system-config/keyboard.ids delete mode 100644 kinto_old/system-config/keyswap.service delete mode 100644 kinto_old/system-config/keyswap.timer delete mode 100644 kinto_old/system-config/keyswap_toggle.sh delete mode 100644 kinto_old/system-config/kinto.desktop delete mode 100644 kinto_old/system-config/xactive.sh delete mode 100644 kinto_old/user_config.json delete mode 100755 kinto_old/xkeysnail_service.sh delete mode 100644 references/app-configs/sublime-text3/linux.sublime-keybinds.chromebook delete mode 100644 references/app-configs/sublime-text3/linux.sublime-keybinds.mac delete mode 100644 references/app-configs/sublime-text3/linux.sublime-keybinds.org delete mode 100644 references/app-configs/sublime-text3/mac.sublime-keybinds.json delete mode 100644 references/builtin-keyboard.json delete mode 100644 references/kintopy/kinto.py delete mode 100755 references/old-files/chromebook.sh delete mode 100755 references/old-files/install.py delete mode 100755 references/old-files/mac_only.sh delete mode 100755 references/old-files/mac_wordwise.sh delete mode 100755 references/old-files/old_uninstall.sh delete mode 100755 references/old-files/test.py delete mode 100644 references/shortcuts delete mode 100644 references/symbol_names.txt diff --git a/.xkb/symbols/chromebook b/.xkb/symbols/chromebook deleted file mode 100644 index 34585ce..0000000 --- a/.xkb/symbols/chromebook +++ /dev/null @@ -1,5 +0,0 @@ -partial modifier_keys -xkb_symbols "swap_lalt_lctrl" { - replace key { [ Control_L, Control_L ] }; - replace key { [ Alt_L, Meta_L ] }; -}; diff --git a/.xkb/symbols/mac_gui b/.xkb/symbols/mac_gui deleted file mode 100644 index 8c19c53..0000000 --- a/.xkb/symbols/mac_gui +++ /dev/null @@ -1,781 +0,0 @@ -// Template -// -// ONE_LEVEL_CTRL -// Base -// Shift -// Alt -// Shift Alt -// Control -// Shift Control -// Super -// Shift Super -// Control Alt -// Super Control -// Super Alt -// Super Control Alt -// -// replace key { -// type[Group1]= "ONE_LEVEL_CTRL", -// symbols[Group1]= [ -// Base, -// Alt, -// Shift Alt, -// Control, -// Shift Control, -// Super, -// Shift Super, -// Control Alt, -// Super Control", -// Super Alt, -// Super Control Alt -// ], -// actions[Group1]= [ -// NoAction(), -// RedirectKey(key=,modifiers=NewMod,clearmods=Mod1), -// RedirectKey(key=,modifiers=NewMod,clearmods=Mod1+Shift), -// RedirectKey(key=,modifiers=NewMod,clearmods=Control), -// RedirectKey(key=,modifiers=NewMod,clearmods=Control+Shift), -// RedirectKey(key=,modifiers=NewMod,clearmods=Super), -// RedirectKey(key=,modifiers=NewMod,clearmods=Super+Shift), -// RedirectKey(key=,modifiers=NewMod,clearmods=Control+Alt), -// RedirectKey(key=,modifiers=NewMod,clearmods=Super+Control), -// RedirectKey(key=,modifiers=NewMod,clearmods=Super+Mod1), -// RedirectKey(key=,modifiers=NewMod,clearmods=Control+Mod1) -// ] -// }; -hidden partial modifier_keys -xkb_symbols "swapescape" { - key { [ Escape ] }; - key { [ Caps_Lock ] }; -}; -hidden partial modifier_keys -xkb_symbols "caps_escape" { - key { [ Escape ] }; -}; -hidden partial modifier_keys -xkb_symbols "caps_shiftlock" { - replace key { [ Shift_Lock ] }; - modifier_map Shift { Shift_Lock }; -}; -hidden partial modifier_keys -xkb_symbols "caps_none" { - key { [ VoidSymbol ] }; -}; -default partial xkb_symbols "mac_levelssym" { - // // Minimize window Cmd + H = Alt + F9 - // // 2 caveats - // // 1 Cmd + H may not pass through on VMs - // // 2 may cause conflicts with apps - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ - // h, - // H, - // h, - // H, - // h - // ], - // actions[Group1]= [ - // NoAction(), - // NoAction(), - // NoAction(), - // NoAction(), - // RedirectKey(key=,modifiers=Super,clearmods=Control) - // ] - // }; - // Maximize Window Ctrl + Cmd + F = Alt+F10 - // Also maps Option + Cmd + F to Control+H for Replace - Sublime - // AD03=e,E - // AC01=a,A - // Ctrl + A - Beginning of Line - replace key { - type[Group1]= "ONE_LEVEL_SUPER", - symbols[Group1]= [ - // Base - a, - // Shift - A, - // Super - NoSymbol, - // Shift Super - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Super), - RedirectKey(key=,clearmods=Super) - ] - }; - // Ctrl + E - End of Line - replace key { - type[Group1]= "ONE_LEVEL_SUPER", - symbols[Group1]= [ - // Base - e, - // Shift - E, - // Super - NoSymbol, - // Shift Super - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Super), - RedirectKey(key=,clearmods=Super) - ] - }; - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - f, - // Shift - F, - // Alt - f, - // Shift Alt - F, - // Control - f, - // Shift Control - F, - // Super - f, - // Shift Super - F, - // Control Alt - h - // Super Control - // ,F10 // Default maximize - // // Nothing // KDE maximize - // Super Alt - // Super Control Alt - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - NoAction(), - // Shift Alt - NoAction(), - // Control - NoAction(), - // Shift Control - NoAction(), - // Super - NoAction(), - // Shift Super - NoAction(), - // Control Alt - RedirectKey(key=,clearmods=Mod1) - // Super Control - Fullscreen - // ,RedirectKey(key=,modifiers=Mod1,clearmods=Super+Control) // Default maximize - // // Nothing // KDE maximize - // Super Alt - // Super Control Alt - ] - }; - // Close App Cmd + Q = Alt + F4 - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - q, - // Shift - Q, - // Alt - q, - // Shift Alt - Q, - // Control - F4 - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - NoAction(), - // Shift Alt - NoAction(), - // Control - RedirectKey(key=,modifiers=Mod1,clearmods=Control) - ] - }; - // Show Desktop Cmd + F3 = Super + D - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - F3, - // Shift - F3, - // Alt - F3, - // Shift Alt - F3, - // Control - d - ], - actions[Group1]= [ - NoAction(), - NoAction(), - NoAction(), - NoAction(), - RedirectKey(key=,modifiers=Super,clearmods=Control) - ] - }; - // Fix the G key for Sublime Text - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - g, - // Shift - G, - // Alt - g, - // Shift Alt - G, - // Control - g, - // Shift Control - G, - // Super - NoSymbol, - // Shift Super - NoSymbol, - // Control Alt - g, - // Super Control - g, - // Super Alt - g, - // Super Control Alt - g - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Pass G Normally - RedirectKey(key=), - RedirectKey(key=), - // Find Next - RedirectKey(key=,clearmods=Control), - // Find Previous - RedirectKey(key=,clearmods=Control), - // Sublime Goto Line - RedirectKey(key=,modifiers=Control,clearmods=Super), - NoAction(), - // Sublime Quick Find - RedirectKey(key=,clearmods=Mod1), - // Sublime Select All Matches - RedirectKey(key=,modifiers=Mod1,clearmods=Super+Control), - NoAction(), - NoAction() - ] - }; - // LEFT to Begin Line or Beginning of word - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - Left, - // Shift - Left, - // Alt - Left, - // Shift Alt - Left, - // Control - NoSymbol, - // Shift Control - NoSymbol, - // Super - Left - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - Wordwise - RedirectKey(key=,mods=Control,clearmods=Mod1), - // Shift Alt - RedirectKey(key=,mods=Control,clearmods=Mod1), - // Control - RedirectKey(key=,clearmods=Control), - // Shift Control - RedirectKey(key=,clearmods=Control), - // Super - Change workspace - NoAction() - ] - }; - - // Right to End of Line or end of word - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - Right, - // Shift - Right, - // Alt - Right, - // Shift Alt - Right, - // Control - NoSymbol, - // Shift Control - NoSymbol, - // Super - Right - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - Wordwise - RedirectKey(key=,mods=Control,clearmods=Mod1), - // Shift Alt - RedirectKey(key=,mods=Control,clearmods=Mod1), - // Control - RedirectKey(key=,clearmods=Control), - // Shift Control - RedirectKey(key=,clearmods=Control), - // Super - Change workspace - NoAction() - ] - }; - - //Up to Mac Home - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - Up, - // Shift - Up, - // Alt - Up, - // Shift Alt - Up, - // Control - NoSymbol, - // Shift Control - NoSymbol, - // Super - Up, - // Shift Super - Up - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - Wordwise - RedirectKey(key=,clearmods=Mod1), - // Shift Alt - // RedirectKey(key=), // Chromebook multicursor - RedirectKey(key=,clearmods=Mod1), // Default multicursor - // Control - RedirectKey(key=), - // Shift Control - RedirectKey(key=), - // Super - Wordwise - Sublime? - RedirectKey(key=,clearmods=Super), - // Shift Super - RedirectKey(key=,modifiers=Mod1,clearmods=Super) - ] - }; - - // Down to Mac End - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - Down, - // Shift - Down, - // Alt - Down, - // Shift Alt - Down, - // Control - NoSymbol, - // Shift Control - NoSymbol, - // Super - Down, - // Shift Super - Down - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - Wordwise - RedirectKey(key=,clearmods=Mod1), - // Shift Alt - RedirectKey(key=,clearmods=Mod1), - // Control - RedirectKey(key=), - // Shift Control - RedirectKey(key=), - // Super - Wordwise - Sublime? - RedirectKey(key=,clearmods=Super), - // Shift Super - RedirectKey(key=,modifiers=Mod1,clearmods=Super) - ] - }; - // Alt BKSP to DELETE - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - BackSpace, - BackSpace, - BackSpace - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Mod1) - ] - }; - // // Full Print Screen - // // GalliumOS - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ 3, 3, 3, F5 ], - // actions[Group1]= [ NoAction(), NoAction(), NoAction(), RedirectKey(key=,clearmods=Shift) ] - // }; - // // Region Print Screen - // // GalliumOS - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ 4, 4, 4, F5 ], - // actions[Group1]= [ NoAction(), NoAction(), NoAction(), RedirectKey(key=) ] - // }; - // // Full Print Screen - // // Standard Ubuntu - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ 3, 3, 3, F5 ], - // actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,clearmods=Shift+Control) ] - // }; - // // Region Print Screen - // // Standard Ubuntu - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ 4, 4, 4, F5 ], - // actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,clearmods=Control) ] - // }; -}; -partial xkb_symbols "mac_appcycle_chromebook" { - // Cycle App and In App Tab Switching - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Tab, - Tab, - Tab, - Tab, - backslash, - backslash, - NoSymbol, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Alt - Redirect(key=,mods=Control,clearmods=Mod1), - // Alt + Shift - Redirect(key=,mods=Control,clearmods=Mod1), - // Control - Redirect(key=), - // Control+Shift - Redirect(key=), - // Super - NoAction(), - // Super + Shift - NoAction() - ] - }; -}; -partial xkb_symbols "mac_appcycle" { - // Cycle App and In App Tab Switching - key { [ F13 ] }; - key { [ F14 ] }; - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - Tab, - Tab, - F14, - F13, - NoSymbol, - NoSymbol - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Control + Shift - Redirect(key=), - // Control - Redirect(key=), - // Super - Redirect(key=,mods=Control,clearmods=Mod4+Super), - // Super + Shift - Redirect(key=,mods=Control,clearmods=Mod4+Super) - ] - }; -}; -partial xkb_symbols "mac_browsers_chromebook" { - // Cycle App and In App Tab Switching - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Tab, - Tab, - NoSymbol, - NoSymbol, - backslash, - backslash, - NoSymbol, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Alt - Redirect(key=,mods=Control,clearmods=Mod1), - // Alt + Shift - Redirect(key=,mods=Control,clearmods=Mod1+Shift), - // Control - Redirect(key=), - // Control+Shift - Redirect(key=), - // Super - NoAction(), - // Super + Shift - NoAction() - ] - }; - //Up to Mac Home - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Up, - Up, - Up, - Up, - NoSymbol, - NoSymbol, - Up - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Wordwise - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=), - RedirectKey(key=), - // Wordwise - Sublime? - RedirectKey(key=,clearmods=Super), - RedirectKey(key=,modifiers=Mod1,clearmods=Super) - ] - }; - // Down to Mac End - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Down, - Down, - Down, - Down, - NoSymbol, - NoSymbol, - Down - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Wordwise - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=), - RedirectKey(key=), - // Wordwise - Sublime? - RedirectKey(key=,clearmods=Super), - RedirectKey(key=,modifiers=Mod1,clearmods=Super) - ] - }; - // Alt BKSP to DELETE - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - BackSpace, - BackSpace, - BackSpace - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Mod1) - ] - }; -}; -partial xkb_symbols "mac_browsers" { - // Cycle App and In App Tab Switching - key { [ F13 ] }; - key { [ F14 ] }; - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - Tab, - Tab, - F14, - F13, - NoSymbol, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - Redirect(key=), - Redirect(key=), - Redirect(key=,mods=Control,clearmods=Mod4+Super), - Redirect(key=,mods=Control,clearmods=Mod4+Super+Shift) - ] - }; - //Up to Mac Home - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Up, - Up, - Up, - Up, - NoSymbol, - NoSymbol, - Up - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Wordwise - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=), - RedirectKey(key=), - // Wordwise - Sublime? - RedirectKey(key=,clearmods=Super), - RedirectKey(key=,modifiers=Mod1,clearmods=Super) - ] - }; - // Down to Mac End - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Down, - Down, - Down, - Down, - NoSymbol, - NoSymbol, - Down - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Wordwise - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=,clearmods=Mod1), - RedirectKey(key=), - RedirectKey(key=), - // Wordwise - Sublime? - RedirectKey(key=,clearmods=Super), - RedirectKey(key=,modifiers=Mod1,clearmods=Super) - ] - }; - // Alt BKSP to DELETE - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - BackSpace, - BackSpace, - BackSpace - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Mod1) - ] - }; -}; -partial xkb_symbols "mac_chrome" { - // Back Button - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Left, - Left, - NoSymbol, - NoSymbol, - Left - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - RedirectKey(key=), - // Alt - RedirectKey(key=), - // Control - RedirectKey(key=,modifiers=Mod1,clearmods=Control) - ] - }; - // Forwards Button - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - // Base - Right, - // Shift - Right, - // Alt - NoSymbol, - // Shift Alt - NoSymbol, - // Control - Right - ], - actions[Group1]= [ - // Base - NoAction(), - // Shift - NoAction(), - // Alt - RedirectKey(key=), - // Shift Alt - RedirectKey(key=), - // Control - RedirectKey(key=,modifiers=Mod1,clearmods=Control) - ] - }; -}; \ No newline at end of file diff --git a/.xkb/symbols/mac_term b/.xkb/symbols/mac_term deleted file mode 100644 index 6a57a0c..0000000 --- a/.xkb/symbols/mac_term +++ /dev/null @@ -1,210 +0,0 @@ -default partial xkb_symbols "mac_apple" { - key { - repeat= no, - type= "ONE_LEVEL", - symbols[Group1]= [ Control_L ], - actions[group1]=[ SetMods(modifiers=Control+Shift) ] - }; - key { - repeat= no, - type= "ONE_LEVEL", - symbols[Group1]= [ Control_R ], - actions[group1]=[ SetMods(modifiers=Control+Shift) ] - }; -}; -partial xkb_symbols "mac_win" { - key { - repeat= no, - type= "ONE_LEVEL", - symbols[Group1]= [ Hyper_L ], - actions[group1]=[ SetMods(modifiers=Shift+Control) ] - }; - key { - repeat= no, - type= "ONE_LEVEL", - symbols[Group1]= [ Hyper_R ], - actions[group1]=[ SetMods(modifiers=Shift+Control) ] - }; -}; -partial xkb_symbols "mac_global" { - // // Minimize Window Cmd + H = Alt+F9 - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ - // h, - // H, - // H - // ], - // actions[Group1]= [ - // NoAction(), - // NoAction(), - // RedirectKey(key=,modifiers=Super,clearmods=Control+Shift) - // ] - // }; - - // - // Some sort of glitch occurs on shifting F while this segment is active - // it is like the Control key is being held down when it isn't. - // - // // Maximize Window Ctrl + Cmd + F = Alt+F10 - // replace key { - // type[Group1]= "ONE_LEVEL_CTRL", - // symbols[Group1]= [ - // f, - // F, - // F - // ], - // actions[Group1]= [ - // // Base - // NoAction(), - // // Shift - // NoAction(), - // // Ctrl + Shift - // RedirectKey(key=,modifiers=Mod1,clearmods=Control+Shift) - // ] - // }; - - // Close App Cmd + Q = Alt + F4 - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - q, - Q, - F4 - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,modifiers=Mod1,clearmods=Control+Shift) - ] - }; - - // Show Desktop Cmd + F3 = Super + D - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - F3, - F3, - D - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,modifiers=Super,clearmods=Control+Shift) - ] - }; - - // Cycle App and In App Tab Switching - key { [ F13 ] }; - key { [ F14 ] }; - - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - Tab, - Tab, - // F13 // Default cmdtab - // F13 // KDE cmdtab - // Right // Elementary ecmdtab - ], - actions[Group1]= [ - NoAction(), - NoAction(), - // Redirect(key=) // Default cmdtab - // Redirect(key=,clearmods=Shift) // KDE cmdtab - // Redirect(key=,mods=Control+Shift,clearmods=Mod4+Super) // Elementary cmdtab - ] - }; - - // Page Up - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Up, - Up, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - - // Page Down - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Down, - Down, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - // HOME - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - Left, - Left, - NoSymbol, - Left - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control), - RedirectKey(key=,mods=Super,clearmods=Control) - ] - }; - // END - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - Right, - Right, - NoSymbol, - Right - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control), - RedirectKey(key=,mods=Super,clearmods=Control) - ] - }; - // Full Print Screen - // Standard Ubuntu - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - 3, - numbersign, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - // Region Print Screen - // Standard Ubuntu - replace key { - type[Group1]= "ONE_LEVEL_CMD", - symbols[Group1]= [ - 4, - dollar, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Control) - ] - }; -}; \ No newline at end of file diff --git a/.xkb/symbols/mac_term_chromebook b/.xkb/symbols/mac_term_chromebook deleted file mode 100644 index 93e1d70..0000000 --- a/.xkb/symbols/mac_term_chromebook +++ /dev/null @@ -1,100 +0,0 @@ -default partial xkb_symbols "mac_levelssym" { - key { - repeat= no, - type= "ONE_LEVEL", - symbols[Group1]= [ Hyper_L ], - actions[group1]=[ SetMods(modifiers=Shift+Control) ] - }; - key { - repeat= no, - type= "ONE_LEVEL", - symbols[Group1]= [ Hyper_R ], - actions[group1]=[ SetMods(modifiers=Shift+Control) ] - }; - // Page Up - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Up, - Up, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - // Page Down - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Down, - Down, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - // HOME - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Left, - Left, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - // END - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - Right, - Right, - NoSymbol - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift+Control) - ] - }; - // Full Print Screen - // GalliumOS - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - 3, - numbersign, - F5 - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=,clearmods=Shift) - ] - }; - // Region Print Screen - // GalliumOS - replace key { - type[Group1]= "ONE_LEVEL_CTRL", - symbols[Group1]= [ - 4, - dollar, - F5 - ], - actions[Group1]= [ - NoAction(), - NoAction(), - RedirectKey(key=) - ] - }; -}; diff --git a/.xkb/types/mac_gui b/.xkb/types/mac_gui deleted file mode 100644 index 9c747d0..0000000 --- a/.xkb/types/mac_gui +++ /dev/null @@ -1,53 +0,0 @@ -default partial xkb_types "addmac_levels" { - Virtual_modifiers Super; - type "ONE_LEVEL_CTRL" { - modifiers = Shift+Mod1+Super+Control; - map[Shift] = Level2; - map[Mod1] = Level3; - map[Shift+Mod1] = Level4; - map[Control] = Level5; - map[Shift+Control] = Level6; - map[Super] = Level7; - map[Shift+Super] = Level8; - map[Mod1+Control] = 9; - map[Super+Control] = 10; - map[Super+Mod1] = 11; - map[Super+Mod1+Control] = 12; - level_name[Level1] = "Base"; - level_name[Level2] = "Shift"; - level_name[Level3] = "Alt"; - level_name[Level4] = "Shift Alt"; - level_name[Level5] = "Control"; - level_name[Level6] = "Shift Control"; - level_name[Level7] = "Super"; - level_name[Level8] = "Shift Super"; - level_name[9] = "Control Alt"; - level_name[10] = "Super Control"; - level_name[11] = "Super Alt"; - level_name[12] = "Super Control Alt"; - }; - type "ONE_LEVEL_CMD" { - modifiers = Shift+Control+Super; - map[Shift] = Level2; - map[Shift+Control] = Level3; - map[Control] = Level4; - map[Super] = Level5; - map[Shift+Super] = Level6; - level_name[Level1] = "Base"; - level_name[Level2] = "Shift"; - level_name[Level3] = "Control Shift"; - level_name[Level4] = "Control"; - level_name[Level5] = "Super"; - level_name[Level6] = "Super Shift"; - }; - type "ONE_LEVEL_SUPER" { - modifiers = Shift+Super; - map[Shift] = Level2; - map[Super] = Level3; - map[Shift+Super] = Level4; - level_name[Level1] = "Base"; - level_name[Level2] = "Shift"; - level_name[Level3] = "Super"; - level_name[Level4] = "Super Shift"; - }; -}; diff --git a/.xkb/types/mac_term b/.xkb/types/mac_term deleted file mode 100644 index 10fa367..0000000 --- a/.xkb/types/mac_term +++ /dev/null @@ -1,53 +0,0 @@ -default partial xkb_types "addmac_levels" { - Virtual_modifiers Super; - type "ONE_LEVEL_CTRL" { - modifiers = Shift+Mod1+Super+Control; - map[Shift] = Level2; - map[Shift+Control] = Level3; - // map[Mod1] = Level4; - map[Shift+Mod1] = Level5; - map[Control] = Level6; - map[Super] = Level7; - map[Shift+Super] = Level8; - map[Mod1+Control] = 9; - map[Super+Control] = 10; - map[Super+Mod1] = 11; - map[Super+Mod1+Control] = 12; - level_name[Level1] = "Base"; - level_name[Level2] = "Shift"; - level_name[Level3] = "Shift Control"; - // level_name[Level4] = "Alt"; - level_name[Level5] = "Shift Alt"; - level_name[Level6] = "Control"; - level_name[Level7] = "Super"; - level_name[Level8] = "Shift Super"; - level_name[9] = "Control Alt"; - level_name[10] = "Super Control"; - level_name[11] = "Super Alt"; - level_name[12] = "Super Control Alt"; - }; - type "ONE_LEVEL_CMD" { - modifiers = Shift+Control+Super; - map[Shift] = Level2; - map[Shift+Control] = Level3; - map[Control] = Level4; - map[Super] = Level5; - map[Shift+Super] = Level6; - level_name[Level1] = "Base"; - level_name[Level2] = "Shift"; - level_name[Level3] = "Control Shift"; - level_name[Level4] = "Control"; - level_name[Level5] = "Super"; - level_name[Level6] = "Super Shift"; - }; - type "ONE_LEVEL_SUPER" { - modifiers = Shift+Super; - map[Shift] = Level2; - map[Super] = Level3; - map[Shift+Super] = Level4; - level_name[Level1] = "Base"; - level_name[Level2] = "Shift"; - level_name[Level3] = "Super"; - level_name[Level4] = "Super Shift"; - }; -}; diff --git a/kinto_old/defaults.json b/kinto_old/defaults.json deleted file mode 100644 index 4c5ee4b..0000000 --- a/kinto_old/defaults.json +++ /dev/null @@ -1,86 +0,0 @@ -{"defaultapps":[{ - "name":"term", - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty" ] - }], - "defaulttypes":["windows","mac","chromebook"], - "defaults":[{ - "id": 1, - "name":"Windows", - "type":"windows", - "active": false, - "description":"Standard Windows 104 Keyboards", - "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", - "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", - "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_win)+mac_term(mac_global)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"+mac_term(addmac_levels)" - }, - { - "id": 2, - "name":"Mac - hid driver (Recommended - Also supports Windows keyboards)", - "type":"mac", - "active": false, - "description":"Standard Mac Keyboards with Apple driver", - "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", - "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", - "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_win)+mac_term(mac_global)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"+mac_term(addmac_levels)", - "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" - }, - { - "id": 3, - "name":"Mac Only (VMs & non-official Apple keyboards)", - "type":"mac", - "active": true, - "description":"Standard Mac Keyboards", - "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", - "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", - "xkb_symbols_gui":"+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)", - "xkb_symbols_term":"+altwin(alt_super_win)+mac_term(mac_apple)+mac_term(mac_global)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"+mac_term(addmac_levels)" - }, - { - "id": 4, - "name":"Chromebook (xfce)", - "type":"chromebook", - "active": false, - "description":"Standard Chromebook Keyboards", - "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", - "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", - "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term_chromebook(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"+mac_term(addmac_levels)" - }, - { - "id": 5, - "name":"Chromebook (xfce) - Windows", - "type":"chromebook", - "active": false, - "description":"Chromebook with Windows 104 Keyboard", - "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen; setxkbmap -device $usbid -option altwin:ctrl_alt_win", - "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", - "fallbackgui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", - "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term_chromebook(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"+mac_term(addmac_levels)" - }, - { - "id": 6, - "name":"Chromebook (xfce) - Mac", - "type":"chromebook", - "active": false, - "description":"Chromebook with Mac Keyboard", - "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", - "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", - "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)", - "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term_chromebook(mac_levelssym)", - "xkb_types_gui":"+mac_gui(addmac_levels)", - "xkb_types_term":"+mac_term(addmac_levels)" - }] -} \ No newline at end of file diff --git a/kinto_old/keyswap_service.sh b/kinto_old/keyswap_service.sh deleted file mode 100644 index e00af8f..0000000 --- a/kinto_old/keyswap_service.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -systemctl --user stop keyswap >/dev/null 2>&1 -systemctl --user disable keyswap >/dev/null 2>&1 -systemctl --user stop keyswap.timer >/dev/null 2>&1 -systemctl --user disable keyswap.timer >/dev/null 2>&1 -mkdir -p ~/.config/systemd/user -mkdir -p ~/.config/autostart -cp ./system-config/keyswap.service ~/.config/systemd/user/keyswap.service -cp ./system-config/kinto.desktop ~/.config/autostart/kinto.desktop -cp ./system-config/keyswap.timer ~/.config/systemd/user/keyswap.timer -cp ./kintox11/binary/kintox11 ~/.config/kinto/kintox11 -cp ./system-config/xactive.sh ~/.config/kinto/xactive.sh -cp ./system-config/caret_status.sh ~/.config/kinto/caret_status.sh -cp ./system-config/cleanup.sh ~/.config/kinto/cleanup.sh -cp ./system-config/.firefox-nw ~/.config/kinto/.firefox-nw -sed -i "s/{username}/`whoami`/g" ~/.config/systemd/user/keyswap.service -sed -i "s/{displayid}/`echo "$DISPLAY"`/g" ~/.config/systemd/user/keyswap.service -# if [ "${#DISPLAY}" -gt 2 ] -# then -sed -i "s/#Environment/Environment/g" ~/.config/systemd/user/keyswap.service -# fi -systemctl --user daemon-reload -sed -i "s/ExecStart=/ExecStart=${swapcmd}/g" ~/.config/systemd/user/keyswap.service -systemctl --user enable keyswap.timer -systemctl --user start keyswap diff --git a/kinto_old/kintox11/binary/kintox11 b/kinto_old/kintox11/binary/kintox11 deleted file mode 100644 index ebeb40cc32f596669f83ad0776e4c6b5f5ec6916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265416 zcmeFa3v?7k_CG$87Xt=6C}?~#>Y#}NCM!|05Y3Po(jyaz0)h$)7!rv*f@DTO1cH-M z`r8g>Rd#V*zl-j=%dWc1x{8Pb39m$a1ysa$MAU8uB%ophA^*>kWoc}rh z{huR8(_Oc!Zryw9)~#E&s(P0AgCkR%PKWU?)p4zZrGCjF#Ui66CCw<}D0U2WoQ}Ua zj>{YwfKpDe$hAMSQhA2)bcu2Vrh4Tf-~K#blrx?Nh4f5NA_`d^Q!eHS>YFTI-Q)vRs_bXzj z<=y9XedbXC{4<`0Jc&m7e~yr+{pm&?{d2Rw4u`#7gQ#bJ`b2r-No~--9{8W$lkrDo z=%3M!@f`DIXd2bC(`TgJR0;pw>~Erexu`eu3!Y(rX0pz8IE<%3=Z&aG^88Q#iEeP* zB-%^HUpol^|BNT^C5Pk6nbo&nJ><%n(+16~o*kY)X#UWv2VFg6aBa=tU$F8_W_TlV zOK%wGKzBA0Oo*S!w6920{>nRE)V>{G{^7(&M(*3VYQ|}G&)v1oz(H+N8Tv={g=(1T zoA5?ui2r5YC!G#wRxg6xjQ{ChYvo(B)_?Kvy(9eZ9mu`l!SnarHR1fiBdRgvcp=;0 zAxNKLgHiGxG~ONjoFwo^Kv;L>r6lEVOalKb2|YuSlrKejH~zQ(dn^e(mnFgTLXz_S zB=8TDz&9qr|8f%e(j<89NK$@blJYk~VY-w5Z<647Jqdhv68QKeaGF-SYqvMxZhNO7 zJtPU86-nSHlJHA9-yQzzla#+83I3%?_}U5l-SM>`N%ls_{GJ?A8WKbQoMoP>UN z5_+^G_=}Rj_awpdViJ0kBzOiSq4Sd@_}3+YZ%xu}T9WbulhCs-N%?n@lz%o!`9CHp zKR-!%ZxT7Yo&?XFB>b*U0>3i}9w`ZYe-b(eC4nDJf~P!5`QIj?^NA$o2PKiumL%=I zk_3KN68NP_;JHcY3?!lR-XwT>C!zmPlJftX1YVH@eiHOt3|j5~7NXrO$N3Jo2Nf;< zrZf0?j<$=s!bbp4AC%Vw-0<6K1Ri_&heUY;Zj^Vx51KG5Opedhj>&&aJ$o zx;9ifcWhb7%$nJiW2fFev(ho)#&G4_1!Lz{;&mkZJ9I3`cNV^+=V z$+e-Wb3>CSb41;vnH4UXSzS3hG`@QFw3>OW`TTs|{Dd1S=ZE}vBhxWqOl8PFcW%vG zdFt$GGb`shCIn_zhsI8yTRC-Ftz$xIWhgLvPB=8OrXq~wn97-z6&%9yN@h;2t(B_@ zk9X$GnuULx3{ibZw5kRI zB=GEtS#uoW+DZc+s+>8~0q$xYq3T)GEW}zdV{*mx8I!A~R?h?qV%LFoh&jR#szD9> zshI~+Aw4ZT2h|{iN^}RSGq-Xc1kTG&bD(`ub0$crLU)R`XIIV>Z?h_AfmEu1{~T4d zm6bCbfDx&aCs)mx3+Yx7NhmR`CLCgUV6UoTW=$>8e0S|^OQBi3LC_`8Pp##-C|MC& zFsE|z?Ic!01{phQ7eN1JA+HM(5Hh=BYHcOa0Gg*xbKFrGA`#V8O=CJp^vzkosG1t8 zsV3qprq6ZURa-MRWHuzk#F|6n^QTU(s-8V{X7xRcYJ)C@Wb)+s5Iy5J4DiPtf?a@y3;ROH@XTgx*6LWh(F10zZ% z|6=ej1{av`L(RARA?9o1?W)0+cWx?Du%<}C+JaUbv|{0D{x{8%N=F&K083|3S{qV5 zs*!>JseYmstyXx7-V8iFOc<3-vy|aDsRrS3;crh-HU;Y&C*J9Q{*Tg!@Jj1AH~tTw zTaA@=hNF&%!9U9H#ItLDnk7HOaSKeMu@20xu7+#c)A1m)e-6i^zy1xDQ!dAEM7l4_ z@8Nh-q(kRWd+Cm6MEXpYpXzu?q&Yn)W_w0lz_6QbBJPqc;spkLm4Lf#@W4lmEk}+G zexrcr+2FSd_)r^shJY8_;P(l*Y=i$+z{_p$rv-e14Zc>ur`X{0KjidJx4~Bl_#7L& zMZo9V;2i>9XM=AS?Jl#yKNau>8~l)fud>09zsKoZZG%7eDTlAI!Cw^cbvF2`0^VqY zHwt)*4c;u^tv2|Z0J0(Uw!!xZc#aLePr!%T;NJ+i zY=a*Y@Ci0}#$Hb6bQ`>{fX}zV-2%SM1|KBgD{b&$0>0V?mj!&C4L(l5TWs*#1$>VU zK1aYc8~k1Y@36rY0e7A2>>~da0-kMyKPBKfHuxF=A8Lbd5OCQB-yz@=Z1DF5e7X(3 zPr&Ef;D-f#nGN14;45wL)4t&SyV?fN7Vvd8_y7TKvBC2Ne2)!&t$=Gb`1JzbVS|qo zaF>Xu8v1{`0e5%p7nex8?eJF4SB?$dTfp;d@UsMbs11IRfEU}~g9Kc*!G{TWxeYE0 z_yik#tbk9k!KVoLbQ^rSfX}hP?-KC&Huz!zud~6U0=~=!e^kI5Z15)pe5DQkcL85z zgTEr+t8MVt1bmGR{+@uZv%x(xT6@g*b-qGdn|B@ha3OeEbwy;AfB29exU{4Zh_xqfg9^p@><7R z;KsU_;5@R7=kff8+2u7I+E=vA^>z@Kg)D&H^WI*7&!~0_UDI&uOs0t@{`& zEpV|F!78k>zzrKm8LKVuUK}<1yT$@P%>rL%fg4*?l-+27Q_R-**J6R6ZUFIYwZJ6{ ze2)d5Wr4R@;C(D`%>uW^S=%k}GcDyiEbx97xZ}b^Kb~cQyDadtE$}Q0Jlg`#w!qJ^ zz}*)3c@}t%1#aD7$+N&Ou#_Kaf%mt-i!E@s1uk3Q7g^xt7Wl;$_yi055(|8a1@5uH zr(56yEbuuN_@x&3d<*P0NGyXML;FlXfJXc!aS6JYyEbxIA_-YG$ zkOjWR0v~LFud~3#7B9UTT5Y zS>Un-zRUs-Sl|s7`1Ka}N(+3H1-{Ax4_e@>E$}i6e2oQug9X0M0v~OGH(KE37I=#V zexn8c^XtzN_*nu!OWhGZP(<$eO{&{C-X9G)9NbQKe(@aw! z^oZVMrYQh=ME|FmroiVB{Yf)T0na1)ugx?CI*;f}%`^ooj_7xpX$ou}(Wjbe3LGEN zZ#2^s;5?#x%`^ozkLdYkngW_f^oz`NZ)H`5fT z1pj850+it2OjBSI{F`YCXoG(qZ>A|Q3I5GA1th`0nWjJ__&3uOfCT?$ngZkC z-%L{=68xKK3P6H?GfjcVBYGb*O#yW9Z>A{#3I0zQ{JUBDb2Ci=NAPc^DbNW1%`^oV z!M~ZNz#{lJ(-cqy|7My3iQwN%QvebCn`sIhf`2nj0YmU_rYTSe{>?N62*JOZrobTh zH`9Yyx{sNrKp^-x(-Z&%|34Z0Q{WH%Z>A~W2mZ}81^U3hnWg|A_&3uO*aQD&ngV*@ z-%L{=5B!^H3gCf%Gfjaz@NcFmUfL%1-5iQ zTe`O`oo-8?_{!G*w)8<;`b%5-6I=Q{Tl!5~dYdi1!Ipl}mVVBbe%h9P!j@iPOUG>K zs4cz7mJZv}vux=~TY8c$JI(#u1OiuQTNSgzMt!o!bwxD%9N{a*$&sR8qNGDs zz6@o`YSBm}w8CSZo!T@wYunRlSUD%5uGv1-*XJRVUdEvwoL%=cl0^=~mPYfGMIYPRRsA2!6|Hjhu6N3A&yt(=yPJ+>G%z%Sn!mvc(Z$&XT|qlt z;AxQ-PnRQp&8cl<%x9sJCarZyYa3-J{%e(9a!4;V4sf^~j%Z`}U6Ebi7|x*A`0ezU zWH*|s$I3~58mfVX4#GUE!wE=-Jj}1%eVKNv*+xh5Hg>QIkw)is>H@#kRg{~^f!1#P z5v@T=$ZwO^Um2P;=gJw?v*njVHCI+lom&}_l`L72UE7PZ2t}fYb0LCAN2gT(1$B8d zP3`R2&YpxURfWXm-4%SA899h)i2=`h?Mf5dP9t^Fgb&jbxH&Iby6V<-@fmMT6 z@bpn4RrR;a;E3{n!_jK8I<7-j!&D9e+_|0>Qj~u+lhHWjqmHvx2!V1&z$xdYo3%z@ zRiHzn5%Omui#~RSd#oco@k~Z-Je@td3J`t12i5jKeA=c4l-ANXMeRIwl+zE|K$i-V zKn8m)c2TD``}d&%hrSAb7Z3v$;OAMi1ayqx>p8A77_RVe;Btnq2Cf&-n!p9=60S@W*F=tsNqq{(MWk(-hCkXO z^fc;cqND2@r6?^BH&L#3H@LNoO*RG?gJ4cp)2~5;P=aE5fJPTe$Ik-1KZoZCcstrt z)6YdJ(s5S!Gc{cjuNSN7KcP*6o~=dDEwbA0BLL*wR=MaY@VfZrlxPi--zbK;ErW(Bg$cS?`*?EO@khhB>FyVNcE=gVFu6Qjm<_q zYK#?ennkXpBHxm3De0q7gbSk@Y@8wtCERASRv0N_gp^^(K{sRQ*;v6#G*u|gyz5Q^ z73*;|Ojc)zVGVZ!ZqdM{2O7bPvLT2LIU@Cm7UOAajp2Jai?O_74)SH?{hz*-pHVuL z9mJLT94h9njxx&lh;%V5p1p8lYhv;p5y16_soBvjiXG?-~6yiXa| z*6fE`)2Qj7+VRV1_(MVZMj0|1rp{K?QRr_AyO5>$e~M>D{2flb5A*N4cc<$AX;PPo zi6#JGmX&dPfSTbPflk~*s=tWnQZ}QGMF&|EEo2weGL(9Y3cm0y8Gvv)O2+#{{6C?& zpQyRD>xk9_8)Gp4<}mZ4gj=ZCE{;!mqH{x8I=a&GIwSr*rC1*CDS^&MmGB5uqt#^}j-2*yA;0<%B{Nb5w& zi2plhWYKrS7Jm?THY7@>QOU_DiCUM^`xvv<0)j%i2`0fKrk+I|vcgPzyR^30Ev<#b z$c&aVo2WY2*gUb^7`~4jMwg~f{gfXsWEQ*&!eSDdg2`7I*CH!rjXtGunZMOGYU&oX zI^Y<^irxZVZ4FRH7QNdiGy;Fm2o0BG;||ENGBV{xx5dCQtJEKT*{+VGxg82mmgOmv zw2pSNb2~nv*+1mL*l$$*@3Jy~Hp{$=GF*svqE*Hz)S*k^m(9X|F$)(Ng>Ab3H0bKW z{v5Es4)R>1jC&UBuL>&ul|H3qnSZrS1Za8K_)En4l6>OTMoe0xcBVNj^I5J2@q-2S#;404HK){K?4K#ow|Fg3BROlb-z=;&tc zVhk00mp4whcIi8En56 zS+tcpSB%Uthp1BuK4zVA5qfW>3dxZ7!g}V>n4ws|M8Wu_z)AYoDi>}Jor9Maa@VsW zi=OQh>V>~&NYOJePDv0UQU#48Tgj0Lf9yZP5dgU%W(aEfjgnoC# z(}<=7)86sko4w<_W5>u#50I|OkxY-n_TGU=w6fvZ_lT$$SK(n*-j@7E?F95L!U{N- z^w^&M@<&iXkzPCwGZ58*6A60ALAm}xreNA{Q48G(EwB|BC<@%o3WU$xo_+@~VlpZ^ z7dhHP2Z1eCW=Pm0R`9vX3Ewz~WxBg$zAiGKv?7#&twSD z_TLftRHE;4f>}iXA7j8h9LOpFSkHhT1E{WGui06-q*7NKYT0CXvHkhDi3gwM3gV&+%2-QM=snNI>S_p z2R$7UipO;n9MFkZId`l1iY`6VOhh!7>}-=GE=UuP#vXE$mMS;3rGmI(kZfl|=4>E0 zi<6#hAzg_&IM8JQ{`c@x-VHw!On%zmWnIyMhtU;Ew2cEb3-G^(pDEq&Gu`B;m6N{5 zLb?)dpKl=@D;y4-ZUO%H@UyBL zepZ|OlylN2SV)ISa=KUtjg zYzyg_e>l)(0si;!(@L~AN3-yt8Ah+h>QGi!P#TU<9zD1(xEMRTWIxC!Qu!lRaAt&n z&D!T4mbr{)vIn5YFNKTJ1Z)i)8zEIP?@LsF|2|&*DPFySS7#4Yf7Pf?V*-^*!eN3U(AHI^EJ7r}DZ@P{nTb4iudggH8d;tVjDh8}n3|NEei&P}2ZlEH( zjSf6EpW4Q5862>j|D&Vb2uFLfymYVWX}=>YAIgRAcJFC#Ub>gN+6bl?@6lbMEbf5+ zJ4aiCB-I!xp!y>3ktQMIb|&K{NT7}Ph-UUklN>vr$L7rb>o7}C0WS2&bUb*EP^Xr2 z-~<5-s!=KyRAW>usO*3csR)EfMG`_pgkm^4s*!cn`z*Fe6cwWo+K}-`w2{YwLj@4X zsTlf;iUpNj=rSr2RG+3IXycur(uN1Pp*C6qKYSrOc^f-PA9zPGKCK?zM$3xms63-< zM|~ydVo81E|D}$ydUOsNwHEs@IW>uWc$KdsyV{2Zi@1I0-=Ch*@-Ft_T9KK;GbeP( z^oh(bFJv{RbjiF*WVZ0k={%ERhpE_$wKPmvF{y?cBfBmuY1jvgvKCOFi5Dn8r2uOM z1y=C_Q%)(sT0(&(yuh4O3JAM6|6b1bWt>1^7Y);Q;}wSKgJfO6LCT~*g+CyYlP#vm zv{nQsZW72+_Or7>m9K#9MJ6;g#<3k{;)^g!F{!jeixI;vWNGQX0NGY% zt%tF!#pBE(3M&%7>i>dZm~d(o&9qvZnfofZ6|y~c50~xh=hKr<5Q%x>dmLd?*qmUM zErKu(K2w;K*9H=z;gbv#&G$I+7EnHhXt18a{vvgtx`IYQx1v$f{wIDpnaHO7DIk%J zmhL*FIjsS5Ld3~nk4&FQi*(;)o=I{C@3!gdL2OeXlynmq*9LrqcguKumT8UQQRPtg z^Z9xp7$FYcy?}90M>%{nfM$@&0j#3hw*i0#lu%>jGVqOvH@>2I^#IYSM%Pg03YMtY zg-tUA1u2Ahc!3cdz2L)S<(joVM6)?J?=d(hW~KYCBhF(5O~AA%1I%ctpLTZgO|W~u zMwXI(q?tHKkF!UE#u!fj1Sz$yjS?%d`0PQu z{3i&mvu)Z*L@yK+9m@eh4#+YA!#E(D0Mm%D%Q?Vp0?y%p924N;fIJiM!w0ODp#VUL zRI}MJyJmLf_Tn@e>r^lSXpXi)G%3VVtmygqXmKd2V>9yvwymYL2%q+QX$uoY8vy7` zYS^o^Z$u5&)n{{gJP-~a zaunk^iYfmNMX^pirw?RhdJo_=2D8Tsl7Q%zhgmUFqL1boO01?q5i$0bIs8f2$WD+M+|+q(rO#7MfyLnP^9$O8?A>| z`yZEAS6E0Iv5)Mx6n&KlvKjim(B3Fh6Fz!xAWagBlIT`&!Fd6x4t+KLa2r8Btl{Ni zn|}jiH++>q)$F(MPjD!HlqNOpCKC3mhE9fTmA;h!78g8D;Nkk z*}ISTvJn2ciJaeyoXspJJVb~GMyDgh>#XK=suMZWMV;k5XEa9PJPZLGDab*ga%K%l zaaL} zq*=R&#4q1%b2wvF^o z<04`TfE_;36BmBYe4HC0?;e{?c{eitSPiSZKd3cS;SaP_P@~c&y->he_4|aFr@|HAmM0FX}mTI*y^T zB(|-GsVgW0yI5-o5jwAFZz|S3CJIDQV*Q?hv15~%b_ZHT$R1VVg-NT%7KPa&j#F&@1Ra zwQq`AFaWve(9_vN%;;ifX(E3Hj>S}=C6 z=OTapK@b&0HX;+>23~c#sXH8Lvf}f&l$QLXWy+yQn{%1Z(_bgQ0f%1eS&8Dh6FsDd zBCu_E>n}aWH_Cq=)_p((u+xT7C{-G5>eNozer@Jo`%N(I&=ZU(V#R zpyxtu#BIb2-cSood~4LN@5zPJTdKd3zx9;r>1P*EE>o(%jlW$i)sx2r*hH!R0ld|} zCe@dsId*6hljxq=oZV?h#E;mJq8LI408JlatBh*66A>U)kgjgvv|!+%AcIb7h3cEEdb93rAGN3 zqWs5{ab=>sk^h{?f0gp3Q}Y`{{_iRO5N=A@=&2R?_fr1br{>=*@+VUMKaj6I|2E{v z&ZB$BGKKXjZ{Wc8_vow3PzHZX9{#sWD-SxrJU!NjNzMabU zVh7@S-^h^2h0%^%y9O`uFUI=TPRkEHr~^kQUKniO4#7g;TF%jyIdE19aKd03Gn zFb1#>nL+gmS)GyPi_LMe0#2YxGvm0>m^1zC#Q3^_l*U) zAx|cxO5)oF3q;fz=I?713-LY%4<90h@tKX13A?R72^2UXx;1+pTC!w7#frIWj>H?79vi2|XpGRwvDJ{8kFT9-h(z>5#TpIT}#jmB|^&K*3;arYEaRX?wX27#RB-=?zN44wq_YybdRG z3w1HA>^BbNdD=6tVRloRS;QwYYT>YU!@L+ zk0QBONmr(4!6r!e??MyXVY?l#xbViLA+HO}#z*<9Lkq|c%ZeOd;(c`qWx_NohkViv zUqBtS*O(RLlDEv=eZafCbSrfbhG{|%_`D*m^?CXn^?AW-{UxBr9KXjGNe|J{N^mPh zPshu~O4i~b%?l}!+@c{s$q?YZo(_$#uR{q4xTcDAS7b|y_TF|Fu^{CwK;A1o2?h19 zyl#+SiE&g#-l^_EIivk)LDe$=UM<<9WiLo(}u~2PI#d{uXjbejBmB zOFE+cv6<xfs%Dt7B< zGaPlO>F|yVDBr`EX6jz?A$hNn^av`I?)V=YFk`v3 z-%|N+@*CrSXY|TAzzbbGT^*kmIo28K5!vii#;0v5#|^j`bbLKoJ#@zx)96vO9}jKC zRuY$w-xsFJ*Nst2;oTocgV(_GS4z|9@N=n56yTQBymEY0LHVq6jEgaHn@K-BL1r)V z8@Hgj)2X>e-du<`x00H>6wM{(Cp6{aP4$u0g;}?;`)$Hr%IbC6I+W%aze2}bdPjV} zK_@?0l&ATh=$G;v3$MWt1~GMLA0`JA29id854DFurv;(#H&DL^m@S9@0X|O2XGDw~YYdU~WNRSxSrts`PvfEW-(q9O^l!drVYnU4 zNrXyiQE-S^EriwAj4ZA;ARqk|8J02ckc!28zo!UsMcRD`!Cy<)7VC*^8WunH!9yv@ zB8{T7{sVAP`X!!z`FoN63s3iicC-B7@^qn5{sBrimr!8BA^M2$og?b&(?BH2*E<%_ z*|)~}Hio+77v%B6ZSz80NaBk5jp!F_W7K9dhZov}8G3#Jyo+qPg3c(@L>__` zj&m?c(s?57B+EIR6Th=B!R0_5P}ekj-skXMBFKOg1qS=zIuv{LkW+|>QOu%*l# z^I}JU++pq7axy+&`}6l{-!{Rz{0bf3?8rm|@plvY4{sdu=pDH(4Q{hq>PF9Yx$kMt zskC5sp{!K@B2b__Bq~M!O7x-{eCmMm9$Y(^s?PEpItg)fYf7jnSQwY;|A<0JriErR z=jc&ZXQ7)^$*;5pmBY7D>{p$b8Ve%A`bx{V5hCYqhaY7e$ z#@8q2OV)p{>EE*zo9It!^K6n9{PiVneZeU591MLY3B`IBP#es7jTIc9%-VPgAnmzL zT}B+&mvy8FTN3?2F0sXDL6?KC<}?pVK_ffik6)J-x=<$X5c6p!yA&2CQD$#}y@-EB zdPFnHI2k~)1NUNxO`#=ytMBePeKcWOf3a>Y^Z(m?Q5 znJ458Tg4Tu5Mz)8epwfRU&5|g6bz)x7ym}X{*Am57X#5u@1*)a;dS0kqbfl@c|yc2ez_G}W!+jwKLn8)rq^6`sx4SJ?8AKiDdE`j}uKu<5BPFak3iiY@C z+6TX6J<^*EbIh@IXc~GNf0f~>fc&3N$X|{$yW_7}($qf>%Or04R~NruTd?6jk$3kB z&gVPUKLzNYa2}f&qDL2BDX$0f^lu3rRmnXp7d9=*mzD8im>B(Qj30akVLd0wQD;_I z@-{wkkmzP(JdyJoJsKVhn>n2M=41fQ(44Q(eW2zv1|nRtS~Tg;cpx`j`vUaP^nM!6 z5LH<5V1|&DLBml1;VpCgM@~A!d0h~vYpbnQui#au$;v?15LL#&iWTjh2zysH1RD;- z^(2dZ58#sx>iBY|2+CVQrCA?|(ay)4pSZL?_shQj>iAIj4}H?L?j%IcPy=oco+E*|89np>fb|msrV?waTsx_ zUIMrCiZGa@`Zth)0VPGhz>644Jl@;YlJ!Lu8Z)@T%Kg-i3@J+S8tqo85WT{;0l3|Q&yQuO_5}Fh+`?HvJbg1vggyats-d6Vt!J4*Cak>@ zey4s3tHk&d`o?GPg%E|%v*GeOie+Z$v!WoJ&Mjn1YO(kd>3oO?FU(Z+Udno@@VMN$hGNV z+_b&hEo11rv>Cuo(!;@4X28X~i8a+ybiw+qyp6w5Ofgop7R_q6P#Xq4#(1#M`&c*h z_9I+xb6mG^Tz3+#-rdsMmH)?}M`n9uHbC3c;CcOff`5+hT*9~EpWX4_6kg2t&H4}Uz1$6b+d$L$y&T^Rj_)4Acfo&vZ$Zha^o=8YI>&b&$9Fm5 zdvi@U{POrgKsn(Zo7jWQLoI}t4v{ig_J6RtubcxK*N1(n}s6IrC-t*!1n$jZ6HPg)Jdv;gq6T{%rR!An>)+dcFcEd zXl!wMnVF;->nZ$%>Hhwu$nrx&e{bw{xDidE`KMzTi~`$s2-O*RM@RF#kCDe|iq1sS z4MzTlBL7w7>o+ClXJgA{lgR%)<A~5#YY@KRs9!u^(x!d)JR8~R6hWzNJqL9 z{h0bk`AqY`uo~MaEd-0f4Mki_rnxv?Vvffk2`qnCnW6`26Z=zIvQCFM5!f3WM5kpT zV2!DDw{{5-0(e~@vej8u_;u)RnL_fwj9koJpJ_)}i<_Z5;lG)AM(r<;Q|$$t;jiIH ziZ&7s4c|4P6*X-`r?GXL6z#z{+?vyMizDHGfdy~mWJ;(xsLqfvg_O(cEKs1yJv&1G z!dD@(FonsVlSXdmey6tnALNtIl40b_<7mIc9aN{l29aA%!oUth_{=zBsddCmnL5pr z4N&MeL#XIID}&z}rwW3VTS=e}XHlf~5y&=Lm;^=m1#3Bo>uDAy@QWE<2B0 z+qqZ!mQ9(T1(a=?hSxyhw(vbLB4t?e6$h20)WccmL<|t5;818OEY(cAafpRAhJqxu zQYeGapU|*CWII&l`*0&)f~phQ3jKW1)8)LUvyAb!1uoREl47Y|2c1}szm1+MM9_(C z>&2V$;r6pYz~BH1z=9a<4eggT7B0qSty-=H!Fp%ePUe^2<2++VT9zY2fAM^>QBXArNw z^>wh|hCg8Vxva~?c@Fxf2oGe3rbB_K(iAyzts{IZVxYlT?+*B9v_|J+At?EGjWfuZq7lu4?R5|yI%k+xOw&#?{7obi1t1zs@Y)y8bR8w}R~Vc}IiNbU zS%DqvicjUHFYt{&`hqxaGwh-DJi^@CKG=I%g<}a&Grqt_ZK(6Jweuk*25c`DUT>k#r#OFd@1!|^K|qceCuX%j zK|I2(AB=$KMmI9FhZxZ3$)oXjvF3)((RwNiPCHwJX*ZBkf?+uG)EB~;cl{O4yvF5D z{A?m*6#Yj(P?{vIoyql?wlfe7>URxEWKo{>#%f@sBRyO2BGv<#)0FpxVWNXWSO?^z z*#q<8x1@D3Qq%Jru|+=GsjUDB*s7w2VWVK0y%C^$a4nMIzQC`AsGTCvuta)b6%}Ih z$ms-)6>Nd`w~4~@SU{0!`r*$+l#d){jNe<(`&8T&P!4DV(NM5rMqfG+1NrBm60V*u z%qvskWy&{!rmxb=oF@zE08IUp{UAPRZJGzCBu9JIj6{BFGclD;Nb$!G23c z-`{XUD&~>q5)bmR{RS$i4VvesTjsev{W*-zUClR4ARWeAJJvJ0?${!!{uiiUcMRtU zmty~^?$~8g{d~LtZ%-mwIb6RBvt6Nj6sSEG8vs?Q3#HCMJ`^*LHpmJ@C^Zq*-Vqpf1kR&cckW*7l`Fs9$ol z0yLwRuvUDr37usXai4NqUz*2_)|R6+;DOP0$ra;WYH4O}D@C-HKYs>Et_K~>9K9?P zqkW7^9pR$0$Rl6_&fsT6)fwkUPNYZ=9Rz>A*evHdvNB~ACw!7m!-U}qs(D9ChB~F_ z#M4Na$7qI&6}fJ}Ao|^3xY@5pP9V~m&dz_)oF|QZA7%E@)I0KNUdE3yWfcc`?Y|(0 zVi~tE1R+l#aw3hntGx1is9aB#d-BTB6_Ac0YUmb3Ez~b^B2|ihdLCQMrZ1!_XTgEc z+tJxv{&mMLN1P0Ds5^G06n*A=)|2RVCM|N%h>Xe4Fdtnr$5N%jAHaV(^t?l_#EgLtv71j`JFg|klS7s3#Q==a$DS! z(8pk53(mnpk)^d+%$hM?s;E!VPAoISm;1Rg3ay3T3o2h?Fc;Tj`*bKOkfFdyS*qIK zY`2$GzY%7fwL8j<8ocQi)^z-Ws)k_Un^OJz=q3qkU(p~cg;|5!oUycAUv3*?FZ?b@ zg^56P6K#eY^ew0b{#0l1BzzOV!5>6ie*4)4ok&{09E_n^zQF5xpJn*-*JTiMwZhSAy=iIOG9r=n~+tad4JtO|s zkpY29;4Z60=>kdy>r1^CxhLj%Vj8}5HaJJS81W*Q(`YYLHNp6M&clRF@B4V0Jvu^nV~9Qdm>R>K_NT!gi_tUwFd$_Vut%lh$sg!%gn++vuB6 z+A^keSB87BL0sQJJ)@3H^C}to&BvJC5PAu_cMSHo?$|&nS^)*+1XFy6S_RK$|L7;+ z^;R_m)Vs4e&tt*!U|LC3l=LO5B&U|-F&E;4Cle-;<3lglgxNfjITvU^Khi~>(%PAx z(Z%%#rTQ~b!k^!n-xyRvp1hzsDEC3KAJaT;zj895d=^x`z~qrl3gT4`DBDP)L*rA# z{K6LfpAGj*(H$@gI6oPEA5U*=WQw=BlvUb5HDPSCz3_t(mnRu}l~VUGHo0wqxxfX6 zOMJ_wc}Dx|_eu4s7!rPEw^!Qu9eKZ(pzGN5c`;PQAG_J%`(fljN|^n^y(0_KQbIidBje5;f->|Co9nel@TQiq#T%P|NpAt+AWDFBR&SD8m+3WCT0REDo2J*73Z7KpNGLaBIeBDue0Zg7IId%x*n(Xs!QPlGP9j%;XlX_VZJ`VWBz zjw3Owe~Q35A17iQ|5A$niY78f5?;*V{wO1>7{fWqd|6L(w0*u@j#g;C{4<`?+Ai~D zIm-WE&zI-I9ZbxZ4s^(WI$x3v=^_hrzWfkp%M$ia9W@jl@!Ar!6HEUC9+A(TxPs9R z!JhAp(A}zE0Tq)LxBGP344*gIIMBlkd_Xyhm@nqH>*7V^=Xhg&96WA@2X?+`O1K5z z3_JmN3)0%Ny-Z;^`foAjWNG7mKf+r5Y1hCFWZBx-Cx}<1sA+rw7$gi_T{3jw;LsCv zFe=YaZq_xh2sE|Aq>@(azh#|PhgZk4F#~DnkX~pVIY|^4YJt(pxzjhpU}8SCc+l{a zg%kaU5f~57-|_MA?so}2?;>J09(L0jBcb8VBiUM>H2pCsAGs4l83RG(xCk@hmKjzb z;WHDp|iiy^PZiRtCPk~XUKKhTyVQ)OEwMZk2BbnRd@ z7+pF~_+y;ZwK#9V?S#$#rb-Xp3Cm?%3K<+hYf2FMy7dxf_E~jeJKOXSqrIV(`WDhN zj1Ra1@Vrf@kS#l>10!Th{!bZBSCZQ19xxY?^2%Ug+v02FR2=leW_GDQFEoNywdgxk=!v(+Li`nT=L;V9Z z@7+i^cz=~ue4~3T`f09_uso5Xq~ZGGBp^e7k&iCn%P6*jf!hH8h?IXPah8w^#$=Q> zk%V0Iu|OkcZBkV+bHk)yes<_%q26`JZkOsCVfN~d&6es%0$z7)u2laKdkIPP6ETqM zj#WwZ=fI8`{s@)@gpQU5c@PJ8ZMN5$uFVF#{u|c@MwhGby-dbLEeVH~zzbmDEaQue zOf-s8f+47$UWX)?qoLtJG{-f3uN!^|94DsT`c}*$q|Zh<56Wp2h|_G^k>8-bo{#52L0BGjyB0(~>p)CkdN$5T zkZlZoAi7bX#AY}jDlo+a|KvnzYd=j)Nl9F<=u%YWmS2QKTmW!1G({1b>vkfric|Z9 zKbGMCLhyeZXr=zPz;_aSq0j>h{AC7*vf0W%N$}!tIGm>KAXeFVh(ePk!)8hPnyX2} zid}xJeU`67gD`7#LovNjhfsmvqJaJfBog`sxr2CzzK@wR_#eX4drHs?#b*(jI*fcC zk+~ahiTXUBuh6@hh3i{@-q4uAMTm#X3IkUR4=~#sw6w^Xk?w9zv63h&mv^)gm!tB6;DwrMiYkM#}`0Owpv%_>g zI~-)km5k8>gV$xiKx{N&b6VFOpgyW6xw0r$FKQocqtPz2657^MY;8~cKeru>RXXjB zQ&YV0VXSe7x9O{1-lbo6f;aEduN*%~4u8)dyi1$uI1sHA^;^*yxc5%GWJzdy(@tCC zBT3~#;v(6ob0Dpufu=9hgQ+v}w7-9VafQfoK=Ef$b{Db(d`Yt!mLxGv5Ob!hU4t;_ zzo+pWJB{Zjr;!L?bfO6&3WS0lpEA>vO@UZ#>91i*ohMnu3PvEC6NR-pjcqR6PjR}9 z+xLL7Cy1?MH@q_zc)@~Oiarl5q!xg=?mApOq_|J?5J*%_m>tr{$uXFm58{01gaL(B+?nE-#M07fb((Q(VGHVJ`Cl z)aEWTMhTJThRf`O>zu7U1E~?w*oW^?az?YY%K>C!WHPvy%Yw;5JO%-$7&;zy<-_6auMtWclT9~(R}(|%8vT3- zmgPqFepYuZAVnP{>5AIESSgp`hGeWj!8Tc=a%C#?;}DfapsT@1{ebAA=4>e#H9b5g;(Ux*P6>x1}Ras6PuR zd}aME_|{m!=sKRpk)gCal-fe2(oyPE>i%j_*PC6NwG}{bmDOA@9)*h$>W`ydRw9H6L8@4?uWZ0x-;HRr1Ep5iu2; zrI*Hfrokjs;oB`33RTO>Q}pNA80!!!NO)QrvCt8CO+1x+EsonZ((+|&Y-9Bk^h~3* zk2xArtno&DHZT)f-?DqrDlug)p)i=LI1=Bo;feZPb_eyrsL$8oZ^92%$6y{9m51(R zi|mTcycYxbH7JVvJDcDY-wxQRTpR~7#zm&S7)bmIetVgGS=irc z?6{nEHG-1*kH`Z;a@h&jJ%o!Dfe;+pnN(yqFG3zT6&a5rhD`DYA^%dy9Vp1nru=Ix z`Dapo2J)FQVzPQ*BP7c7?~F)GyQz$s3B9o?XO&es?}+@Ew)l2fH^dI6!N8e{l-5O& z27q9L!bb*zf_gLx3NcSQbT@o!&LJ%~w0y)f_3t1UaXBwL26p zX6-H7pCb!w>gRsv;!(7`=TX=s`e_E9wimoS#(P3G;t>6Pfb+p zkoFVm!cK`JD#h5b+IQO|0N6<$A3q<0qaCN-P61(Q+H7i!j(#R?X5p+3?pqBw{*8J{P-M#}Yh%B9?(XNr_N)-y-S z{k^9Sb)?)sc^cUBSjs}b*zFyQ?<%y98>9VhGw`8%=b+cIpPv7bmV*|QZ8)dtikCaL z6n=8|^~!$bQ=f7u_rsv`EA2J3fzyg#YE$lqZ5*mqV`TFa4wsAquqyZR_*$bw0Rqfh5P9p$m8p7b^uEY1HpRst60S7*IF3I zi@-^=amlABf2%qUepeV=9@2(=WFD+qNa^E1O9SB&3@?1dj?rZ~$3xCEdM69iieW-u z)k>VV)6RpiAw=5V_u;f)tmuDWX4pYolH(*8JZfcyXk`Q9=kb-069F5rT0$hc8V}UF z5A|@>43%fb>$KH7tFZ=f9Sy8Yx@1N%*A zO23@SuS0obeM;kTBlW9(6S~;Azm$J8zmXkpqoZdZfFlgg0m?R35ENd9qI7X-tA!u|DXis2bAmuB?;Ht_ zXM||umJj;4_-Zo`hbp{tqLv&c-fcVJ40?*yTDG12lY?FE9qBJN{=t{(ZX>2-|w19aOwR`fVZYs*oJsXg&z z+8=!1U;re_^iiCrV~66pwVPOWtc1wq!t*`2Q|5Qz{Hx7^;@e+av$2_hQ;XV(`)u~W zu>aqY=|7GZtfR_jy&119Mcwt}NU)pApCJ^$-nVHhNvdjJk6id+=t{aGL^q#dL2}3} zktt7OM|i`-Ku8v@KU>c)((pSE=Psj-UO3>u0Q$W>8?o!%7;l7Ldzr@`e^Dzz>%tyH zIy2^-%??^Fza7-DgO-Lqf&-Uw61UKqYZfb-NVfm7W1ToR!DLMQ0_8RTi|?;D<0qBU zx*nip^8<<&o&+7}5SErUo{jJPT)-$%@B<3X*ga2ow%~WBDIrAUU1KNPlz{pKUkz7J&?!cPlL%K|FtDV9HWXzW-r7Ad*OeHODGHHoxP+}0fMBl zzeKl_ghSl07h;fJQo%`UJ~%l&7wVFKxT*29TqsNaj;59#^uzCzm1Sh5Ga$k z0Pk?+?xrE9w9|2E6ZK2L7=Ko@jL%de-6Fj-Dy8XjG#q~f8K61gv5?Bs54w-ZXxf|Q z+#G*f_zh|*nMjATNuPvgqCB)Pbxd07Y5GWjF)k5OU};`@yM84Dv+=|;oZI#D7_6Su z7_PFY0C+0k9NCYgOUxdtB|y%RZPxb!Ea)LRQ%`el*56_BtbFs%8 zyBQA4*oV{cqtLBFo^rDTqQP9>n1hpx;dXq!#+;7Dl4I#Tm}0-~;w}pRUF~-Pn8ATC z>I}UQcuadi@#2k>!x7T!Bv-wCCdoZ}1tV9}fERVYEmAHe`;AA&_MgoqBygV75@_qhMenWy^B~eEs+&(@BYYy$s6A&@N-SvL}vH)EY zf^$zdYI?_SqWk^qK24|;7e+eA<*;wC;Fhp@6+UE5kzeHy_cXltB}J_U>H(#Eo!r}0 zyi?Dy0m5mcd7a-EKMPYIZh>U`m4O};w=0iAo)J_;^vjF@bKbu z1M2u}XwKuZ@uOVoaQwhzXJ>d5$tJN_!_5QUUjel=o3d_`otki$DbGAF!uYkYO8yzx zr7Gl3n|Ihf7=$K&mhu=7?=bO*vf6R#Cv@6{+%rVS)3@A;p{S{F*&AsUL3o%8`cdeB zxG!XQo$UJr7--+qKqFe@D{8W(W$Q>U)eLlnF*2n4pJ6bZH=L2?qy~G^SYMbeI}gdt zrC7dE4JcG|4-f?Rdtp{+lw8<>?}v~G=?JYtznqSDWdyE{l)9+~jiORMib!UYwm@GY zzvg0=i;uFojPHgKsxujy=3+7I=!n({-<@+e*7O?)mA5ww<&Aw6+V1$ zmkSgy`EQ5J^nF(K=R&L_{Dco*3WQAg{K)aMU&-R94o5-fh4ml6W9n{HW6>lwI<#9u zRDixA3mI-_%ihFQq7BH5AGGK=!!OjDn?u%1JRXLR1;#RS3U@5dmn+_roy|~ZZ3fz> zeo)VJYLFkl&VhR&OujUVK)MezQOt8j%x7%H`oF zDfdB7J77}oqaKPkQ8+7$J^$o!v*)v(JobFSQ_P;Pdgwl8mk7*iAi(K#1oB+;O?h`2 zT?ab+avi`dl0_f*MYyX0^)?cat~${;Vqq-GS;K*uc>8XV|CZ2%gk=ne6d zSioM4$PI}$5gIVBjM1Gby>Chbd}O-=`W4D*@0NGEYY z?kT)fHCRlksgJldSTGSsU)TUdZjCpEOg8PM-)}fIy))+EZwYo0L6x z)6V2I>4Xnz&f+zf@tX0iUHv(H1Kq+u=4RYwPCo+Nc%^&s;Zif^_QDEE{0ba>zf%%t8+HyHX|SPhCsCGy}(oPvLTt+ zw~D*4Uj79!UA$~gh8)@NlnYzJ2Tap|zpe+7-Z4F2l^MM=0)0E0p z5~fkR3VJ8zg@O3sTlPjOvWbQO-LItto@_*DE>@J!5T|j^zHvpBG_u!rvBgMvN;XK#f zr(={Nl+-T#8slCw%SQlNs{aurlgky1&32OW_AYlL)Ka(}$8r6A?(On=nu_sn2{vKq zzSaHzOKh^48PNU#d}H7N?p6%DJ~rfgWI8nJf9B3UOl8$k!_z4*Y~m3;mRf zcJ)jO`_{sb#g|~yG`VnwYhJ&g;tnb^EKV8ut8~}{>=$>Af%Czp#h~KZFBfjBeJA0) zS&WM8Y{Vg^fHYzoz9*`egG}z%0Xgo}zs1*!@h33x@OhNULpg#k1iSP$u*=hjDGlqj zo;p;Y4!Iikg7U@u$$yXpy|Ng$96_zoPRLhhqoKbmt!-Wfx<&~54b)y zv51Wuc#2=kJL6@sf%xReH=V86Y}kVfPbf4G-z_(D=|aa}#X*Z$YQ9ej-Wvjl#Y!2jPQ;AAHe9gZ7nW>-2!RW2x>TUlF6FE>@rtejd~=@=0Xg=%JV zFn>34%4$N@HM4KP->L-;|LjoZT=5>PoO*Yqcpq6)5v~o)cChE@aEMUPnmWg*HGfVG z+9;hnb54FPU38HDsXnRn~^)))-miW+%{=nGN9W zrpmj*DCxMVa?aGbm9s+zsv7(h#2w+e2DTC-ohV;heb4{H-rL7jRb~I<=LxtME|-g- zauM|+AfTuhMa72{1QdKkMWeJp1rtLg#IiDF(i|%@DJy59va+&gnz6FUipnV~Ypks7 zVam#$rY9>aD~s>@z4t!Xd(8QK=J$GiUcbNQyk48N*V=2Zwf5R;Kb(EexzyTNQC-u5 z<@Lvvhj5#rylH7;ZBxk7nQ-3%`lkqPY|=ug%^o6z%&A}6bi4&c^>r|H3i@K+S+yEk z(OB1TmSSzvnwB?IEo~@kXk6YrGLW$>S`rp645I`BwdX%~K=aZ78qpA_3@oc{I=8kdP*b<8v3}n90|(+I5PAKNe1U~a zn*zCkC3OwUn`>EVQe8vy(iOS6fx2aZhNb5PYFE@Xqak7PDp6S5)U>o|WT5%{#@bUd zYI3N&ZeIN<8THF^0t=SbkQl8+2Lfl+HbVpADR5q0L(NjWFR7tj12UG43^f+DWm#2S z4I7Gz^6FPYB@{seq?plAO6b?H)S>%-siLfHUfO8e z3R`GNKih$9%<*Dj>;EECG~|D7FN{^18|EzuHIEhl=X&r{v^Jnd8!(`zcK-6Sv>D4A z8tA6FhJYXhmY^H7vL%g6n}qw8ql>B*h!Hbz@v@~2?9dZwnk?7q@c&jc)UK=1=3zvf zTgzw_5sMjPiOBFDzQWtId6~w)GN5II%e)G1@xNi&p5l4U^8yQ-mM#gLs5ek2%tY&# zEnlzzBWU6B`ug(+hPA1#8DX_#$-D-J2>W+t^E}zEvun>^cHX>3HfMZY)3RpOc>&r) z-T>UhaAU27bxpMkm#(0Bk|3I6d#p}7C1xeR|7xVlwj`QA$dcG z4bLAjZ~lUs+J%MVii%6dYsbk0`wyrs3AIquI@&rr+mW^+Z9-~6YDC(H^vd1%!EB_> zNc=sf9Z0*8@{nTx+SyrzG#zO%(gjHEf9dQT0vIMfytP#|wY80CX5;y2FD8LyjMXr2 zRL!feuR3>LJyw${tSR&ADaTRX)HLt>DhzB)J}Z=x-uVd%YF?y@Ph#KvWmu3F*bKk7ZyCn8UEA3{85D4nXu0GGudm7-2ArfE4XCO;nSYkS za~#bz7~8f5;q~DeM|~>;=PX}}d_aa)piynI#DwhNJSjt%;E^W?R{Wxi;r^2v;L>6>H~#xf zcuO!PqS*t+ELb$JscPxMg$Sg;m{TzCsl|q?9+pVVw++~Iat&=>x)h6OZKJll!ERch zwgF9ADEc~_OrcmKYn#N}e7t@0moCLFvf((PVfm8zh!tBN)>zps*br0YGH!Vr7Sw7s zgIH>?r_tswU$_tzxw8!{#SU*_z1&90?#JIf4`Z&y9JvR{x1+N&@F3<*q^yTy$Ju4oV@DP zKjgDz*#DqU?oMp#(bZWCYqB*p4z!x3%dtH|)HiE#9LwoMli@Ea2|HwARrAuSg?07V zz{!c~ye4rI5+DsbIk|ZY=jXOk)o8?cYQ~_cYN$Ogz^!|&+JOC@ADhYJvpcp5OBdj7 z(J>2V)zmgNFT&kSw$w>OPbx>+$sM1#SE<1gWY-Y<_Qb1vyFyuJ^PF66m1CnSe^ zK)B6ePsnd-vgA!1_Kad>3b#ANC+$9|^b`5fpp!_o zn%8hvZD39?C!^*JSo5y~ot<|f9YgvK$@3=OGeb&x3+LuYImo9VS;+qamM9pNI|4bq*SCNq&TEVBn|1uH#$4NLiz}) z_a&cC-`VS=Z5K?P z=0GZn%Z|5YW;il+cH!hurSWBxOKfCHI06eQLP{$tE5;o+VZ6f$Gs{Chm|0#{9+Ea= z+W1i0rc5rI8gfB6Q}MKrGiDS{oe-*AIH9miOm}(@bCfGW)3#!$?U;=90r}0-aSsEy z4R9r3^K3k;b!*xxzz)14zZsBULtS(#?sEXY1>6C6S!HMEe!x>s>+C!Nxa#!I&O|(R z-8cua33&ZnJTl>9*fTmi>j8(J+1a@P@N&R=0FMFg1+1;YdJgzLpbyV(2Unv$VD3D` zKH&TFalZw4`U0%yfUg6#1Ma|w2KxciF9AQEQmqA?3z)YK;|H(?a0g&B;2yxufQJBg z17cI99RW-MOvlGA`G7TmlL5B@Rs$wphVcw|XandNrV6<2n4HUlPZ!dM5~47d+)8{i?p9e_sxi(4_S@hWr; zU=HC`Xg^>x;5NYBfI9*A1MUUPyBht*a=>FO2lT~4&t}vITnktL$lnR60JN@wUjdH* zZU9Wb7WM!(1MUK>xeo0D+zj{yptS{l^P)ar7T|us(SUh>f;`dzTL6o%NB;sg19q?+ z_sL%XS~s8`KEf#m91U0lSPr-wa6RB5z&5~&8=)Vt_$KJ{fe$bda0g%(VB%JM%|SX~ zCFy|mfY!~>4_E=X8E_lmcEHWIqCXJF`)>n3;E_8JH-Of5_zN%(@EG83z&w1Tl8)a8 zo(otE*a%nwxE62+;0~7Gg*_)=9^etc8bBYu?K$)U;sdZ^Z)fKgz|DX=0Jj0|0o)Jx z4&V{M!^B^NUHGty|EGH{VER7vD_|brPQYz|UjP=rjQ+z{gw24(fNKFO0S^JL1>F1! z_yP9=?gu;q_$i?ED%u5@2k676#GBuM-vM_3RsdQDu)Yun+zz-Oa2MbazRTEr9%8?+!rgBeWMV@niT0uYaTi z7629lRsik>Yy;d6*bZ3n3Hpn4z|nXK1+EpBe!&b)U*Xexc%ocx`n0b2@sA6xUvDv#~p|?e^^sXrM zHkwU(v^T%V8!Yr@jq?Uj5dy|}UE{F^WkFmPWPY&{AA2INjraOC7-in1b><{*V2yR5 zH>pT4lMkr^yn%~4J8uv1P9<--x4<|*+M84;cnf0$Zwq+0fp=htw~)NWlv`!K`hb9qo0M#874;#^pYg zomh`H1W|SfWg}P*7is)$Jm0F$&XIzmY1M$0pp6FYZ1f5Jb)_+xeF4|1z937~Q27UbR=p``$h~?#+x4h+RqSi%jh`7SqXkKa1HulF_%r)4Oh-)(b9-+N0 zn7?V;@i;kdn~0NQ#>oWlLEXIh-x-JMqW#$SZMwL#6Vtc2^6|G4v^LPLBn3LIFiN~h z8_Ys)V4YR$%~}&N!5eId_GW>A4wtc3hFGIK?k^9c?kLus>-D7rYzHj`FRU*nZKBt= z##n;>DvK#Xr#+46TZ6W6F4+gZ8t@G!AI9k#V;cA-$4o)bQ}$t$uSGewbmAh-!oITw zw16ZDz9i5#fQBVnT;$6Ejo(DtH2Ssxv~8e?c|(i~5x;2G8f#%#u#>kQya&MBfxMg} zCVG?Bm=nB#8IrS5j<*~XZvk)p+Rn~ZyTDJJ7wvrq zG=9^|JTLl(d+Z&cT}FbCYn&khA1L{JYAX_@xZwWh{$%<%D=q^Gbm+ z9U+U}o#32ECd4#@j>tM8#K*-5z3ZW4FLZ?4-v-(q(2A(H#>;Q3HSYPXb;skG<8?P^ z8faAjTB$d1E*b=}LheD76{9SCydD9q5j0yaWw4D_fhTLicPWuLGNHquM339{{LQC7XavonKbxMgz?*Y9USSTcml!u|Fz*KqHEiTypbguoZ-bhTfm7E`(Cz_k2l7%E zwqfhc$?)u%A!YCh=b}U4Ex>)+Q;PQru8V3eD&t%<30mi3GQz48nvAgUiS}dS&v@5+-qd6!QSuUIugI@;D)88n%khzz=&vvDJcld8o%_ zoflvKV8EO-B{B zf%mARaSv*bbJBRfS_)eDxZu6(TF_2KIs3W}h9GQ(jM0F5!uTnJKgVq0-qn^tS`BCg zC(u@aw($ zh_$exXt}Dhb1c@76W2qbBYZuqHuaP1m=sfh>gABtjC<=OC2J#N?Fz2@8!XIx>$nG7 z6IqO{&_mH;F2qU^+H7G@6o3p~C#>rQYa-W0Y_P5{H$pCb$}#Xz@$q?(G~WLw;l3Ty zo480j2wEa&Vt)mkv3dlwAZVA9OT?EQKdVDSr!;0}D9`@p8qD*9^{7|LdWi9LMlr`M z_JG&{Vpqq>jyid+&;h<)b=mjdhN__bYw+ znZ4j;d+!1NQSdLO3}H9MywHE#Zn#kByED{oKtyzkq_Dc))#Z$0x=FJ19jnS zVlv8FIH8L;!+s@vzjizZ%DnBmnZzLY{c1+_!pD`6w{oXiGlZ>Tzby6zMk!n?cflnw zXfm=TG=w&8LcJZRHyU}4H|&uxlx3TEo^k+Xwh!r7o~`T$O|)sMTqE~`b{I5!exlq@ zK|2Q8tCTwlyE@}3A(?HraL&SKW4EvjTd|D>=BX>piHupqzlvF74ra*lVbNL|QzSQV z;qhAx5fzXZ_#5t1)tEi`7?|K~50rU30>%><2-p&a4}^&^Y#YykRy^9-3DdtmAqDd+shy8p<=yMqP}Y(B7gr<~%7aL=p1_`(YF0?SQ=8kUVkUB;?KZ zCZT1B1(eN2+6CS{;Jsb(UP;|*&N{wsh4$qOFk}7x27f|KshG&ncq~$(;HOVh5-=z2 zR&jqkJ~1yq5AMNe3D=Wi@CCpp_TR_(5IbwE`p~E>iJ587dZ@#;u0*|3)H{fLSf8Pu z!40EaQLyU?qIf%akAb(0yvKFGmeavHK^P+@QuLLpQFBR&xNWkZ&~jD)(T`Bws1wd>yfE zaaG{&UeK~Yi=jQ`p?Mx7&oQcc82%Y@6O-Kjaer<@uBR^kQ2aj1l+cWs{ns_HlG68YEmG3 zBhORRzA|i$#=X3wC1PG-725X&WK=>%EeXOt>`B!5pqMYjUK-N@&wUCSP8OM>?Rl7t zTOcQba{hb$*8~6cz<)jPUl07(1ON5Fe?9PjnnxZXMR5`99wyDMSdWmy_ZZ>IF5hC z6;ODZ!UrhaqwrA*x6cns6>gu&%u+axSj077;r3p+QQ^4l7S~FJ+h-J)Djc_D;<`rR zxIGcqEeglhUR>=8$5vKck15VKo~9t!VNIPVjA#e68C zeLkP0@LrOvWhlJ2!gCcKQ1}>yrz(7+!uu$Emcn_j#%sR9C3gI;uCgb>mJ{e-pMZCs zfS;xW*!?SRuEAsXZ~hCig6%I~lB{6+$Brx8e@Uv`_Lp7${coL1Dd~VI<=OFDsTAAs zo1_BWj>jhzzwHmZAMO5^(lkx6Y2`hoeTFK?R|CP0AA4Nb@sXt(V$)kxVA^(XR|CZ! zFSdTWziqx>I%WHyU66iL_&yc*cvD2Q-?sCx!jo0`PYSQL8}xq+13gqnpCC6Fl!O8W z%N49vuu;Jl1ve?URl#-zI~3ff;6VisE2xPBEZi$A7*H^%V1a_=3RWxFs9=kNn-tut zV7r1H3hqL)Iz}#VXiM!BhnYC^$;NQUxm% ztX6Q5g6Al>O2JDM+^paY3f`ySqY6H!;A;xLr{KR7{7FIg%hKLt1+x^)SFlXMN(IkS zaD{^F6}(Qt+Z41ty7YCKTc_aHPduh!>Cxkj>$QB{ODBopy?o_Wvg~p{QtNAZylq ze7n0mFk;}~fw==lEEgEQAQX6Da4>g7ZZMcHo(;?sW^YAtFQuBg=n zdgNK6EP}5gm{tV8v@%=~`~bkZfb3iRXF{}9K-MKpqsB%xJL^l-~AWLKSdw~?pr9JKp>^=%V3(jP$1=Q zFKrqpkVHR#?(R`UROeh zxu zEy@Mp@x!~G9?2wm&LCee8OKSa_ZIXnQPwC(OB|$M53YnADADwU3(#84NJv6_XjVcr zyrQ`h&W25zFQJxLAmJGAAPN#v(HyNM@diu|dg9|8@QM3SVkQ2Jy7-X#E3`4Tw-L7; z(j#5Bf;sjuNvV?LnFeNWx|ao>Pf^`FSeiHxE%y$Wc|R(6M~Qsb%CcfDZk(7ktRt`_ zZlcWZf*o;_Wj+Iqh?^qwXQA0~)v=#Ly)_I<;^xWxW*8i|NaPKlbrDT2g~h(|IGW-b zjLr=BHv9N$toyq(6kHQ2$Jtr%vG3YM7P#EMK&$UM*PTFoZvNkI-=AZ~10 z4oka}AH+WcSVJJ(cfCo5t`mwh-@C>$$VR&M;x8SqdGmcAx{EOJxa+CykcW97@Q?4K z7!zzR_r)OjJ`+ay+%LcrzR!K*z?I})h^F~IPbLy@&xG%MpZ6t_YW_w#>3e}#?kkD>5KS%@M3ezqAH$Wt zAI(|FC$;!=-Tf$9>lf`XblDL9#pn&6sV8=z$mRc%N-f>pg9iCqSr(xS4N3k}=&A@k zmVQj}d*B^kq$~^gN3$$a_p&VA?_pO&$+9eeEHRhveg-^2|5|Er%d&j`57ZN_3$qLS z-_YI|J>pSNOa14=Y@bJu83L@_Kbq}})rDUx{Ud0ZS7O!vtJoQFQsyH6CFG3LeYBvxgUl32B$CmOy8!?z#O7Wpq_k44I|M*oMD z5+$)_|L4S9hH%6R|6=x^%jiwFwD|kcGPmSh??1>EMH?bsHu*;}T4N-(#XlX+_IV63 zJ#6(iQ%bDFw)O3i$Pl9BQrhW!(VpVV zg&wk=ruS^;$Vri?rT66j2J-ckhPw2gd@bD9OQJr#=bwo7mdr_d&j1YyNb>@^=6e>( zBVCNUZVUi+ZFkNGAU=V7q>Ewi8-Un~biG9`4lTCS=K2WvN{oo}cS6$i)Ur(ie_liCVW&S&0Dn~VLQv(9i?QtCgGb__Sfv^Ckkzb~+S zBaYo$?mtS4M@X!~{~|keF)aGSy1|{TQddW{J&} z@xEMor&>#XheP9B!~8pXH!0}5z;NebU`h{MDCKE#L-SR(W}VB|)kf6y zSb(y$EhRORh_~K^6eJo_(Ee`u`b=bGfVc%`G zeV=nfaJvzciCHl~`|b#{?+%B3+a308ci4BQvd>?~S@tf8jrM=Yso`#k6==z45WUAR zd4q-sy3cT*8*lsee#xaGsNG@v0}k8&;;{X%%66%Fhm?{fH9sgZM9??zmhU0MbVDCB z?=;*Wgfu_m(EK-t=0_cxciEc7s`Ho~L1JBaTxr&lucEFe408>2mHM7E+&6ZyTlthj z*V7JNyB)gzZtGfsh0FJhtxITrR$^J~uRT&?knyxf_E(;ar{`ozzKo~mWPgqJU&itO zyeup5&t|y4AT<|j$;-J5+iRF#OFzA2xT6zn+yCLPeV@bjmmRjhV%z={UGb{J_WjCs zEjfWR>T8C1H@uUS?|Z{=uMO!s;L!D^L)TjlU2i*dz2ngJPo>Mx69e43i5)~xOFo@0 zc+W7qLmxE1Z@7O8Y5u^W`9p{1Lk`U!IW&Ll(EN$5S@`$UkmeQ+x6cf-m70UT&kgrt zoV?1}wAZ;9~`=V zbm%&2>k@tWlS9|fb}NM)zep^|s5~a+=QApg$*3GHW9?TdowEUFvfm8zJlcofsW9FA zaRzChZpwRDxtF4jYmkHuP}VkYd{){MXaA zLEPx~l2Wqde9}w$33KaE-YxVt&06TgE;rS5-__l2eIJMBG>7JNhvp1hvxud>wq{{R zW?1X9!djo@=*MhXqWUr0(U1LPnd-;>QeLUtXXMDTa{n!K;Q(o4rIvh*=s?qakL}9$ z1x+`9%tOX!uB@Y0tHF+T4RN$9&u*89&!LWX4O8v%AK-*ET*}1!^eSh@eA9dweuU(E@_&|DbOd?}ZMai*CIec1gJo9@0?eq@_V9Gb^F zG*577F10m_-Yc^;bGzu9Xh!{r)@I53u}P-59}CL8=47b>yPQvW_d3Ni@1`C3zGA=79w*Fl*fCq#p(U5FD^4}dA<&mp?mNwN^CwoM2Tpfr zp5xFw*P;0gTl4c2cc!h`&ycFJeJ|{&mUaaFgW2SH63h30$H{xX#0sRZ7DyXQwd6ZF z8P%BPy|l5^x6pLI6|(UxhmDIIHr6?8Tx{DYtUBAaQCL-Pdq-Hc#I{jb)nMBQ?V4|? zvESk>&XYPrLzb8V|c?3`y?buRDCR+!?jFDnJV z^r!h&%6ckxR!I$cS~8C_eXC9L6WGx!%Xg`1Tn{^X<22?nQ#=&ty-f36Zn_1vUh{1* zU3Y^)i!R3>=EOq)w-(J~zejD{;@tKJ(>)B^aoMJe9c^0UXwzCpn=Wy*X`S7sM#jb; zZBM@pcly>#nL+vKvj4=D@d`O!wmQw3xv#Z>Te9jR3n=A|Xuj47wqY_KklDBe>-DO7IN?rNB$4&QTAze>6 zbagm%J?YT(ltb6k4qdyIF8{CWuD_d!qX4sHOg&?Ey#^Ro8Gcgkd)74Lpgqt70oLJr z(TrOX(6m%>8uyZ1K~o=LC;h|p(BG*&i0m^xU!Za-f27IxvKhxyt<>dg)+=Tl4}VhU za0PqSjOQ6i>U}KPZzgj7PhHMVe$9;IU3F?HC$iVg?!1Lf?Z@Te4KtqigsETAX9vs# z-lnAvW1Tn6uDp**eUx4Gmf4LrCaGmK=WWx=JBQRO>GgL^4>$9vBPi{kW&-!usWmKl z*No=|ICUbC_slNbZKe*Sw1cLP8@ALgH1vJ58+T5rxv<2ax(W zl^!zvT$EG4rHel@~{?zQki8^&TWBD^Pp7UdB zDwY1r?8b>Dbu1n7x#{ERPJNp0{lfHeh^5xB&X;B!Pd-xl>vwqe<71Gf9-{?co81^i zy&LD@@c*zG#cq@{*hR>R8LhjPoI)$UG0p418p}_{eT@;~SzV-yO1!@K$J|eX-`$QT z#y>93r#1JB5EcJ~KwNml2ovKw%p1Vw(=Z=Ix?V)qu&kjFZn&(A(Vp1pxR2}-VG7wU zK8klGQ?;}aP^4$Z_65mp z25=_L%bEaD`=f&-h+dQhYXC$E8^%h+y8aF|h ztBK#cqE&69GBvGlEF2FOaae7&w%xtD@1Nj!P?GsT*J|B#_v*}rjheneck@}b)%xk( ztF!tcNcAgp7bRG&?f0+FdKZID->7$g1!h^T>+e~e^&ACn)H5Vy6Da4Z_JJ~-25z!z9ROuB1{x^6B+sXyyh=Hn zY+VQMTb-RjN~^4ubr;QT)e~feE%&U>#Q(7XAz2c(!rH;~Xsg~^QVv7rBa)IODMvxc zqW!IUo}{$E592W4^s8*!)`L>QKDbJcmpq$5nMV7s(o-d63nL6(dO}tx=J6DkQk(9vRyGM_^T#ycugg3o3{a!t4s~{aFsflCfem&|zL29`dq&=+I zuDhNWq)mcEjSuK??+MaYk{F}E z$#W5_bsw5=8+k_Cl%034?tkIw=uuqTB+#n*Vnx4^2KeOhiq-ng-K({nGtZC=_rnRi zvb>nd^&*>R2ZaBNM*i7|I}^^ZTDRVh7+Ij{IHQ)a){dY-P^q(Nt93i7lrS7_Fnp6! zS*88H)&0M&7UDJg9r~|B_MC6TNkIo-Pyc@NC0~IAT6efTE1rYoG9yOv?Wf)Q7f6N? zijOATCm&!~t@nTfi^84w!>}DN4w=qOxk@l-2a*ucx*Y*1i40ps+!-P=a20V+h{(`Y z!~=pzn;5)`_-Tm9@Kwa4AtD1<5!WNCq;`g|B5ny08N`aXJw#-PD&o!%kwL16`#@CL zJ))e}vELN&)8pj_MLA!WYCySIH+3x|$g#Ib_j0ayW;`n6S}6g#xD%X%uvRV7v$$9p zt)+voN-fd{bD1()3;K!(U!;$^6;;gEovSmKX?mR=O)HGnxmkR#MPIDPQI64CofAJn zitev8WUV5@GTp=aM(ZLj(@zF8E#n!|XX|1)oTAJ+UsclEuFaNa&DQ%!vnu;8?kg(f zNW;qeW^usI)`v?=Cine_?VPPoWIJiN7>Kj=dBkaWU$NlN)|YX`M>{jo&QtYhDQ=OL z(TfvAx-{s9Vrhx^xk_a9wzhuKpmaSzgUr_LtEENhdOwOVTeq&3CZ+2`X_DF6wp!Yh zu9r$1Hm#OMrR!CauwEIJuAf7r%+@WdX;p@8Re2WAZS=kpXCt!s_KlutGZbVU#12-^ z(qm{J8kIGdV?A5TOO%r%g!j44Ug1Ehnz2ZBT}C!3GJ%kk$SD{jRLki z%5GM5*6nPDOHSzsGc7os^F^oF`%F;=O_z3|bC$!PT;6i(ojqi@EXu7E6>_f&&@a{6 z;EP!Nx!94t%((*B@lo&>2pEFt<_mGGY_!%4LG!-!C|O$YYZoeiD6}t9mFuJoX!qve zH;v|@JeiF{C*;isk}Z*foQqV2LREpHKN1JbY?wB*4$JkMLiCS{<(!b{#X@uw7VtN_ zGLJ6H!~g98+Dm%6BA2H#`kUEuc$KmdZ>dJqqc>^9uNO(D%|QmmjcS)#QjTDfvi<40Ze)tCgt*1 zfAzn0lYXqsEfZ*8iI(SoOAU{zVN?+G%P-{R zzryhTgKbd$101jyD|Au*ODtV4dc$a~&<2-#fzK5YaOY^LjqT;7w|xU``Df6cGgRbE z&R@^j`Aj9RJV#R|ekki``Qn~oevEWaWxfcR1!BvI!8U}q7&S4x!w@rm(4sS^Mv?mm zPE5G|Dgo3F9)y6vzXSnCijp^k|A$1MCN^f2Fyb8AUl@6&s=OssxdD}PF^W){AR~10 zkY>bWN%to~G+N8GkumJLU<_~C>=*2phw6(^%N3zUW^L^Z>~6H1VYy51j@x0+XP966 zbjJ%@2r2uD!2+P}a?Qagj~L*kQ!N+Qz6fU3oAZ$*n6KjgDq^5uiIVT=M^=$XzNqi| z4#O_;10Ii)hThsy)hGYP_DdvY|T2&I~v18^VGl`>rBz9 zu9$N*YrdfSJbd@qS}0nO9t%_k&k3q1pinrR!ERW_y_5a0889~=@GA>%Qx2(<(un?^3C-``R00}d~-cf zzPX+#-&~IuZ?5B5ie`&9*W=}z>(Sq0Mn2%pbrsN${M5obL!-1L?*iWXp9Sv(LaN%e4+!!F#jKo1mHe)WUbE_g(-?bhgP)Eqs>=in$Hq ze3#2SKedQY_HZzCp9r-dpo(9Md;`Gbrxx)&l1Vc8sYQG*!DsSQi}>DxuD%iy2K2!= z7sld~AXgR;F&H@d#ZZ^?0Ga_pB&iYnldKLzdrXH{c@j!XTx;Mit2Ay27-Co8kC(HF z=6V@3k2N`IEhusH%GE3q(~D~y#-dg3rP}BxF{R~O=eWAUrD9sOmWz2u^Y9%p>wJM& zo+J!tYn7O6T%JE6tgJP1BK7Qs0P7MpC*6-Zz`86kSxkgH3%4%!27qLFN~m)~TwfqT ze18SimTR8)OPehh&2w!-^@JXA{H8p%2!G@Z6@3?u+XD$bU6+95`6tXu=pD_x=HV|e zCImzfxrFrzsRHqNXh}k!?)(NT3F0}`S*{#lt}{8K`{QmvK6X3)h`CNn3B+a_&jan* zh@C_105P_D@rhaNKvx$Sr}fT?%@R|54EGkXgDh6oVz_&b4T>o@paobVE4Gij7(=&L z0&Iv)i(7*J=v9S9E;ikhjVis4!56U^vC-(oUeBU!v3<+=oa%}XhIL?UNK^RooxM~Zyve8|yrV%=uGI`By+RLW>C^dVhT-na(kqQ+C_Js(clva*;}23d^1*>wy4Ed0%honX zTJA_q%kHU=HRT{$F4}9kII;F?W8+&R#PHJoD65FyDn?dsn}(TOwz4&%fVEh}L+1=} zZ`~Sk8i}_cak|QQ6X6D7OV~Z{f$%noOA!GeuHo#*=O;->(n+lmchX6an}v0|7nzYbwo0ENgsmn28kPK_2vjSWp2bYbQx0LI^11tjz}VH5AfYc{nsNb z^=qY%V-eZ>UAdg$AXcGe=VSP>9c6R=#I< z<-VZU7zAWvPfwT3vhQ)Kh*MepG~*(eF+jW&hxuO`zw@~9{Vhyb`XiFSiK-h?<`$)j z(%*pbAq_IPR)SC&t|0qfRUs8YocWSM{)WlkfKmjgu&=^ciDrBr#;Ogz0;8-%wFP4i zw!9n>eE}*3Z$e2$6gG-TPJ};1yb;vPkg^x5%2$@dE8Q-YPQM-qwBm8mo05P7mGZ&( zSxLog*crQ2za_%Fk6P!0i(g6c>kVy4zduR_IPqY3LonVd;BSEG=pBF=9Bt>K?Q>O) zbK!`ip(=Htzo6$E$K-=+<#JW2btc+8& zct&zGrY*q?sLz+vl0EJ}k}@%1>2Wz==SK|W&haNS^)nzxx&cFh3=}i&Q z=|F;Wz%>ru8iS-|n-|OCH?aU@XDOt24v=9A5neo9A&;k_q)s6vSwNO6q!FE&eThPT zhRxYmD@4q4c?opXcsaA_e2zX;OxNQh3OTliifMX$#OXw|VGpv+y`)$5Pry7}44qyP z{aHTT&2iK#qC_y~{go?&sU-6~cgbu-wj76BQ4!)EP0T{m zQ5nx;)hr}?oHWtnDOx0jkL<}g>^G|`qVlpI8YD31PU; zN5czj!!2=ZDFT)y!hGx&x!F#804D+ZK})QojccXZMG_!jdtfR}7rG8wLug|Qq6FJ? zEnVn5XpN;#K63d0DT5m|2%AJAe+qswQkX&2%Ai4;M&PHsl``GVVD1-}{()sY4%31+ zgNv_QJcOi;`lI6CRgQ1cQH&uPHWg^Oe^uq7v7DvmpWlz=4=gd3ZFAs-7(WbuQ+grr zJ1=l%m0oyLdf`J@^fr?8!kf|yQxKOWNa?)Q*Wa>w(O(aPa6eL*7h1x-kZyay&V;=1 zj%DnI_k|aFpv$?f*G3Ij{CnVqLnuDc3k&{pFT5kYV4H(s*2GYLReC|6hepdVd({$K zsG*`=uUZq>F43NIz~VNy+F>RFj5HBoUA0Jx7}kt^p#GxeYJ&OtouEjeFIuA*yF$(* zpt{WthaA#`9DKmcT4^&m$RCqqAh1S6igv052-LmMBInD;t)3J-9%&4c?6)T*@g5Mi zA!W?Pd4S$wxq0)`4Z-9^>MssLpR&4h*Tb9l6-Z(Ic2L%boT4J96gWi-+lmW++Y){y@`GKiF0t15i~cd*-Cm2ilj3zeBS zsiL1ybQ?s8z0%=xlr`Cps^W<0pcJfx75ddyY&CCFaHUCrfFFzFE7{FgTO&Clo1k|w z(%|ke1=w|+yd&W2QAc?z@I=SMOpcVA$fC98^3MPoYV!~^*y3@T^p@ip?nU^Yq z|2Q1}#wcX>o{PWoc40dA*_oRa&)*P#>lM#Mf@c{vTlc8a?V_YY)VA**So>2|-Vbhn zC0ql>=;`P_9(dtO4AW55=RGY1SC-#fOTG+BB<# zL6@HaPQBcc=lp3JVnm-Lh3spQeK1o3#CBgqzKrcjRyL*bUCcd5>5x9j8cFF>(UHYS zgE?!rhmOCC2iYB5YI2M1N2VVzLa4--at&c_;L*C+3K`Bg9vq?j7X#CkT zGiE7Ml@3Gr&@Tu+Ep0l6g+4|$pj~OlwoY7n+i6fQr`IvoNPBv{3rh7|E0)$bsw$&G zRYqc`FWa1J<#Q-K4)&c$gL#9pO7ZLbWhXt~ihcwd#7&784Twh4N_Gv$(XQe%I>$^xv%6eBwyu^^pOOHb%6ldDUw3OXJ;48Edk86AL`iq6Y#}(gdzpmPUqp*vM#~Nm z{(>YIpJciC{1b#Xki_D%O(`=pwmR8LF`-K=KKwPyzDQ$OA{L)=V3Uz@pHh{6zxWI~ z3XlJ)ibEM}PsOG8w~VtXKXojoEl6626zmG*US#;`K+p~36=e1y<;JwgdPO39?0Jl5 z9%2nDP{n#RZO^c*dnuc1&`+rSJyP~W#lkfxdzM1P%9lArVN+4Wm*Nqhu4TF_knRff z)v`}lrQ%*Pt(e`T%kDY2N)y)(3D7;K_mbVCTlwss;Se?mNjlw>PHzL@S|s80LrR2R z5DB@am9hf&NW$r#faN2kF)R^Ik3&%mQtq#+((j!|v1 z)RBY#XLA$>e+dX9kc7=+>}^UTw<*7w#sQQFoA)8}JW}?A@NG)@Nw+Ddg;BMBT6c*0 zT0W83v`88K~ipPQQH>48WBp0Y*t-z@FGYHiLAGK5K#zFKUd+ z2A4ihOXF>gexKP*JM5 z*%ZfC(?AeJhUqP40>gA8XzP(=nBHRcs6zdBL3oQq5vI48eM#(re(sLcpBq+vn<@6d zvq7jp%6wR<=hzRTDr1Oo^{k>ZK0|ROHwgpTc^ge}=(QERys)(um)^!xL4G8#(Hxo$ z(nUbe7bGl_8_iMRIZfRz1R=T`E)tD7({pn~SUB1>FLYLnRYi>Z2o?ItA z`4$KVkV<%4TdYLr1rds?is4W?-w{NtttgFE|kF> zP<)7Qap65&+9vL=FO+M*WXLN;5_9fKIp} zVQHeYRG)?R%NvnIvy6rfge-HJpl33Prm_g zTp?>7_xW3pAboy;F`PS`UtrPKNPU)YZdqx>D4+MAL@!-rh}ZZw;j&YjWT#98aWazVlyuw3Ms`Y*>J+}+d=AnWQbniy3D|W=xx-Y2lXObI z?hNBvLp%UGyhs{#d&ssw!+X-DwZ>Qus1C^6g(Rlkg@&KgF5j{I2{bwFo+V|~fLM(r zr`<)8cryq$Aoa15Q0;6Zit_Qr#Ng}3z;|_0t#J@guQ!Ya6b3s`@(!xJg%sQYBzh2D z7eNYc2NFbPAW|+~4j0!dbOh&-^Vk)72`6zJ6wF|*(rv!~n&d*yov$iz_p||u?2QF) z+_da#RjKGdF^S#<9x;g~YH8d2FmR3xZFGEZNa=4x9z+lDI^McZ7;$2Y(qFo?XAm#> zA<1V-{f%*42>%GeYNW7-CV>M|lz3=zNXgah3?^G~=>rU-6)MC-lg}aHGbC-)kBa|N zgvebeMns9D&D=EQiqNB>4y6VhC%l(1z!1+eZ9DM5?Ofitbdz1Lry{DQueupy+0#SC zO9kDGayDrAHw?7yMlU|{($Wra_VdaJC{VU>X5^)}4M8VKA9;=O6xA&kcQ{DWM{!11 zifjR41yUdJG%a2R2A3haxY~BmVQ}hQ3?ln2R{}zrF48*DU?Ipo1aE#L2|+<*a)?mS5@hO-ayKg>*G><)9K)FRgBX}MsX{R@ zCz_D2yAAR1GN?*IGj?0rCc4^`7fQ*@AdLcVlJ_i0(mS|}|vF7Wt=Dudx_8&qnC`ZRh7rd^E_Xj4x@S#XDX5P>f z`Sxnhp*Ryjl3S?*dP;Z9Fh@Z+gp{#}QTe7Gza3IP9HwdiKAvfuLEHYQdkF6ACSfl;7`IYMFjRe8^=d_*Kv_p zINi~a>>*VN1qNJgbM~L-ao43-G-LCMU`_msy3OLcuc%sdBiG*bp1WuxDK^N zFOG!ld?anqA}lkO5}?}|jz?blhq{|%BX|M0s=$8+Qt%QW>yWt^X>zoxYb(yIQiNTw zHWD4cJp&I5ryKA=_64d`yvp{3LjHrGc@LlB;RPt$UkIAE?y&DUy$jzM)f=Hm2F-JN z5oZT2?Jx(=!@Afi29zT%6RiThtq}u3t{#ubZhQ)j*@Yy|VAB=9evk{=BYMg)$QQS$ zu_Mv3NMl$cR*<21~yHu%#CNT?57Wd|`VL6!2@LNzbWv(YM(L6hbAFJ_sw(rreYa*%#0T}XJO zsrb2Ln}}i#D82%UCHL@aq9PFS+;ykoWIG$eIWfXG&Q?O&-Y{uf!g+A8USe=hG z#bHjJp26E3xpl462XN0Nx2|=1zSw{b`wL=MuhGRLR-F$!2X&yZ158+HlH&rs!j zkSWX0(8YV?By-C$+2~agVDP?x+H&v~=|z;jv_R9&LXu;$NS{n8 z2S9j<>cf2lMZFG&p(u$Pbu5`Z-PmX&+ zA&)^0y(iwPw%>WyvOiMAUxHVYZ<9@PvmHtJR+|U6vcXBZc&~Q&4qD~cQ~811aB(c3 ztcy=ChWG7?k{-IBU&U$Dp6CY51rc0Vr3jav!zc5ymP;T0Blu)3x1P#cV)r25S!+3f zLSAY86CudbqsU#*BxqWK1n?U$Y3*6#zuba4antJtP% zGuHV*{z2@>G$k((lE)L=nS%X?A@csMfRn9i+MV$YhD{YSjD!*at`hkk{_Px_G8I!?-G%)|ssjtghl2#^cI(tpHs5 zbrHE>6h|0m;JjxJk~qS+9GOdr@Cf4pWbQ}G{aMwuk1)hrOZsrJroms#;Rxe^nrN}z zaQ)%Q>c^N8lT(5#9 ze?E&MaV8JCq@fG(V=eq@V!Dp$Jo84SmK?i}*UXFvtNB%kE&|{+=L)eSj57(Fhman; zY3k(MAI3S($@#RC^Ybvy(?gti4{Oo!_N)!jg;mcuC8URO-sj|e&dFIE#(BWWx!1{A z6UJ$v%fedv4=3l^FwPt&=PM4*?2U@^`1us~TVh;CYO^M$AQtB9Vqoz0MNS*@gJR#G zx1|?m=t@0x6`W$Wq8R&f;Kd?~Z;LDSnd0j|OML2AeIOglL4nTEW4=UTRaMJKz-VK> zfq71Vvr93Ck)MX)I8UoSirLj%r6UG3lYu&WVpl<6wb|`35QSvbsz1ZpX!h1QGn)eu zpOUk;{!@svw>}{f^xl}m!6;_i`J6Nl)`10AvILka&PRQ5%dol>pCln=f1`NBR{Up$ zIJV;Rd3Lr*ZPGDui%V~7DuAdLQS>Rqyo(g%uT<2PVWL0^ehlO%WWFK759t?7#0WcW5kdS> zSa9HWq42N&hVNftd_!@Y#GTYW#S3>z1Kap0EO-ryUWd+?XvEDx#!bczF;eh8AWtCk zFw!7OII1LsGU!h!3cIKr3S*VDDL5lV62hh+Q$~bpE<wqW-G;;1A{rj zH!oFs%3-yBs%gDXWuK#D4aEI{^4|mU05bPe{@sc{0&U{tCgi)#xX|*C-fO|4(X~O! z^?|PwB161}D@V(mph{Cvnhsa7lwZ@~_AW+A(y~ueOxa+{T&?s{-ZWK1wXIgm?b&!- zTbQPSxQnNE-&K+=9%FNV12sl!=C&aY>Uky^k3^nnBuuI{yU!+Y~^1qGsb0 zZzLgYATl{fT4r};3ulIERAhtYThDZexZ}+(R@%gxF`sX*HY&=Mw%WFu5{Tx@s{fC+ zH-VF?xY~#B($#Z&nO>%+XCJ0#Uw~N{wt)c#L}eGE#$l69mJtP%0l~;3xS(hR#RW4W ziW(PG)VQHWVl+WxqQ(W6B%)DcTp}^PY7$@lo~NpAFQevr|L^zz?r+X?ol~byojP@D zxpnK-oe!}mFduGXu-jj~1kME^0TBZZ!?}9q81b)(q^&Yv0faw<7)!xuEQ6 zTM_@6#%j#xB)a1arIy=mnLTC4K!Y)eT8rFI2P`DtR?U|Tl)1%uSp18nVG3ggN<*D* z*WAh3?}%3vyY%3U+3x{4`%O;EjWJ7g+7R?$&7q8w&d@ZC8}oUOk~mYzjJcZhj6sq` zTz1AC%Y5Ev&DAW^k}L(sLe~mJ^@pyNfaWG3dl9&iNIQ^zGx0%5%a+L-HDl8GI&re#+*ou#6AvUy z^(U5!+k~oSVTT|fc!Xk1v zl9KWxBw7oQQuZKl0}B;5tg9268!_TCoT#Y-71@a`oVl< z5a$)#?ffa^{EdRS54!1OteXKw2XunWtMWKFOyn z&#zK(sdA6ztcfpozlVI@2FTaGE9YQ?89=@eJ{N&mfYER0)atcw_l16K1Z8CT7WjNV zf!e)VWknC=W%hi)toVTGItbfI>3oLuIs&f{;nS`Bx!86Hkk7E5*Afgj;G-N|d}t@x zPne5WuK`lfb_6aZ!YqD=z%zi+uW2Ei04P^*Uy3$RY3zHO&qWAVsrrGUqb7jLzBe!r z{X9VSz2guVON4#z`3Rg#0{h;Hlh0LYIh`@)^ZkvDn-v8Ek-W^F80T+W5cMl0`#C^9 z2|Z8qnQlP137+#c6T|cchj2kj`>Nda0N2CG!qHbm(cB%8~-T1R1UXG`|MqsYRG>0-9Dq z>n#^41xz=k(_$H;W_E}%2JmhBA6%?dG*{4k!$jb&@b$;loX7;XO!y9YEUtzYzEYFnY^Y#i`AW@sl^%98IyfF$)t*f~d~! z3iiRnOhE1}p{|!eBV-Tpo_cx_=E#7qPl_QD5I;J*>k|xPgjk2!wH}d#ShLxc6UT-K zK&;*DdZz$81^}@(b7>ZY5%T(2p{~gY5Ms6F(rb~BkT=N6?z$J!34wFWuH7XVf&j4w zv+FVZ5(1F40V5$HccU3TjY~;y0`iTe1-V!c1LPH3q0_!bwx0p=jjm^)4Iyt;xa(1* zBNTK+PxFEI8z_OK$3gkG6HLZH#?dKD@V0t?O4ZbotWX&7pX zA42Y1p`|b2mykQ&40Vl)qWuC2kE=XAu*)}o*`lsxUEOPq(}TPG{Zp8CmuJenDMr^| zXita@HoJanu zsoypI(P@~@LO3u!tNT2h(H@8x%ae7Ujc^CU`cz5Nn|4~HN1a4zV=`ihb7{1OJTeQO z7U}6%$gxGAP$|xaRL?b%BzS0~XJ;{^y-wCm_;H+j$ZL9+K?hrgGd=|2jz5!G zagk2EkdMCEP)GK8Tb!j9%+4eGyseyZ0pXE--od^*5OxBu!3y3X5{U$OY@BzfL<#~t zvd`Nlkwkz;_IZa%q%OcC`@F*?(j4HCecpD73=P~1ncfi+=?L)1K5vIa#szp}pLeuG zrUrPjly{6oIs-hi&pS4c-zA?L;E{daV{$JBvLx`42go?7^@;$G?DLM7NOyoo_IW1+ zE4VE4>%UlE9iOAeEtqfUF3NAzPJ1)&ydVsSW=eF&mB0Pw_*LW(cAT zcLK@&8TuK=84jtAgMr=%v8=yKu?fEA5NIfW9VEvYhyP+AD8YhUGKn5Ex$NTDTBOv6 z4oVY-JvyHWS$G^|Moo1xI9lYF3;19%kwnj`aDf}v}>rw zc>vP$_-aI`R<;Hsz@uG5b<&lb0Jj~7>Ln611WyDE7l)rfn*875U%^dK(NHG>hD#lO zcRRon0mEf}hK&FpjE57_N0qE_xkMrXo(LGO$d7}q0OhA3M=B#WLqMb`_jF1&5ZxIq zc78(1e0m!#%@JNoejZ#n)v*{6oS$R-kX{|&v9QrZMGlZi9*>2Mmgn+NwSv6m zMs$GS8EA<>HAbgsYf%B1#szpRY;>S(R#TxxEtti6bksRlXU{`kf?DMClt}t9q~8#J z3Z(p(DV3@zJBS~nqtCe|^cEPh6he8lM7p@2rWj2X-&s@82=+YLowQxE4vh)p%@(|!$s@R+Lgg#MczG-9A8lhk@3xFpl1Ah zgsu1$RcJNwN6TrjgWwnO1qm1|{yJi_;@hi{Nt`cW`r^gl^vB--B@picPcUww)n>;R z*TU!VaY&GKX8pXA9AxtWk{R)TL68~06{4;96Ed@hLGi@vYna&p(7o|rLPS>l8-$(s z7SMh1Dd6$PcS6xX{B=-*@jZ~19bW`WD1HvY;rIm5Bk?CdiN+sAqpvU6dAT2lk z8DisczPy_kuK^`LUI3l~!~au=PQ=DJJO@6&FBQio6w^3H;CB+KAmYheKL1oBHZh<6 z=mg$|fY>C7L;^n}GFdta#2rGpJ7UwFu^3;Zcf@9@o*@ryDK<;CB`3g_?P9ZK#}Ek| zf!$)WbLJt>+`td0^K97w3IbapEH=A}F(rW@^o`AvX%cx0&pgwJ%`YAd-Kqk+P=wfm zNC(*J0)<3Qk<*TTfw3&Y!cr>J9N;E{*di%lD13#L65`-91F^Ep_89gAgcE;DppJ&e zNcY)0{{$9X<@=zs*`BimVUJ9Axtq>0>`hEJ6E$Xzh>`BIx9N0=ehE-VYU)N;+6Gw7 z994WQq&ZUBVON@M*w0g%fVyT!jC7y9+D&IOkI_;KJMk%18lx3G!)2L-N;Z#5Q*=1y zNV0&!u=^sMsD#DMu`$wp_EI<9X)v&Pv`i=DAhps>7cvs3Fsoy87sw=u0uy?}eEson zr^{s-iQyD+S{}a=iqq5FgGr~6`j+jy3hu~0Ce)iW@N4!AK|fL1y&Ri{-?E1iIr=o* z1OcjeveIM_@R2O7WAzA~yaejh@QlRPH>5ZqxFf7eA~5Xc>Nk|jRf># z(=-1eTiZ-b16lz6vFYVA>ErhH>o+v+L}upa!NWF6@*^zJ0vh+x=wC?McHkEQnue0E z%(QR)vDD3IUcL&uRv)mfLp_SnVnD$UgIKjVF9Fto8KTTDkoNC@)-gI=9jt#jxKINg zd~?BTv`*JC0}=D6iZKVsItjk5MAxWiT&>-jvjd#3xH4XajOv5C6z3#Ww{mT!giVFHJM)9CR{(0W(P4VoGm)4}_Nh12>}2A8LMSHONmQ$rFIK({%iqkjbm1 z8TMO)iRJ)Kea!omy8i&{-vI*>RO)AnShN8hBw*N72pqgkr8koy$dQ+MziE|(@L+!} z*m#V^RKU>FfviDbHIaEhc&5rOfYExD7PTHK9gBprmAIW4Y6QzwtP1e9?$@jrgLV7& zvX*Z!2H~~TjqYVe&v%0x`qjz9cv}ypW%{Tq$?daJnW7F_zevlJ3t&>eZ?TrIGX}29 z$n?D4nYJ}-S0=g&>bHKQYl3B&?TYq}cwd_W%cq4e7 zVJbV&_sx9HG1^&ySKp)(nHZZ9^@$ny5K72OdjY0?4j?P-a|Avk!b&UKh^Zc+`c|F# zZj~iGpH&2F8P$2WD#2Qtw5XO2%_P!1orl?Nc4KA9d1tVOqH_gM7MlvXZKIq{XTj_{s{@|9s3`2NZBpV|JVsR0E{AlMpx_pv0}c%@yZ{ zFo~BJJ^?45cE#O-1UFFv#XXC_GeoG}R|tFwP)+BlJ9J`WBP?s~utX4jtt{Zg3$O_Z zAVr*kz;YrKaUB9z1C&Owy{-s11h>)z!ev80w07~4+cd68-;f63hk{7YBgHF-kstZ{XIP8H>7wLeh<$V zx2Je6`W~L!?@aOhRPoS>smTDN^|xuUPi4lo7_E0}v#>0G&WvrvVTft5vKLlT2Wp$f zuU8pch8s%y;H{Q38SPG1(K=Y|M>HdCx(9(9h_H%YMBq7qQC+MX+pnPqTQ7QNqvZfx zu>&ir19EEMllNG1+EH^6=FWftPgF>vywg1kgfjrL;a+f!Qp+^lP;wl<*RtMm)p`Q_ z2LMv7_YruH2-S*Qj9E3nX#GTs;y510(tsQ%-8sI}Qx6htWjj@_FM_r8LTwoigp0m6 z9mdx|nd9rX2lYwXNhoRG|0hXZS`y3hhAYXv??{yeQ>505(lV_^1;}E5ixoR#2d~eV z9$e6SdQe@vM_EOWoay6uGo~n)7r0~9AvIPFsAsLds;Zh#)x#JG5TGDufE<5IjK2at9C90I>3!aDyFflmR| z*Xh*mP`4VTpBC8u()t}9eQcY`<={`c5V#jGlDSmB ztW&wt<@goY{(hSD*6XfRlGzs4K_;w^X$We_Imd8@Ryjj!jOqt&RXp0RYMLHF1LjeK zBR;5wMme_sBb(#d?hPY0(10=9|0GiJ!-%aht;b>H@ruj?bF5o87;Q)C2u{#j8+0!J z1oD;3g;{RfVjUqM*JwF{j{ZE1W@^@PhMk&qjJZOoiCITBG&tM#u7iHkNJn6kk6a_w zU4~);WK~Q(s7rSAa?7&MMEu2Nbar+$o2k*wp)g}9&m zot?ww$P>2XW(Cl}?^Zl#%N}$G@Jj$~7wFV|kbCu=8o3GOpvSG0`L8xduP(Z<|@8i?xkD1KXznX``acG3f$G8;wDr1EBiqWxCfi4L6kRtA&-d z%@wy23C^Gd*5^(Ht|mg0{{n%>0ZQCW*J)i0H&n>TyZPVw9LU)xS|A%ybC-7Ov{;yBCbZ@N+Q(g*9iO)phR4IyDMThMGUcW z7rG(}cVGn&AVrKqU<470SdPF_fD$qE4p)Rcg@34(d#fwr7hrmvsi?(Y5O|jeMdYIs ziLoP*1$iPlnKCf^nQd0?hpvb&Ff9g15tkuwDG`cz9DzpwO2n2sT`ij95HZZkZ7c;N zZ4rg*gaJ~-5CjGhp@_u@EC8t5`Rp!Ngd0j$c7tiHbHzQ31P@XI3-u-fehJ?Q!Q1AvHZ6hk!q>$j&?2=bij!Q1IBc+ zbKhIT_{V|Y59lYC3GXW6GU2dmuwVsH%YSzla&hre;F|$Q`6|%A>a1*IE?dPtfo4dm zUZSaa;GhdSAhvGQM6P9?0D|&O)s=G+>HEfL>(M+rS@@eYav3^c?Z{X@Qm`Uln%GKo-_OANv&)PMim+=FO#)fDh=ZGTkD}G#o5#fY!I&JYm_- zl#<-~LM^wSVzhmwqghkN*pI+uUhO@Ai5IVF>IdfTq6X58S2xm(iy-=BKtBvZJLTH{ zZ-G4psQy?dc847f!}u1F9(K-w$fMtb70pYtP1@lYDfQCflzQwDTH#Xe`h+q^YJr^Z z-F>OjqQClqGOQ-0%=!J9to2&pfYv)TEA90fK-;+O5lz1tg=~9LBW$bVI9udJ1l+U? z?u~!QoHyoCw%ITYJ&d_bA_>iXs!9Y^UV8v!=1Xc1RjJCO&=jRa6dZtEL*k7pxob0r1(R3Ec zXgCT@*<4Ua580DhF%Z8`yZ9eJ5OT$3BK1euxB zM^NNE6m2%3aT;ke9!;T8~%<(qH_$2|!1{WgSO zWiFF8LSy?mlh(B9L&tFaSQCuNbVPSQPAB*GJR;9wiK#aUS-Xasv2_CB({0C{VIQ%;6NLjKm^RGzO%$jPzG zr??xyLT%06jc^&!?3Qmnq0oJOQb z+YUDMH>hnw&SOa7ZiUOgB{YSvOA~Sqluvc{p5sAbh1Qx=`3($0PJgR>DxXUba?Ul&f8cJoo5J_K2|2%sPI0%! zh0Zajx|`_=v6*g)yRj_PXd36k79Qj1FrH4Stz2)_tF2re`(R{VdKMX;0?*Um6K(_9 zcE;krhe4rsS9wXWUW|ay7$RMNPgrDrN_aI>s7+sp;Wii%@vQSxjNB-Oxi2@03AINI zvbirzSRw)EbH5h605aUK1ejzdUL%|$b)dzunH4dK($`1nj zYJF5xeGu4Jmo*Dv_3cMry+ndWwjo$pCb6B55Fb+e9(E##eGkh)56gWIVY%-iEcZQx z<-Uio-1iWc`yRq---GQ;L^>~1dHBz{59apQ6>mj2vKMOaKp=V({tnjJDjYGK{mfxO!3HE&d)k66PPdIRb5C2a zRTfiyhBi1@T0?z?HaJ8g>NB*#p%PJ_p$)c4M16)fI7}kyGql0s5>cO_4Yo@}eTFtT zLL%xjw80LEsL#*_M@vL~hBi1xBI+}=!LfOlLQnM>+Tby{R{&9;p$(3cTC2~{2FFW8 zeTFtTA+R4N!1t}-5W&egmjh9sp$$$6?*^hiLmNEK*$HXtGqk~J;oE?y&(H>^Xa5Rp z>NB*#nfX6MjQR|1a8}{tKz7T|&<1Bqb<}5QgD3lFcl8B>NB*# z`OZ@ipg%*KomKcTsziQ>_<@Y zzU=a1Pul@FKxlI8C5W)DhyR8y3Vn=dTUNZqO>LozCB?c4ETOF`%uQ|Kq97YVbQM&n z@Su-1y!rUCxT!5%Ttt$^O>N;mlF#C%ws4uGqfwuYO!EH*y&`2+cn)}NhwUr>2ubCN zWF6;+{3_W)SnoRs4^W~SS&|_tT!;kG;W8Xj+h*wT*fztBSz)tjgypuGu-rBi zmfL2+a@$OJK?3b8EVs>s<+hn{xE!5BSZs<+hoy+%^-I+h)RY z+e}z)n+eNpGhw-HCj11(uxMCrn+eNpGhw-HCM>tjgypuGu-rBi?zL?u3;lCYZ<~?3 z)`EK53=vO2Z=0z>bvi-4ZH7oBsJG3qe$uwh?1MP@O6-Ag{5%=+drEvgQih59X zKyfS6VV5zLJPm|JfRZ*X;48F|QtlPmc36ojmAmOrEX7lbA=u2uNrm}G!L(EFR~&b$ zALQAH7E&e;fBs_ywK@RF4*?PfVSe+E&5WKcvQ3?u?d@nd&kWd)!VepPxJ6s{`Jne9hrcl6T7s5~lD zmB+y#9M2|nCwNm*46{A;0KbN`9!ZOn_8RaP0ac5%*1v+4W6)O>6XlcdqZ(Cfbo}oT&+S_D zigS?eYE6F=^m&@T4zVW$RvN)?a21_nRKQAs)%cP?iJ};lyLBo$T;)$S@)3}dM>LXb zAFuuiYT}{;uE%em=c)bevRe1)dg&)QK<;4;NmJimOcOSs5-I@7)VH_N)H{G*0#K&D zy`6kt1OFUQcR)*|d(?baZKLj|mCDZtm;7GyCRJT>SnFZbhglUnq>|=OAg4jP+KzhG zVPENDJC3C?4YIy>Or;Y2=pt9iD(xq$_bNZh{cXy+TGEX^ZA3Q5nRfSmD!XMmSF`7h zpzAH0hcKtp_F$?6sE|3HpU+hP0{$6k%c-B@My?v z8i|M<;J6&nGyuq>2s{KRc~G zll3P1dF)c;M7gp-bMTRV)fA1?18G1uOoG-}p{XKCyRX+w)SNGWYRxORXu2Gk$J)-P;(z_w~$)-nsjTVQ^4CXdJ(VQzU#1jICwo(h4`~4`?l)hfhyT_VZ2@ z4_DVWPJ+`#b=xv`vlp4_JdVUo=OW@>?T0dY#_fw;8{RP-aRVg zbts^$RCm(GrtCLN4!kYsh*g*e_F_n$jwuSNsa2iG<@FB2TlNIZa!P-}zgEiS4g=mCv4%TFoLL1~cSd($$D#As`40Q6N(sj zUAu5$d6_-0fi+PQfK^JT~9#O~M4jw?$ z93Y-MFgGT$6v#C|E&&WZ3rNjgI09hkCLk*jSWe`}K<+@`Hb65iIap_8*6KhXH^*JU zJvk7}LFIXH{|+Drm46}dIiO^?PLVOF*#6NLYTfqJ9L+4sD$SM*RJu9r5REJp%P|1c z=4OB_$4LmBNQA}Rh``x^HWsRlg=u3UD$mhk<&bifMv{a4(8DT|In!74IjE9F3a{jxp-Cc5wZ#2X0Ti}v}$TBlB>`Vj*dAYG+bnDOQy~V-yzu=b; znP&!veT*{C1Y#FPhPf++zD9ExSN93A>nn!2i>tmib66EF7?;fnvF(K;rbCJ20H}%@XzwvB7)LKe^2;N9r?f-gMGXZLuQ!iJ zd*O?k_6zxKz-_gbC|4qFwP@%$8g${JQmK#z>^o&zDHW*t}KH zbFQB+k&0t-e*|QS|055OaZ>9Qe!fI1#!IBz&zDHWguorhZjGErh{-v$;YR<@slk-+ zJp63(k0)}Rb1tN9_VXoDF)h3u$QD0eA{EoK9|XfTKVKphGxK{8bB&)bk&0P`KLxVe z&zDHWY^lzz{$(t}$-Zewv(L|$NW~m~e;^O}`4Xv^D|I{I=S!qwzH=u8JZV^;L$)`o z@MZ7?c7Y`NhJxxP(iOlQhY{IN;~({sD^sK{0TNU%kzUQ9dWrN#1SRidE-zmqeIAKD zq=dQNmUU6+C4?PW?_sXDWnC;OVfsndRu$%Yn^P2|mu3GFVSF4IvoX)t2!^@d<`fr^ z6y|!H(?{}!IYn{GBpu$!)pPhim))Wia{>Z6$$!Xy1_&`L2$#1nD`MWZT5GqqgXAlS zEdj~13{2K*Xal~&+#iv!frQQQdtXs59-bN=o~&;jz#|R+jAFJqAGdwiStmMQA|iLG zVNDM)SHph_I)3Y9FLiNpR~y!RNsss!qYAA>F|rrEe$!p{L|Haz3-<2Zi#pE^4Z)ysPZRyC`0nZjp}<3j{o`M*Q~%{`W2X;=J0 z(hM|HdEwC-9H;=>nD$sT4B|N}-Z6xLd>%M}N8B=5LMLP6;$`+UV7ga`WIZa`s~GK` z1r*}FrXFh$?R4s0XxxCJg@(Dyk_G%T&^H0ayR$IE(=x$@+5k&_E@YNGhN#lJAqh}& zFOZWEI37@3iBa86WEtC-=nTvEPbgh72vIx1b14&b0IA-GJ0w8q5S>dOwW?s09jysZ zLo|u2@n0Q`l9;8VST;m)f&)9Oh3}dhlpQ(_$l@D^)ep*gjkd!Es~^p`0C~;?6r#`@ ztPZ-;L7-0nik2DXxmIu{NJaO+j{&9Yv^M32p+s0jDcrJ;caLxDPzHF%c`FALbi%fYL8?4#`Roy4>Hc z1bE*x6t`jlt-jonjnO1qC5pY=YGbi0QQYO$IN2EUdB}x1S1}qopIed!I~k5ngUz)% znDR7eGao>M&9#oB1g^lnMbZ+I7Ih%$qWj^K0M^)iE5g?Q0ML5@RczJf0!udQPeJ$y zPM@Q`sTr#6jK!3r9YCdKsJ3$l&^;uf7H3#v zsb>zxEk8ik!0)w8jDD=LS(eX$Oj!eK!E**c*1#VScok6ks!rh6K;rM3KwY%2qaDEI zPw1n*Rno`o!DrML+c|jB%tit$H0JV z8s;)A)JlYFc&>@rXnE&qJ?Tlj%pS7Q?fA)8W>)l2sm7b~>z;ds$_V{C5Ua{$W++e?vxZ1FCnbRQ)dm=O)Nq z4XDZ^F>1xAX%0mB0Y&nQ8#zkXGeKAeXh`Jal^BRFf+dSAIZo{b{Z>Gg{0vU96*(HB z-v{AsfOMXEUG=6h70Hn<-X9{Q^Nc`L8$deGDg;)Nx9>Fm$3mXw%pqfLc>9>kFcD@e6D}cmFS^#xH4(!oWUXE8u(8PH4ksqqj2z;Jr<=`_- zQisI1bf7S$gKgDQhkP{u7(nUZv5Kj~2_Q@bB!>J49q_`g0XI-r{stEPeN$$;LX&UM zk!H_EOvhEW@0*p(_DV>pV8MVKF&`J6^P z1Hu!4B5W1=*pwYwUkrftfFiV%znRkiP6B!ypzqaMp)XK#Q=kgWX|{0a#0SOuK9Cl9 zriygd>rGOUr_QJgYdf&&jr^antbaD;?7}qxTCcp!p7$Z6aA^xU%GhH(2o3H76fPY= zS`%rX0Y3sL%hs8Da(Y)XhM>FqBA)|hUK=Fu)-^m6rRQb#oEWA|GDwj_p1=%)u#(#S z+N`_+Tt0iOo=G)E(2wy-$p3itAcS_tPc@p)n7OQyeMr0)P#4#n5$I$TKY(mrO1jtF zJR~@5`Z_=@;o{3jNbw$^oWgI{gj0$0i^HCgLC8V&URr^Hd<${|>vS0WC9u7z2jk{}IF&Gkz2h`#DSr z5O1_D0oJVbKgt9JS92GLi@`DvfUE482js6&qKq#4-+m)$?E96mS7?St#Rp^43N-fp z<`CB3Ly&YYpz13c`$03x`x)=^nEwN+J|poVGsNDj1%!HlG0BlE-&^#9R~5;?&bc?nB7 zT>7@#mC@gLnLVG$#E4hyCmQY7kiDNtM@{H9Gg>l}owMr^7)JWl{+P*6G)7&69@WCJ z{A@aMEfP~O;A6Qgi76O@$5RoMhc`bRoJ#IP&%+B%LS8uR6wGo4dG+&#aT!3)Ex$(K zbATL=9@B}CoZ}JZ^uJ{y&gmDvfPIVrIUXHE;7LH~uXO^B8RsCM#2++4Pbbs5c^s|a zZg2}?gWG6#XIc}Q=gMo`h_J&w zS1M>Y+;gSE9*29byvA*0ak%G7g(HSuhVnUl1Y>;XGL&9=3h0B*(iWDot|@#GspP^E zwzM%Ebp9Lv{hvx<@+7lt5<+ry$!U@2bA`FOj_lTijR=s*oN*f)!oRfX5wtZo)E;)L2DSWsekhxN~ z17WT%IrE*jAV9A!`LYUq5ES9+lG8U7CX z)uo{G3WAdN?=Ei)R1YL%lj7$;OK#~KSkM8HIb3e?Ulb~Yxr5RXa=6^&zgSXoZUT#c zs|s_uDNq!A79{Zn!c&kWW@I0QpByeX1&WJE%HeWTppWFs;c`=;Owu!#n~)cH{paIf zZpeUbBEcHxSHR+Y3L31H6>o$GpvMZC^gfTFlUKR=LBCfB zm&nIsrYox%a(<6T_UK~@-qnmecCheoX-JW~Fc5UMLxDVQnKdu-?$azeNx>5!t{8$Z ztD#_Ys3qT^uQ68&nk4c|#djr4&CBe`!$Jb}SeYRECg^cCApi80i$QB*Mf?@`TY%C& zd@QyqU?O{a`sh!4_=@JxciPTT_&;W65J6gKf3Tz#B2n7NzTpBH(U*?)(nPkWS9k`1O+#1k9RQx}^sBe5^l5`ocVv zVLG5{Jldl>02SoA7dE}(oPkW~n*B+?D!S_G~ERJ^6r zU9QB+nw;jW)^`yoLJ6M(na4{TAO3|Z)K>Ka8?)?eKgZXz{X7qe2Lbug^N%0O_S5zn zCenZ^*+PyVP1D^6{0=~Z$!)EH`FsH~`k`+cXmvD~{8vu%6kveJ0o0R4+URs(iviL` z`w@5mP%%x5a&3h7i4#>$q6S&k?nJ4xbi8F0BCF|k`4b?1j+93L zS&cw9pdzl*apM;~neLupq=p3jqFwf<=Eu;uFKp7@pEl|D5nZc&Aj{n!ea1-VQ-m7j z62vI!NJhyQ`CzHcA-g-jIT1{}%pTTm6U0^LGJY@gxd~8trLK!xq0wAM5KK9jxg0!A}6PboUBB)xbxC%%u5Hjk0x=p z)E}TA!M-Ut(0%&a(hMaD*)>*Z0L}FqaCnUY?z<*lqs5)tW@BpG;vP1fjl+hGf512% zYMdK{uxZ6ACjs^MjrJL$fKT*derk#kA8Nl9+P_1qtUGQAj8>SNEumkp`>#;U)?pb zMv{Jo3J)NChvGSr^s9;_&r1wnT`be`k*RY{;mJ(PN2bosVi|rn8{yqW3_DKN-r{8aoXZHH^`wjBUUY~xyL7v&`)9*LPGkbmd{RVkvuTQ_<5V#leefs?d zd1kLqzuzFw?DgsQ8|0b2KK*`!JhRs~HjmRVb!M;cnB4ycqR#B~jgwldGkbmGC8Eyk z^-T!;9oemsXZHFg=UfUzo!RS~68;Ggb!M;cILAgiQ)l-2riEib)S11$>GIY=o!RS~ zncoL7>dao>tipOA>dao>Y^jbqv)6aBFAnRfGkbk={A_OO%wFGIshc{p*Eip3f`BKD zEIw}aXBD1=MDomDU-JEiPf{r28Mk6eE)DbKVA1;C>V|I}qdq-w6B_sk4Le;XoWr$a1Ad$eI7&9{T8jym(ULqaY_X8;j zEFs(I>|X#$1hz8fC?AVZ73g5h(Nc6>;8^r~p$XY^k>)@yW2Qv&q0i931FF8HP)ZCiO<}7=>!9r(g z8rC`4xKFx1R0EQA81)d{t;9ToI*r~CWtU*BC(kX4=WX)brFi(7X7p~!6TKP2qXnjn zh;faH4P|u0mvK#W&;WbX^HDG7Pten&tCGDQUQ|)3MG=e49Pm&{F^EG zgUTY%;tUsWKK?7+4aRc5cmfup8!hgkcBJ2;|9nJ}A zh{G* z+^6Y}f}U_yI|!ugeI3J|u0@^x%RuS*X%D^4b|Qz3NbN^SzZPIe%bSYF*DLpj6H5tuh+v!698 z?qiZmRT4UOrJS~37G<|*RIzijo-$1~8v7$eS94P&DQvgZKh)8TLEpeMH6J7BsW2(s zra#tht|uWt5w%aqa6U(wT5i7dR8%hn-KhC7BJ6sV4=b>i`PlU_W>d?}mv(&_CDa); zzl6qOzG7vYs{M^56wgMEwVXzZ`RzYIvO1&w0_aDuE;WM<%z_)??BZYpmE_(xPhq5? z3Je6%8LW3V$c3>%uEE`y=dI3eI1`BpIk~a=GB6WjT~>AjdIsJ|7}1I0zV4jS@SqR! z7%e5}4%ExGAA+6JzR0h@ifbeE<5ju@%JF4e>pxEWtnZrk{copwYBH4-F&*dEP{DZ# zx|u#Nt&5o(5r619h7I2y{2T(vnLwoxILz39&163Nuzr^+_$aAuvSY=2SR8p6FNb}E zW!eo!;K$@@&$dDG*>m-Coow3F9Ff(A6uoU@_Phn&(0xodqJ-+LKqH?E2;WB9D5-Me zn`qg9z>TDJWHAliFpBUjpwW^ebQqNZh@6VkZAbel=pvx!0;1c{J^TtO!m`{G!z}j^ zM0^A=a$eT8^>=W@wz1T>z6PR7N3twk%*Z_()||#?u3)>L$IzeAP}6;PeJ;7%QGW44Z-G>kdcEk3osnv=_2wX7QD=v* zL|$1A=Z{VY{@o4mCI2CYlMuhf^YgtpKOacow`AFXe@5{3T=YI(oS%|c|9BH}d!Cccdwg%XL?YRIHtfau`Cu!6dD+5C$Nfnf!Tp@$20hcOJ;*# zJi7pYcpi@4HZQ1SxbZFY5rA;lDQiF*h`Khe1b!(XA~%Ly!1kHO)bOEA>XF~$}($4QApW4m>K{g6)fLcA8U9P@J>K14BejAVvP=# z??=AesUTj3*d2h}u|OU};1ME2f&3YPw}^1X%6S)N0OTfsv>?zIP(VS2vp_i)*g8Pr z5+FZE;2|R2KmzZ%z^qR3=8goh^aHd6fJE*=;ASEd5HspSEXn~2$X@tEP%Z|x1yDE_ z$b$&n3Fx!Oi$!2pv_S`&>B|K}?z4z!{RoRvfZPK>&O~4Zk)Hv%7J;h(W&hG?@5!Q7 z!bX`aCrJ@yE~@6<9%=DEp*J zxq>!H_BBQxKVW1YWzsfNbso@IUS`kj5U3j8QPRrhiTUUwj*`|z9aZsrQf8ZJ=!8>~ z38N^FaQ~buuhfxn zdl?!3LPt_F^s1P>V3Chjv)Lck>J>l|YV`_W2gB(rfHkeCE2~DOVlSgoDMGDW0jx3E zgjK2j7CtLl8d%G1AVi zcNh3TcNhKy7XBLCB}0KF!v=S~Phh>zFr#L5C>F3o#i6K~lNG_}ZdDn9z(|mgp$I@vItyKTgcFLxF(eGePiWrzIPT6n@hjA7f0Q94VSW z2@XtS8CBSh8qL-u!ORpX6f@K1;;2_w9e7;~2-8K&VVxY0IWj=4Qd-37z`%`RxiWxE z<4EtMijx;NYYUZL`9hYYK<5V)sBNJxht!DWDAEc@0{j>30`fF_3D_w<$zGa~9-8#Y zSLM+O%F+{{H_3PHsN>7i)5A4}NF^&XO=n?<+n@0eFJc=oGj+iPX+P#Kvp`6-zWo+ z)r9PmmZI?Hq%^qNx3q21+DbPh`+#)zUPWt7w*{F8>dca<2g%ghUf;@WaJuYN?A6L} zLmE*>%7s#K+NeXdg_0SyWs1tEfnk|(X@!6{r!~+M^P^_(2AZCaYA7DJNebm7Uez+Q zQcc-OwH>xupK8kf-c2{4T~d~TE+5oBm?UJg)v$g;s?CH`ttjGwae6nysN4E-G8<3q z+bvc#R5%J7s1r9iaK@qK;u~5x6r35(z7F>GFhD&%}skvRffOkKR54mux^}QE=mB&82MkCezxs3}J!6rMU&y`~el}Xz(b5o5} z+ipad|RA8O9ie(FjM;ewdh33hp(&Wj1VjPtsDB#~od| z1*pzAx{X}-d$nwg$~cKKQ9xoFyK?Tt!ZCHLeE8j3I{S*x;v1XOF9 z+uJaSz(Co-&O;Joek0mohN%`v=R@2n0Ys^$yD%wP`-_&nNVZh)E@q$v{rM8gORMBA zdQ5xavXE;>yo;408OG8SqUH;DFD8QonWqm%pOiUlQH|cimKu{hsWC~Ux_Q=~oL6F2 zsfIAe9nyT-jIyItUHf+qTgi#49JW%TF|%|>kdQlq;Jht04~?YPkrJ-vlN?n3;}GQz zYkBG83bV$_ks2Ti)BstS8X$|lYk(}y9H-n_r1oKV4yn;Tnd4Mha>|H!`fDP+JggK9 zTyD*dmkv;obhqyssVa5*NFS9ryG)K2)vDiM$5oRy7}aJ<&2ZSd44KfWUNz_e`SPp1Ouh2|QenmsxQFNHiK=p`Aw8b3@2k4~f zcF-f48a4*1kzi23q>6)e){-3?yxry~+>sFDRobB0rn+JpaafX7w_H8O4o_DATfdWR zu0&=#BAtn~jU^Nc9hI7eccg2kZ7@1**chYhBHg%0WoD-PlCjAumX(xI#Yd-ip{l1n zCcV~DW0%YaBbRa`Js6E=kK$I98bL6Yr3+x;CT1$YaYl8NlfE56>tJN-)pbtE?77;| zT8~qG*VK#{R3n}-W{^PmL5lD_ot>@@Sw_{F*lsW8QN5Z--Dm&*IY&=+c;D6Ggx#(y z!cLMsZ`ADs}2Oll-J^nBmI~Gt~;!eK@A{DH3|h6yi=;Mr4rSzv(yFEP|Y=q-G3k67DJ(7Q{Si z;^MA;rRFbLgXDrtYNnEEG-@>VyUm76T5LFhR3^B!c3Ww-+x$Xq^9!d}oN7)HHnV7I zE|H^V7cov$*gTV7DjTRf2gyqp#73B(bgS=bgqX6p!{PXtY_k~z<^M(6$ue51>o~~~ zk3Njmw`BE|D*wivcUr40bK4JQE@}RcY0J0dp)K}SUA2geDT`VQW7|sC?mO?bGo@vC zvcBhL5!fvCU3RKPW|&T|{xrB#hrVu^n7p6v1u|0T`zyC~Dos&0jj3U~Nlh=B)BL|h z`Tu~_tiP2(DxSKpPPQm!?%r3+9uDm;v+Ed=UX7TaWUfuNX_u19VVa`mIm3CAnYv@v zxnC_;*PpkH!wP*0YfF+PG^vi+5d5?b_YMZB{k@7#n{s zn|i!=Q_oBKv8;`Zy1=q_s$bAUTtUjA3p1KrQChn!&Pa$#EXmBJ*LYS64x^9ur)0&K zrI$nJo^acB#t>AV)=yNp%?FEWZjiOWHMHJiW_3~;i;XoWJzQZOE!pqXCVAXJ4~<$4 zQuV5l;qJqgtmdA~F5{*H?KnMmHLxZ-++H^tSU1bCgz7ZEwZiQVdMz1_EPZ=G1__>x zM?ds~^qcg7Dbn|Ne!BIQ7o{ensaYt#q%H5gQ*NA<8lxB^M>i}OD|i3Dc;_w0Gp(fT zWt5T`-j93m|LAzR->O{JU0l^G#y)rfTr>Y$TzHI}=5o3naCVW=2-3W$Bq<`((@K>m z^^ww$RdPV19vss2*iqh?^j`P=2E*C6-Hs1;(j2QQS$bF~<(wJg8E(XrT(S#D-5Awo zdTkw>DIOuF`I7Xvh76MIOZ%os|F_*Ma|I*Wxw?I#&+U%=Zg(6=_hi;*uZM>uW%o8g zMn8y06|Sisk+Tg*~*=9##5y4F<)jQOP_6~ zTB1AS)V#8hV13LTW}MVy(5EJYevS|UckUPLJ^p0(9)IwajqjSJ>lqDBY5$frBHv-j z=yzBxqZMmQ#*%F))e~c9MzW`lr%c*wQ0q0^WDaYn{Q}kC3)32G5rpBf2_8G(;ZWMh z)@vZka1%X6)ivDbTk5h+CmT4L_jfg53}q>!^}2t=h?efk7}GNCuawc&PcF1E*Z*+~ z&lKn`#b>s83@Di`UUmXT7U;I|EGBrS`R`CR{+kFJ#G6*FJhQ25*@DwnowBfL&CtPf z1`q6iTGz5wYx*xa_Ab5kq6|0t@dd+myaTA*h9e@V4+ zZ6yDEXyiZ$TcuWXFFAAJyi?KzEKX z2thBcA#_+k-4xNlf|Jks>oA%C)!St57xrI7p%WA36GY!`(KTLdSH z@DfqHUt~=X&YgG`ZF%fQ#ng$#ex%$bV*HUwCJFzh5yG4(a+*c(F<~DPSyp9C2q#Ab zwu|6q5!oypXR(N^5@NRqI@5)JzYr5e@gpL%Nr*>80D0u>6=H;lJR-!qA`1~qMDVON z!ki(hnnmazBKranIwS&zMDR}GJi2(fnB? z7UIY56l>MbeE#eb;R{4`l?W{o!6h)?MA3JVXkH{lyQsA4VTeuvPGPSWjW;;$ z!vC(YHzT)qX|=x23{;f;7ppEN!q()N$cEuyn?n3F>=&W^!vBact$s04q7G?BX-5kCT;aE>a<6BuOPk@g;{C;s2`?qW zYKx)d;>E)2ye`C|iOzNrx?Th(2r(T&{|yv#mUA+F+W+omIMx>CE?&D{_#PKo(}nLm zA*}jb6!uQ#1>MR|px#9I-eg2{iLAwNB9R5@heXs~hGwuy)pn;SR3@Pdpwj!|$A(UJ z-mb-{uh*FSTGWEDs^ie}F*x}WM!dm@V^|?;MAntieLHj)*-BOvO$jP)62bSD3UiVu zZ?;C{2>U%DX0U<4E&Gshn`~0%Ud$GNp`P0DYfTU>{MjoS`2%VIEp!zfc)xHS5w^1( zUKD)~MVkRV9zpTY22i-*J0i3g|DoMG!d@c6i-c|c!i0-4@XU7xvQ$(qETehQ7`~4g za{Q1J7xrEp6b~~^7g7E|9rh45^q|w&@Zz}qjfo;nr}vSbqv`pYuJ{rQD zqO17wUUCw$o^5*-IH-ZSNqHZ7JUepmdb%D|%$Y8Vp<0}3!8|!=4vR(ZArXI+O#==Q zKP0QcvRCcT6k~@EiZB|eb%7ldS!j*cb#|^6neV(O@*uJgpbQX)Xo$;2BSj7+_$hiv zl;WrO9j6lHM@SAX7Gkdm%s}h>R1{4VeY!=$s>u^Y&L)xQ7JW9MuSZ?mYn^wLOQ4ff z<;t=H2iXs1y`yZDw=IFuFwmVL%j+3&;c5P7ME<#@;R4pw*Nkve5Tf z?WtdTjmWkJ#@TtG;}vT}#2OSAfg5T1>=`0!ujn&f1g+W}ju_ciTh3-tWL3pP!80QJ zdeLX5i0l>R&=<`zaJeXYS_IHziHc^(L7Ko!T}Ml|sjd;uM&?Z-V8`AWr9Ej$Lb^Dp zy8axygoWL70i;#rq5eBXE0awS&HMp655M*VF`GX?x3Zh{Ob|Fg2EQQWOcVih!#D>I zt<<^8s)?yTk&R&!^)Vfi>o9zv*R+o2P=fIqgE^99GfAHFn-o$5nU=lM+1slK**2XN zK9W08^m|7HFlxYKt-APo&Sv=Zc^rFV6R!}JXN!DPL;)ZO7e@usrx%H83={ZId*jz{ zwdM-nb|mF^YT2vR)B&$UN~0_i*s-vUi8&Rqn?x;toQG9xxA5%{ExW|vMZyO)tbsYg zw@M7yD~4#oNJ$vDSG1)FwteY_ZcAX|+f~7-@V_|q{ohW7GiI*;H|NF1sVkQ+n}ctB zaLOsCwsKxM0P{ULw>`6K+2T2imY><(wWw<$XOy5~uD*21yp^0N;=;sp8RwyL`m3kH znDwSlXfab=*4-bl%oQsMt9nzEloiOc8!zE0@#*@>{L%<>z`A-~Hz%jKGUv*e!s@v) zLhf9dI`*C`>nSgyu*rPhT0MzY@=$oC)4Y`{7oN$!PE_De>$jNiLqn==6^pu?+hVYCbrxUD8%_IVpj zHPXd#L|A~{UdC&#J7jEE00< zXrF$})V!Nw!ejfb{-$U~oX2~%2;kS-hzWeVw_A92OLO?Vn4^LIfBMUrg6Z8PJp6S= z@;}uuy?ed(=?7(&P-msH4YDn--HJ}hk09n&miIhZIc8Pl$RZ>1tW8LXdhJ%7uGj7| z1!oo}hJD*Eb>2ZGN!)9na!}EAtkeQrE;niqW3ktM&f6{X#f_6UDy$}9o+PYQ0;e?z zYec(ux-jjJ*R%^OSCn~U2Zd#C%QC%pI=C0|#uDv~UizgB;U-=|`w@)VJ4^@=)yC!Bk7rqaUwr$4|HX>Bi*RS(NbF z_gn9z6{7zt5uX5+F=j7>)Db9+H#WgLGmXU>f!Vzmjpnd^J;c8AY&H|iI~8>MY!js) zGl8Y|ju2LvW;RaME$l^8F-xP-P-M-v_pFD6!tIpsiU|em+t(*_(q=blk2fu;@RSR4 zyzn3oZ!-kEwl*nXH)_(d53hv)+iUMastJ^PwYfi4j8x9QSd&cnP!VpR5guT5W1JoYj)yZ*ema63TX4rZmsh3Zo+*m7H;v7+V;+1TWCikY4+|H=FK7- zt_$C`{igSzP8eCL%@oiX#&V&0NLaIkxk6a43v(!HdrBv4MwzI0kz+q;AcPr`BwQ}+ zD;Tiv-+-3m#Va?QG4LOHDgJmTIVZ%svcM%|%8@DqkJo8(K7^zZTGDptb-L3& z!7jkr+Np>)TMr)$%F!OFtDEZX|OSiY2+<-Jk%KS=3w-ig7eEG4kuHrZ@8pAAeln@%Uu z&US{luLL?W$#y=Ab`Z1?+B(~1S#58J#EVu5@3{h=UV>Yx|A)DEfwQA3^2fVxPxsu( zJ4|>QV0eh4OCSMxCOibhgjXi>U;>j|CX<YIqvB(CHR$T9KllHwI`uu>_jXUnvcLU*ei5hZRM$DDs!p9cb*fMI zO}>JA*oz}3{-Crnb&t|Cbcnv@#?x^xz5*bkF3~e2#@;n~Tva?P83sX!DTs^EhskBi zw~$YUk3r(4Vg4LQc94oSIa<1?7hA9->J`mPd*4=h-jT`!SukYp!_CP_bgpwQ_ifs- z$KfAB7k4E)w!z36C0XVqEEyg&(GWcy z?~$b>`oJc2SXcs|Mq^<|5;aR_Vf6MYUM6E->zH`wrXBc!0?%Dtbm?wqXWP-&T?$Uw z05F=2T_y~0_k3*JlBmHPXk_;!?ExKI~bO?OXVr>c3M{~OO~VKlHLf}5wT#Fn%KcAksNa~wm7Ik;fR6#ug^wkC#Kf^$4bSjHAFxiOw0U~;Rgs+KJT5>HJU zj>D7UdCAju?}$Xh6gcAW#N<1Q6n19BrAy+5tI+Oltqy51p=70)X%%PT8eZJgB=K1^ z0wE7dc8#EwB$`on1MooQ01K4)CYlSAH)>NCqXc(+f;JUlPcQdw;Z0d4W<)!bdtv^&XeEvw z-24=lo@c}DN%Wr0P*C&(Y5W>Au^Zn+I4b&`qlZG~&o}q>CQzKK9roLZ+>NLo%O2Qq z3(Oskt!DVqjfhp&$`zA*Ej-B_f#-}wLx{Lb$$6%;tL%EUw`b9%&grG99~o_(+9!6* zM;nq_3#0WC2ZR#MBYmx|BZ&re{v`N{Gm!E}p%L_oya=RjEFWOHO0D2o`w)N|kc*+E zKir^ZU;_%R+>Aw79U^9(w3>X&d=>&_DPJsq)Mu4nE@lGvmOPpu6;euGP)|@ww#AbV z65oup8Z68;eU6OwSz)?VO;!sHrbmgj4pvgTx8Uf-AvWqr{O>f=4*uO5#;F@1n^a$sVxM zDD6k9OGm>ZqNlNkg27?WhP{0BpgwevA$gM-kwpGz`^_EHIcgE-Vb*oT^;(rjS%)q+M=_`{$OS7ZDPu2KERpTyI;}=zpyRL_; zD>j?QsK!rRFH2yR**uz2qnXX8Z5DFM;ena3poY_o*@CR${joYzx3`ayr=9nTCT)jJ zt&zuP$ce~2y*H!D`sgPJm}D;x(PZkCqID8dM^m?|p&c3Bf8E|i$fGCGGawXIOkRsN zChv+bd~vN&U*{y{b4+2?8g`4tqWG_z(aIBva4$N$N(ZmuviN}3IJ_Gp8*Rda7&M`Y z*EyQ2&Jvy-AJ8staoTq41~EdDgh5eqscs4o$kioRE{%`DeYY8a)JTM2Mk5n`DX^zG z7G&A2+o@^Iy68YS2`Qh5HlqF=W~NtFwTPfw=F};!`qA0ylM%YP>QVBlWIOs2I}fkI z{{G*BY?7j30hX655C_9rbh$qFdgtfp%4bL4Lu75U6;I$WL!aA(I?*^%umVeJrN}w$ zz$3>4WU~HHNvf>u?Qv$ZI!7VtfyU%_;1WY8mNz4w{eW1o+bT++3L}x_fCxD5=+DC2 z!9R_TKX5!z$Yc-jUL0!M9c~S3dT1Z1w;q#k?o^6 z3-w##?8IkGy&X8jTk;@C^cc;7pNtkG#*34C;TWR7+1P*HZbO^(EgmXVsIn_H2|@<31=%U~GA$;BJV& z5hp1^1iu`bq$Ra0fdP;{% z`r8f2t!P%l_L^_X>@{V#B&reHZ-SW7@Q(OI;EtV7v5&r8Sjh3)_C4;=Evc-c;5Yz2%57S zp@^BTqnrW9hsX(WOUEABfGobrBDb@^uk1g*q>QV!j$f zv4O;6I7v8^BIJae(mORIJ4~!e_OqIk2$wdg=9e|8dq?)mReG7LB&JUP7A6PBlP-+I zWv)ioc2`4u-Ni1ohS(eM`3|q$Z^*!sCUBk-l7KUqz?mf%LyT?>fVAWcm4|JYV7pmp7JxAOV@=?n^&YP9`DvL6!@dB(<_nO0p1sNq6cENSl08a@430 zVb0ZI;oOR8^Vg-)E3l139uvFU##uP3pd)p*&GlQKR-d6Ec61QDt2h{ue1=@$W$%$_ z1CDm;YtiXmC7y!i9j<-3#t!wn7RARRixtK)W-}0fNHqyLWeu%MZdYeghd|xQ?AG`lc|%77@9c)6p@qq-Ws1rciK(EJ3OR@fi*cpjrtb zj_5-Zi@z25u0}?2Ox)KJjjdEAUqwpjfaoE$CY;VdUN!m#ENLqwIyjErkvt^{2#LJp zd0zy!^(2sppyfOC5QT`=AZwa*SH|w79TL6~e&OrV?t#Jv9^lqTAF2<<#YF=m4J7U% z?}GgJmX1U>yEr{eKe0&D9|__vO%b1an|X#C@gOA>oA{&dgkxDe-jKM*y|Z@5Q=$(; zVWk6crVJcST^g6q0>J{uACC4}%C#iVNpMrRPNG+cTDikg$Aw`}qE?A(7wV`@!zjYG zW#qpMwIMD;n6eHhf@Y(IGw?h)8j_vH(AFIol22PqCqse^;HN;d6RbjO4|}e4J;3=mC%`mtm*;=2G`P7# zG71MoA7i6;YNL-yqdQ@mw`&{89`WTfur0>1)Fk@gdPIZvpfpUT8@vc7KcXiZAh2wS zqxRiNdAlt2XUg-1Pj12f(PfUJBX*$=S!>;Dfu&LCjM%g zochtH$#^uItiiNFo(a2SOp)>;T~OT4BU}s>lwXFUgs2;iZBXGV_(NU@bSFC?ymlxik#}e5s~VW)T}zPQhg{TcT%MGJj;ZKR5CZ*sTD;~ zC3=n}d)CBp#d9a3s^M(G!8OND!21N}Qv#d?Z77}e7Bif;z?87tmn7ZP`>q_i1O~VY zrJ1;%eY-lA!zIbG?RI#5*yQ6$bRjmfus-ahCrNH<2ymx30_@B_m@p$EX^n6}63vs` z1%f}f7=}3Kn=HeGm>M^%f%_3Z1s`P|SRWrJSGe+m_((-xp+_NL-R^;M2yZNpz{F!~ zAGbHn-4`(VtLMTpbshl!E z!iGl^p7?81`}1=62j|tUiNjaP5{e^0I_ZTmSx9Fs$JrdDhrrLljfX1xazqsw1U&iQ$ z#{%h97W;aPw+vK0F2g7-#Svdcmye200qE{QKF%ldW;bfnAq9ir#0J0S`dCaP!}R!GT4mLRPx0rkm7 zge=NMxyj4*=|Z`BA(tNfOrp=Ga)pV67||0E0zxrP-HLq#Tb)O)-=(qN42?ueuWpP_ zKtIuTwcRK=E1vpoN$AJI&tnPlffs++7`jS|Yx^>9{{VT6JBoZA-vZp~*c{3Q_ z7T4d83To5hVxp(66OS;h6KaxIRxtb{aomd*u$z$lEso7hP43s(Idwi>A%Ie4VrWz$ zThjNs@s&sp`;BP4&gGVMy532v(stD%o(5t}wS5^yt& zX*#IxK1}XlbVuAc?=bU;u9657lUoEn%MHdZ!8D_H=o5>QNSnajN!(bM+zgL~qfKD{ zgIK}5W2%)D_iwxbC*1Lbxim*iP<_=4coZhSO5Ujmm!Of=s-P$t8-JhPm=sN&k7+ZE zm=LVL5~PP<8-iDs4mlldU|V)ze3*Di=s|`?9x&?|Vf9kP0(H|7iu$4f*En%E5xf<& z^(RbXc~pcZFhv$%|8b$9zZZyuMzfp;QbSY|J+uWHce!JID`UHJHE692y$Orwjl>J) z$FJ;&7wnA}&WSIXA1|CApEf@}Xg)|D*REvQoH9J=4A#@~c}{Q1yVYVQC0})xii7ycN8G+mW&@IEN6V!*J|7pD^eaCF zy3aXJG+*B5nbGS^dab@?f-?#8-E$Fes}E8Raks&^?zrbG85)v#fTvS>{J+_~hH<8z znvX^uNwjIiy&Qr7M5(lf{=rHO-*iHlTS5L6CZE?rW(9H2LaJ5}@gw2_#B0^z0kf6e zi8jgk7Ooz3wlZLRumIp$VcYFY>aFO))G@=0xg~^N>Z{b_1-l)}!NH zI%mYf7cJSQN_6eS9{pYz&qN-5o0lo|&3}yae3$eR-Ew{E(f=5w9vyhOpYiCZC7Az_ zM~A&Uzd1w#c_!v$IVo>Y{gfB&h-W^ADT##(@2p8A)qpn;xQ z^vx>Cr(hkFhlEIeYOL%M6CvnzwkyY(Ka#W;A)-fd21HGCmcFiFL5@hP^$-leJz4;R zN*8FQ&u*5LEEI+5EhUmjR-7U>_Um;L*CnIyu#of#tiFf^04~5WPl+tci=uB{U!H^I zdoTQBy@WIgSe=3m!L<7TV&M>bNl-y8_1Vo54$I1p^DGgT7J+ssq7H7Yd}1=9;$)&6 zJ#{Bs%E5J8i+|{ZP6zkho6~!h1A0WOi$0C;QVtYP=wj`avd;dQT>h`avd;0v^rk zDSsP0)Dny)l9QdnLb6By>J*T0BYN9)c=#f5vGQAr{uS%AoNK9*Tso3y_*;)Bn#m|K z(DtS1LBx))8aEYTjQd2dDnD` zu4rgYdaaLksfFR)MfjC}gCM3bge6XM(th-4*b#kLCZ4}5u2l5ejbV2nUMq9JRXL30 z1dU4lmGfPQNu%{0>X)V>;FDDHRE$^@$zhRF^oHx8nKBX|rR2*>6k|Jo6G|@8SGQY| z(>S(tKsA+&67YWs#IB(=MCK0j1pI^EM1Wcr`_10OS$)IE1!q~3=sX0RU}?%_al9E{ z(1BieyHk_MLEN?2Y__N_#R$hJrsLxZ87@krt%IAM(e~Q)VoQ8 zKv`Ohej7-<2r!bH>Cn5)&&~RJPR%WZ&ff?-U_$ynXR_CCu|Aw#koAC868&>#LH?*N z$a(|#)Hee!yljQm(^`TN4chxZx-22cSBknbo%`Bt*!4mOencfxI@GC@cYC(pon=b~ z0CVAc8MfZ1Z0QZ)Q?`H?Vqq(-C74}1vCL!1lQ?-jT<((y(ee0eQGASh(%P^n!GU{t zPrLSU)V*R7iKqb%-KDJ*_^Pwckt9CeCyZ4^jwh&Z$j7c5{iuBE+jzjz08D^iU( zV=DG0yG$A2x&zIe@R(kTGDYif-WItniR)xprpWRlG=CRRi8h>L`$M8CfdpJIq^tHZmbjDh|G-VQ+#JaH2JG}@^uNYrrM z?7MH11OhfC_QYGgMe7?D;7%hUe?N_U@7uIh?npptR7FTw$092@C@6f+nquXx?cj(&~(d}SMR);d;(GG^ScW7lb z(vsi#l%k*8+E|jPQ6gaUdzX99O$yPkt`lP{Nz|C$jb&AfMDj>jjS`87B0QYK3x7Wk zo?_=%D((a;h*Q3KLk9v@O;qDRXC`RfI`Psh0Z5E?;g0^4F3oj#ZU|)EEY*q3W-a18 zvS810GZp)5DJ7%&7b%k@`Y)_52rRHf%0$OeNEaxTZo#9+l^_qavgjmAf;e^2>Bo(z|L8;O|Ck>%~#U(T}b}DqA4DX;+7R zqJp6=b_gam?bN+?9F5_VE>f+$NbO4o6KgM03(;5QtWZ5pzHHUeM-+cHQth~3mpqEU zVRE1R)mj;w`dI<@_hh*LMUH#iMTGS0Ko=*Nr{e&h2|?+Uq$AqqizY>JilBqJoH$jT6&mlZ;cOoh8vpu6w@{*m zdp-YA^t|#Pi4YpfMO#geV8e|EX2X2!2fhSnruzZ05ol7ovwJT@J+#@8n!+CnOhK5$Ui|?a zj;M?76()rpF$av02$w{kb9Nw-gYpa=j%tcablwX=7=2b%6McPC$L%`xGA{mi*hPsG zn((R88`WE8bArm9-@HpCUYBgN&A}!)uD=Z|tNt#=A*O?(%h7|LA$+x*hHLAPV+gOt z^Hsn&{|VoAlG``o8y7L2@8G$DU>E2*HAP&99PJhl&xDQ~6vXMwvv8|Z-kED$gp&%> z#D1}Po8N?ZuNS8k7#`}0UEq-zu6VvH$1PCQ zHZ5#E!tJhQBPCioO8%6$>o+jIiVulJ!S4Tuzk#9OZODBA!+%K)ocDGQjP%==Fd@8hwB1d3=d)L4;Gn*+AKkxYFP0j4rKx-(7}K-FZqDLl*wg{xBKd3dd%bK7 z$JER<&ODBi%QjnqBDP=u8SHc92K_O{aoVh?g33R>qlE@V7fBb=lD7iXb z2Z~8JcztG49^a-chxkrCt!TVR(x_vO zW8mj_1X{wWHp!^qyMCnwarv)Azc>Kmk}Uf54AEOZ-W8JPjpg3t0UUI}!4N!hjwhWM zM?FY~yTc&Sj76p|8LtwaGD+euO4fma8F6%pyeShV2PILHoM{%{jCyi37kd5m$DCe~ zlah?i3;Nh~etf9DYavJZ{3&!O(ISshB{E~j3;~Z zTHLt|{dt-Y7%vtFFP z2`^55W<#s1F~)FjNo)`yJ7xn8{K(wLC$px#9;SGeZZ}>rCw|!?d7)r(a)R9!$AEV( z;Aq|1t;HI7z>6JlZ>%4;i4NYbraV>OM{dBo$#_*ViN@t?9J3k^#1Z4Ec(mVum)qsE zfArNr5(DTsxjU|ZTAu&IA>zz%M~oNTr{Xaf9+4wJ5%jTO1-LWghD!`LU2yg1%ug02 zi{>ZrGK-Qq$sBXv=EdsK=zb>pIBhh$!7A5mT5x)cRADk(kPS(F(M9=9qm3Up4$fHc07RP52q35IV#Sj=3 zdd`=Qs=7BFDF`F0zOk>;ORJ;|fw?F-cu@!cHz$Eu_=9{0mU}tr9!B#pLO4Z#qDb^k ztWkLxoN&kMnFM8KsS+L15x;`cMeFCJxA7rGw0uaf-adbh9H7I;Pt?Gt<8zAgeJb1s za>E`?yvVUfIpWuZ>ruEK?8g^4I?>DZ_mcTuCubjIzg3;O9`PYb^o$Ec(I? z>xefby>zgXN)HR3;vOF#L-nb`re7u|*jY3Hm&%=J5C^-_kSR8jkI`Vp{WjPEq^xK1 z8VEk&b23)=rSZw~W<(Nw>G~178{MtX=AuMSr5z*#j{Uj>6~E2k55=-BZxrHyceK}4 zv^e6B&Nyt1_3uc0$hi_i`nXFsNb;}`uWh?WL^!O9+L-TpHb@&RSjn?S2rDGRiU;npdy0?|53g)mv`9}BARL_pE+RRNYB9&;>=zS| zfp+iNe#)&FaxT>3H{QD1Zbiq~M$Wwsi(`k#wo9NPG0QCU3WlDtS0OHTCvmTcWh*C) zx|{=Otc*}pj=3TTmO+S1CrHeNsOGcPe8{>oJw6QIC4x{FA?m0q$<2ga}c`P~g3vdIkP;4HNd^Y$*l0#02 zVXuRA_AFrVVPJVug)|7h+9KNpIR`vB8kHC9CU?l2MBoJP&W!6+!)z*D8c#l57?qPP z*cZrCZFkhxf%d}NiP(5eimq{cp~nL56fh-s3a>~%-+(YvWBU2vE!tYbpB3h z|4XydMf5ZMOoz-qSN&b3P_m;9(NAtr{k>iF=UR_Y5KnW6$}f{vUUp4-ECR6yHjqIN z0zlaFn&3ZV`shosXSsuOFbSE*;s!LsB@b0Y$r*;KO8qk@nTy+XuwOBWi`|^cICyWrB zflMy>5Qu#F?l>XX7B|X=b9BF}8B=(2@qh;lt(&>>3@`jR+PYG|;!<-La|6f!WC~B- ziVf%3j`)K0G8+!&av|1+5m_?fhpAg>UACq^n((}-5f_>Sdal6YN! ztWhsUc@}&>y3&>85OEe^^g2|*L&-!A&dk(f2hqa$Tb zYdNu_N#;$oO3uAIE0Q2<3N{ZVdHAt zclVsr)C@*`dKYV>F?oLnWJw39`43?E`dOOy8?i@5m! z5NM+9KxE9Y$!rVD`sGBV#RU2)g&7yDd5*^}F;Q&qu^+ns{{Wzu% zPLb9blMmRUwQnFb1w{0rEl+Lr^}iO?$5aJd@~1xA?RSrZU|GD5~8Ao*`IT29P%7^5@mx zbWW>feuqUXC~sMQ&~bID95?NUPn4&^%r`oA@7ICEd7a=f^E&tf940)>>PPwjHpFM$ zcHt3xQa%}TN?v%5XSomP{ym}whttuM|d2$Ow{yC^6)`^qL8vev7hF;+*<=TNyr^=2V@6qFLC@*v&1Kx);(W%qq)2s4*82ow$T-a$c+MsB{Q^rZr z)z}ax$hE^e;={>!zufJp+*SZPEor+vXNPonMKNL$Hk^w$c(Sy$oLt z!gpXx5bTvmRaukk{p;=e^9;%B^@n9LyUd182sB-=9|ls0uy&)U0_&w>lDWma_dzYA8Vjb;%G~z;L*} zLwfk7G2SG_UkNiUc0dd}D?S_#kKUzNS%-1AQAZgsu*mjenIu(DuZ^8V%Ry7{VK4Fqb!9OT)3m;9?nalv_50VjU6JlF`8C9E{5A45v%zpl>*6m~%DSaZ5fvOFK(FVbm|K;go0=lF!Iny6?^R zFVYn|i4Js+;=wXRI}E)^ud6k^Cd=qy5E@(E6e`f|Z`scqv-n!M43 zw|ykfC*gz}E*ww*gGLVrc+GCf7SEhN@)U@oMm#c9@&!uva(oF0e((I`8bw-;X@Pua zN)j5|AFo!ign!Y3Mf2_H*oQN>WhW%J8@?SMs-MZn8f_jte zjH0O;^n~(^Eh#^0!bl>A2|ppySf6b?flt`NH)*10%u6rpn6U5m}G%(+sOx^taW5l|Axn6_u{; zk-qgk!39HI8@g8X_wZ-bDkDK2*-^hhfe{F>a_zJC0yLr?eMz)BRluEE3X z?!lEk+TD_#Ye##AM_iAf=R8_Vx{|8y%^rI}0k6-j$WLUBhc+-K%Wq z!(*cj)|2y?b8SJK7Yz5U8d%lk*xWFLMwQWlp0SYt|F5j<8tDo;&IczWJy&QuP6d_T zp`IS$Uw#NfhF~pznGYOofRZFwLOrwuEo5}1j1DNDGCpo>jAL06DiE_Wv}%PLk;_E0 zK(FmuSHYz+I0UT*eFFfUkTT*62QJMH+VJQKCv4Co(P1#QYN%^{A5>S%g{g~X0?t;A z_Q59bs~`C0#8BWwRn-m*4z2C#m$4cg9qR7sTNw-u4ni?K_({H?%F2_1v6axx(BMYnu%f^Jw`p*oCur{*9z_>W^WgBXx9hQr zbR->*_K%2B4UUck>-xq-A=qQ%`xV;XaMyY_W|a=diS%eH!Y}%XG`;1f>qC;@P8!~@Z^EQOQjqct|*@ie+(T`>-P+t!e-9nMi??;H>4?b> zCllZo8bt*aH7Cr&fr<@mutE(IlWQgHU}eupS6{#M)wdG=jR^#!g7(+iP?$r4`HW#m z28V*d4NyriwqkT-1geLvU@DuLg0{bBAgJ{A;W7xnG*DU7vr&Cf=2T_l$zNoUIYq%$5q7E90?KofEGd!_X z7XRqnj*SI00=swYh{HyWewk1<`eQ>q>o5~w++*E+L*1kOP*2c}+oB(HqrIx(Kqg~W z0IU|645K~H`KET}IFY#`KlmvQQXRue^Ucn!snRim_;I0CtJVENFqxMax|LOeRjo!H z7dXG-e3t7;79BUr0o=ma$OYoY*RJl-hC41Dl*8?LMt-bGt( z?Nb9EgH_A8I)jrL+ims{bX?qH{@%nnT`e5c!x+N~8&jXGZLNUUfk&?l!*yZmENsEy zz@dH&%3`{TKsT^ZM{?&}`z8Cy4qN!_&q z=k@|b4HB22X%|}fRbJvG#0G0M7D`P_q#Fgt;uic0Uh8A4j5YK7xI;Y_qf{#Ex>ml1 zmImkN>}w^1w(~{?*TQH9M+RZj5|!bEq0S4;V~B(WvTqY&5uN`SD_y#R6&n$NxR{~R zae-Tmb*zlAB9%nVXe8j7MMPXH`-WgfL5sST*STeOY^_cheEbOu50+txBvY%clCR?; zx6(Nsjj8Rb)j;tM2Q%qKeCfQ8sCwP#06G*KR39sG;sqL9AZnNkbM5WI`d@*hLMuOd zMqTtFH1WECB=|4Ts8$!|YsHzIChp;s%2k*CqihBd@{!l?=g!6N%2% zggcg)<9CwV6h9d&wwok|cnv++se#1FixES>{vnMEBTZKlsRr`(ur;#M$wKGCyoDEV ztuh(Gfe72Z9s}DoG>lmxi+tdI@ENN$?n^ooyNsS5{*+xX;37crIxA(Rg4kXC>sEIK za1sMJ$_7g89h?;h_))q(glM{FUaHRCy*r6V zDkGaToRxq?T^uH1a}3YXbEgy2*R$~rp3y8v4gH5hV}OF3NIg^)|P zE)ZF_W393m9vc{>Zx{b5o}ZnmI}ogOv3I(G>6U0daL!t0b*}{2KFp)^I*_NHB1`D#01R{Gyv!bmL>;e_ zsN;Oh4(@+2xc!40&|?2;jk-7L;#lb&@QCa|&WbF>wp3uK|Ou)sK~|;zkB8XG29}%%I!a&+G}%t!}j7==*yR zwdyUIn$&bfznNHBA&#kvU##v!RR|k@Yf0qH_M_`TRWGn8xMhhSD6K3&**cD0%nEgI zq_VB7_;t7y3%s%E!~C%{NzWK^45B_bI&4z3$!@V=?GMZNU~jNmQY94$z)qfrk;P0{ z3}eprE_yQ#hSM>~>d9I}8)&CmJ5F2~Q`y{Qo2`*X@+Nv)l`hkHVqz@TvK%5aGq`Re z%%BGe1eh&;DOCJx&)RNav$aJ6$0Hn{uA>+u{S8z^4idLziA|US`J@@QoI9z+WgzRZ z0i8o_1B3d-OP3Eo>!+Sl)vQ%QR!B!&D#AbXJyaQHGnGRSc(SZ7^HI z6e}&(bYgdGTBpjbY8hcFmSUQ(yJfo5JKj6=!Tn(lY^ca@=vFnMfq<7L?WbZ7JmA+* zm6Nl;z33v2=u&cZSLCOO`1z${t25aXG%FOt&~+$>>8#Cmpv?5 z*nWhFSPijhLn=r{bYyU)%tR4T{L5-&82l2P;R~ODg>k3{tztKIHC1StztywSg)o|` z6h_7AB15`%By|JA8a6UD1FG{qodRGYGhu5zVs)2tH#0KYQjO;j_WdZTxIGBo;Hn{N zl|W*QvMKE8s`jTgRMi~^FTO*TzE0>4M*4>_pJ99yzB@z6RZ)zJ-%_V-uuECQRa z%8aCh|8DUbuDFR%byI#=xiXBjd{tADh479}{M4}QMza;w5KNMqRjgV$9Q|x%=OJah zr03dEH63T&sP50T1r^<-Og)o$ZtU2zeWVks3T=bB4{KFrq)k_BSx}dk?ZBCuJOI$- zEz9XxxmHQz!Vv<)ZV*Q2@8$-JtbyuDTrc@>RQ(~A;#KZ>a+Sz|0Pm0rp3 zW@a>X?ftcQ<*LqXIjHH4^hKmyD_2&bWzedWXHD7#7*j23YdR(-%QTXx|=*2D3Su=$>VYyZ_^&_hak{@%&HUm~7B&)F}7(pJn z+TWRYkRC?mK6CBVpA|&zYT3mNl-Vs(7H?Q+nXM-F=&VSTi=HK}>>gaZ4$om~g0;e+ z1ssV88e|r#y|M+MNmo1nGL+KA9_5T3cU zN`hgA2QT&M%jNU%yySoN@k>@3H+|qs)k|e2Q<34TQ_0Ys|2C(PB18!Ic(ig~pNvFE&sgloSk=&w1d0=$1d&aIwOv{yW{AMdUH&ZQ- zYZ7Uq6_S3>_8DL$%W6QZSVX8Ia-&j>%64fgm0h()`$%jLs-O1y85wj*8Q6N2JyZ>$ zHRBfHER$7MA!v5 z3U9i?35`DNhS)%)8?dqup?vdGWCYtghp_;xM4Zke@wOYea&Kq6S>W ziduLfS5ElMTo6mG(xEtQHAvB;zg1Oh(bA!G#(6i+mbh~i|WSHEoDyjtguy{yy6GPjSGvQ9`{ zyi=<406L%M2CHx+XLTPQG$88_7hmmBZ33FTL5B$HUz8D@2-fUARUgN*j&fPMh>HwiW1VK8aOXmB!E~JTudhqC8o=V^WQ5TSdGHy=2 zv|l;XLCsG{;hQP^)KF~&{P7=MV9Pg@?DxN_LiI{J$RMuA|RFxhk zon~k413#!ET*^~EJU)jB=qV+f*>KFr_mMOd_LlV- zt7)ERJrMy*@0Sd}rtskXpY;h-zq8bPpi@`vGG6jrScYCvOntgt<=j)TFP6w%cgT8DRQeGj zsewaV8?}Jvp(7YPP_69KXOgmm(R z!-U!b0mfOVd3IEdsThCwUAEU&HO#XLGJIsKex ztNAGdsi81fN{}2M3{IP)&)($P0DRJ%SBAksjh=b(HX$Ji$Z;4n6U;K-JR$QxGA_wd z7%Zmd{>#g#y@pgqZ5S;x+cPk892p(rBXGtubbDJkD>?YSm zE4yG#H`@DGxw)wF1WL^Hyrih|lA;m7M>sS8at(E`p+9=XwG*UXM5>N)mM-+_Y$v!b zqt1?Tmdak8?F5?)R z<9Pv=k?W%Cn00)cUE|=+8J%~QS-jiO<)CtB`OY%#5cAI59b(>F-4u&oHgtnD)uwF` zwKvyR5vvumhPB=*78Cq;kE+zx6jNi(4MtW9P8uhiR_&~|6XC0UzKTu@N0el ziwOoMQy46#l~PQg2>yqsTFl{mnK#kp9LuvkD(7p$;Av~(dArsHw|`(ulJf1Klg%BTj`YUR zPB5#{4zJORQbK~%p;%3a*C@Hh@=uUlhd~FytSxlp0v+*ozcvG+_sBSszj)i4&>gM2 z*=b;_T~V9ht%ee|+s0Y?P)bPfqg8}e8qE~g(=EP%R)TEXO)HijN(l*Odn%q*(qX=* z=AxdOy-W}Io|*|}d&JRn$Hy2 z)2Y6JR)TEXshFiJQbK~+o+egtzNhA*o|?zm(_-IKGr??6MJhhlsvPgDPORc>P7CMS z6;@2}0z;L8(O`+eLn#@-^`7kZ)ftUeflWqpmapDQkS#m)va}{8B)Gv)jnuq!GP z{7*v_v*W6{zcb$8u5;~*MhM<}i@OyD%Lu;PP_A8;{vjnK_^B#FmiDHESswB*xjMmf z)k^R#-$pyZ2Ry2cAX#%Z&(cRdVLL&x<_K9z8O?2Mgjuq8wr8)IAZtd!?Vs9`7c9lF zjo11%mJqzhv)M_I5(t}1###FNl#n1LaD*(8tAZ&2+my6QCbcrlIO?~nY}*O*ioG988mbh`9Vh(Gl#C*gV<98_jIVmqIN?;H<*81y5ZSxa_tC;W9!XL8 z<_e?2yG+K1?TYN<@z%)szOmd=k+So|jSl{kT`|iD&h!qeo#4S9)kg3TL&>nVjk9!2 zN|^Rl3$gE#CvGL!=uw>n*&+6A1lgOLA}pnS=T^Vav+$(J%MQ^hL3Rj}B*+f`@Agea z|No`)btdz>?23K~-e)K`iYz^x5(YK@M3bBC_HA}Wd#w3jiUMKPKUs)bgWXTaNmWf0 z>U>r9B-1fZ^*`u>jXki%K_9UzcqDkljqVoKNrJ~1$|;bg6)B;sk^jqX{?T{SO7L)B zyM-Vdb{5Z4+D(Cv_@gyE$+xzomJ57t692w$ga>-UPIj<3MG*tv(LHHbcrSviTCgw#!T&M($v3(t5eU?_T|`u{WU{4wXh)QDu60D|!4<)M zD1tmayV*g%wJS`C;FVtTc7n?cE!!p0Ja3x27n9w|G=;_`=d2 z{bb44>$8fz>$It_{Jupxkt9x#_rZqMCi9%@mZ^(AQ6e&5f;6B5WLu<+6i9n zQEdbl8_F37ORXs(!K*xK0`2@y`pt@z!rN^>{$aa9ID$X%s1}01G?bGhZ6yn_#lP{@ zTM0hzQSAh?E#`NM(k|P3m#^GRFk88KJj+B1v--z;^(6#<;ZdCgvn>{7G(TZg9`jWT zJb2o9(+v(DvMaPp@J>THRkHL=PuN26c$?ggkfocwYic3*U=?A?L<&7-tvC6~T^kI1 zSBgsM9VD~p!&dXtDSu~MjfK8uP8DuSvsVg)2QTcEtOG^xHfwHT6MLf1@%3%HLa7A5 zXQ&si{9RwUm0-4Vu_-=al^*ex+X#N`MSBhcR{yxK-b(N*9@S1T+v2|2VI#<65zJOD zo*8*&mK0SkngpLUX20l}F5Iv@aJ?I+N9-B~T?8A=jFRAm=yx-ZpJ3`jW4R{U*u=m2 zR@({w#!znbSz=$s2LXaFTBT=vdy84~k15JYQuS9?@sAtHKc%Duf9g@4Y%uh*r;}jp zQTcT}_=+{brX~dujX$Td&{Jn5sbUy~lql0AEny!`l6r#Z;HAkY%$;izc6w!X5xm<_ zr68X(4#QjR?si`>XMhpZ{ zR)S}ER0qLqi^Y?l?Y-JpZYG$mTs-+%ncd+@Cc$jwqRB6#ws@WV4T4U)!UGdr?NJ>B z`wX=&?Xbn=zIrP`HiJ$GW?L-Q4%=Jm+iND6tz4`fR%Un54#8~YiL~Q% zB}jIK`POlkewGpvByWz8r2{-$tpu}d6%TV@t*=OXA=qyy*GsJ&wdH3wI?M%|+!ff)^1Q@@^Q0xvU zg6vFtu5Hkjx0@#3V^`EB_@qa*5d4;*oN{Vg3`<|P```3c7w3q=yX+>3OToznZu+4b zstMdQn_oBPpoi@WIS78)P>yMqo=ph}maR)i$kIh#mNtS{R1uPe>g%03hML*+9^Z9y zzLSF8H0yoG*UJSDuJ0xzn41z3?DeP?f~yQQ!C;2V>^|P2(SHRa5QfLvO%fLm=BYJQ z1x-m8zqW1G93N@65xmDx#mqVe(*|bv23iSj_oz;Sw`baH9cPI>6$C$79{=RGgv|t5 zQ+O<1YA9gjnOQg_yh#q zMsiI`N^pyzoIEVOB_$*{UPVYjYp?m9T8nyW9cNE>`kq<|W_v0ST)Vv5s%`ewuOP^l zBYauYcf&Rd?AtA?LBJ--FCHZkWRq^pSR%h5B*<45?TMf#M%@2wA#6 zB_z1ZquL05rm8MWU-X2zTwGo@O4Z;iwGuqqquL2l4mbWR-Ix**q#TZrrFW%-1Sy>( zWa*=xu$3UCa)fz7@|e76%@plI-~KX!mwHq)LCPmxHjlIPCQrDGAmwv}EKwLd=OVb% z*KH=qQFC=!qO^t2$o5CnB^331-(@F3%7-(s1Sy`a3z3{D$dOprDm z29@IWh@D!~F2W9Wagp7^K^KBlJrWDl{&G*XnBZGHYB>d@hS64Dhs()K_R8sdo^Pz3 zV9G^nwuZoUAvOOS8v*#@TB1@=XN}U}3W6;e$2^&LG}K!`a@IX1y~6t6?D^=t*}!{K z6v6vED#vYDI@WHo$x?7ik(HEAH@b^_V~Yv0YQa`O1bu0odA-`xzbXDHU>m_BJgS}G z(H_-C@EAkMB+IX|Zbr>C8a5+GA`Hc5Fw_M1-J)ka_^_Q4{JdS!1i>$OR13k!4dwV` z>H8@m!5>u-rri}mGuAllT)Tn=f@?jhg<$JiN9|Z(=~~0$aTLMpst8%)6@<^8;ad8I zU4bfMFN-6qO`fk-f@gXTDg@8=s5XM~Zf)liFIid3aWIYe7UM-;`E0qf%;K92 zT@IGXE1$SS%<;x(gWPG?TSP6$-y-U~{4JusmA^$4m6GX;sJS*+#y3^A$k3S@L|tsR zR3tEdXPKDGeOn^zjM`~yUDWE(ol$KuMfKPfQ2|ZVL;+-S5N0EYH3+i3qB-QE2sZc?Ygi}=vlTo&C%CT$ zl~Y@nPW4Mx8^N>oYsqTraROgxR~QPx8&|no2=NGRGn6wFmfq^~jfH`qYlR(+`Hor% zF83X^5M4lY(o5 zCcF`SSKZO$#GTdadYgn3ZM;X^BD*(PUZcLNZc8wG-t6%r0GlGx2AHwFA~XtTAN zmkCj;cnlEreX^+y`yhf;cNA<1$62`4(=DsjI9j8kW0N1P5u~2AH5RB~R3%7D#pbwH z!)T4lrh-95kh(6|$%&Snj-0;srJE1>A!yxCMYK{8cX-{j?o;Yi#8%4lW3RAQZxk88 zvCZN8oM*9};BJpvOm1kji2ui}b@m2SUTZl|9R!bBtADgB9zZ<(Eyq^DzN(hG6r8pn zR0tm**pd-d!7!L^x;)aZMF(Eo5-0@c> zsAZ7lXYJ9?UVF>53EOG7!+W~spk_-zCy z8OjklUW@*+ub=w9S_!gGXoMg;lvZ2ES&Du4tpu~(Pi)2P{Au5LGeNd3JvIBDev=Xs z%=T0?!uv-jsv#w1z)%v*c2X=3D^vfN(FC)V^9EcrC^y=s@3(eEV+6lC;3{AdBlu^J zY9n~≺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 R -#include -#include -#include -#include -#include -#include -#include -#include // `apt-get install libx11-dev` -#include // `apt-get install libxmu-dev` -#include // `apt install libjson-c-dev` -#include -#include -#include -#ifdef WIN32 -#include -#elif _POSIX_C_SOURCE >= 199309L -#include // for nanosleep -#else -#include // for usleep -#endif - -const char *eventNames[34] = {"None","KeyPress","KeyRelease","ButtonPress","ButtonRelease","MotionNotify","EnterNotify","LeaveNotify","FocusIn","FocusOut","KeymapNotify","Expose","GraphicsExpose","NoExpose","VisibilityNotify","CreateNotify","DestroyNotify","UnmapNotify","MapNotify","MapRequest","ReparentNotify","ConfigureNotify","ConfigureRequest","ResizeRequest","CirculateNotify","CirculateRequest","PropertyNotify","SelectionClear","SelectionRequest","SelectionNotify","ColormapNotify","ClientMessage","MappingNotify"}; - -#define NUM_THREADS 2 -typedef struct threadArgs * ThreadArgs; -struct threadArgs{ - char *run_onInput; - char *run_offInput; -}; - -long long timeInMilliseconds(void) { - struct timeval tv; - - gettimeofday(&tv,NULL); - return (((long long)tv.tv_sec)*1000)+(tv.tv_usec/1000); -} - -bool debug; -bool input_check = 0; -long long int event_ts; -int last_event; - -Display* d; -Window w; -XEvent e; - -// cross-platform sleep function -void sleep_ms(int milliseconds) { - #ifdef WIN32 - Sleep(milliseconds); - #elif _POSIX_C_SOURCE >= 199309L - struct timespec ts; - ts.tv_sec = milliseconds / 1000; - ts.tv_nsec = (milliseconds % 1000) * 1000000; - nanosleep(&ts, NULL); - #else - usleep(milliseconds * 1000); - #endif -} - -char *trimwhitespace(char *str){ - char *end; - // Trim leading space - while(isspace((unsigned char)*str)) str++; - if(*str == 0) // All spaces? - return str; - // Trim trailing space - end = str + strlen(str) - 1; - while(end > str && isspace((unsigned char)*end)) end--; - // Write new null terminator character - end[1] = '\0'; - return str; -} - -int check_caret(){ - int caretint; - char * fpname; - fpname = malloc(sizeof(char)*20); - strcpy(fpname,"/tmp/kinto/caret"); - if( access( fpname, F_OK ) != -1 ) { - char *buffer = NULL; - size_t size = 0; - FILE *fp = fopen(fpname, "r"); - if (fp == NULL){ - return (0); - } - fseek(fp, 0, SEEK_END); - size = ftell(fp); - rewind(fp); - buffer = malloc((size + 1) * sizeof(*buffer)); - fread(buffer, size, 1, fp); - buffer[size] = '\0'; - trimwhitespace(buffer); - caretint = atoi(buffer); - fclose(fp); - if(caretint == 1){ - // printf("caret: %s\n", buffer); - return 1; - } - // printf("found nothing\n"); - return 0; - } - else{ - // printf("file %s does not exist\n",fpname); - return 0; - } -} - -void *inputToggle(void *argStruct) { - ThreadArgs args = argStruct; - - char * onInput; - char * offInput; - onInput = malloc(sizeof(char)*400); - offInput = malloc(sizeof(char)*400); - onInput = args->run_onInput; - offInput = args->run_offInput; - - Bool ran_onInput = 0; - - while(input_check){ - if(check_caret() && ran_onInput == 0){ - if(debug == true){ - printf("run_onInput: %s\n",onInput); - } - system(onInput); - ran_onInput = 1; - } - else if(!check_caret() && ran_onInput == 1){ - if(debug == true){ - printf("run_offInput: %s\n",offInput); - } - system(offInput); - ran_onInput = 0; - } - sleep_ms(100); - } - pthread_exit(NULL); -} - -void *nextPlease(void *threadid) { - long tid; - tid = (long)threadid; - - // printf("Next Please Thread ID, %ld\n", tid); - - // Reference http://www.rahul.net/kenton/xproto/xevents_errors.html - // event type 17 - DestroyNotify - // event type 18 - UnmapNotify - // event type 22 - ConfigureNotify - // Dismiss the following events by initiating another XNextEvent - XNextEvent(d, &e); - while(e.type != ConfigureNotify || (e.type == ConfigureNotify && last_event == ConfigureNotify && timeInMilliseconds()-event_ts < 419)){ - XNextEvent(d, &e); - } - // Unset input thread - input_check = 0; - last_event = e.type; - - if(debug == true){ - printf(" event: %s %d\n",eventNames[e.type-1],e.type); - printf(" duration: %lldms\n",timeInMilliseconds()-event_ts); - } - event_ts = timeInMilliseconds(); - - pthread_exit(NULL); -} - -char * append(char * string1, char * string2){ - char * result = NULL; - asprintf(&result, "%s,%s", string1, string2); - return result; -} - -static int wait_fd(int fd, double seconds){ - struct timeval tv; - fd_set in_fds; - FD_ZERO(&in_fds); - FD_SET(fd, &in_fds); - tv.tv_sec = trunc(seconds); - tv.tv_usec = (seconds - trunc(seconds))*1000000; - return select(fd+1, &in_fds, 0, 0, &tv); -} - -Bool xerror = False; - -int in_int(int a[],int size,int item){ - int i,pos=-1; - for(i=0;i< size;i++) - { - if(a[i]==item) - { - pos=i; - break; - } - } - return pos; -} - -int in(const char **arr, int len, char *target) { - int i; - for(i = 0; i < len; i++) { - if(strncmp(arr[i], target, strlen(target)) == 0) { - return i; - } - } - return -1; -} - -int strcicmp(char const *a, char const *b){ - for (;; a++, b++) { - int d = tolower((unsigned char)*a) - tolower((unsigned char)*b); - if (d != 0 || !*a) - return d; - } -} - -Display* open_display(){ - int i; - Display* d = XOpenDisplay(NULL); - for (i = 0; i < 60; i++) { - if(d == NULL){ - printf("fail to open X server display...\n"); - } - else{ - break; - } - sleep(1); - } - if(d == NULL){ - printf("fail to open X server display for 1 minute...\n"); - printf("Kintox11 is now exiting...\n"); - exit(1); - } - return d; -} - -int handle_error(Display* display, XErrorEvent* error){ - printf("X11 error: type=%d, serial=%lu, code=%d\n", - error->type, error->serial, (int)error->error_code); - xerror = True; - return 1; -} - -Window get_focus_window(Display* d, int etype, char const *eventName, char const *current_app, bool debug){ - Window w; - int revert_to; - - if(debug == true){ - printf("\n get focus window\n"); - } - - if(!(etype == DestroyNotify || etype == UnmapNotify)) { - XGetInputFocus(d, &w, &revert_to); // see man - if(debug == true){ - printf(" -%s: event: %d, window_id: %ld\n",current_app,etype,w); - } - } - - if(xerror){ - printf("*Error getting focused window, e.type: %d, current_app: %s\n",etype,current_app); - exit(1); - }else if(w == None){ - printf("*no focus window, e.type: %d, current_app: %s\n",etype,current_app); - exit(1); - } - - return w; -} - -// get the top window. -// a top window have the following specifications. -// * the start window is contained the descendent windows. -// * the parent window is the root window. -Window get_top_window(Display* d, Window start, int etype, char const *eventName, char const *current_app, bool debug){ - Window w = start; - Window parent = start; - Window root = None; - Window *children; - unsigned int nchildren; - Status s; - char * ws; - char * wstr; - ws = malloc(sizeof(char)*4096); - wstr = malloc(sizeof(char)*100); - // strcpy(wstr,"test,"); - - if(debug == true){ - printf("\n get top window\n"); - } - // Checking for Destroy and Unmap Notify events here too - // Sometimes they still get passed through and if so need - // to be ignored or XQueryTree will cause a segmentation fault - while (parent != root && parent != 0 && !(etype == DestroyNotify || etype == UnmapNotify)) { - w = parent; - - s = XQueryTree(d, w, &root, &parent, &children, &nchildren); // see man - - sprintf(wstr, "%ld", w); - if ((ws != NULL) && (ws[0] == '\0')) { - strcpy(ws,wstr); - } - else{ - ws = append(ws, wstr); - } - - if (s) - XFree(children); - - if(xerror){ - printf("*fail to get top window: %ld, e.type: %d, current_app: %s\n",w,etype,current_app); - break; - } - } - - if(debug == true){ - printf(" -%s: event: %d, window_id: %s\n",current_app,etype,ws); - } - - return w; -} - -// search a named window (that has a WM_STATE prop) -// on the descendent windows of the argment Window. -Window get_named_window(Display* d, Window start, int etype, char const *eventName, char const *current_app, bool debug){ - Window w; - - if(debug == true){ - printf("\n get named window\n"); - } - // printf("getting named window ... "); - w = XmuClientWindow(d, start); // see man - - if(debug == true){ - printf(" -%s: event: %d, window_id: %ld\n\n",current_app,etype,w); - } - // if(w == start) - // printf("fail\n"); - // printf("success (window: %d)\n", (int) w); - return w; -} - -const char * str_window_class(Display* d, Window w, char *prior_app ){ - Status s; - XClassHint* class; - - class = XAllocClassHint(); // see man - if(xerror){ - // printf("ERROR: XAllocClassHint\n"); - } - - s = XGetClassHint(d, w, class); // see man - if(xerror || s){ - char * app_class; - app_class = malloc(sizeof(char)*100); - strcpy(app_class,class->res_class); - // printf("\tname: %s\n\tclass: %s\n", class->res_name, class->res_class); - return app_class; - }else{ - // char * error_msg; - // error_msg = malloc(sizeof(char)*50); - // strcpy(error_msg, "ERROR: XGetClassHint"); - return prior_app; - } -} - -int main(int argc, char *argv[]){ - - XInitThreads(); - - if(argc < 2){ - debug = false; - } - if(argc > 1 && (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--debug") == 0 )){ - debug = true; - printf("Running in debug mode\n"); - } - - FILE *fp; - char buffer[10240]; - struct json_object *parsed_json, *config, *config_obj, - *config_obj_name, *config_obj_run, *config_obj_run_oninput, - *config_obj_run_offinput, *config_obj_de, *config_obj_appnames, - *appnames_obj, *init, *de, *de_obj, *de_obj_id, *de_obj_active, - *de_obj_run, *de_obj_runterm,*de_obj_rungui; - - int arraylen; - int appnames_len, init_len, de_len, config_de_len; - int system(const char *command); - - size_t i,n,r; - - printf("Importing user_config.json...\n"); - fp = fopen("user_config.json","r"); - fread(buffer, 10240, 1, fp); - fclose(fp); - - parsed_json = json_tokener_parse(buffer); - - config = json_object_object_get(parsed_json, "config"); - init = json_object_object_get(parsed_json, "init"); - de = json_object_object_get(parsed_json, "de"); - - arraylen = json_object_array_length(config); - init_len = json_object_array_length(init); - de_len = json_object_array_length(de); - - const char *name_array[arraylen]; - const char *run_array[arraylen]; - const char *run_oninput_array[arraylen]; - const char *run_offinput_array[arraylen]; - int init_array[init_len]; - - int de_id_array[de_len]; - Bool de_active_array[de_len]; - const char *de_run_array[de_len]; - const char *de_runterm_array[de_len]; - const char *de_rungui_array[de_len]; - - // Grab all de variable info needed - for (i = 0; i < de_len; i++) { - de_obj = json_object_array_get_idx(de, i); - de_obj_id = json_object_object_get(de_obj, "id"); - de_id_array[i] = json_object_get_int(de_obj_id); - de_obj_active = json_object_object_get(de_obj, "active"); - de_active_array[i] = json_object_get_int(de_obj_active); - de_obj_run = json_object_object_get(de_obj, "run"); - de_run_array[i] = json_object_get_string(de_obj_run); - de_obj_runterm = json_object_object_get(de_obj, "run_term"); - de_runterm_array[i] = json_object_get_string(de_obj_runterm); - de_obj_rungui = json_object_object_get(de_obj, "run_gui"); - de_rungui_array[i] = json_object_get_string(de_obj_rungui); - // printf("de_run_array[%ld]: %s\n",i,de_run_array[i]); - } - // de ends - - int appnames_max = 0; - int config_de_max = 0; - - for (i = 0; i < arraylen; i++) { - config_obj = json_object_array_get_idx(config, i); - config_obj_appnames = json_object_object_get(config_obj, "appnames"); - config_obj_de = json_object_object_get(config_obj, "de"); - - appnames_len = json_object_array_length(config_obj_appnames); - if (appnames_len > appnames_max){ - appnames_max = appnames_len; - } - config_de_len = json_object_array_length(config_obj_de); - if(config_de_len > config_de_max){ - config_de_max = config_de_len; - } - } - - const char *appnames_array[arraylen][appnames_max]; - int config_de_array[arraylen][config_de_max]; - - for (i = 0; i < arraylen; i++) { - config_obj = json_object_array_get_idx(config, i); - - config_obj_name = json_object_object_get(config_obj, "name"); - config_obj_run = json_object_object_get(config_obj, "run"); - config_obj_run_oninput = json_object_object_get(config_obj, "run_onInput"); - config_obj_run_offinput = json_object_object_get(config_obj, "run_offInput"); - - name_array[i] = json_object_get_string(config_obj_name); - run_array[i] = json_object_get_string(config_obj_run); - run_oninput_array[i] = json_object_get_string(config_obj_run_oninput); - run_offinput_array[i] = json_object_get_string(config_obj_run_offinput); - // printf("%s\n%s\n", json_object_get_string(config_obj_name), json_object_get_string(config_obj_run)); - - config_obj_appnames = json_object_object_get(config_obj, "appnames"); - appnames_len = json_object_array_length(config_obj_appnames); - for (n = 0; n < appnames_len; n++) { - // printf("name_array[i]: %s\n",name_array[i]); - if(!strcicmp(name_array[i], "gui")){ - appnames_array[i][n] = NULL; - // printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); - } - else{ - appnames_array[i][n] = json_object_get_string(json_object_array_get_idx(config_obj_appnames, n)); - //printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); - } - } - if(appnames_max > appnames_len){ - for (n = appnames_len; n < appnames_max; n++){ - appnames_array[i][n] = NULL; - //printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); - } - } - - config_obj_de = json_object_object_get(config_obj, "de"); - config_de_len = json_object_array_length(config_obj_de); - for (n = 0; n < config_de_max; n++) { - if(n < config_de_len){ - // printf("de value: %d\n",json_object_get_int(json_object_array_get_idx(config_obj_de, n))); - config_de_array[i][n] = json_object_get_int(json_object_array_get_idx(config_obj_de, n)); - } - else{ - // printf("de -1 value: %d\n",json_object_get_int(json_object_array_get_idx(config_obj_de, n))); - config_de_array[i][n] = -1; - } - - } - } - - printf("Data from user_config.json imported successfully.\n"); - - for (i = 0; i < init_len; i++) { - init_array[i] = json_object_get_int(json_object_array_get_idx(init, i)); - int de_id_idx = in_int(de_id_array, de_len, init_array[i]); - printf("Running init command: %s\n",de_run_array[de_id_idx]); - system(de_run_array[de_id_idx]); - } - - char *name; - - // for XmbTextPropertyToTextList - setlocale(LC_ALL, ""); // see man locale - - d = open_display(); - XSelectInput(d, DefaultRootWindow(d), SubstructureNotifyMask); - XSetErrorHandler(handle_error); - - char * run_normal; - char * run_onInput; - char * run_offInput; - char * prior_app; - char * current_app; - char * prior_category; - char * current_category; - run_onInput = malloc(sizeof(char)*400); - run_offInput = malloc(sizeof(char)*400); - run_normal = malloc(sizeof(char)*400); - prior_app = malloc(sizeof(char)*100); - current_app = malloc(sizeof(char)*100); - prior_category = malloc(sizeof(char)*100); - current_category = malloc(sizeof(char)*100); - strcpy(prior_app,"none"); - strcpy(prior_category,"none"); - - int remap_bool = 2; - - printf("Starting keyswap...\n"); - - // get active window - w = get_focus_window(d, 0, eventNames[0], current_app, debug); - w = get_top_window(d, w, 0, eventNames[0], current_app, debug); - w = get_named_window(d, w, 0, eventNames[0], current_app, debug); - - // XFetchName(d, w, &name); - // printf("window:%#x name:%s\n", w, name); - printf("First window name: %s \n\n",str_window_class(d, w,prior_app)); - - int breakouter; - last_event=0; - event_ts = timeInMilliseconds(); - - for (;;) - { - strcpy(current_app,str_window_class(d, w,prior_app)); - int category_idx; - // printf("current: %s\n",current_app); - breakouter = 0; - - // Cycle through category name array - // printf("%d\n",arraylen); - for(i = 0; i < arraylen; ++i){ - // Cycle through the maximum App name array in each category - for(n = 0; n < appnames_max; ++n){ - if (appnames_array[i][n] != NULL){ - // printf("%s\n",appnames_array[i][n]); - if(strcicmp(appnames_array[i][n], current_app) == 0){ - strcpy(current_category,name_array[i]); - category_idx = i; - // printf("Match found: %s: %s\n",current_category,current_app); - breakouter = 1; - break; - } - } - else if(i == arraylen-1 && breakouter==0){ - // printf("No match found, default to gui"); - strcpy(current_category,"gui"); - category_idx = in(name_array, arraylen, current_category); - // printf("Match found: %s: %s\n",current_category,current_app); - break; - } - else if(appnames_array[i][n] == NULL){ - break; - } - if(breakouter==1){ - break; - } - } - } - if(strcicmp(prior_category, current_category) != 0){ - // printf("prior: %s, current: %s\n",prior_category,current_category); - // printf("%d,%d,%d,%d\n",strcicmp(prior_category, "gui"),strcicmp(current_category, "firefox"),strcicmp(current_category, "gui"),strcicmp(prior_category, "firefox")); - // printf("%d,%d\n",(strcicmp(prior_category, "gui") != 0 && strcicmp(prior_category, "firefox") != 0),(strcicmp(current_category, "gui") != 0 && strcicmp(current_category, "firefox") != 0)); - printf("%s: %s\n",current_category,current_app); - // Make sure we're not switching between 2 GUI keymaps - // Firefox & Standard GUI apps - // strcicmp returns 0 for matches, <>0 for non-match - if((strcicmp(prior_category, "gui") != 0 && strcicmp(prior_category, "firefox") != 0) || (strcicmp(current_category, "gui") != 0 && strcicmp(current_category, "firefox") != 0)){ - if(debug == true){ - printf("run: %s\n",run_array[category_idx]); - } - system(run_array[category_idx]); - } - strcpy(run_normal,run_array[category_idx]); - strcpy(run_onInput,run_oninput_array[category_idx]); - strcpy(run_offInput,run_offinput_array[category_idx]); - system(run_offInput); - for(r = 0; r < config_de_max; r++){ - if(config_de_array[category_idx][r] != -1){ - int de_id_idx = in_int(de_id_array, de_len, config_de_array[category_idx][r]); - if(strcicmp(current_category, "term") == 0){ - if(debug == true){ - printf("Running de term command: %s\n",de_runterm_array[de_id_idx]); - } - system(de_runterm_array[de_id_idx]); - } - else{ - if(debug == true){ - printf("Running de gui command: %s\n",de_rungui_array[de_id_idx]); - } - system(de_rungui_array[de_id_idx]); - } - } - } - } - else if(strcicmp(prior_app, current_app) != 0){ - int indent = strlen(current_category)+2; - printf("%*c%s\n", indent, ' ',current_app); - } - - fflush(stdout); - - strcpy(prior_app,current_app); - strcpy(prior_category,current_category); - - if(strlen(run_onInput) > 0){ - input_check = 1; - } - else{ - input_check = 0; - } - - pthread_t threads[NUM_THREADS]; - int rc; - int i; - ThreadArgs args = (ThreadArgs)malloc(sizeof(struct threadArgs)); - args->run_onInput = run_onInput; - args->run_offInput = run_offInput; - for( i = 0; i < NUM_THREADS; i++ ) { - - if(i==0){ - rc = pthread_create(&threads[i], NULL, inputToggle, args); - } - else{ - rc = pthread_create(&threads[i], NULL, nextPlease, (void *)&i); - } - if (rc) { - printf("Error:unable to create thread, %d\n", rc); - exit(-1); - } - } - // wait for threads to close before continuing - for (int i = 0; i < NUM_THREADS; i++) { - pthread_join(threads[i], NULL); - } - - w = get_focus_window(d, e.type, eventNames[e.type-1], current_app, debug); - w = get_top_window(d, w, e.type, eventNames[e.type-1], current_app, debug); - w = get_named_window(d, w, e.type, eventNames[e.type-1], current_app, debug); - } -} \ No newline at end of file diff --git a/kinto_old/setup.py b/kinto_old/setup.py deleted file mode 100644 index 9501be2..0000000 --- a/kinto_old/setup.py +++ /dev/null @@ -1,631 +0,0 @@ -#!/usr/bin/env python3 -import json, time, os, sys, subprocess, shlex, platform -from shutil import copyfile -from subprocess import PIPE, Popen -from prekinto import * - -homedir = os.path.expanduser("~") -kintotype = 0 - -def windows_setup(): - keymaps = ["Apple keyboard standard", "Windows keyboard standard","Chromebook","IBM - No Super/Win","Uninstall"] - for index, item in enumerate(keymaps): - print(" %i. %s" % (index+1, item)) - default = 0 - while not int(default) in range(1,len(keymaps)+1): - default = int(input("\nPlease enter your desired keymap (1 - " + str(len(keymaps)) + ") : ")) - print("") - # Short DOS path notation - path= cmdline('echo ''%cd%''')[:-1] - if default > 0 and default < 5: - print("Will now install chocolatey and autohotkey with elevated privileges...") - print("This install will fail if you are not running with elevated privileges") - os.system('powershell -executionpolicy bypass ".\\windows\\autohotkey.ps1"') - print("Copying autohotkey combinations for Terminals & Editors...") - os.system('copy /Y "' + path + '\\windows\\kinto.ahk" "' + path + '\\windows\\kinto-new.ahk"') - if default < 3: - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; Default)(?!( - ST2CODE))(.*)/$2$3$5/g" .\\windows\\kinto-new.ahk') - if default == 1: - kbtype = "mac" - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; MacModifiers)/$2$3/g" .\\windows\\kinto-new.ahk') - elif default == 2: - kbtype = "win" - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; WinModifiers)/$2$3/g" .\\windows\\kinto-new.ahk') - elif default == 5: - print("Removing any old registry keys from prior versions...") - p = subprocess.Popen(['powershell.exe', "Remove-ItemProperty -Path HKLM:'SYSTEM\CurrentControlSet\Control\Keyboard Layout' -Name 'Scancode Map' -ErrorAction SilentlyContinue"], stdout=sys.stdout) - print("Removing Kinto from Startup folder...") - os.system("(del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\") 2> nul") - os.system('(del "%userprofile%\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Startup\\kinto-start.vbs") 2> nul') - print("Ending any running Kinto tasks...") - os.system("(taskkill /IM autohotkey.exe) 2> nul") - print("Removing Kinto from users profile directory...") - os.system('(rd /s /q "%userprofile%\\.kinto") 2> nul') - print("") - print("Uninstall of Kinto is Complete.") - if default == 3: - kbtype = "chrome" - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; Chromebook)/$2$3/g" .\\windows\\kinto-new.ahk') - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; WinModifiers/CB)/$2$3/g" .\\windows\\kinto-new.ahk') - if default == 3 or default == 4: - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; CB/IBM)/$2$3/g" .\\windows\\kinto-new.ahk') - if default == 4: - kbtype = "ibm" - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; IBM)/$2$3/g" .\\windows\\kinto-new.ahk') - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; WinModifiers/CB/IBM)/$2$3/g" .\\windows\\kinto-new.ahk') - if default > 0 and default < 5: - stvscode = yn_choice(bcolors.CYELLOW2 + "Would you like to use Sublime Text 3 keymaps in VS Code?\n" + bcolors.ENDC) - print("\nWill now install Ubuntu Termimnal Theme as default...") - os.system('regedit "' + path + '\\windows\\theme_ubuntu.reg"') - os.system('robocopy "'+ path + '\\assets" "%userprofile%\\.kinto\\assets" /E') - if (stvscode and (default > 0 or default < 3)): - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; Default - ST2CODE)/$2$3/g" .\\windows\\kinto-new.ahk') - elif (stvscode and (default == 3 or default == 4 )): - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/(; )(.*)(; CB/IBM - ST2CODE)/$2$3/g" .\\windows\\kinto-new.ahk') - os.system('copy /Y "' + path + '\\windows\\kinto-start.vbs" "%userprofile%\\.kinto\\kinto-start.vbs"') - os.system('C:\\Strawberry\\perl\\bin\\perl.exe -pi -e "s/{kbtype}/' + kbtype + '/g" "%userprofile%\\.kinto\\kinto-start.vbs"') - os.system('copy /Y "' + path + '\\windows\\usb.vbs" "%userprofile%\\.kinto\\usb.vbs"') - os.system('copy /Y "' + path + '\\windows\\detectUSB.ahk" "%userprofile%\\.kinto\\detectUSB.ahk"') - os.system('mklink "%userprofile%\\Start Menu\\Programs\\Startup\\kinto-start.vbs" "%userprofile%\\.kinto\\kinto-start.vbs"') - os.system('copy /Y "'+ path + '\\windows\\NoShell.vbs" "%userprofile%\\.kinto\\NoShell.vbs"') - os.system('copy /Y "'+ path + '\\windows\\toggle_kb.bat" "%userprofile%\\.kinto\\toggle_kb.bat"') - os.system('copy /Y "'+ path + '\\windows\\kinto-new.ahk" "%userprofile%\\.kinto\\kinto.ahk"') - os.system("del /f .\\windows\\kinto-new.ahk") - os.system("del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\" 2> nul") - userpath = cmdline('cmd /c for %A in ("%userprofile%") do @echo %~sA')[:-1] - print('Starting... "' + userpath + '\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Startup\\kinto-start.vbs"') - os.system('"' + userpath + '\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Startup\\kinto-start.vbs"') - # # print("\nPlease log off and back on for changes to take full effect.") - print("If using WSL then please remember to right click on title bar -> Properties -> Edit Options -> Use Ctrl+Shift+C/V as Copy/Paste and enable it.") - else: - os.system("(del \"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\StartUp\\kinto.ahk\") 2> nul") - -def cmdline(command): - process = Popen( - args=command, - stdout=PIPE, - universal_newlines=True, - shell=True - ) - return process.communicate()[0] - -if platform.system() == 'Windows': - print("\nYou are detected as running Windows.") - windows_setup() - sys.exit() - -check_x11 = cmdline("(env | grep -i x11 || loginctl show-session \"$XDG_SESSION_ID\" -p Type) | awk -F= '{print $2}'").strip() - -if len(check_x11) == 0: - if os.name != 'nt': - print("You are not using x11, please logout and back in using x11/Xorg") - sys.exit() - else: - print("\nYou are detected as running Windows.") - windows_setup() - sys.exit() - -distro = cmdline("awk -F= '$1==\"NAME\" { print $2 ;}' /etc/os-release").replace('"','').strip().split(" ")[0] -dename = cmdline("./system-config/dename.sh").replace('"','').strip().split(" ")[0].lower() - -run_pkg = "" - -def requirements(pkgm): - print(bcolors.CYELLOW2 + "You need to install some packages, " +run_pkg+ ", for Kinto to fully remap browsers during input focus.\n" + bcolors.ENDC) - print("sudo " + pkgm + " " + run_pkg + "\n") - run_install = yn_choice(bcolors.CYELLOW2 + "Would you like to run it now? (Will require sudo privileges.)\n" + bcolors.ENDC) - if(run_install): - os.system("sudo " + pkgm + run_pkg) - print("\n") - -def install_ibus(): - global distro - print(bcolors.CYELLOW2 + "You need to set IBus as the default Input Method for full word-wise support and re-run this installer.\n" + bcolors.ENDC) - print(bcolors.CYELLOW2 + "Confirm the IBus Setup by saying Yes and then closing the window.\n" + bcolors.ENDC) - print("ibus-setup\n") - print("im-config -n ibus or im-chooser\n") - run_install = yn_choice(bcolors.CYELLOW2 + "Would you like to run it now? (Will require logoff and logon.)\n" + bcolors.ENDC) - if(run_install): - if distro=="fedora": - os.system("ibus-setup") - os.system("im-chooser") - print("\n") - print("IBus needs to have Input Method set to your language.") - print("im-chooser needs IBus to be selected & closed.") - input("Will need to log off and back on for it take effect...") - else: - os.system("ibus-setup") - os.system("im-config -n ibus") - print("\n") - input("IBus has been set as the default Input Method.\nPress any key to exit and re-run after logoff & logon...") - sys.exit() - -def setShortcuts(): - global distro - distroVersion = cmdline("awk -F= '$1==\"VERSION_ID\" { print $2 ;}' /etc/os-release").replace('"','').strip() - - print("\nIf Kinto is already running it will be stopped...") - print("If you cancel the installer you can re-run Kinto via\n systemctl --user start keyswap") - - cmdline("systemctl --user stop keyswap") - print("\nDetected " + distro + " " + distroVersion.strip() + " DE: " + dename + "\n") - addhotkeys = yn_choice("\nDo you want to apply system level shortcuts?") - if(addhotkeys): - distro = distro.lower() - if dename == "gnome" or dename == "mate" or dename == "budgie": - cmdline('dconf dump /org/gnome/desktop/wm/keybindings/ > keybindings_`date +"%Y.%m.%d-%s"`.conf') - cmdline('dconf dump /org/gnome/mutter/keybindings/ > mutter_`date +"%Y.%m.%d-%s"`.conf') - if(kintotype == 1): - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['Tools','Tab']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['Tools','Tab']\"") - else: - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['F13','F13','Tab']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['F14','F14','Tab']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['h','F9']\"") - # - # Leaving run dialog disabled for now - # Too slow on appearing, compared to the app menu - # - # if dename != "budgie": - cmdline("gsettings reset org.gnome.desktop.wm.keybindings panel-main-menu") - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space','Space']\"") - # else: - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['F1']\"") - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-run-dialog \"['Space','Space']\"") - cmdline("gsettings set org.gnome.shell.keybindings toggle-application-view \"['LaunchB']\"") - if dename != "mate": - cmdline("gsettings set org.gnome.mutter overlay-key ''") - if (distro == "ubuntu" and dename == "gnome") or (distro == "ubuntu" and dename == "budgie") or (distro == "linux" and dename == "mate") or (distro == "ubuntu" and dename == "mate"): - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up \"['Up','Left']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down \"['Down','Right']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left ['']") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right ['']") - cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['h','F9']\"") - cmdline("gsettings reset org.gnome.desktop.wm.keybindings panel-main-menu") - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space','Space']\"") - elif distro == "pop!_os" and dename == "gnome": - cmdline("gsettings set org.gnome.desktop.wm.keybindings close \"['F4','w']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings toggle-maximized \"['F10','Up']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['h','F9']\"") - cmdline("gsettings reset org.gnome.desktop.wm.keybindings panel-main-menu") - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space','Space']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up \"['Up','Left']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down \"['Down','Right']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left ['']") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right ['']") - elif distro == "elementary" and dename == "gnome": - if(kintotype == 1): - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['Tools','Tab']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['Tools','Tab']\"") - else: - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications \"['F13','F13','Tab']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward \"['F14','F14','Tab']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings show-desktop \"['d','Down']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings toggle-maximized \"['F10','Up']\"") - cmdline("gsettings reset org.gnome.desktop.wm.keybindings panel-main-menu") - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space','Space']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['h','F9']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space','Space']\"") - if(kintotype == 2): - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ Elementary cmdtab)/\$2\$3/g" ~/.xkb/symbols/mac_term') - cmdline('perl -pi -e "s/(\w.*)(\/\/ Default cmdtab)/\/\/ \$1\$2/g" ~/.xkb/symbols/mac_term') - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ Elementary cmdtab)/\$2\$3/g" ~/.xkb/symbols/mac_gui') - cmdline('perl -pi -e "s/(\w.*)(\/\/ Default cmdtab)/\/\/ \$1\$2/g" ~/.xkb/symbols/mac_gui') - # elif distro == "budgie" and dename == "gnome": - # print("Apply budgie shortcuts here") - elif (dename == "xfce"): - print("Applying xfce shortcuts...") - cmdline('cp ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ./xfce4-keyboard-shortcuts_`date +"%Y.%m.%d-%s"`.xml') - # Reset Show desktop - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/d" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/d" --create --type string --set "show_desktop_key"') - # Reset App Cycle - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Tab" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Tab" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/backslash" --create --type string --set "cycle_windows_key"') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/backslash" --create --type string --set "cycle_reverse_windows_key"') - # cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/h" --create --type string --set "hide_window_key"') - # Don't need to undo other maps for menu - # cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/commands/custom/space" --create --type string --set "xfce4-popup-whiskermenu"') - # cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/commands/custom/space" --create --type string --set "xfce4-popup-whiskermenu"') - cmdline('xfconf-query --reset --channel xfce4-keyboard-shortcuts --property "/commands/custom/space"') - cmdline('xfconf-query --reset --channel xfce4-keyboard-shortcuts --property "/commands/custom/space"') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/commands/default/Escape" --create --type string --set "xfce4-popup-whiskermenu"') - # Reset move to desktop shortcuts - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Home" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/End" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Left" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Right" --reset') - os.system('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Left" --create --type string --set "move_window_prev_workspace_key"') - os.system('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Right" --create --type string --set "move_window_next_workspace_key"') - # Reset Change Workspace - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Left" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Right" --reset') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Left" --create --type string --set "left_workspace_key"') - cmdline('xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Right" --create --type string --set "right_workspace_key"') - print("\nYou may need to run these commands manually to make sure they are set, if you want to move windows between desktops.\n") - print(' xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Left" --create --type string --set "move_window_prev_workspace_key"') - print(' xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Right" --create --type string --set "move_window_next_workspace_key"\n') - elif distro == "fedora" and dename == "gnome": - cmdline("gsettings set org.gnome.desktop.wm.keybindings show-desktop \"['d']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up \"['Up','Left']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down \"['Down','Right']\"") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left ['']") - cmdline("gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right ['']") - cmdline("gsettings set org.gnome.desktop.wm.keybindings minimize \"['h','F9']\"") - # cmdline("gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space','Space']\"") - cmdline("gsettings reset org.gnome.desktop.wm.keybindings panel-main-menu") - cmdline("gsettings set org.gnome.mutter.keybindings toggle-tiled-right \"['Right']\"") - cmdline("gsettings set org.gnome.mutter.keybindings toggle-tiled-left \"['Left']\"") - # org.gnome.mutter.keybindings toggle-tiled-right ['Right'] - # org.gnome.mutter.keybindings toggle-tiled-left ['Left'] - elif dename == "kde": - # cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "krunner.desktop" --key "_launch","Alt+Space\tAlt+F2\tSearch,Alt+Space\tAlt+F2\tSearch,KRunner"') - # Remove Alt+F3 Operations Menu - Sublimetext Select-All - cmdline('cp ~/.config/kwinrc ./kwinrc_`date +"%Y.%m.%d-%s"`') - cmdline('cp ~/.config/kglobalshortcutsrc ./kde_kglobalshortcutsrc_`date +"%Y.%m.%d-%s"`') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Switch to Previous Desktop" "Meta+Left,Meta+Left,Switch to Previous Desktop"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Window Operations Menu" "none,Alt+F3,Window Operations Menu"') - if(kintotype == 1): - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows" "Ctrl+Tools,Alt+Tab,Walk Through Windows"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows (Reverse)" "Ctrl+Shift+Tools,Alt+Shift+Backtab,Walk Through Windows (Reverse)"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows of Current Application" "Alt+F6,none,Walk Through Windows of Current Application"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows of Current Application (Reverse)" "Alt+Shift+F6,none,Walk Through Windows of Current Application (Reverse)"') - else: - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows" "Ctrl+F13,Alt+Tab,Walk Through Windows"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows (Reverse)" "Ctrl+Shift+F14,Alt+Shift+Backtab,Walk Through Windows (Reverse)"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Walk Through Windows Alternative" "none,none,Walk Through Windows"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Maximize Window" "none,Meta+PgUp,Maximize Window"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Window Maximize" "Meta+Ctrl+F,Alt+F10,Maximize Window"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Minimize Window" "Meta+h,Meta+PgDown,Minimize Window"') - cmdline('kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" --key "Switch to Next Desktop" "Meta+Right,Meta+Right,Switch to Next Desktop"') - os.system('kquitapp5 kglobalaccel && sleep 2s && kglobalaccel5 &') - else: - print('distro: ' + distro + ' de: ' + dename) - print(bcolors.CRED2 + "A supported OS and DE was not found, you may not have full system level shortcuts installed." + bcolors.ENDC) - print(bcolors.CRED2 + "You may want to find your DE or Window Manager settings and manually set Alt-Tab & other OS related shortcuts." + bcolors.ENDC) - if dename == "gnome" or dename == "mate" or dename == "budgie": - # Apply dconf update to make updates survive reboots - cmdline('dconf dump /org/gnome/desktop/wm/keybindings/ > tempkb.conf') - cmdline('dconf dump /org/gnome/mutter/keybindings/ > tempmt.conf') - cmdline('dconf load /org/gnome/desktop/wm/keybindings/ < tempkb.conf') - cmdline('dconf load /org/gnome/mutter/keybindings/ < tempmt.conf') - cmdline('sleep 1 && rm -f ./tempkb.conf;rm -f ./tempmt.conf') - if dename == "budgie": - print('** Make sure to open Keyboard settings & reset "switch applications" to cmd+tab **') - # cmdline('dconf update') - -def Uninstall(): - print("You selected to Uninstall Kinto.\n") - restore = yn_choice("\nYour DE is " + dename + ".\n\nY: Restore hotkeys from backup\nN: Reset OS/DE hotkeys\nWhich option would you prefer?") - print("") - if(restore): - if dename == "gnome": - print("Restoring DE hotkeys...") - wmkeys = cmdline('ls | grep -m1 "keybinding"') - mutterkeys = cmdline('ls | grep -m1 "mutter_"') - if len(wmkeys) > 0: - print('dconf load /org/gnome/desktop/wm/keybindings/ < ' + wmkeys) - cmdline('dconf load /org/gnome/desktop/wm/keybindings/ < ' + wmkeys) - else: - print('Gnome Desktop keybindings backup not found...') - if len(mutterkeys) > 0: - print('dconf load /org/gnome/mutter/keybindings/ < ' + mutterkeys) - cmdline('dconf load /org/gnome/mutter/keybindings/ < ' + mutterkeys) - if len(wmkeys) > 0 or len(mutterkeys) > 0: - print("Gnome hotkeys have been successfully restored.") - elif dename == "kde": - print("Restoring DE hotkeys...") - kwinkeys = cmdline('ls | grep -m1 "kwinrc"').strip() - kdekeys = cmdline('ls | grep -m1 "kglobalshortcutsrc"').strip() - cmdline('cp ./' + kdekeys + ' ~/.config/kglobalshortcutsrc') - cmdline('cp ./' + kwinkeys + ' ~/.config/kwinrc') - elif dename == "xfce": - print("Restoring DE hotkeys...") - xfcekeys = cmdline('ls | grep -m1 "xfce4-keyboard"').strip() - cmdline('cp ./' + xfcekeys + ' ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml') - if dename == "gnome" or dename == "kde" or dename == "xfce": - print("./uninstall.sh\n") - subprocess.check_call(shlex.split("./uninstall.sh")) - print("Done.") - if dename == "kde" or dename == "xfce": - print("Please log off and back on for your original hotkeys to take effect.") - else: - if dename == "gnome": - print("Resetting DE hotkeys...\n") - print("gsettings reset-recursively org.gnome.desktop.wm.keybindings") - cmdline("gsettings reset-recursively org.gnome.desktop.wm.keybindings") - print("gsettings reset-recursively org.gnome.mutter.keybindings") - cmdline("gsettings reset-recursively org.gnome.mutter.keybindings") - print("gsettings set org.gnome.mutter overlay-key 'super'") - cmdline("gsettings set org.gnome.mutter overlay-key 'super'") - cmdline('dconf dump /org/gnome/mutter/ > mutter.conf') - cmdline('dconf load /org/gnome/mutter/ < mutter.conf') - elif dename == "kde": - print("Resetting DE hotkeys...\n") - cmdline('mv ~/.config/kwinrc ~/.config/kwinrc.kinto') - cmdline('mv ~/.config/kglobalshortcutsrc ~/.config/kglobalshortcutsrc.kinto') - elif dename == "xfce": - print("Resetting DE hotkeys...\n") - cmdline('cp /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml') - if dename == "gnome" or dename == "kde" or dename == "xfce": - print("./uninstall.sh\n") - subprocess.check_call(shlex.split("./uninstall.sh")) - print("Done.") - if dename == "kde" or dename == "xfce": - print("Please log off and back on for your original DE hotkeys to take effect.") - -def kintoImpOne(): - - check_xbind = cmdline("\\which xbindkeys 2>/dev/null").strip() - check_xdotool = cmdline("\\which xdotool 2>/dev/null").strip() - check_ibus = cmdline("\\which ibus-setup 2>/dev/null").strip() - - pkgm = cmdline("\\which apt-get 2>/dev/null").strip() - - if len(pkgm) == 0: - pkgm = cmdline("\\which dnf 2>/dev/null").strip() - if len(pkgm) > 0: - pkgm += " check-update;sudo dnf install -y " - else: - pkgm += " install -y " - pkgm += " update; sudo apt-get install -y " - - if len(pkgm) == 0: - pkgm = cmdline("\\which pacman 2>/dev/null").strip() - if len(pkgm) > 0: - pkgm += " -Syy; sudo pacman -S " - - - if len(pkgm) == 0: - print("No supported package manager found. Exiting...") - sys.exit() - - - runpkg = 0 - global run_pkg - - if len(check_xbind) > 0 and len(check_xdotool) > 0 and len(check_ibus) > 0: - print("Xbindkeys, xdotool and IBus requirement is installed.") - if len(check_xbind) == 0: - run_pkg = "xbindkeys" - runpkg = 1 - if len(check_xdotool) == 0: - run_pkg += " xdotool" - runpkg = 1 - if len(check_ibus) == 0: - # may differ with distro, but for now - run_pkg += " ibus" - runpkg = 1 - - if runpkg != 0: - print(runpkg) - requirements(pkgm) - - if not os.path.exists(homedir + '/.config/ibus/bus') and cmdline("ls ~/.config/ibus/bus -1rt") == "": - install_ibus() - -try: - f = open("defaults.json") -except IOError: - print("defaults.json file is missing. Will exit.\n") - exit() -f.close() - -try: - f = open("defaults.json") -except IOError: - print("defaults.json file is missing. Will exit.\n") - exit() -f.close() - -try: - f = open("user_config.json") -except IOError: - print("user_config.json file is missing. Will exit.\n") - exit() -f.close() - -if os.path.isdir(homedir + "/.config/kinto") == False: - os.mkdir(homedir + "/.config/kinto") - time.sleep(0.5) - -with open('defaults.json') as json_file: - data = json.load(json_file) - - -color_arr = [bcolors.CBEIGE,bcolors.CRED2,bcolors.CGREEN,bcolors.CYELLOW ] - -print("\nKinto - Type in Linux like it's a Mac.\n") - -kintotype = int(input(color_arr[2] + - "1) Kinto - xkeysnail (udev/x11) - Recommended\n" + color_arr[0] + - "2) Kinto - Original xkb/x11 implementation\n" + color_arr[3] + - "3) Uninstall Kinto - xkeysnail\n" + - "4) Uninstall Kinto - Original xkb\n\n" - + bcolors.ENDC)) -print("") -if(kintotype == 1): - subprocess.check_call(shlex.split("./xkeysnail_service.sh")) - if os.path.isdir(homedir + "/.config/kinto") == True: - setShortcuts() - subprocess.check_call(shlex.split("./xkeysnail_service.sh budgieUpdate")) - exit() - -if(kintotype == 3): - subprocess.check_call(shlex.split("./xkeysnail_service.sh uninstall")) - exit() - -if(kintotype == 4): - Uninstall() - exit() - -kintoImpOne() - -for index, item in enumerate(data['defaulttypes']): - ossym = "" - if item == "windows": - ossym = u'\u2756' - elif item == "mac": - ossym = u'\u2318' - elif item == "chromebook": - ossym = u'\u2707' - print("%s %i. %s %s %s" % (color_arr[index], index+1, ossym, item.capitalize(), bcolors.ENDC)) - -print("%s %i. Uninstall %s" % (color_arr[3], len(data['defaulttypes'])+1, bcolors.ENDC)) - -default = 0 -while not int(default) in range(1,len(data['defaulttypes'])+2): - default = int(input(bcolors.CYELLOW2 + "\nPlease enter your keyboard type (1 - " + str(len(data['defaulttypes'])) + ") : " + bcolors.ENDC)) -print("") - -if default == len(data['defaulttypes'])+1: - Uninstall() - exit() - -try: - f = open(homedir + "/.config/kinto/user_config.json") - rewrite = yn_choice("~/.config/kinto/user_config.json already exists. Do you want to overwrite it with a new config?") - print("") - if(rewrite): - copyfile("user_config.json", homedir + "/.config/kinto/user_config.json") - else: - exit() -except IOError: - pass - copyfile("user_config.json", homedir + "/.config/kinto/user_config.json") -finally: - f.close() - -keyboardconfigs = [obj for obj in data['defaults'] if(obj['type'] == data['defaulttypes'][default-1])] - -# for k in keyboardconfigs: -for index, k in enumerate(keyboardconfigs): - print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) - print(bcolors.CYELLOW2 + 'Description: ' + k['description'] + bcolors.ENDC) - -print("") -defaultkb = 0 -while not int(defaultkb) in range(1,len(keyboardconfigs)+1): - defaultkb = int(input(bcolors.CYELLOW2 + "Please enter your keyboard config (1 - " + str(len(keyboardconfigs)) + ") : " + bcolors.ENDC)) -print("") - -if 'hack' in keyboardconfigs[defaultkb-1]: - print(bcolors.CYELLOW2 + "You have selected a keyboard config that needs the following command to be ran.\n" + bcolors.ENDC) - print(keyboardconfigs[defaultkb-1]['hack'].replace(";", "\n") + "\n") - runhack = yn_choice(bcolors.CYELLOW2 + "Would you like to run it now? (Will require sudo privileges. Will exit on No.)" + bcolors.ENDC) - if(runhack): - os.system(keyboardconfigs[defaultkb-1]['hack']) - -# Setup the selected keyboards config -os.system("cp -TRv ./.xkb ~/.xkb/") -if os.path.isdir(homedir + "/.xkb/keymap") == False: - os.mkdir(homedir + "/.xkb/keymap") - time.sleep(0.5) -os.system('setxkbmap -option') -os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui') -os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui.chrome') -os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui.browsers') -os.system('setxkbmap -print > ~/.xkb/keymap/kbd.mac.term') -time.sleep(0.5) - -symbols_line = cmdline("cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_symbols' | cut -f1 -d:").strip() -types_line = cmdline("cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:").strip() - -cmdline('sed -i '' -e "' + symbols_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui') -cmdline('sed -i '' -e "' + types_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui') -cmdline('sed -i '' -e "' + symbols_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_term'] + '\\"/2" ~/.xkb/keymap/kbd.mac.term') -cmdline('sed -i '' -e "' + types_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_term'] + '\\"/2" ~/.xkb/keymap/kbd.mac.term') - -# Set chrome file accordingly for chromebooks or normal -if default != 3: - cmdline('sed -i '' -e "' + symbols_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'].replace("+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)","+mac_gui(mac_levelssym)+mac_gui(mac_browsers)") + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.browsers') - cmdline('sed -i '' -e "' + symbols_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'].replace("+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)","+mac_gui(mac_browsers)+mac_gui(mac_chrome)") + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.chrome') -else: - # Fix multicursor in mac_gui - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ Chromebook multicursor)/\$2\$3/g" ~/.xkb/symbols/mac_gui') - cmdline('perl -pi -e "s/(\w.*)(\/\/ Default multicursor)/\/\/ \$1\$2/g" ~/.xkb/symbols/mac_gui') - # Fix browsers - cmdline('sed -i '' -e "' + symbols_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'].replace("+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)","+mac_gui(mac_levelssym)+mac_gui(mac_browsers_chromebook)") + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.browsers') - cmdline('sed -i '' -e "' + symbols_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_symbols_gui'].replace("+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)","+mac_gui(mac_browsers_chromebook)+mac_gui(mac_chrome)") + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.chrome') -if dename == "kde": - # Fix maximize shortcut - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ KDE maximize)/\$2\$3/g" ~/.xkb/symbols/mac_gui') - # term app switching - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ KDE cmdtab)/\$2\$3/g" ~/.xkb/symbols/mac_term') -else: - # Fix maximize shortcut - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ Default maximize)/\$2\$3/g" ~/.xkb/symbols/mac_gui') - # term app switching - cmdline('perl -pi -e "s/(\/\/ )(.*)(\/\/ Default cmdtab)/\$2\$3/g" ~/.xkb/symbols/mac_term') -cmdline('sed -i '' -e "' + types_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.browsers') -cmdline('sed -i '' -e "' + types_line + 's/\\"/' + keyboardconfigs[defaultkb-1]['xkb_types_gui'] + '\\"/2" ~/.xkb/keymap/kbd.mac.gui.chrome') - -setShortcuts() - -user_file = homedir + '/.config/kinto/user_config.json' -with open(user_file, 'r') as f: - user_config = json.load(f) - -onetime = yn_choice("\nOne time initialization tweaks are available. Would you like to view them?") -print("") -if(onetime): - intents = [obj for obj in user_config['de'] if(obj['intent'] == "init")] - - for index, k in enumerate(intents): - print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) - print(bcolors.CYELLOW2 + 'Description: ' + k['description'] + bcolors.ENDC) - print(bcolors.CYELLOW2 + 'run: ' + k['run'].replace(";", "\n") + bcolors.ENDC + '\n') - - print(bcolors.CYELLOW2 + "Please enter your init tweak(s) (eg 1 or 1 2 3 - leave blank to skip): " + bcolors.ENDC) - defaultinit = [int(i) for i in input().split()] - if len(defaultinit) != 0: - user_config['init'] = [intents[defaultinit[0]-1]['id']] - -print("\nDynamic shortcut tweaks\n") - -intents = [obj for obj in user_config['de'] if(obj['intent'] == "gui_term")] -tweaks = [] -tweaks_selected = [] - -for index, k in enumerate(intents): - print(color_arr[default-1] + bcolors.BOLD + str(index+1) + '. ' + k['name'] + bcolors.ENDC) - print(bcolors.CYELLOW2 + 'Description: ' + k['description'] + bcolors.ENDC) - print(bcolors.CYELLOW2 + 'run in gui mode: ' + k['run_gui'].replace(";", "\n") + bcolors.ENDC) - print(bcolors.CYELLOW2 + 'run in terminal mode: ' + k['run_term'].replace(";", "\n") + bcolors.ENDC + '\n') - tweaks.append(k['id']) - -print(bcolors.CYELLOW2 + "Please enter your dynamic shortcut tweak(s) (eg 1 or 1 2 3 - leave blank to skip): " + bcolors.ENDC) -defaultde = [int(i) for i in input().split()] - -for d in defaultde: - user_config['de'][tweaks[d-1]]['active'] = True - tweaks_selected.append(tweaks[d-1]) - -if len(defaultde) != 0: - # gui - user_config['config'][0]['de'] = tweaks_selected - # term - user_config['config'][1]['de'] = tweaks_selected - # firefox - user_config['config'][2]['de'] = tweaks_selected - # chrome - user_config['config'][3]['de'] = tweaks_selected - -user_config['config'][0]['run'] = keyboardconfigs[defaultkb-1]['gui'] -user_config['config'][1]['run'] = keyboardconfigs[defaultkb-1]['term'] -user_config['config'][2]['run'] = keyboardconfigs[defaultkb-1]['gui'].replace("kbd.mac.gui","kbd.mac.gui.browsers") -user_config['config'][3]['run'] = keyboardconfigs[defaultkb-1]['gui'].replace("kbd.mac.gui","kbd.mac.gui.chrome") - -os.remove(user_file) -with open(user_file, 'w') as f: - json.dump(user_config, f, indent=4) -print("Saved configuration to ~/.config/kinto/user_config.json\n") -print("Now running keyswap_service.sh to setup the keyswap service...") -print("Keyswap will be configured to run on user login\n") -print("You may start, stop, restart or view the status of the service with following commands\n") -print("systemctl --user start keyswap") -print("systemctl --user stop keyswap") -print("systemctl --user restart keyswap") -print("systemctl --user status keyswap") -os.system("./keyswap_service.sh") \ No newline at end of file diff --git a/kinto_old/system-config/.chrome-nw b/kinto_old/system-config/.chrome-nw deleted file mode 100644 index 7fd0b99..0000000 --- a/kinto_old/system-config/.chrome-nw +++ /dev/null @@ -1,7 +0,0 @@ -"xdotool key --delay 0 --clearmodifiers Alt+Left" - Control + Left + Release - #Home + release - -"xdotool key --delay 0 --clearmodifiers Alt+Right" - Control + Right + Release - #End + release diff --git a/kinto_old/system-config/.chrome-ww b/kinto_old/system-config/.chrome-ww deleted file mode 100644 index 9717ad1..0000000 --- a/kinto_old/system-config/.chrome-ww +++ /dev/null @@ -1,5 +0,0 @@ -"xdotool key --delay 0 --clearmodifiers Home" - Control + Left + Release - -"xdotool key --delay 0 --clearmodifiers End" - Control + Right + Release diff --git a/kinto_old/system-config/.firefox-nw b/kinto_old/system-config/.firefox-nw deleted file mode 100644 index a2f2578..0000000 --- a/kinto_old/system-config/.firefox-nw +++ /dev/null @@ -1,7 +0,0 @@ -#"xte 'keydown Control_L' 'key bracketleft' 'keyup Control_L'" -"xdotool key --delay 0 --clearmodifiers Control_L+bracketleft" - Home + Release - -#"xte 'keydown Control_R' 'key bracketright' 'keyup Control_R'" -"xdotool key --delay 0 --clearmodifiers Control_L+bracketright" - End + Release \ No newline at end of file diff --git a/kinto_old/system-config/budgie-daemon_10.5.1.md5 b/kinto_old/system-config/budgie-daemon_10.5.1.md5 deleted file mode 100644 index 2def76b..0000000 --- a/kinto_old/system-config/budgie-daemon_10.5.1.md5 +++ /dev/null @@ -1 +0,0 @@ -3cd35e15350ca7dac0c3cbfce1c661f7 /usr/bin/budgie-daemon diff --git a/kinto_old/system-config/budgie-desktop_10.5.1.md5 b/kinto_old/system-config/budgie-desktop_10.5.1.md5 deleted file mode 100644 index f759906..0000000 --- a/kinto_old/system-config/budgie-desktop_10.5.1.md5 +++ /dev/null @@ -1 +0,0 @@ -8660c2f8e0a9d3cff896254f6c0f9159 /usr/bin/budgie-desktop diff --git a/kinto_old/system-config/caret_status.sh b/kinto_old/system-config/caret_status.sh deleted file mode 100644 index 375208b..0000000 --- a/kinto_old/system-config/caret_status.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -mkdir -p /tmp/kinto - -IBUSADD=$(cat ~/.config/ibus/bus/`ls ~/.config/ibus/bus -1rt | tail -n1` | awk -F'IBUS_ADDRESS=' '{print $2}' | xargs) -dbus-monitor --address $IBUSADD "path='/org/freedesktop/IBus/Panel',interface='org.freedesktop.IBus.Panel',member='FocusOut'" 2> /dev/null | grep --line-buffered -o -P '(?<=object path \"/org/freedesktop/IBus/InputContext_).*(?=[\"])' | -while read ln -do - printf '%s\n' "$ln" > /tmp/kinto/caret -done diff --git a/kinto_old/system-config/caret_status_xkey.sh b/kinto_old/system-config/caret_status_xkey.sh deleted file mode 100644 index a405c86..0000000 --- a/kinto_old/system-config/caret_status_xkey.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash - -for pid in $(pidof -x caret_status_xkey.sh); do - if [ $pid != $$ ]; then - echo "[$(date)] : caret_status_xkey.sh : Process is already running with PID $pid" - exit 1 - fi -done - -mkdir -p /tmp/kinto/xkeysnail -echo "0" > /tmp/kinto/caret - -millitime=`date +%s%3N` -echo "$millitime" > /tmp/kinto/millitime - -IBUSADD=$(cat ~/.config/ibus/bus/`ls ~/.config/ibus/bus -1rt | tail -n1` | awk -F'IBUS_ADDRESS=' '{print $2}' | xargs) -dbus-monitor --address $IBUSADD "path='/org/freedesktop/IBus/Panel',interface='org.freedesktop.IBus.Panel',member='FocusOut'" 2> /dev/null | grep --line-buffered -o -P '(?<=object path \"/org/freedesktop/IBus/InputContext_).*(?=[\"])' | -while read ln -do - newtime=`date +%s%3N` - difftime=$(( newtime - millitime )) - millitime="$newtime" - echo "$millitime" > /tmp/kinto/millitime - appname=$(xprop -id `xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | awk '{print $5}'` | grep "WM_CLASS(STRING)" | awk '{print substr($4,2,length($4)-2)}') - if [ "${ln}" == "1" ]; then - appname=$(xprop -id `xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | awk '{print $5}'` | grep "WM_CLASS(STRING)" | awk '{print substr($4,2,length($4)-2)}') - if [ "${appname}" == "Firefox" ]; then - # echo "ff ww" - printf 'ff ww %s\n' "1" > /tmp/kinto/caret - elif [ "${appname}" == "Chromium" ] || [ "${appname}" == "Chromium-browser" ] || [ "${appname}" == "Google-chrome" ] || [ "${appname}" == "Epiphany" ]; then - # echo "chrome ww" - printf 'chrome ww %s\n' "1" > /tmp/kinto/caret - else - echo "reset" > /tmp/kinto/caret - fi - else - if [ "${appname}" == "Firefox" ]; then - # echo "ff nw" - printf 'ff nw\n' > /tmp/kinto/caret - elif [ "${appname}" == "Chromium" ] || [ "${appname}" == "Chromium-browser" ] || [ "${appname}" == "Google-chrome" ] || [ "${appname}" == "Epiphany" ]; then - # echo "chrome nw" - printf 'chrome nw\n' > /tmp/kinto/caret - else - echo "reset" > /tmp/kinto/caret - fi - fi - -done& - -while (true);do - sleep 0.2 - appname2=$(xprop -id `xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | awk '{print $5}'` | grep "WM_CLASS(STRING)" | awk '{print substr($4,2,length($4)-2)}') - check=$(cat /tmp/kinto/caret) - millitime=$(cat /tmp/kinto/millitime) - newtime=`date +%s%3N` - difftime=$(( newtime - millitime )) - if (( $difftime > 200 )); then - if [ "${check}" == "ff nw" ] && [ "${lastcheck}" != 1 ]; then - echo "firefox no wordwise" - # Sets new config - perl -pi -e "s/[^\n]\s{3}(K.*)(# Chrome-nw)/ # \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# Firefox-nw)/ \$1\$2/g;s/[^\n]\s{3}(K.*)(# Beginning of Line)/ # \$1\$2/g;s/[^\n]\s{3}(K.*)(# End of Line)/ # \$1\$2/g" /tmp/kinto/xkeysnail/kinto.py 2>/dev/null - lastcheck=1 - ww=0 - elif [ "${check}" == "chrome nw" ] && [ "${lastcheck}" != 2 ]; then - echo "chrome no wordwise" - # Sets new config - perl -pi -e "s/[^\n]\s{3}(K.*)(# Firefox-nw)/ # \$1\$2/g;s/[^\n]\s{3}(K.*)(# Beginning of Line)/ # \$1\$2/g;s/[^\n]\s{3}(K.*)(# End of Line)/ # \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# Chrome-nw)/ \$1\$2/g" /tmp/kinto/xkeysnail/kinto.py 2>/dev/null - lastcheck=2 - ww=0 - elif ([ "${check}" != "chrome nw" ] && [ "${check}" != "ff nw" ] && [ "${lastcheck}" != 3 ]) || ([ "${appname2}" != "Firefox" ] && [ "${appname2}" != "Chromium" ] && [ "${appname2}" != "Chromium-browser" ] && [ "${appname2}" != "Google-chrome" ] && [ "${appname2}" != "Epiphany" ] && [ "${check}" == "reset" ] && [ "${lastcheck}" != 3 ]); then - echo "wordwise" - # Sets original config - perl -pi -e "s/[^\n]\s{3}(K.*)(# Firefox-nw)/ # \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# Beginning of Line)/ \$1\$2/g;s/[^\n]\s{3}#\s(K.*)(# End of Line)/ \$1\$2/g;s/[^\n]\s{3}(K.*)(# Chrome-nw)/ # \$1\$2/g" /tmp/kinto/xkeysnail/kinto.py 2>/dev/null - # cp /home/ryan/.config/kinto/kinto.py /tmp/kinto/xkeysnail/kinto.py - lastcheck=3 - fi - fi -done diff --git a/kinto_old/system-config/cleanup.sh b/kinto_old/system-config/cleanup.sh deleted file mode 100644 index 7165543..0000000 --- a/kinto_old/system-config/cleanup.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -setxkbmap -option -# force command to run silently and report true -killall xbindkeys > /dev/null 2>&1 || : -# rm /tmp/kinto/caret - -gsettings set org.gnome.desktop.wm.keybindings switch-applications "['Tab']" -gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "['Tab']" -pkill -f /.config/kinto/xactive.sh \ No newline at end of file diff --git a/kinto_old/system-config/keyboard.ids b/kinto_old/system-config/keyboard.ids deleted file mode 100644 index f40825a..0000000 --- a/kinto_old/system-config/keyboard.ids +++ /dev/null @@ -1,3630 +0,0 @@ -# -# List of USB Keyboard ID's -# -# Filter: ^((?!eyboard|^[0-9]).)*$ -# -# Maintained by Stephen J. Gowdy -# If you have any new entries, please submit them via -# http://www.linux-usb.org/usb-ids.html -# or send entries as patches (diff -u old new) in the -# body of your email (a bot will attempt to deal with it). -# The latest version can be obtained from -# http://www.linux-usb.org/usb.ids -# -# Version: 2020.06.14 -# Date: 2020-06-14 20:34:07 -# - -# Vendors, devices and interfaces. Please keep sorted. - -# Syntax: -# vendor vendor_name -# device device_name <-- single tab -# interface interface_name <-- two tabs -# - -0001 Fry's Electronics -0002 Ingram -0003 Club Mac -0004 Nebraska Furniture Mart -0011 Unknown -0053 Planex -0078 Microntek -0079 DragonRise Inc. -0080 Unknown -0085 Boeye Technology Co., Ltd. -0102 miniSTREAK -0105 Trust International B.V. -0127 IBP -0145 Unknown -017c MLK -0200 TP-Link -0204 Chipsbank Microelectronics Co., Ltd -0218 Hangzhou Worlde -02ad HUMAX Co., Ltd. -0303 Mini Automation Controller -0324 OCZ Technology Inc -0325 OCZ Technology Inc -0386 LTS -03d9 Shenzhen Sinote Tech-Electron Co., Ltd -03da Bernd Walter Computer Technology -03e7 Intel -03e8 EndPoints, Inc. -03e9 Thesys Microelectronics -03ea Data Broadcasting Corp. -03eb Atmel Corp. - 2015 at90usbkey sample firmware (HID keyboard) - 2042 LUFA Keyboard Demo Application - 204d LUFA Combined Mouse and Keyboard Demo Application - 2061 LUFA Combined Mass Storage and Keyboard Demo Application - 6127 AT91SAM HID Keyboard Demo Application -03ec Iwatsu America, Inc. -03ed Mitel Corp. -03ee Mitsumi - 5609 Japanese Keyboard -03f0 HP, Inc - 0024 KU-0316 Keyboard - 010c Multimedia Keyboard Hub - 0122 HID Internet Keyboard - 020c Multimedia Keyboard - 0324 SK-2885 keyboard - 034a Elite Keyboard - 050c 5219 Wireless Keyboard - 0924 Modular Smartcard Keyboard - 0b0c Wireless Keyboard and Optical Mouse receiver - 0d4a SK-2025 Keyboard - 0f0c Wireless Keyboard and Optical Mouse receiver - 1024 Smart Card Keyboard - 1027 Virtual keyboard and mouse - 1524 Smart Card Keyboard - KR - 1624 Smart Card Keyboard - JP - 2b4a Business Slim Keyboard - 304a Slim Keyboard - 354a Slim Keyboard -03f1 Genoa Technology -03f2 Oak Technology, Inc. -03f3 Adaptec, Inc. -03f4 Diebold, Inc. -03f5 Siemens Electromechanical -03f8 Epson Imaging Technology Center -03f9 KeyTronic Corp. - 0100 KT-2001 Keyboard - 0101 Keyboard - 0102 Keyboard Mouse -03fb OPTi, Inc. -03fc Elitegroup Computer Systems -03fd Xilinx, Inc. -03fe Farallon Comunications -0400 National Semiconductor Corp. -0401 National Registry, Inc. -0402 ALi Corp. -0403 Future Technology Devices International, Ltd - 8371 PS/2 Keyboard And Mouse -0404 NCR Corp. - 0320 5932-USB Keyboard - 0322 5932-USB Enhanced Keyboard - 0323 5932-USB Enhanced Keyboard, Flash-Recovery/Download - 032a K016: USB-MSR ISO 3-Track MSR: HID Keyboard Mode -0405 Synopsys, Inc. -0406 Fujitsu-ICL Computers -0407 Fujitsu Personal Systems, Inc. -0408 Quanta Computer, Inc. -0409 NEC Corp. - 0011 PC98 Series Layout Keyboard Mouse - 0014 Japanese Keyboard - 0019 109 Japanese Keyboard with Bus-Powered Hub - 001a PC98 Series Layout Keyboard with Bus-Powered Hub - 0025 Mini Keyboard with Bus-Powered Hub - 0034 109 Japanese Keyboard with One-touch start buttons - 003f Wireless Keyboard with One-touch start buttons - 004f Wireless Keyboard with One-touch start buttons - 0094 Japanese Keyboard with One-touch start buttons - 0095 Japanese Keyboard -040a Kodak Co. -040b Weltrend Semiconductor - 2000 wired Keyboard [Dynex DX-WRK1401] -040c VTech Computers, Ltd -040d VIA Technologies, Inc. -040e MCCI -040f Echo Speech Corp. -0411 BUFFALO INC. (formerly MelCo., Inc.) -0412 Award Software International -0413 Leadtek Research, Inc. -0414 Giga-Byte Technology Co., Ltd -0416 Winbond Electronics Corp. - 551e Keyboard - 551f Keyboard w/ Sys and Media - 5521 Keyboard -0417 Symbios Logic -0418 AST Research -0419 Samsung Info. Systems America, Inc. -041a Phoenix Technologies, Ltd -041b d'TV -041d S3, Inc. -041e Creative Technology, Ltd - 2801 Prodikeys PC-MIDI multifunction keyboard -041f LCS Telegraphics -0420 Chips and Technologies -0421 Nokia Mobile Phones -0422 ADI Systems, Inc. -0423 Computer Access Technology Corp. -0424 Microchip Technology, Inc. (formerly SMSC) -0425 Motorola Semiconductors HK, Ltd - 0101 G-Tech Wireless Mouse & Keyboard -0426 Integrated Device Technology, Inc. -0427 Motorola Electronics Taiwan, Ltd -0428 Advanced Gravis Computer Tech, Ltd -0429 Cirrus Logic -042a Ericsson Austrian, AG -042b Intel Corp. -042c Innovative Semiconductors, Inc. -042d Micronics -042e Acer, Inc. -042f Molex, Inc. -0430 Sun Microsystems, Inc. - 0002 109 Keyboard - 0005 Type 6 Keyboard - 000a 109 Japanese Keyboard - 000b 109 Japanese Keyboard - 0082 109 Japanese Keyboard - 0083 109 Japanese Keyboard - 00a2 Type 7 Keyboard - a111 remote keyboard for P4 chip -0431 Itac Systems, Inc. -0432 Unisys Corp. -0433 Alps Electric, Inc. - abab Keyboard -0434 Samsung Info. Systems America, Inc. -0435 Hyundai Electronics America -0436 Taugagreining HF -0437 Framatome Connectors USA -0438 Advanced Micro Devices, Inc. -0439 Voice Technologies Group -043d Lexmark International, Inc. -043e LG Electronics USA, Inc. -043f RadiSys Corp. -0440 Eizo Nanao Corp. -0441 Winbond Systems Lab. -0442 Ericsson, Inc. -0443 Gateway, Inc. - 000e Multimedia Keyboard - 002e Millennium Keyboard -0445 Lucent Technologies, Inc. -0446 NMB Technologies Corp. - 6781 Keyboard with PS/2 Mouse Port - 6782 Keyboard -0447 Momentum Microsystems -0449 Duta Multi Robotik -044a Shamrock Tech. Co., Ltd -044b WSI -044c CCL/ITRI -044d Siemens Nixdorf AG -044e Alps Electric Co., Ltd - 1104 Japanese Keyboard -044f ThrustMaster, Inc. -0450 DFI, Inc. -0451 Texas Instruments, Inc. - e010 TI SmartPad Keyboard -0452 Mitsubishi Electronics America, Inc. -0453 CMD Technology - 6781 NMB Keyboard - 6783 Chicony Composite Keyboard -0454 Vobis Microcomputer AG -0455 Telematics International, Inc. -0456 Analog Devices, Inc. -0457 Silicon Integrated Systems Corp. -0458 KYE Systems Corp. (Mouse Systems) - 004c Slimstar Pro Keyboard -0459 Adobe Systems, Inc. -045a SONICblue, Inc. -045b Hitachi, Ltd -045d Nortel Networks, Ltd -045e Microsoft Corp. - 000b Natural Keyboard Elite - 001c Internet Keyboard Pro - 001d Natural Keyboard Pro - 002b Internet Keyboard Pro - 002d Internet Keyboard - 0048 Office Keyboard 1.0A - 005c Office Keyboard (106/109) - 005f Wireless MultiMedia Keyboard - 0061 Wireless MultiMedia Keyboard (106/109) - 0063 Wireless Natural MultiMedia Keyboard - 0065 Wireless Natural MultiMedia Keyboard (106/109) - 006d eHome Remote Control Keyboard keys - 0070 Wireless MultiMedia Keyboard - 0071 Wireless MultiMedia Keyboard (106/109) - 0072 Wireless Natural MultiMedia Keyboard - 0073 Wireless Natural MultiMedia Keyboard (106/109) - 0080 Digital Media Pro Keyboard - 00b0 Digital Media Pro Keyboard - 00b4 Digital Media Keyboard 1.0A - 00db Natural Ergonomic Keyboard 4000 V1.0 - 00dd Comfort Curve Keyboard 2000 V1.0 - 071f Mouse/Keyboard 2.4GHz Transceiver V2.0 - 0730 Digital Media Keyboard 3000 - 0750 Wired Keyboard 600 - 0752 Wired Keyboard 400 - 0780 Comfort Curve Keyboard 3000 - 0799 Surface Pro embedded keyboard - 07b6 Comfort Curve Keyboard 3000 - 07b9 Wired Keyboard 200 - 07cd Surface Keyboard - 07f8 Wired Keyboard 600 (model 1576) - 0800 Wireless keyboard (All-in-One-Media) - fff8 Keyboard -0460 Ace Cad Enterprise Co., Ltd -0461 Primax Electronics, Ltd - 0010 HP PR1101U / Primax PMX-KPR1101U Keyboard - 4d01 Comfort Keyboard / Kensington Orbit Elite - 4d8a HP Multimedia Keyboard - 4e04 Lenovo Keyboard KB1021 - 4e6f Acer Wired Keyboard Model KBAY211 -0463 MGE UPS Systems -0464 AMP/Tycoelectronics Corp. -0467 AT&T Paradyne -0468 Wieson Technologies Co., Ltd -046a Cherry GmbH - 0001 Keyboard - 0004 CyBoard Keyboard - 0005 XX33 SmartCard Reader Keyboard - 0008 Wireless Keyboard and Mouse - 0011 G83 (RS 6000) Keyboard - 0023 Keyboard - 0027 CyMotion Master Solar Keyboard - 002a Wireless Mouse & Keyboard - 003c Raptor Gaming Keyboard - 003d Raptor Gaming Keyboard Integrated Hub - 0041 G86 6240 Keyboard - 0081 eHealth Keyboard G87 1504 - 00a1 SmartCard Reader Keyboard KC 1000 SC - 010d MX-Board 3.0 Keyboard - b090 Keyboard -046b American Megatrends, Inc. - 0001 Keyboard - 0101 PS/2 Keyboard, Mouse & Joystick Ports - ff10 Virtual Keyboard and Mouse -046c Toshiba Corp., Digital Media Equipment -046d Logitech, Inc. - 0203 M2452 Keyboard - c221 G11/G15 Keyboard / Keyboard - c222 G15 Keyboard / LCD - c223 G11/G15 Keyboard / USB Hub - c225 G11/G15 Keyboard / G keys - c226 G15 Refresh Keyboard - c227 G15 Refresh Keyboard - c228 G19 Gaming Keyboard - c229 G19 Gaming Keyboard Macro Interface - c22a Gaming Keyboard G110 - c22b Gaming Keyboard G110 G-keys - c22d G510 Gaming Keyboard - c22e G510 Gaming Keyboard onboard audio - c248 G105 Gaming Keyboard - c24d G710 Gaming Keyboard - c301 iTouch Keyboard - c302 iTouch Pro Keyboard - c303 iTouch Keyboard - c305 Internet Keyboard - c307 Internet Keyboard - c308 Internet Navigator Keyboard - c309 Y-BF37 [Internet Navigator Keyboard] - c30b NetPlay Keyboard - c30e UltraX Keyboard (Y-BL49) - c30f Logicool HID-Compliant Keyboard (106 key) - c311 Y-UF49 [Internet Pro Keyboard] - c312 DeLuxe 250 Keyboard - c313 Internet 350 Keyboard - c315 Classic Keyboard 200 - c316 HID-Compliant Keyboard - c317 Wave Corded Keyboard - c318 Illuminated Keyboard - c31b Compact Keyboard K300 - c31c Keyboard K120 - c31d Media Keyboard K200 - c31f Comfort Keyboard K290 - c326 Washable Keyboard K310 - c328 Corded Keyboard K280e - c32b G910 Orion Spark Mechanical Keyboard - c335 G910 Orion Spectrum Mechanical Keyboard - c33a G413 Gaming Keyboard - c503 Cordless Mouse+Keyboard Receiver - c504 Cordless Mouse+Keyboard Receiver - c505 Cordless Mouse+Keyboard Receiver - c509 Cordless Keyboard & Mouse - c529 Logitech Keyboard + Mice - c703 Elite Keyboard Y-RP20 + Mouse MX900 (Bluetooth) - c714 diNovo Edge Keyboard - c71f diNovo Mini Wireless Keyboard - cab1 Cordless Keyboard for Wii HID Receiver -046e Behavior Tech. Computer Corp. - 0100 Keyboard - 5250 KeyMaestro Multimedia Keyboard - 5273 KeyMaestro Multimedia Keyboard - 5308 KeyMaestro Keyboard - 5408 KeyMaestro Multimedia Keyboard/Hub - 5500 Portable Keyboard 86+9 keys (Model 6100C US) - 6782 BTC 7932 mouse+keyboard -046f Crystal Semiconductor -0471 Philips (or NXP) - 0401 Semiconductors CICT Keyboard - 0402 PS/2 Mouse on Semiconductors CICT Keyboard -0472 Chicony Electronics Co., Ltd - 0065 PFU-65 Keyboard [Chicony] -0473 Sanyo Information Business Co., Ltd -0474 Sanyo Electric Co., Ltd -0475 Relisys/Teco Information System -0476 AESP -0477 Seagate Technology, Inc. -0478 Connectix Corp. -0479 Advanced Peripheral Laboratories -047a Semtech Corp. -047b Silitek Corp. - 0001 Keyboard - 0002 Keyboard and Mouse - 0011 SK-1688U Keyboard - 00f9 SK-1789u Keyboard - 0101 BlueTooth Keyboard and Mouse - 050e Internet Compact Keyboard -047c Dell Computer Corp. -047d Kensington -047e Agere Systems, Inc. (Lucent) -047f Plantronics, Inc. -0480 Toshiba America Inc -0481 Zenith Data Systems -0482 Kyocera Corp. -0483 STMicroelectronics -0484 Specialix -0485 Nokia Monitors -0486 ASUS Computers, Inc. -0487 Stewart Connector -0488 Cirque Corp. -0489 Foxconn / Hon Hai -048a S-MOS Systems, Inc. -048c Alps Electric Ireland, Ltd -048d Integrated Technology Express, Inc. -048f Eicon Tech. -0490 United Microelectronics Corp. -0491 Capetronic -0492 Samsung SemiConductor, Inc. -0493 MAG Technology Co., Ltd -0495 ESS Technology, Inc. -0496 Micron Electronics -0497 Smile International -0498 Capetronic (Kaohsiung) Corp. -0499 Yamaha Corp. - 1054 S90XS Keyboard/Music Synthesizer - 1617 PSR-E353 digital keyboard -049a Gandalf Technologies, Ltd -049b Curtis Computer Products -049c Acer Advanced Labs, Inc. - 0002 Keyboard (???) -049d VLSI Technology -049f Compaq Computer Corp. - 000e Internet Keyboard - 0051 KU-0133 Easy Access Interner Keyboard -04a0 Digital Equipment Corp. -04a1 SystemSoft Corp. -04a2 FirePower Systems -04a3 Trident Microsystems, Inc. -04a4 Hitachi, Ltd -04a5 Acer Peripherals Inc. (now BenQ Corp.) - 0001 Keyboard -04a6 Nokia Display Products -04a7 Visioneer -04a8 Multivideo Labs, Inc. -04a9 Canon, Inc. -04aa DaeWoo Telecom, Ltd -04ab Chromatic Research -04ac Micro Audiometrics Corp. -04ad Dooin Electronics -04af Winnov L.P. -04b0 Nikon Corp. -04b1 Pan International -04b3 IBM Corp. - 3003 Rapid Access III Keyboard - 3004 Media Access Pro Keyboard - 300a Rapid Access IIIe Keyboard - 3016 UltraNav Keyboard Hub - 3018 UltraNav Keyboard - 301b SK-8815 Keyboard - 301c Enhanced Performance Keyboard - 3020 Enhanced Performance Keyboard - 3025 NetVista Full Width Keyboard - 4604 Keyboard w/ Card Reader -04b4 Cypress Semiconductor Corp. - 0101 Keyboard/Hub - 0102 Keyboard with APM - 5201 Combi Keyboard-Hub (Hub) - 5202 Combi Keyboard-Hub (Keyboard) - 8329 USB To keyboard/Mouse Converter -04b5 ROHM LSI Systems USA, LLC -04b6 Hint Corp. -04b7 Compal Electronics, Inc. -04b8 Seiko Epson Corp. -04b9 Rainbow Technologies, Inc. -04ba Toucan Systems, Ltd -04bb I-O Data Device, Inc. -04bd Toshiba Electronics Taiwan Corp. -04be Telia Research AB -04bf TDK Corp. -04c1 U.S. Robotics (3Com) -04c2 Methode Electronics Far East PTE, Ltd -04c3 Maxi Switch, Inc. -04c4 Lockheed Martin Energy Research -04c5 Fujitsu, Ltd -04c6 Toshiba America Electronic Components -04c7 Micro Macro Technologies -04c8 Konica Corp. -04ca Lite-On Technology Corp. - 0020 USB Keyboard - 004b Keyboard - 004f SK-9020 keyboard -04cb Fuji Photo Film Co., Ltd -04cc ST-Ericsson -04cd Tatung Co. Of America -04ce ScanLogic Corp. -04cf Myson Century, Inc. - 0022 OCZ Alchemy Series Elixir II Keyboard -04d0 Digi International -04d1 ITT Canon -04d2 Altec Lansing Technologies -04d3 VidUS, Inc. -04d4 LSI Logic, Inc. -04d5 Forte Technologies, Inc. -04d6 Mentor Graphics -04d7 Oki Semiconductor -04d8 Microchip Technology, Inc. -04d9 Holtek Semiconductor, Inc. - 0006 Wired Keyboard (78/79 key) [RPI Wired Keyboard 5] - 0022 Portable Keyboard - 0348 Keyboard - 1203 Keyboard - 1400 PS/2 keyboard + mouse controller - 1503 Keyboard - 1603 Keyboard - 1702 Keyboard LKS02 - 1818 Keyboard [Diatec Filco Majestouch 2] - 2011 Keyboard [Diatec Filco Majestouch 1] - 2013 Keyboard [Das Keyboard] - 2221 Keyboard - 2323 Keyboard - 4545 Keyboard [Diatec Majestouch 2 Tenkeyless] - a01c wireless multimedia keyboard with trackball [Trust ADURA 17911] - a055 Keyboard - a096 Keyboard -04da Panasonic (Matsushita) -04db Hypertec Pty, Ltd -04dc Huan Hsin Holdings, Ltd -04dd Sharp Corp. -04de MindShare, Inc. -04df Interlink Electronics -04e1 Iiyama North America, Inc. -04e2 Exar Corp. -04e3 Zilog, Inc. -04e4 ACC Microelectronics -04e5 Promise Technology -04e6 SCM Microsystems, Inc. - 5151 SCR338 Keyboard Smart Card Reader -04e7 Elo TouchSystems -04e8 Samsung Electronics Co., Ltd -04e9 PC-Tel, Inc. -04ea Brooktree Corp. -04eb Northstar Systems, Inc. -04ec Tokyo Electron Device, Ltd -04ed Annabooks -04ef Pacific Electronic International, Inc. -04f0 Daewoo Electronics Co., Ltd -04f1 Victor Company of Japan, Ltd -04f2 Chicony Electronics Co., Ltd - 0001 KU-8933 Keyboard - 0002 NT68P81 Keyboard - 0110 KU-2971 Keyboard - 0111 KU-9908 Keyboard - 0112 KU-8933 Keyboard with PS/2 Mouse port - 0116 KU-2971/KU-0325 Keyboard - 0201 Gaming Keyboard KPD0250 - 0402 Genius LuxeMate i200 Keyboard - 0403 KU-0420 keyboard - 0618 RG-0618U Wireless HID Receiver & KG-0609 Wireless Keyboard with Touchpad - 0760 Acer KU-0760 Keyboard - 0833 KU-0833 Keyboard - 0841 HP Multimedia Keyboard - 1061 HP KG-1061 Wireless Keyboard+Mouse - 1121 Periboard 717 Mini Wireless Keyboard -04f3 Elan Microelectronics Corp. - 0103 ActiveJet K-2024 Multimedia Keyboard - 01a4 Wireless Keyboard -04f4 Harting Elektronik, Inc. -04f5 Fujitsu-ICL Systems, Inc. -04f6 Norand Corp. -04f7 Newnex Technology Corp. -04f8 FuturePlus Systems -04f9 Brother Industries, Ltd -04fa Dallas Semiconductor -04fb Biostar Microtech International Corp. -04fc Sunplus Technology Co., Ltd - 05d8 Wireless keyboard/mouse -04fd Soliton Systems, K.K. -04fe PFU, Ltd - 0006 Happy Hacking Keyboard Lite2 -04ff E-CMOS Corp. -0500 Siam United Hi-Tech - 0001 DART Keyboard Mouse - 0002 DART-2 Keyboard -0501 Fujikura DDK, Ltd -0502 Acer, Inc. -0503 Hitachi America, Ltd -0504 Hayes Microcomputer Products -0506 3Com Corp. -0507 Hosiden Corp. -0508 Clarion Co., Ltd -0509 Aztech Systems, Ltd -050a Cinch Connectors -050b Cable System International -050c InnoMedia, Inc. -050d Belkin Components - 0200 Nostromo SpeedPad n52te Gaming Keyboard -050e Neon Technology, Inc. -050f KC Technology, Inc. -0510 Sejin Electron, Inc. - 0001 Keyboard - 1000 Keyboard with PS/2 Mouse Port -0511 N'Able (DataBook) Technologies, Inc. -0512 Hualon Microelectronics Corp. -0513 digital-X, Inc. -0514 FCI Electronics -0515 ACTC -0516 Longwell Electronics -0517 Butterfly Communications -0518 EzKEY Corp. - 0002 EZ-9900C Keyboard -0519 Star Micronics Co., Ltd -051a WYSE Technology -051b Silicon Graphics -051c Shuttle, Inc. -051d American Power Conversion -051e Scientific Atlanta, Inc. -051f IO Systems (Elite Electronics), Inc. -0520 Taiwan Semiconductor Manufacturing Co. -0521 Airborn Connectors -0522 Advanced Connectek, Inc. -0523 ATEN GmbH -0524 Sola Electronics -0525 Netchip Technology, Inc. -0526 Temic MHS S.A. -0527 ALTRA -0528 ATI Technologies, Inc. -0529 Aladdin Knowledge Systems -052a Crescent Heart Software -052b Tekom Technologies, Inc. -052c Canon Information Systems, Inc. -052d Avid Electronics Corp. -052e Standard Microsystems Corp. -052f Unicore Software, Inc. -0530 American Microsystems, Inc. -0531 Wacom Technology Corp. -0532 Systech Corp. -0533 Alcatel Mobile Phones -0534 Motorola, Inc. -0535 LIH TZU Electric Co., Ltd -0536 Hand Held Products (Welch Allyn, Inc.) -0537 Inventec Corp. -0538 Caldera International, Inc. (SCO) -0539 Shyh Shiun Terminals Co., Ltd -053a PrehKeyTec GmbH -053b Global Village Communication -053c Institut of Microelectronic & Mechatronic Systems -053d Silicon Architect -053e Mobility Electronics -053f Synopsys, Inc. -0540 UniAccess AB -0541 Sirf Technology, Inc. -0543 ViewSonic Corp. -0544 Cristie Electronics, Ltd -0545 Xirlink, Inc. -0546 Polaroid Corp. -0547 Anchor Chips, Inc. -0548 Tyan Computer Corp. -0549 Pixera Corp. -054a Fujitsu Microelectronics, Inc. -054b New Media Corp. -054c Sony Corp. -054d Try Corp. -054e Proside Corp. -054f WYSE Technology Taiwan -0550 Fuji Xerox Co., Ltd -0551 CompuTrend Systems, Inc. -0552 Philips Monitors -0553 STMicroelectronics Imaging Division (VLSI Vision) -0554 Dictaphone Corp. -0555 ANAM S&T Co., Ltd -0556 Asahi Kasei Microsystems Co., Ltd -0557 ATEN International Co., Ltd - 2004 UC-100KM PS/2 Mouse and Keyboard adapter - 2212 Keyboard/Mouse -0558 Truevision, Inc. -0559 Cadence Design Systems, Inc. -055a Kenwood USA -055b KnowledgeTek, Inc. -055c Proton Electronic Ind. -055d Samsung Electro-Mechanics Co. - 0001 Keyboard - 6780 Keyboard V1 - 6781 Keyboard Mouse -055e CTX Opto-Electronics Corp. -055f Mustek Systems, Inc. -0560 Interface Corp. -0561 Oasis Design, Inc. -0562 Telex Communications, Inc. -0563 Immersion Corp. -0564 Kodak Digital Product Center, Japan Ltd. (formerly Chinon Industries Inc.) -0565 Peracom Networks, Inc. -0566 Monterey International Corp. - 3002 Keyboard - 3013 BakkerElkhuizen Wired Keyboard S-board 840 Design - 3020 BakkerElkhuizen Wired Keyboard S-board 840 Design USB-Hub - 3107 Keyboard -0567 Xyratex International, Ltd -0568 Quartz Ingenierie -0569 SegaSoft -056a Wacom Co., Ltd -056b Decicon, Inc. -056c eTEK Labs -056d EIZO Corp. -056e Elecom Co., Ltd -056f Korea Data Systems Co., Ltd -0570 Epson America -0571 Interex, Inc. -0572 Conexant Systems (Rockwell), Inc. -0573 Zoran Co. Personal Media Division (Nogatech) -0574 City University of Hong Kong -0575 Philips Creative Display Solutions -0576 BAFO/Quality Computer Accessories -0577 ELSA -0578 Intrinsix Corp. -0579 GVC Corp. -057a Samsung Electronics America -057b Y-E Data, Inc. -057c AVM GmbH -057d Shark Multimedia, Inc. -057e Nintendo Co., Ltd -057f QuickShot, Ltd -0580 Denron, Inc. -0581 Racal Data Group -0582 Roland Corp. -0583 Padix Co., Ltd (Rockfire) -0584 RATOC System, Inc. -0585 FlashPoint Technology, Inc. -0586 ZyXEL Communications Corp. - 2011 Scorpion-980N keyboard -0587 America Kotobuki Electronics Industries, Inc. -0588 Sapien Design -0589 Victron -058a Nohau Corp. -058b Infineon Technologies -058c In Focus Systems -058d Micrel Semiconductor -058e Tripath Technology, Inc. -058f Alcor Micro Corp. - 2802 Monterey Keyboard - 9410 Keyboard - 9472 Keyboard Hub -0590 Omron Corp. -0591 Questra Consulting -0592 Powerware Corp. -0593 Incite -0594 Princeton Graphic Systems -0595 Zoran Microelectronics, Ltd -0596 MicroTouch Systems, Inc. -0597 Trisignal Communications -0598 Niigata Canotec Co., Inc. -0599 Brilliance Semiconductor, Inc. -059a Spectrum Signal Processing, Inc. -059b Iomega Corp. -059c A-Trend Technology Co., Ltd -059d Advanced Input Devices -059e Intelligent Instrumentation -059f LaCie, Ltd -05a0 Vetronix Corp. -05a1 USC Corp. -05a2 Fuji Film Microdevices Co., Ltd -05a3 ARC International -05a4 Ortek Technology, Inc. - 1000 WKB-1000S Wireless Ergo Keyboard with Touchpad - 2000 WKB-2000 Wireless Keyboard with Touchpad - 9720 Keyboard Mouse - 9722 Keyboard - 9731 MCK-600W/MCK-800USB Keyboard -05a5 Sampo Technology Corp. -05a6 Cisco Systems, Inc. - 0a01 Virtual Keyboard/Mouse -05a7 Bose Corp. -05a8 Spacetec IMC Corp. -05a9 OmniVision Technologies, Inc. -05aa Utilux South China, Ltd -05ab In-System Design -05ac Apple, Inc. - 0201 USB Keyboard [Alps or Logitech, M2452] - 0202 Keyboard [ALPS] - 0205 Extended Keyboard [Mitsumi] - 0206 Extended Keyboard [Mitsumi] - 020b Pro Keyboard [Mitsumi, A1048/US layout] - 020c Extended Keyboard [Mitsumi] - 020d Pro Keyboard [Mitsumi, A1048/JIS layout] - 020e Internal Keyboard/Trackpad (ANSI) - 020f Internal Keyboard/Trackpad (ISO) - 0214 Internal Keyboard/Trackpad (ANSI) - 0215 Internal Keyboard/Trackpad (ISO) - 0216 Internal Keyboard/Trackpad (JIS) - 0217 Internal Keyboard/Trackpad (ANSI) - 0218 Internal Keyboard/Trackpad (ISO) - 0219 Internal Keyboard/Trackpad (JIS) - 021a Internal Keyboard/Trackpad (ANSI) - 021b Internal Keyboard/Trackpad (ISO) - 021c Internal Keyboard/Trackpad (JIS) - 021d Aluminum Mini Keyboard (ANSI) - 021e Aluminum Mini Keyboard (ISO) - 021f Aluminum Mini Keyboard (JIS) - 0220 Aluminum Keyboard (ANSI) - 0221 Aluminum Keyboard (ISO) - 0222 Aluminum Keyboard (JIS) - 0223 Internal Keyboard/Trackpad (ANSI) - 0224 Internal Keyboard/Trackpad (ISO) - 0225 Internal Keyboard/Trackpad (JIS) - 0229 Internal Keyboard/Trackpad (ANSI) - 022a Internal Keyboard/Trackpad (MacBook Pro) (ISO) - 022b Internal Keyboard/Trackpad (MacBook Pro) (JIS) - 0230 Internal Keyboard/Trackpad (MacBook Pro 4,1) (ANSI) - 0231 Internal Keyboard/Trackpad (MacBook Pro 4,1) (ISO) - 0232 Internal Keyboard/Trackpad (MacBook Pro 4,1) (JIS) - 0236 Internal Keyboard/Trackpad (ANSI) - 0237 Internal Keyboard/Trackpad (ISO) - 0238 Internal Keyboard/Trackpad (JIS) - 023f Internal Keyboard/Trackpad (ANSI) - 0240 Internal Keyboard/Trackpad (ISO) - 0241 Internal Keyboard/Trackpad (JIS) - 0242 Internal Keyboard/Trackpad (ANSI) - 0243 Internal Keyboard/Trackpad (ISO) - 0244 Internal Keyboard/Trackpad (JIS) - 0245 Internal Keyboard/Trackpad (ANSI) - 0246 Internal Keyboard/Trackpad (ISO) - 0247 Internal Keyboard/Trackpad (JIS) - 024a Internal Keyboard/Trackpad (MacBook Air) (ISO) - 024d Internal Keyboard/Trackpad (MacBook Air) (ISO) - 024f Aluminium Keyboard (ANSI) - 0250 Aluminium Keyboard (ISO) - 0252 Internal Keyboard/Trackpad (ANSI) - 0253 Internal Keyboard/Trackpad (ISO) - 0254 Internal Keyboard/Trackpad (JIS) - 0259 Internal Keyboard/Trackpad - 025a Internal Keyboard/Trackpad - 0263 Apple Internal Keyboard / Trackpad (MacBook Retina) - 0267 Magic Keyboard A1644 - 0273 Internal Keyboard/Trackpad (ISO) - 1001 Keyboard Hub [ALPS] - 1002 Extended Keyboard Hub [Mitsumi] - 1003 Hub in Pro Keyboard [Mitsumi, A1048] - 1006 Hub in Aluminum Keyboard - 820a Bluetooth HID Keyboard -05ad Y.C. Cable U.S.A., Inc. -05ae Synopsys, Inc. -05af Jing-Mold Enterprise Co., Ltd - 0806 HP SK806A Keyboard - 0809 Wireless Keyboard and Mouse - 3062 Cordless Keyboard -05b0 Fountain Technologies, Inc. -05b1 First International Computer, Inc. -05b4 LG Semicon Co., Ltd -05b5 Dialogic Corp. -05b6 Proxima Corp. -05b7 Medianix Semiconductor, Inc. -05b8 SYSGRATION -05b9 Philips Research Laboratories -05ba DigitalPersona, Inc. -05bb Grey Cell Systems -05bc 3G Green Green Globe Co., Ltd -05bd RAFI GmbH & Co. KG -05be Tyco Electronics (Raychem) -05bf S & S Research -05c0 Keil Software -05c1 Kawasaki Microelectronics, Inc. -05c2 Media Phonics (Suisse) S.A. -05c5 Digi International, Inc. -05c6 Qualcomm, Inc. -05c7 Qtronix Corp. - 2001 Keyboard - 2011 SCorpius Keyboard -05c8 Cheng Uei Precision Industry Co., Ltd (Foxlink) -05c9 Semtech Corp. -05ca Ricoh Co., Ltd -05cb PowerVision Technologies, Inc. -05cc ELSA AG -05cd Silicom, Ltd -05ce sci-worx GmbH -05cf Sung Forn Co., Ltd -05d0 GE Medical Systems Lunar -05d1 Brainboxes, Ltd -05d2 Wave Systems Corp. -05d3 Tohoku Ricoh Co., Ltd -05d5 Super Gate Technology Co., Ltd -05d6 Philips Semiconductors, CICT -05d7 Thomas & Betts Corp. -05d8 Ultima Electronics Corp. -05d9 Axiohm Transaction Solutions -05da Microtek International, Inc. -05db Sun Corp. (Suntac?) -05dc Lexar Media, Inc. -05dd Delta Electronics, Inc. -05df Silicon Vision, Inc. -05e0 Symbol Technologies -05e1 Syntek Semiconductor Co., Ltd -05e2 ElecVision, Inc. -05e3 Genesys Logic, Inc. - 000a Keyboard with PS/2 Port - 0504 HID Keyboard Filter -05e4 Red Wing Corp. -05e5 Fuji Electric Co., Ltd -05e6 Keithley Instruments -05e8 ICC, Inc. -05e9 Kawasaki LSI -05eb FFC, Ltd -05ec COM21, Inc. -05ee Cytechinfo Inc. -05ef AVB, Inc. [anko?] -05f0 Canopus Co., Ltd -05f1 Compass Communications -05f2 Dexin Corp., Ltd -05f3 PI Engineering, Inc. - 0007 Kinesis Advantage PRO MPC/USB Keyboard - 0203 Y-mouse Keyboard & Mouse Adapter -05f5 Unixtar Technology, Inc. -05f6 AOC International -05f7 RFC Distribution(s) PTE, Ltd -05f9 PSC Scanning, Inc. - 2206 Gryphon series (keyboard emulation mode) -05fa Siemens Telecommunications Systems, Ltd - 3301 Keyboard with PS/2 Mouse Port - 3302 Keyboard - 3303 Keyboard with PS/2 Mouse Port -05fc Harman -05fd InterAct, Inc. -05fe Chic Technology Corp. -05ff LeCroy Corp. -0600 Barco Display Systems -0601 Jazz Hipster Corp. -0602 Vista Imaging, Inc. -0603 Novatek Microelectronics Corp. - 0002 Sino Wealth keyboard/mouse 2.4 GHz receiver - 00f1 Keyboard (Labtec Ultra Flat Keyboard) - 00f2 Keyboard (Labtec Ultra Flat Keyboard) -0604 Jean Co., Ltd -0605 Anchor C&C Co., Ltd -0606 Royal Information Electronics Co., Ltd -0607 Bridge Information Co., Ltd -0608 Genrad Ads -0609 SMK Manufacturing, Inc. -060a Worthington Data Solutions, Inc. -060b Solid Year - 0001 MacAlly Keyboard - 0230 KSK-8003 UX Keyboard - 0540 DeltaCo TB-106U Keyboard - 1006 Japanese Keyboard - 260U - 2101 Keyboard - 2231 KSK-6001 UELX Keyboard - 2270 Gigabyte K8100 Aivia Gaming Keyboard - 500a Cougar 500k Gaming Keyboard - 5253 Thermaltake MEKA G-Unit Gaming Keyboard - 5811 ACK-571U Wireless Keyboard - 5903 Japanese Keyboard - 595U - 6002 SolidTek USB Keyboard - 6003 Japanese Keyboard - 600HM - 6231 Thermaltake eSPORTS Meka Keyboard -060c EEH Datalink GmbH -060d Auctor Corp. -060e Transmonde Technologies, Inc. -060f Joinsoon Electronics Mfg. Co., Ltd -0610 Costar Electronics, Inc. -0611 Totoku Electric Co., Ltd -0613 TransAct Technologies, Inc. -0614 Bio-Rad Laboratories -0615 Quabbin Wire & Cable Co., Inc. -0616 Future Techno Designs PVT, Ltd -0617 Swiss Federal Insitute of Technology -0618 MacAlly -0619 Seiko Instruments, Inc. -061a Veridicom International, Inc. -061b Promptus Communications, Inc. -061c Act Labs, Ltd -061d Quatech, Inc. -061e Nissei Electric Co. -0620 Alaris, Inc. -0621 ODU-Steckverbindungssysteme GmbH & Co. KG -0622 Iotech, Inc. -0623 Littelfuse, Inc. -0624 Avocent Corp. - 0249 Virtual Keyboard/Mouse - 0402 Cisco Virtual Keyboard and Mouse -0625 TiMedia Technology Co., Ltd -0626 Nippon Systems Development Co., Ltd -0627 Adomax Technology Co., Ltd -0628 Tasking Software, Inc. -0629 Zida Technologies, Ltd -062a MosArt Semiconductor Corp. - 0102 Wireless Keyboard/Mouse Combo [MK1152WC] - 0201 Defender Office Keyboard (K7310) S Zodiak KM-9010 - 4101 Wireless Keyboard/Mouse -062b Greatlink Electronics Taiwan, Ltd -062c Institute for Information Industry -062d Taiwan Tai-Hao Enterprises Co., Ltd -062e Mainsuper Enterprises Co., Ltd -062f Sin Sheng Terminal & Machine, Inc. -0631 JUJO Electronics Corp. -0633 Cyrix Corp. -0634 Micron Technology, Inc. -0635 Methode Electronics, Inc. -0636 Sierra Imaging, Inc. -0638 Avision, Inc. -0639 Chrontel, Inc. -063a Techwin Corp. -063b Taugagreining HF -063c Yamaichi Electronics Co., Ltd (Sakura) -063d Fong Kai Industrial Co., Ltd -063e RealMedia Technology, Inc. -063f New Technology Cable, Ltd -0640 Hitex Development Tools -0641 Woods Industries, Inc. -0642 VIA Medical Corp. -0644 TEAC Corp. -0645 Who? Vision Systems, Inc. -0646 UMAX -0647 Acton Research Corp. -0648 Inside Out Networks -0649 Weli Science Co., Ltd -064b Analog Devices, Inc. (White Mountain DSP) -064c Ji-Haw Industrial Co., Ltd -064d TriTech Microelectronics, Ltd -064e Suyin Corp. -064f WIBU-Systems AG -0650 Dynapro Systems -0651 Likom Technology Sdn. Bhd. -0652 Stargate Solutions, Inc. -0653 CNF, Inc. -0654 Granite Microsystems, Inc. -0655 Space Shuttle Hi-Tech Co., Ltd -0656 Glory Mark Electronic, Ltd -0657 Tekcon Electronics Corp. -0658 Sigma Designs, Inc. -0659 Aethra -065a Optoelectronics Co., Ltd - 0001 Opticon OPR-2001 / NLV-1001 (keyboard mode) -065b Tracewell Systems -065e Silicon Graphics -065f Good Way Technology Co., Ltd & GWC technology Inc. -0660 TSAY-E (BVI) International, Inc. -0661 Hamamatsu Photonics K.K. -0662 Kansai Electric Co., Ltd -0663 Topmax Electronic Co., Ltd -0664 ET&T Technology Co., Ltd. -0665 Cypress Semiconductor -0667 Aiwa Co., Ltd -0668 WordWand -0669 Oce' Printing Systems GmbH -066a Total Technologies, Ltd -066b Linksys, Inc. -066d Entrega, Inc. -066e Acer Semiconductor America, Inc. -066f SigmaTel, Inc. -0670 Sequel Imaging -0672 Labtec, Inc. -0673 HCL - 5000 Keyboard -0674 Key Mouse Electronic Enterprise Co., Ltd -0675 DrayTek Corp. -0676 Teles AG -0677 Aiwa Co., Ltd -0678 ACard Technology Corp. -067b Prolific Technology, Inc. -067c Efficient Networks, Inc. -067d Hohner Corp. -067e Intermec Technologies Corp. - 0801 HID Keyboard, Barcode scanner -067f Virata, Ltd -0680 Realtek Semiconductor Corp., CPP Div. (Avance Logic) -0681 Siemens Information and Communication Products -0682 Victor Company of Japan, Ltd -0684 Actiontec Electronics, Inc. -0685 ZD Incorporated -0686 Minolta Co., Ltd -068a Pertech, Inc. -068b Potrans International, Inc. -068e CH Products, Inc. -068f Nihon KOHDEN -0690 Golden Bridge Electech, Inc. -0693 Hagiwara Sys-Com Co., Ltd -0694 Lego Group -0698 Chuntex (CTX) -0699 Tektronix, Inc. -069a Askey Computer Corp. -069b Thomson, Inc. -069d Hughes Network Systems (HNS) -069e Welcat Inc. -069f Allied Data Technologies BV -06a2 Topro Technology, Inc. -06a3 Saitek PLC - 8000 Gamers' Keyboard - 8020 Eclipse Keyboard - 8021 Eclipse II Keyboard -06a4 Xiamen Doowell Electron Co., Ltd -06a5 Divio -06a7 MicroStore, Inc. -06a8 Topaz Systems, Inc. -06a9 Westell -06aa Sysgration, Ltd -06ac Fujitsu Laboratories of America, Inc. -06ad Greatland Electronics Taiwan, Ltd -06ae Professional Multimedia Testing Centre -06af Harting, Inc. of North America -06b8 Pixela Corp. -06b9 Alcatel Telecom -06ba Smooth Cord & Connector Co., Ltd -06bb EDA, Inc. -06bc Oki Data Corp. -06bd AGFA-Gevaert NV -06be AME Optimedia Technology Co., Ltd -06bf Leoco Corp. -06c2 Phidgets Inc. (formerly GLAB) -06c4 Bizlink International Corp. -06c5 Hagenuk, GmbH -06c6 Infowave Software, Inc. -06c8 SIIG, Inc. -06c9 Taxan (Europe), Ltd -06ca Newer Technology, Inc. -06cb Synaptics, Inc. -06cc Terayon Communication Systems -06cd Keyspan -06ce Contec -06cf SpheronVR AG -06d0 LapLink, Inc. -06d1 Daewoo Electronics Co., Ltd -06d3 Mitsubishi Electric Corp. -06d4 Cisco Systems -06d5 Toshiba - 4000 Japanese Keyboard -06d6 Aashima Technology B.V. -06d7 Network Computing Devices (NCD) -06d8 Technical Marketing Research, Inc. -06da Phoenixtec Power Co., Ltd -06db Paradyne -06dc Foxlink Image Technology Co., Ltd -06de Heisei Electronics Co., Ltd -06e0 Multi-Tech Systems, Inc. -06e1 ADS Technologies, Inc. -06e4 Alcatel Microelectronics -06e6 Tiger Jet Network, Inc. -06ea Sirius Technologies -06eb PC Expert Tech. Co., Ltd -06ef I.A.C. Geometrische Ingenieurs B.V. -06f0 T.N.C Industrial Co., Ltd -06f1 Opcode Systems, Inc. -06f2 Emine Technology Co. - 0011 KVM Switch Keyboard -06f6 Wintrend Technology Co., Ltd -06f7 Wailly Technology Ltd -06f8 Guillemot Corp. -06f9 ASYST electronic d.o.o. -06fa HSD S.r.L -06fc Motorola Semiconductor Products Sector -06fd Boston Acoustics -06fe Gallant Computer, Inc. -0701 Supercomal Wire & Cable SDN. BHD. -0703 Bvtech Industry, Inc. -0705 NKK Corp. -0706 Ariel Corp. -0707 Standard Microsystems Corp. -0708 Putercom Co., Ltd -0709 Silicon Systems, Ltd (SSL) -070a Oki Electric Industry Co., Ltd -070d Comoss Electronic Co., Ltd -070e Excel Cell Electronic Co., Ltd -0710 Connect Tech, Inc. -0711 Magic Control Technology Corp. - 0260 PS/2 Keyboard and Mouse -0713 Interval Research Corp. -0714 NewMotion, Inc. -0717 ZNK Corp. -0718 Imation Corp. -0719 Tremon Enterprises Co., Ltd -071b Domain Technologies, Inc. -071c Xionics Document Technologies, Inc. -071d Eicon Networks Corp. -071e Ariston Technologies -0720 Keyence Corp. -0723 Centillium Communications Corp. -0726 Vanguard International Semiconductor-America -0729 Amitm -072e Sunix Co., Ltd -072f Advanced Card Systems, Ltd -0731 Susteen, Inc. -0732 Goldfull Electronics & Telecommunications Corp. -0733 ViewQuest Technologies, Inc. -0734 Lasat Communications A/S -0735 Asuscom Network -0736 Lorom Industrial Co., Ltd -0738 Mad Catz, Inc. - a109 S.T.R.I.K.E.7 Keyboard -073a Chaplet Systems, Inc. -073b Suncom Technologies -073c Industrial Electronic Engineers, Inc. -073d Eutron S.p.a. -073e NEC, Inc. -0742 Stollmann -0745 Syntech Information Co., Ltd -0746 Onkyo Corp. -0747 Labway Corp. -0748 Strong Man Enterprise Co., Ltd -0749 EVer Electronics Corp. -074a Ming Fortune Industry Co., Ltd -074b Polestar Tech. Corp. -074c C-C-C Group PLC -074d Micronas GmbH -074e Digital Stream Corp. -0755 Aureal Semiconductor -0757 Network Technologies, Inc. -0758 Carl Zeiss Microscopy GmbH -075b Sophisticated Circuits, Inc. -0763 M-Audio -0764 Cyber Power System, Inc. -0765 X-Rite, Inc. -0766 Jess-Link Products Co., Ltd -0767 Tokheim Corp. -0768 Camtel Technology Corp. -0769 Surecom Technology Corp. -076a Smart Technology Enablers, Inc. -076b OmniKey AG - a011 CCID Smart Card Reader Keyboard -076c Partner Tech -076d Denso Corp. -076e Kuan Tech Enterprise Co., Ltd -076f Jhen Vei Electronic Co., Ltd -0770 Welch Allyn, Inc - Medical Division -0771 Observator Instruments BV -0772 Your data Our Care -0774 AmTRAN Technology Co., Ltd -0775 Longshine Electronics Corp. -0776 Inalways Corp. -0777 Comda Enterprise Corp. -0778 Volex, Inc. -0779 ON Semiconductor (formerly Fairchild) -077a Sankyo Seiki Mfg. Co., Ltd -077b Linksys -077c Forward Electronics Co., Ltd - 0005 NEC Keyboard -077d Griffin Technology -077e Softing AG -077f Well Excellent & Most Corp. -0780 Sagem Monetel GmbH -0781 SanDisk Corp. -0782 Trackerball -0783 C3PO -0784 Vivitar, Inc. -0785 NTT-ME -0789 Logitec Corp. -078b Happ Controls, Inc. -078c GTCO/CalComp -078e Brincom, Inc. -0790 Pro-Image Manufacturing Co., Ltd -0791 Copartner Wire and Cable Mfg. Corp. -0792 Axis Communications AB -0793 Wha Yu Industrial Co., Ltd -0794 ABL Electronics Corp. -0795 RealChip, Inc. -0796 Certicom Corp. -0797 Grandtech Semiconductor Corp. -0798 Optelec -0799 Altera -079b Sagem -079d Alfadata Computer Corp. -07a1 Digicom S.p.A. -07a2 National Technical Systems -07a3 Onnto Corp. -07a4 Be, Inc. -07a6 ADMtek, Inc. -07aa Corega K.K. -07ab Freecom Technologies -07af Microtech -07b0 Trust Technologies -07b1 IMP, Inc. -07b2 Motorola BCS, Inc. -07b3 Plustek, Inc. -07b4 Olympus Optical Co., Ltd -07b5 Mega World International, Ltd -07b6 Marubun Corp. -07b7 TIME Interconnect, Ltd -07b8 AboCom Systems Inc -07bc Canon Computer Systems, Inc. -07bd Webgear, Inc. -07be Veridicom -07c0 Code Mercenaries Hard- und Software GmbH -07c1 Keisokugiken -07c4 Datafab Systems, Inc. -07c5 APG Cash Drawer -07c6 ShareWave, Inc. -07c7 Powertech Industrial Co., Ltd -07c8 B.U.G., Inc. -07c9 Allied Telesyn International -07ca AVerMedia Technologies, Inc. -07cb Kingmax Technology, Inc. -07cc Carry Computer Eng., Co., Ltd -07cd Elektor -07ce Nidec Copal -07cf Casio Computer Co., Ltd - 6802 MIDI Keyboard - 6803 CTK-3500 (MIDI keyboard) -07d0 Dazzle -07d1 D-Link System -07d2 Aptio Products, Inc. -07d3 Cyberdata Corp. -07d5 Radiant Systems -07d7 GCC Technologies, Inc. -07da Arasan Chip Systems -07de Diamond Multimedia -07df David Electronics Co., Ltd -07e0 NCP engineering GmbH -07e1 Ambient Technologies, Inc. -07e2 Elmeg GmbH & Co., Ltd -07e3 Planex Communications, Inc. -07e4 Movado Enterprise Co., Ltd -07e5 QPS, Inc. -07e6 Allied Cable Corp. -07e7 Mirvo Toys, Inc. -07e8 Labsystems -07ea Iwatsu Electric Co., Ltd -07eb Double-H Technology Co., Ltd -07ec Taiyo Electric Wire & Cable Co., Ltd -07ee Torex Retail (formerly Logware) -07ef STSN -07f2 Microcomputer Applications, Inc. -07f6 Circuit Assembly Corp. -07f7 Century Corp. -07f9 Dotop Technology, Inc. -07fa DrayTek Corp. -07fc Thomann - 1113 SWISSONIC EasyKeys61 Midikeyboard -07fd Mark of the Unicorn -07ff Unknown -0801 MagTek - 0001 Mini Swipe Reader (Keyboard Emulation) -0802 Mako Technologies, LLC -0803 Zoom Telephonics, Inc. -0809 Genicom Technology, Inc. -080a Evermuch Technology Co., Ltd -080b Cross Match Technologies -080c Datalogic S.p.A. -080d Teco Image Systems Co., Ltd -0810 Personal Communication Systems, Inc. -0813 Mattel, Inc. -0819 eLicenser -081a MG Logic -081b Indigita Corp. -081c Mipsys -081e AlphaSmart, Inc. -081f Manta -0822 Reudo Corp. -0825 GC Protronics -0826 Data Transit -0827 BroadLogic, Inc. -0828 Sato Corp. -0829 DirecTV Broadband, Inc. (Telocity) -082d Handspring -0830 Palm, Inc. -0832 Kouwell Electronics Corp. -0833 Sourcenext Corp. -0835 Action Star Enterprise Co., Ltd -0836 TrekStor -0839 Samsung Techwin Co., Ltd -083a Accton Technology Corp. -083f Global Village -0840 Argosy Research, Inc. -0841 Rioport.com, Inc. -0844 Welland Industrial Co., Ltd -0846 NetGear, Inc. -084d Minton Optic Industry Co., Inc. -084e KB Gear -084f Empeg -0850 Fast Point Technologies, Inc. -0851 Macronix International Co., Ltd -0852 CSEM -0853 Topre Corporation - 0200 RealForce Compact Keyboard -0854 ActiveWire, Inc. -0856 B&B Electronics -0858 Hitachi Maxell, Ltd -0859 Minolta Systems Laboratory, Inc. -085a Xircom -085c ColorVision, Inc. -0862 Teletrol Systems, Inc. -0863 Filanet Corp. -0864 NetGear, Inc. -0867 Data Translation, Inc. -086a Emagic Soft- und Hardware GmbH -086c DeTeWe - Deutsche Telephonwerke AG & Co. -086e System TALKS, Inc. -086f MEC IMEX, Inc. -0870 Metricom -0871 SanDisk, Inc. -0873 Xpeed, Inc. -0874 A-Tec Subsystem, Inc. -0879 Comtrol Corp. -087c Adesso/Kbtek America, Inc. -087d Jaton Corp. -087e Fujitsu Computer Products of America -087f QualCore Logic Inc. -0880 APT Technologies, Inc. -0883 Recording Industry Association of America (RIAA) -0885 Boca Research, Inc. -0886 XAC Automation Corp. -0887 Hannstar Electronics Corp. -088a TechTools -088b MassWorks, Inc. -088c Swecoin AB -088e iLok -0892 DioGraphy, Inc. -0894 TSI Incorporated -0897 Lauterbach -089c United Technologies Research Cntr. -089d Icron Technologies Corp. -089e NST Co., Ltd -089f Primex Aerospace Co. -08a5 e9, Inc. -08a6 Toshiba TEC -08a8 Andrea Electronics -08a9 CWAV Inc. -08ac Macraigor Systems LLC -08ae Macally (Mace Group, Inc.) -08b0 Metrohm -08b4 Sorenson Vision, Inc. -08b7 NATSU -08b8 J. Gordon Electronic Design, Inc. -08b9 RadioShack Corp. (Tandy) -08bb Texas Instruments -08bd Citizen Watch Co., Ltd -08c3 Precise Biometrics - 0003 100 SC BioKeyboard - 0006 100 A BioKeyboard -08c4 Proxim, Inc. -08c7 Key Nice Enterprise Co., Ltd -08c8 2Wire, Inc. -08c9 Nippon Telegraph and Telephone Corp. -08ca Aiptek International, Inc. -08cd Jue Hsun Ind. Corp. -08ce Long Well Electronics Corp. -08cf Productivity Enhancement Products -08d1 smartBridges, Inc. -08d3 Virtual Ink -08d4 Fujitsu Siemens Computers -08d8 IXXAT Automation GmbH -08d9 Increment P Corp. -08dd Billionton Systems, Inc. -08de ??? -08df Spyrus, Inc. -08e3 Olitec, Inc. -08e4 Pioneer Corp. -08e5 Litronic -08e6 Gemalto (was Gemplus) -08e7 Pan-International Wire & Cable -08e8 Integrated Memory Logic -08e9 Extended Systems, Inc. -08ea Ericsson, Inc., Blue Ridge Labs -08ec M-Systems Flash Disk Pioneers -08ed MediaTek Inc. -08ee CCSI/Hesso -08f0 Corex Technologies -08f1 CTI Electronics Corp. -08f2 Gotop Information Inc. -08f5 SysTec Co., Ltd -08f6 Logic 3 International, Ltd -08f7 Vernier -08f8 Keen Top International Enterprise Co., Ltd -08f9 Wipro Technologies -08fa Caere -08fb Socket Communications -08fc Sicon Cable Technology Co., Ltd -08fd Digianswer A/S -08ff AuthenTec, Inc. -0900 Pinnacle Systems, Inc. -0901 VST Technologies -0906 Faraday Technology Corp. -0908 Siemens AG - 04b3 keyboard front panel Cockpit -0909 Audio-Technica Corp. -090a Trumpion Microelectronics, Inc. -090b Neurosmith -090c Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) -090d Multiport Computer Vertriebs GmbH -090e Shining Technology, Inc. -090f Fujitsu Devices, Inc. -0910 Alation Systems, Inc. -0911 Philips Speech Processing -0912 Voquette, Inc. -0915 GlobeSpan, Inc. -0917 SmartDisk Corp. -0919 Tiger Electronics -091e Garmin International -0920 Echelon Co. -0921 GoHubs, Inc. -0922 Dymo-CoStar Corp. -0923 IC Media Corp. -0924 Xerox -0925 Lakeview Research -0927 Summus, Ltd -0928 PLX Technology, Inc. (formerly Oxford Semiconductor, Ltd) -0929 American Biometric Co. -092a Toshiba Information & Industrial Sys. And Services -092b Sena Technologies, Inc. -092f Northern Embedded Science/CAVNEX -0930 Toshiba Corp. -0931 Harmonic Data Systems, Ltd -0932 Crescentec Corp. -0933 Quantum Corp. -0934 Spirent Communications -0936 NuTesla -0939 Lumberg, Inc. -093a Pixart Imaging, Inc. -093b Plextor Corp. -093c Intrepid Control Systems, Inc. -093d InnoSync, Inc. -093e J.S.T. Mfg. Co., Ltd -093f Olympia Telecom Vertriebs GmbH -0940 Japan Storage Battery Co., Ltd -0941 Photobit Corp. -0942 i2Go.com, LLC -0943 HCL Technologies India Private, Ltd -0944 KORG, Inc. - 010d nanoKEY MIDI keyboard -0945 Pasco Scientific -0948 Kronauer music in digital -094b Linkup Systems Corp. -094d Cable Television Laboratories -094f Yano -0951 Kingston Technology -0954 RPM Systems Corp. -0955 NVIDIA Corp. -0956 BSquare Corp. -0957 Agilent Technologies, Inc. -0958 CompuLink Research, Inc. -0959 Cologne Chip AG -095a Portsmith -095b Medialogic Corp. -095c K-Tec Electronics -095d Polycom, Inc. -0964 BITRAN -0967 Acer NeWeb Corp. -0968 Catalyst Enterprises, Inc. -096e Feitian Technologies, Inc. -0971 Gretag-Macbeth AG -0973 Schlumberger -0974 Datagraphix, a business unit of Anacomp -0975 OL'E Communications, Inc. -0976 Adirondack Wire & Cable -0977 Lightsurf Technologies -0978 Beckhoff GmbH -0979 Jeilin Technology Corp., Ltd -097a Minds At Work LLC -097b Knudsen Engineering, Ltd -097c Marunix Co., Ltd -097d Rosun Technologies, Inc. -097e Biopac Systems Inc. -097f Barun Electronics Co., Ltd -0981 Oak Technology, Ltd -0984 Apricorn -0985 cab Produkttechnik GmbH & Co KG -0986 Matsushita Electric Works, Ltd. -098c Vitana Corp. -098d INDesign -098e Integrated Intellectual Property, Inc. -098f Kenwood TMI Corp. -0993 Gemstar eBook Group, Ltd -0996 Integrated Telecom Express, Inc. -099a Zippy Technology Corp. - 0638 Sanwa Supply Inc. Small Keyboard - 610c EL-610 Super Mini Electron luminescent Keyboard - 6330 SANWA Supply Inc. Slim Keyboard - 713a WK-713 Multimedia Keyboard - 7160 Hyper Slim Keyboard -099e Trimble Navigation, Ltd -09a3 PairGain Technologies -09a4 Contech Research, Inc. -09a5 VCON Telecommunications -09a6 Poinchips -09a7 Data Transmission Network Corp. -09a8 Lin Shiung Enterprise Co., Ltd -09a9 Smart Card Technologies Co., Ltd -09aa Intersil Corp. -09ab Japan Cash Machine Co., Ltd. -09ae Tripp Lite -09b0 Fargo -09b2 Franklin Electronic Publishers, Inc. -09b3 Altius Solutions, Inc. -09b4 MDS Telephone Systems -09b5 Celltrix Technology Co., Ltd -09bc Grundig -09be MySmart.Com -09bf Auerswald GmbH & Co. KG -09c0 Genpix Electronics, LLC -09c1 Arris Interactive LLC -09c2 Nisca Corp. -09c3 HID Global -09c4 ACTiSYS Corp. -09c5 Memory Corp. -09ca BMC Messsysteme GmbH -09cb FLIR Systems -09cc Workbit Corp. -09cd Psion Dacom Home Networks, Ltd -09ce City Electronics, Ltd -09cf Electronics Testing Center, Taiwan -09d1 NeoMagic, Inc. -09d2 Vreelin Engineering, Inc. -09d3 Com One -09d7 NovAtel Inc. -09d8 ELATEC GmbH -09d9 KRF Tech, Ltd -09da A4Tech Co., Ltd. - 0260 KV-300H Isolation Keyboard -09db Measurement Computing Corp. -09dc Aimex Corp. -09dd Fellowes, Inc. -09df Addonics Technologies Corp. -09e1 Intellon Corp. -09e5 Jo-Dan International, Inc. -09e6 Silutia, Inc. -09e7 Real 3D, Inc. -09e8 AKAI Professional M.I. Corp. - 0071 MPK25 MIDI Keyboard - 0076 LPK25 MIDI Keyboard -09e9 Chen-Source, Inc. -09eb IM Networks, Inc. -09ef Xitel -09f3 GoFlight, Inc. -09f5 AresCom -09f6 RocketChips, Inc. -09f7 Edu-Science (H.K.), Ltd -09f8 SoftConnex Technologies, Inc. -09f9 Bay Associates -09fa Mtek Vision -09fb Altera -09ff Gain Technology Corp. -0a00 Liquid Audio -0a01 ViA, Inc. -0a05 Unknown Manufacturer -0a07 Ontrak Control Systems Inc. -0a0b Cybex Computer Products Co. -0a0d Servergy, Inc -0a11 Xentec, Inc. -0a12 Cambridge Silicon Radio, Ltd -0a13 Telebyte, Inc. -0a14 Spacelabs Medical, Inc. -0a15 Scalar Corp. -0a16 Trek Technology (S) PTE, Ltd -0a17 Pentax Corp. -0a18 Heidelberger Druckmaschinen AG -0a19 Hua Geng Technologies, Inc. -0a21 Medtronic Physio Control Corp. -0a22 Century Semiconductor USA, Inc. -0a27 Datacard Group -0a2c AK-Modul-Bus Computer GmbH -0a34 TG3 Electronics, Inc. - 0110 Deck 82-key backlit keyboard -0a35 Radikal Technologies -0a39 Gilat Satellite Networks, Ltd -0a3a PentaMedia Co., Ltd -0a3c NTT DoCoMo, Inc. -0a3d Varo Vision -0a3f Swissonic AG -0a43 Boca Systems, Inc. -0a46 Davicom Semiconductor, Inc. -0a47 Hirose Electric -0a48 I/O Interconnect -0a4a Ploytec GmbH -0a4b Fujitsu Media Devices, Ltd -0a4c Computex Co., Ltd -0a4d Evolution Electronics, Ltd - 008e MK-249C MIDI Keyboard - 00a3 MK-461C MIDI Keyboard -0a4e Steinberg Soft-und Hardware GmbH -0a4f Litton Systems, Inc. -0a50 Mimaki Engineering Co., Ltd -0a51 Sony Electronics, Inc. -0a52 Jebsee Electronics Co., Ltd -0a53 Portable Peripheral Co., Ltd -0a5a Electronics For Imaging, Inc. -0a5b EAsics NV -0a5c Broadcom Corp. - 4502 Keyboard (Boot Interface Subclass) - 5803 BCM5880 Secure Applications Processor with secure keyboard -0a5d Diatrend Corp. -0a5f Zebra -0a62 MPMan -0a66 ClearCube Technology -0a67 Medeli Electronics Co., Ltd -0a68 Comaide Corp. -0a69 Chroma ate, Inc. -0a6b Green House Co., Ltd -0a6c Integrated Circuit Systems, Inc. -0a6d UPS Manufacturing -0a6e Benwin -0a6f Core Technology, Inc. -0a70 International Game Technology -0a71 VIPColor Technologies USA, Inc. -0a72 Sanwa Denshi -0a73 Mackie Designs -0a7d NSTL, Inc. -0a7e Octagon Systems Corp. -0a80 Rexon Technology Corp., Ltd -0a81 Chesen Electronics Corp. - 0101 Keyboard - 0103 Keyboard - 0205 PS/2 Keyboard+Mouse Adapter -0a82 Syscan -0a83 NextComm, Inc. -0a84 Maui Innovative Peripherals -0a85 Idexx Labs -0a86 NITGen Co., Ltd -0a89 Aktiv -0a8d Picturetel -0a8e Japan Aviation Electronics Industry, Ltd -0a90 Candy Technology Co., Ltd -0a91 Globlink Technology, Inc. -0a92 EGO SYStems, Inc. -0a93 C Technologies AB -0a94 Intersense -0aa3 Lava Computer Mfg., Inc. -0aa4 Develco Elektronik -0aa5 First International Digital -0aa6 Perception Digital, Ltd -0aa7 Wincor Nixdorf International GmbH - 0100 POS Keyboard, TA58P-USB - 0101 POS Keyboard, TA85P-USB - 0102 POS Keyboard, TA59-USB - 0103 POS Keyboard, TA60-USB - 0104 SNIkey Keyboard, SNIKey-KB-USB - 0502 Hub SNIKey Keyboard -0aa8 TriGem Computer, Inc. -0aa9 Baromtec Co. -0aaa Japan CBM Corp. -0aab Vision Shape Europe SA -0aac iCompression, Inc. -0aad Rohde & Schwarz GmbH & Co. KG -0aae NEC infrontia Corp. (Nitsuko) -0aaf Digitalway Co., Ltd -0ab0 Arrow Strong Electronics Co., Ltd -0ab1 FEIG ELECTRONIC GmbH -0aba Ellisys -0abe Stereo-Link -0abf Diolan -0ac3 Sanyo Semiconductor Company Micro -0ac4 Leco Corp. -0ac5 I & C Corp. -0ac6 Singing Electrons, Inc. -0ac7 Panwest Corp. -0ac8 Z-Star Microelectronics Corp. -0ac9 Micro Solutions, Inc. -0aca OPEN Networks Ltd -0acc Koga Electronics Co. -0acd ID Tech -0ace ZyDAS -0acf Intoto, Inc. -0ad0 Intellix Corp. -0ad1 Remotec Technology, Ltd -0ad2 Service & Quality Technology Co., Ltd -0ada Data Encryption Systems Ltd. -0ae3 Allion Computer, Inc. -0ae4 Taito Corp. -0ae7 Neodym Systems, Inc. -0ae8 System Support Co., Ltd -0ae9 North Shore Circuit Design L.L.P. -0aea SciEssence, LLC -0aeb TTP Communications, Ltd -0aec Neodio Technologies Corp. -0af0 Option -0af6 Silver I Co., Ltd -0af7 B2C2, Inc. -0af9 Hama, Inc. -0afa DMC Co., Ltd. -0afc Zaptronix Ltd -0afd Tateno Dennou, Inc. -0afe Cummins Engine Co. -0aff Jump Zone Network Products, Inc. -0b00 INGENICO -0b05 ASUSTek Computer, Inc. -0b0b Datamax-O'Neil -0b0c Todos AB -0b0d ProjectLab -0b0e GN Netcom -0b0f AVID Technology -0b10 Pcally -0b11 I Tech Solutions Co., Ltd -0b1e Electronic Warfare Assoc., Inc. (EWA) -0b1f Insyde Software Corp. -0b20 TransDimension, Inc. -0b21 Yokogawa Electric Corp. -0b22 Japan System Development Co., Ltd -0b23 Pan-Asia Electronics Co., Ltd -0b24 Link Evolution Corp. -0b27 Ritek Corp. -0b28 Kenwood Corp. -0b2c Village Center, Inc. -0b30 PNY Technologies, Inc. -0b33 Contour Design, Inc. -0b37 Hitachi ULSI Systems Co., Ltd -0b38 Gear Head - 0003 Keyboard - 0010 107-Key Keyboard -0b39 Omnidirectional Control Technology, Inc. -0b3a IPaxess -0b3b Tekram Technology Co., Ltd -0b3c Olivetti Techcenter -0b3e Kikusui Electronics Corp. -0b41 Hal Corp. -0b43 Play.com, Inc. -0b47 Sportbug.com, Inc. -0b48 TechnoTrend AG -0b49 ASCII Corp. -0b4b Pine Corp. Ltd. -0b4d Graphtec America, Inc. -0b4e Musical Electronics, Ltd -0b50 Dumpries Co., Ltd -0b51 Comfort Keyboard Co. - 0020 Comfort Keyboard -0b52 Colorado MicroDisplay, Inc. -0b54 Sinbon Electronics Co., Ltd -0b56 TYI Systems, Ltd -0b57 Beijing HanwangTechnology Co., Ltd -0b59 Lake Communications, Ltd -0b5a Corel Corp. -0b5f Green Electronics Co., Ltd -0b60 Nsine, Ltd -0b61 NEC Viewtechnology, Ltd -0b62 Orange Micro, Inc. -0b63 ADLink Technology, Inc. -0b64 Wonderful Wire Cable Co., Ltd -0b65 Expert Magnetics Corp. -0b66 Cybiko Inc. -0b67 Fairbanks Scales -0b69 CacheVision -0b6a Maxim Integrated Products -0b6f Nagano Japan Radio Co., Ltd -0b70 PortalPlayer, Inc. -0b71 SHIN-EI Sangyo Co., Ltd -0b72 Embedded Wireless Technology Co., Ltd -0b73 Computone Corp. -0b75 Roland DG Corp. -0b79 Sunrise Telecom, Inc. -0b7a Zeevo, Inc. -0b7b Taiko Denki Co., Ltd -0b7c ITRAN Communications, Ltd -0b7d Astrodesign, Inc. -0b81 id3 Technologies -0b84 Rextron Technology, Inc. -0b85 Elkat Electronics, Sdn., Bhd. -0b86 Exputer Systems, Inc. -0b87 Plus-One I & T, Inc. -0b88 Sigma Koki Co., Ltd, Technology Center -0b89 Advanced Digital Broadcast, Ltd -0b8c SMART Technologies Inc. -0b95 ASIX Electronics Corp. -0b96 Sewon Telecom -0b97 O2 Micro, Inc. -0b98 Playmates Toys, Inc. -0b99 Audio International, Inc. -0b9b Dipl.-Ing. Stefan Kunde -0b9d Softprotec Co. -0b9f Chippo Technologies -0baf U.S. Robotics -0bb0 Concord Camera Corp. -0bb1 Infinilink Corp. -0bb2 Ambit Microsystems Corp. -0bb3 Ofuji Technology -0bb4 HTC (High Tech Computer Corp.) -0bb5 Murata Manufacturing Co., Ltd -0bb6 Network Alchemy -0bb7 Joytech Computer Co., Ltd -0bb8 Hitachi Semiconductor and Devices Sales Co., Ltd -0bb9 Eiger M&C Co., Ltd -0bba ZAccess Systems -0bbb General Meters Corp. -0bbc Assistive Technology, Inc. -0bbd System Connection, Inc. -0bc0 Knilink Technology, Inc. -0bc1 Fuw Yng Electronics Co., Ltd -0bc2 Seagate RSS LLC -0bc3 IPWireless, Inc. -0bc4 Microcube Corp. -0bc5 JCN Co., Ltd -0bc6 ExWAY, Inc. -0bc7 X10 Wireless Technology, Inc. -0bc8 Telmax Communications -0bc9 ECI Telecom, Ltd -0bca Startek Engineering, Inc. -0bcb Perfect Technic Enterprise Co., Ltd -0bd7 Andrew Pargeter & Associates -0bda Realtek Semiconductor Corp. -0bdb Ericsson Business Mobile Networks BV -0bdc Y Media Corp. -0bdd Orange PCS -0be2 Kanda Tsushin Kogyo Co., Ltd -0be3 TOYO Corp. -0be4 Elka International, Ltd -0be5 DOME imaging systems, Inc. -0be6 Dong Guan Humen Wonderful Wire Cable Factory -0bed MEI -0bee LTK Industries, Ltd -0bef Way2Call Communications -0bf0 Pace Micro Technology PLC -0bf1 Intracom S.A. -0bf2 Konexx -0bf6 Addonics Technologies, Inc. -0bf7 Sunny Giken, Inc. -0bf8 Fujitsu Siemens Computers - 100c Keyboard FSC KBPC PX - 1017 Keyboard KB SCR -0bfb Grass Valley Group -0bfd Kvaser AB -0c00 FireFly Mouse Mat -0c04 MOTO Development Group, Inc. -0c05 Appian Graphics -0c06 Hasbro Games, Inc. -0c07 Infinite Data Storage, Ltd -0c08 Agate -0c09 Comjet Information System -0c0a Highpoint Technologies, Inc. -0c0b Dura Micro, Inc. (Acomdata) -0c12 Zeroplus -0c15 Iris Graphics -0c16 Gyration, Inc. -0c17 Cyberboard A/S -0c18 SynerTek Korea, Inc. -0c19 cyberPIXIE, Inc. -0c1a Silicon Motion, Inc. -0c1b MIPS Technologies -0c1c Hang Zhou Silan Electronics Co., Ltd -0c1f Magicard -0c22 Tally Printer Corp. -0c23 Lernout + Hauspie -0c24 Taiyo Yuden -0c25 Sampo Corp. -0c26 Prolific Technology Inc. -0c27 RFIDeas, Inc -0c2e Metrologic Instruments - 0204 Metrologic MS7120 Barcode Scanner (keyboard mode) -0c30 Mutoh Industries Ltd -0c35 Eagletron, Inc. -0c36 E Ink Corp. -0c37 e.Digital -0c38 Der An Electric Wire & Cable Co., Ltd -0c39 IFR -0c3a Furui Precise Component (Kunshan) Co., Ltd -0c3b Komatsu, Ltd -0c3c Radius Co., Ltd -0c3d Innocom, Inc. -0c3e Nextcell, Inc. -0c44 Motorola iDEN -0c45 Microdia - 652f Backlit Gaming Keyboard -0c46 WaveRider Communications, Inc. -0c4a ALGE-TIMING GmbH -0c4b Reiner SCT Kartensysteme GmbH -0c4c Needham's Electronics -0c52 Sealevel Systems, Inc. -0c53 ViewPLUS, Inc. -0c54 Glory, Ltd -0c55 Spectrum Digital, Inc. -0c56 Billion Bright, Ltd -0c57 Imaginative Design Operation Co., Ltd -0c58 Vidar Systems Corp. -0c59 Dong Guan Shinko Wire Co., Ltd -0c5a TRS International Mfg., Inc. -0c5e Xytronix Research & Design -0c60 Apogee Electronics Corp. -0c62 Chant Sincere Co., Ltd -0c63 Toko, Inc. -0c64 Signality System Engineering Co., Ltd -0c65 Eminence Enterprise Co., Ltd -0c66 Rexon Electronics Corp. -0c67 Concept Telecom, Ltd -0c6a ACS -0c6c JETI Technische Instrumente GmbH -0c70 MCT Elektronikladen -0c72 PEAK System -0c74 Optronic Laboratories Inc. -0c76 JMTek, LLC. -0c77 Sipix Group, Ltd -0c78 Detto Corp. -0c79 NuConnex Technologies Pte., Ltd -0c7a Wing-Span Enterprise Co., Ltd -0c86 NDA Technologies, Inc. -0c88 Kyocera Wireless Corp. -0c89 Honda Tsushin Kogyo Co., Ltd -0c8a Pathway Connectivity, Inc. -0c8b Wavefly Corp. -0c8c Coactive Networks -0c8d Tempo -0c8e Cesscom Co., Ltd -0c8f Applied Microsystems -0c94 Cryptera -0c98 Berkshire Products, Inc. -0c99 Innochips Co., Ltd -0c9a Hanwool Robotics Corp. -0c9b Jobin Yvon, Inc. -0c9c Brand Innovators BV -0c9d SemTek -0ca2 Zyfer -0ca3 Sega Corp. -0ca4 ST&T Instrument Corp. -0ca5 BAE Systems Canada, Inc. -0ca6 Castles Technology Co., Ltd -0ca7 Information Systems Laboratories -0caa Allied Telesis KK. -0cad Motorola CGISS -0cae Ascom Business Systems, Ltd -0caf Buslink -0cb0 Flying Pig Systems -0cb1 Innovonics, Inc. -0cb6 Celestix Networks, Pte., Ltd -0cb7 Singatron Enterprise Co., Ltd -0cb8 Opticis Co., Ltd -0cba Trust Electronic (Shanghai) Co., Ltd -0cbb Shanghai Darong Electronics Co., Ltd -0cbc Palmax Technology Co., Ltd -0cbd Pentel Co., Ltd (Electronics Equipment Div.) -0cbe Keryx Technologies, Inc. -0cbf Union Genius Computer Co., Ltd -0cc0 Kuon Yi Industrial Corp. -0cc1 Given Imaging, Ltd -0cc2 Timex Corp. -0cc3 Rimage Corp. -0cc4 emsys GmbH -0cc5 Sendo -0cc6 Intermagic Corp. -0cc8 Technotools Corp. -0cc9 BroadMAX Technologies, Inc. -0cca Amphenol -0ccb SKNet Co., Ltd -0ccc Domex Technology Corp. -0ccd TerraTec Electronic GmbH -0cd4 Bang Olufsen -0cd5 LabJack Corporation -0cd6 Scheidt & Bachmann -0cd7 NewChip S.r.l. -0cd8 JS Digitech, Inc. -0cd9 Hitachi Shin Din Cable, Ltd -0cde Z-Com -0ce5 Validation Technologies International -0ce9 Pico Technology -0cf1 e-Conn Electronic Co., Ltd -0cf2 ENE Technology, Inc. -0cf3 Qualcomm Atheros Communications -0cf4 Fomtex Corp. -0cf5 Cellink Co., Ltd -0cf6 Compucable Corp. -0cf7 ishoni Networks -0cf8 Clarisys, Inc. -0cf9 Central System Research Co., Ltd -0cfa Inviso, Inc. -0cfc Minolta-QMS, Inc. -0cff SAFA MEDIA Co., Ltd. -0d06 telos EDV Systementwicklung GmbH -0d08 UTStarcom -0d0b Contemporary Controls -0d0c Astron Electronics Co., Ltd -0d0d MKNet Corp. -0d0e Hybrid Networks, Inc. -0d0f Feng Shin Cable Co., Ltd -0d10 Elastic Networks -0d11 Maspro Denkoh Corp. -0d12 Hansol Electronics, Inc. -0d13 BMF Corp. -0d14 Array Comm, Inc. -0d15 OnStream b.v. -0d16 Hi-Touch Imaging Technologies Co., Ltd -0d17 NALTEC, Inc. -0d18 coaXmedia -0d19 Hank Connection Industrial Co., Ltd -0d28 NXP -0d2f Andamiro -0d32 Leo Hui Electric Wire & Cable Co., Ltd -0d33 AirSpeak, Inc. -0d34 Rearden Steel Technologies -0d35 Dah Kun Co., Ltd -0d3a Posiflex Technologies, Inc. -0d3c Sri Cable Technology, Ltd -0d3d Tangtop Technology Co., Ltd - 0001 HID Keyboard -0d3e Fitcom, inc. -0d3f MTS Systems Corp. -0d40 Ascor, Inc. -0d41 Ta Yun Terminals Industrial Co., Ltd -0d42 Full Der Co., Ltd -0d46 Kobil Systems GmbH -0d48 Promethean Limited -0d49 Maxtor -0d4a NF Corp. -0d4b Grape Systems, Inc. -0d4c Tedas AG -0d4d Coherent, Inc. -0d4e Agere Systems Netherland BV -0d4f EADS Airbus France -0d50 Cleware GmbH -0d51 Volex (Asia) Pte., Ltd -0d53 HMI Co., Ltd -0d54 Holon Corp. -0d55 ASKA Technologies, Inc. -0d56 AVLAB Technology, Inc. -0d57 Solomon Microtech, Ltd -0d59 TRC Simulators b.v. -0d5c SMC Networks, Inc. -0d5e Myacom, Ltd -0d5f CSI, Inc. -0d60 IVL Technologies, Ltd -0d61 Meilu Electronics (Shenzhen) Co., Ltd -0d62 Darfon Electronics Corp. - 0004 Keyboard - 001b Keyboard - 001c Benq X120 Internet Keyboard Pro - 2021 AM805 Keyboard - 2106 Dell L20U Multimedia Keyboard - 910e HP Business Slim Keyboard -0d63 Fritz Gegauf AG -0d64 DXG Technology Corp. -0d65 KMJP Co., Ltd -0d66 TMT -0d67 Advanet, Inc. -0d68 Super Link Electronics Co., Ltd -0d69 NSI -0d6a Megapower International Corp. -0d6b And-Or Logic -0d70 Try Computer Co., Ltd -0d71 Hirakawa Hewtech Corp. -0d72 Winmate Communication, Inc. -0d73 Hit's Communications, Inc. -0d76 MFP Korea, Inc. -0d77 Power Sentry/Newpoint -0d78 Japan Distributor Corp. -0d7a MARX Datentechnik GmbH -0d7b Wellco Technology Co., Ltd -0d7c Taiwan Line Tek Electronic Co., Ltd -0d7d Phison Electronics Corp. -0d7e American Computer & Digital Components -0d7f Essential Reality LLC -0d80 H.R. Silvine Electronics, Inc. -0d81 TechnoVision -0d83 Think Outside, Inc. -0d87 Dolby Laboratories Inc. -0d89 Oz Software -0d8a King Jim Co., Ltd -0d8b Ascom Telecommunications, Ltd -0d8c C-Media Electronics, Inc. -0d8d Promotion & Display Technology, Ltd -0d8e Global Sun Technology, Inc. -0d8f Pitney Bowes -0d90 Sure-Fire Electrical Corp. -0d96 Skanhex Technology, Inc. -0d97 Santa Barbara Instrument Group -0d98 Mars Semiconductor Corp. -0d99 Trazer Technologies, Inc. -0d9a RTX AS -0d9b Tat Shing Electrical Co. -0d9c Chee Chen Hi-Technology Co., Ltd -0d9d Sanwa Supply, Inc. -0d9e Avaya -0d9f Powercom Co., Ltd -0da0 Danger Research -0da1 Suzhou Peter's Precise Industrial Co., Ltd -0da2 Land Instruments International, Ltd -0da3 Nippon Electro-Sensory Devices Corp. -0da4 Polar Electro Oy -0da7 IOGear, Inc. -0da8 softDSP Co., Ltd -0dab Cubig Group -0dad Westover Scientific -0db0 Micro Star International -0db1 Wen Te Electronics Co., Ltd -0db2 Shian Hwi Plug Parts, Plastic Factory -0db3 Tekram Technology Co., Ltd -0db4 Chung Fu Chen Yeh Enterprise Corp. -0db5 Access IS - 013a Barcode Module - Virtual Keyboard -0db7 ELCON Systemtechnik -0dba Digidesign -0dbc A&D Medical -0dbe Jiuh Shiuh Precision Industry Co., Ltd -0dbf Jess-Link International -0dc0 G7 Solutions (formerly Great Notions) -0dc1 Tamagawa Seiki Co., Ltd -0dc3 Athena Smartcard Solutions, Inc. -0dc4 inXtron, Inc. -0dc5 SDK Co., Ltd -0dc6 Precision Squared Technology Corp. - 2301 Wireless Touchpad Keyboard -0dc7 First Cable Line, Inc. -0dcd NetworkFab Corp. -0dd0 Access Solutions -0dd1 Contek Electronics Co., Ltd -0dd2 Power Quotient International Co., Ltd -0dd3 MediaQ -0dd4 Custom Engineering SPA -0dd5 California Micro Devices -0dd7 Kocom Co., Ltd -0dd8 Netac Technology Co., Ltd -0dd9 HighSpeed Surfing -0dda Integrated Circuit Solution, Inc. -0ddb Tamarack, Inc. -0ddd Datelink Technology Co., Ltd -0dde Ubicom, Inc. -0de0 BD Consumer Healthcare -0de7 USBmicro -0dea UTECH Electronic (D.G.) Co., Ltd. -0ded Novasonics -0dee Lifetime Memory Products -0def Full Rise Electronic Co., Ltd -0df4 NET&SYS -0df6 Sitecom Europe B.V. -0df7 Mobile Action Technology, Inc. -0dfa Toyo Communication Equipment Co., Ltd -0dfc GeneralTouch Technology Co., Ltd -0e03 Nippon Systemware Co., Ltd -0e08 Winbest Technology Co., Ltd -0e0b Amigo Technology Inc. -0e0c Gesytec -0e0d PicoQuant GmbH -0e0f VMware, Inc. - 0006 Virtual Keyboard -0e16 JMTek, LLC -0e17 Walex Electronic, Ltd -0e1a Unisys -0e1b Crewave -0e1e Green Hills Software -0e20 Pegasus Technologies Ltd. -0e21 Cowon Systems, Inc. -0e22 Symbian Ltd. -0e23 Liou Yuane Enterprise Co., Ltd -0e25 VinChip Systems, Inc. -0e26 J-Phone East Co., Ltd -0e30 HeartMath LLC -0e34 Micro Computer Control Corp. -0e35 3Pea Technologies, Inc. -0e36 TiePie engineering -0e38 Stratitec, Inc. -0e39 Smart Modular Technologies, Inc. -0e3a Neostar Technology Co., Ltd -0e3b Mansella, Ltd -0e41 Line6, Inc. -0e44 Sun-Riseful Technology Co., Ltd. -0e48 Julia Corp., Ltd -0e4a Shenzhen Bao Hing Electric Wire & Cable Mfr. Co. -0e4c Radica Games, Ltd -0e50 TechnoData Interware -0e55 Speed Dragon Multimedia, Ltd -0e56 Kingston Technology Company, Inc. -0e5a Active Co., Ltd -0e5b Union Power Information Industrial Co., Ltd -0e5c Bitland Information Technology Co., Ltd -0e5d Neltron Industrial Co., Ltd -0e5e Conwise Technology Co., Ltd. -0e66 Hawking Technologies -0e67 Fossil, Inc. -0e6a Megawin Technology Co., Ltd - 02c0 Defender Gaming Keyboard - 030b Truly Ergonomic Computer Keyboard (Device Firmware Update mode) - 030c Truly Ergonomic Computer Keyboard - 6001 GEMBIRD Flexible keyboard KB-109F-B-DE -0e6f Logic3 -0e70 Tokyo Electronic Industry Co., Ltd -0e72 Hsi-Chin Electronics Co., Ltd -0e75 TVS Electronics, Ltd -0e79 Archos, Inc. -0e7b On-Tech Industry Co., Ltd -0e7e Gmate, Inc. -0e82 Ching Tai Electric Wire & Cable Co., Ltd -0e83 Shin An Wire & Cable Co. -0e8c Well Force Electronic Co., Ltd -0e8d MediaTek Inc. -0e8f GreenAsia Inc. - 0021 Multimedia Keyboard Controller - 0022 multimedia keyboard controller -0e90 WiebeTech, LLC -0e91 VTech Engineering Canada, Ltd -0e92 C's Glory Enterprise Co., Ltd -0e93 eM Technics Co., Ltd -0e95 Future Technology Co., Ltd -0e96 Aplux Communications, Ltd -0e97 Fingerworks, Inc. - 0908 Composite HID (Keyboard and Mouse) -0e98 Advanced Analogic Technologies, Inc. -0e99 Parallel Dice Co., Ltd -0e9a TA HSING Industries, Ltd -0e9b ADTEC Corp. -0e9c Streamzap, Inc. -0e9f Tamura Corp. -0ea0 Ours Technology, Inc. -0ea6 Nihon Computer Co., Ltd -0ea7 MSL Enterprises Corp. -0ea8 CenDyne, Inc. -0ead Humax Co., Ltd -0eb0 NovaTech -0eb1 WIS Technologies, Inc. -0eb2 Y-S Electronic Co., Ltd -0eb3 Saint Technology Corp. -0eb7 Endor AG -0eb8 Mettler Toledo -0ebb Thermo Fisher Scientific -0ebe VWeb Corp. -0ebf Omega Technology of Taiwan, Inc. -0ec0 LHI Technology (China) Co., Ltd -0ec1 Abit Computer Corp. -0ec2 Sweetray Industrial, Ltd -0ec3 Axell Co., Ltd -0ec4 Ballracing Developments, Ltd -0ec5 GT Information System Co., Ltd -0ec6 InnoVISION Multimedia, Ltd -0ec7 Theta Link Corp. -0ecd Lite-On IT Corp. -0ece TaiSol Electronics Co., Ltd -0ecf Phogenix Imaging, LLC -0ed1 WinMaxGroup -0ed2 Kyoto Micro Computer Co., Ltd -0ed3 Wing-Tech Enterprise Co., Ltd -0ed5 Fiberbyte -0eda Noriake Itron Corp. -0edf e-MDT Co., Ltd -0ee0 Shima Seiki Mfg., Ltd -0ee1 Sarotech Co., Ltd -0ee2 AMI Semiconductor, Inc. -0ee3 ComTrue Technology Corp. -0ee4 Sunrich Technology, Ltd -0eee Digital Stream Technology, Inc. -0eef D-WAV Scientific Co., Ltd -0ef0 Hitachi Cable, Ltd -0ef1 Aichi Micro Intelligent Corp. -0ef2 I/O Magic Corp. -0ef3 Lynn Products, Inc. -0ef4 DSI Datotech -0ef5 PointChips -0ef6 Yield Microelectronics Corp. -0ef7 SM Tech Co., Ltd (Tulip) -0efd Oasis Semiconductor -0efe Wem Technology, Inc. -0f03 Unitek UPS Systems -0f06 Visual Frontier Enterprise Co., Ltd -0f08 CSL Wire & Plug (Shen Zhen) Co. -0f0c CAS Corp. -0f0d Hori Co., Ltd -0f0e Energy Full Corp. -0f0f Silego Technology Inc -0f11 LD Didactic GmbH -0f12 Mars Engineering Corp. -0f13 Acetek Technology Co., Ltd -0f14 Ingenico -0f18 Finger Lakes Instrumentation -0f19 Oracom Co., Ltd -0f1b Onset Computer Corp. -0f1c Funai Electric Co., Ltd -0f1d Iwill Corp. -0f21 IOI Technology Corp. -0f22 Senior Industries, Inc. -0f23 Leader Tech Manufacturer Co., Ltd -0f24 Flex-P Industries, Snd., Bhd. -0f2d ViPower, Inc. -0f2e Geniality Maple Technology Co., Ltd -0f2f Priva Design Services -0f30 Jess Technology Co., Ltd -0f31 Chrysalis Development -0f32 YFC-BonEagle Electric Co., Ltd -0f37 Kokuyo Co., Ltd -0f38 Nien-Yi Industrial Corp. -0f39 TG3 Electronics - 0404 Recreated ZX Spectrum Keyboard - 0876 Keyboard [87 Francium Pro] - 1086 DK2108SZ Keyboard [Ducky Zero] -0f3d Airprime, Incorporated -0f41 RDC Semiconductor Co., Ltd -0f42 Nital Consulting Services, Inc. -0f44 Polhemus -0f49 Evolis SA -0f4b St. John Technology Co., Ltd -0f4c WorldWide Cable Opto Corp. -0f4d Microtune, Inc. -0f4e Freedom Scientific -0f52 Wing Key Electrical Co., Ltd -0f53 Dongguan White Horse Cable Factory, Ltd -0f54 Kawai Musical Instruments Mfg. Co., Ltd -0f55 AmbiCom, Inc. -0f5c Prairiecomm, Inc. -0f5d NewAge International, LLC -0f5f Key Technology Corp. -0f60 NTK, Ltd -0f61 Varian, Inc. -0f62 Acrox Technologies Co., Ltd -0f63 LeapFrog Enterprises -0f68 Kobe Steel, Ltd -0f69 Dionex Corp. -0f6a Vibren Technologies, Inc. -0f6e INTELLIGENT SYSTEMS -0f73 DFI -0f78 Guntermann & Drunck GmbH -0f7c DQ Technology, Inc. -0f7d NetBotz, Inc. -0f7e Fluke Corp. -0f88 VTech Holdings, Ltd -0f8b Yazaki Corp. -0f8c Young Generation International Corp. -0f8d Uniwill Computer Corp. -0f8e Kingnet Technology Co., Ltd -0f8f Soma Networks -0f97 CviLux Corp. -0f98 CyberBank Corp. -0f9c Hyun Won, Inc. -0f9e Lucent Technologies -0fa3 Starconn Electronic Co., Ltd -0fa4 ATL Technology -0fa5 Sotec Co., Ltd -0fa7 Epox Computer Co., Ltd -0fa8 Logic Controls, Inc. -0faf Winpoint Electronic Corp. -0fb0 Haurtian Wire & Cable Co., Ltd -0fb1 Inclose Design, Inc. -0fb2 Juan-Chern Industrial Co., Ltd -0fb6 Heber Ltd -0fb8 Wistron Corp. -0fb9 AACom Corp. -0fba San Shing Electronics Co., Ltd -0fbb Bitwise Systems, Inc. -0fc1 Mitac Internatinal Corp. -0fc2 Plug and Jack Industrial, Inc. -0fc5 Delcom Engineering -0fc6 Dataplus Supplies, Inc. -0fca Research In Motion, Ltd. -0fce Sony Ericsson Mobile Communications AB -0fcf Dynastream Innovations, Inc. -0fd0 Tulip Computers B.V. -0fd1 Giant Electronics Ltd. -0fd2 Seac Banche -0fd4 Tenovis GmbH & Co., KG -0fd5 Direct Access Technology, Inc. -0fd9 Elgato Systems GmbH -0fda Quantec Networks GmbH -0fdc Micro Plus -0fde Oregon Scientific -0fe0 Osterhout Design Group -0fe2 Air Techniques -0fe4 IN-Tech Electronics, Ltd -0fe5 Greenconn (U.S.A.), Inc. -0fe6 ICS Advent -0fe9 DVICO -0fea United Computer Accessories -0feb CRS Electronic Co., Ltd -0fec UMC Electronics Co., Ltd -0fed Access Co., Ltd -0fee Xsido Corp. -0fef MJ Research, Inc. -0ff6 Core Valley Co., Ltd -0ff7 CHI SHING Computer Accessories Co., Ltd -0ffc Clavia DMI AB -0ffd EarlySense -0fff Aopen, Inc. -1000 Speed Tech Corp. -1001 Ritronics Components (S) Pte., Ltd -1003 Sigma Corp. -1004 LG Electronics, Inc. -1005 Apacer Technology, Inc. -1006 iRiver, Ltd. -1009 Emuzed, Inc. -100a AV Chaseway, Ltd -100b Chou Chin Industrial Co., Ltd -100d Netopia, Inc. -1010 Fukuda Denshi Co., Ltd -1011 Mobile Media Tech. -1012 SDKM Fibres, Wires & Cables Berhad -1013 TST-Touchless Sensor Technology AG -1014 Densitron Technologies PLC -1015 Softronics Pty., Ltd -1016 Xiamen Hung's Enterprise Co., Ltd -1017 Speedy Industrial Supplies, Pte., Ltd -1019 Elitegroup Computer Systems (ECS) -1020 Labtec - 0006 Wireless Keyboard - 0106 Wireless Optical Mouse/Keyboard -1022 Shinko Shoji Co., Ltd -1025 Hyper-Paltek -1026 Newly Corp. -1027 Time Domain -1028 Inovys Corp. -1029 Atlantic Coast Telesys -102a Ramos Technology Co., Ltd -102b Infotronic America, Inc. -102c Etoms Electronics Corp. -102d Winic Corp. -1031 Comax Technology, Inc. -1032 C-One Technology Corp. -1033 Nucam Corp. -1038 SteelSeries ApS -1039 devolo AG -103a PSA -103d Stanton -1043 iCreate Technologies Corp. -1044 Chu Yuen Enterprise Co., Ltd -1046 Winbond Electronics Corp. [hex] -1048 Targus Group International -104b Mylex / Buslogic -104c AMCO TEC International, Inc. -104d Newport Corporation -104f WB Electronics -1050 Yubico.com -1053 Immanuel Electronics Co., Ltd -1054 BMS International Beheer N.V. -1055 Complex Micro Interconnection Co., Ltd -1056 Hsin Chen Ent Co., Ltd -1057 ON Semiconductor -1058 Western Digital Technologies, Inc. -1059 Giesecke & Devrient GmbH -105b Foxconn International, Inc. -105c Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd -105d Delkin Devices, Inc. -105e Valence Semiconductor Design, Ltd -105f Chin Shong Enterprise Co., Ltd -1060 Easthome Industrial Co., Ltd -1063 Motorola Electronics Taiwan, Ltd [hex] -1065 CCYU Technology -1068 Micropi Elettronica -106a Loyal Legend, Ltd -106c Curitel Communications, Inc. -106d San Chieh Manufacturing, Ltd -106e ConectL -106f Money Controls -1076 GCT Semiconductor, Inc. -107b Gateway, Inc. -107d Arlec Australia, Ltd -107e Midoriya Electric Co., Ltd -107f KidzMouse, Inc. -1082 Shin-Etsukaken Co., Ltd -1083 Canon Electronics, Inc. -1084 Pantech Co., Ltd -108a Chloride Power Protection -108b Grand-tek Technology Co., Ltd - 0005 HID Keyboard/Mouse PS/2 Translator -108c Robert Bosch GmbH -108e Lotes Co., Ltd. -1091 Numerik Jena -1099 Surface Optics Corp. -109a DATASOFT Systems GmbH -109b Hisense -109f eSOL Co., Ltd -10a0 Hirotech, Inc. -10a3 Mitsubishi Materials Corp. -10a9 SK Teletech Co., Ltd -10aa Cables To Go -10ab USI Co., Ltd -10ac Honeywell, Inc. -10ae Princeton Technology Corp. -10af Liebert Corp. -10b5 Comodo (PLX?) -10b8 DiBcom -10bb TM Technology, Inc. -10bc Dinging Technology Co., Ltd -10bd TMT Technology, Inc. -10bf SmartHome -10c3 Universal Laser Systems, Inc. -10c4 Silicon Labs -10c5 Sanei Electric, Inc. -10c6 Intec, Inc. -10cb Eratech -10cc GBM Connector Co., Ltd -10cd Kycon, Inc. -10ce Silicon Labs -10cf Velleman Components, Inc. -10d1 Hottinger Baldwin Measurement -10d2 RayComposer - R. Adams -10d4 Man Boon Manufactory, Ltd -10d5 Uni Class Technology Co., Ltd - 5552 KVM Human Interface Composite Device (Keyboard/Mouse ports) -10d6 Actions Semiconductor Co., Ltd -10de Authenex, Inc. -10df In-Win Development, Inc. -10e0 Post-Op Video, Inc. -10e1 CablePlus, Ltd -10e2 Nada Electronics, Ltd -10ec Vast Technologies, Inc. -10f0 Nexio Co., Ltd -10f1 Importek -10f5 Turtle Beach -10f8 Cesys GmbH -10fb Pictos Technologies, Inc. -10fd Anubis Electronics, Ltd -10fe Thrane & Thrane -1100 VirTouch, Ltd -1101 EasyPass Industrial Co., Ltd -1108 Brightcom Technologies, Ltd -110a Moxa Technologies Co., Ltd. -1110 Analog Devices Canada, Ltd (Allied Telesyn) -1111 Pandora International Ltd. -1112 YM ELECTRIC CO., Ltd -1113 Medion AG -111e VSO Electric Co., Ltd -112a RedRat -112e Master Hill Electric Wire and Cable Co., Ltd -112f Cellon International, Inc. -1130 Tenx Technology, Inc. -1131 Integrated System Solution Corp. -1132 Toshiba Corp., Digital Media Equipment [hex] -1136 CTS Electronincs -113c Arin Tech Co., Ltd -113d Mapower Electronics Co., Ltd -113f Integrated Biometrics, LLC -1141 V One Multimedia, Pte., Ltd -1142 CyberScan Technologies, Inc. -1145 Japan Radio Company -1146 Shimane SANYO Electric Co., Ltd. -1147 Ever Great Electric Wire and Cable Co., Ltd -114b Sphairon Access Systems GmbH -114c Tinius Olsen Testing Machine Co., Inc. -114d Alpha Imaging Technology Corp. -114f Wavecom -115b Salix Technology Co., Ltd. -1162 Secugen Corp. -1163 DeLorme Publishing, Inc. -1164 YUAN High-Tech Development Co., Ltd -1165 Telson Electronics Co., Ltd -1166 Bantam Interactive Technologies -1167 Salient Systems Corp. -1168 BizConn International Corp. -116e Gigastorage Corp. -116f Silicon 10 Technology Corp. -1175 Shengyih Steel Mold Co., Ltd -117d Santa Electronic, Inc. -117e JNC, Inc. -1182 Venture Corp., Ltd -1183 Compaq Computer Corp. [hex] (Digital Dream ??) -1184 Kyocera Elco Corp. -1188 Bloomberg L.P. -1189 Acer Communications & Multimedia -118f You Yang Technology Co., Ltd -1190 Tripace -1191 Loyalty Founder Enterprise Co., Ltd -1196 Yankee Robotics, LLC -1197 Technoimagia Co., Ltd -1198 StarShine Technology Corp. -1199 Sierra Wireless, Inc. -119a ZHAN QI Technology Co., Ltd -119b ruwido austria GmbH - 0400 Infrared Keyboard V2.01 -11a0 Chipcon AS -11a3 Technovas Co., Ltd -11aa GlobalMedia Group, LLC -11ab Exito Electronics Co., Ltd -11ac Nike -11b0 ATECH FLASH TECHNOLOGY -11be R&D International NV -11c0 Betop -11c5 Inmax -11c9 Nacon -11ca VeriFone Inc -11db Topfield Co., Ltd. -11e6 K.I. Technology Co. Ltd. -11f5 Siemens AG -11f6 Prolific -11f7 Alcatel (?) -1203 TSC Auto ID Technology Co., Ltd -1209 Generic - 0cbd Andrzej Szombierski kuku.eu.org keyboard - 2201 Dygma Shortcut Keyboard - 2300 Keyboardio Model 01 Bootloader - 2301 Keyboardio Model 01 - 2328 K.T.E.C. Keyboard Device - 345c kinX Keyboard Controller - a1e5 Atreus Keyboards Atreus Keyboard - bb00 keyplus split keyboard firmware - bb02 keyplus nRF24 wireless keyboard dongle -120e Hudson Soft Co., Ltd -120f Magellan -1210 DigiTech -121e Jungsoft Co., Ltd -121f Panini S.p.A. -1220 TC Electronic -1221 Unknown manufacturer -1222 TiPro - faca programmable keyboard -1223 SKYCABLE ENTERPRISE. CO., LTD. -1228 Datapaq Limited -1230 Chipidea-Microelectronica, S.A. -1233 Denver Electronics -1234 Brain Actuated Technologies -1235 Focusrite-Novation - 0012 Nocturn Keyboard -1241 Belkin - 0504 Wireless Trackball Keyboard - 1503 Keyboard - 1603 Keyboard - f767 Keyboard -1243 Holtek Semiconductor, Inc. - e000 Unique NFC/RFID reader (keyboard emulation) -124a AirVast -124b Nyko (Honey Bee) -124c MXI - Memory Experts International, Inc. -125c Apogee Inc. -125d JMicron -125f A-DATA Technology Co., Ltd. -1260 Standard Microsystems Corp. -1264 Covidien Energy-based Devices -1266 Pirelli Broadband Solutions -1267 Logic3 / SpectraVideo plc - 0103 G-720 Keyboard -126c Aristocrat Technologies -126d Bel Stewart -126e Strobe Data, Inc. -126f TwinMOS -1274 Ensoniq -1275 Xaxero Marine Software Engineering, Ltd. -1278 Starlight Xpress -1283 zebris Medical GmbH -1286 Marvell Semiconductor, Inc. -1291 Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc. -1292 Innomedia -1293 Belkin Components [hex] - 2101 104-key keyboard -1294 RISO KAGAKU CORP. -1297 DekTec -129b CyberTAN Technology -12a7 Trendchip Technologies Corp. -12ab Honey Bee Electronic International Ltd. -12b8 Zhejiang Xinya Electronic Technology Co., Ltd. -12b9 E28 -12ba Licensed by Sony Computer Entertainment America -12bd Gembird -12c4 Autocue Group Ltd -12cf DEXIN -12d1 Huawei Technologies Co., Ltd. -12d2 LINE TECH INDUSTRIAL CO., LTD. -12d3 LINAK -12d6 EMS Dr. Thomas Wuensche -12d7 BETTER WIRE FACTORY CO., LTD. -12d8 Araneus Information Systems Oy -12e6 Waldorf Music GmbH -12ef Tapwave, Inc. -12f2 ViewPlus Technologies, Inc. -12f5 Dynamic System Electronics Corp. -12f7 Memorex Products, Inc. -12fd AIN Comm. Technology Co., Ltd -12ff Fascinating Electronics, Inc. -1306 FM20 Barcode Scanner -1307 Transcend Information, Inc. -1308 Shuttle, Inc. -1310 Roper -1312 ICS Electronics -1313 ThorLabs -131d Natural Point -1325 ams AG -132a Envara Inc. -132b Konica Minolta -133e Kemper Digital GmbH -1342 Mobility - 0201 EasiDock 200 Keyboard and Mouse Port -1343 Citizen Systems -1345 Sino Lite Technology Corp. -1347 Moravian Instruments -1348 Katsuragawa Electric Co., Ltd. -134c PanJit International Inc. -134e Digby's Bitpile, Inc. DBA D Bit -1357 P&E Microcomputer Systems -135e Insta GmbH -135f Control Development Inc. -1366 SEGGER -136b STEC -136e Andor Technology Ltd. -1370 Swissbit -1371 CNet Technology Inc. -1376 Vimtron Electronics Co., Ltd. -1377 Sennheiser electronic GmbH & Co. KG -137b SCAPS GmbH -137c YASKAWA ELECTRIC CORP. -1385 Netgear, Inc -138a Validity Sensors, Inc. -138e Jungo LTD -1390 TOMTOM B.V. -1391 IdealTEK, Inc. -1395 Sennheiser Communications -1397 BEHRINGER International GmbH -1398 Q-tec -13ad Baltech -13b0 PerkinElmer Optoelectronics -13b1 Linksys -13b2 Alesis -13b3 Nippon Dics Co., Ltd. -13ba PCPlay - 0017 PS/2 Keyboard+Mouse Adapter -13be Ricoh Printing Systems, Ltd. -13ca JyeTai Precision Industrial Co., Ltd. -13cf Wisair Ltd. -13d0 Techsan Electronics Co., Ltd. -13d1 A-Max Technology Macao Commercial Offshore Co. Ltd. -13d2 Shark Multimedia -13d3 IMC Networks -13d7 Guidance Software, Inc. -13dc ALEREON, INC. -13dd i.Tech Dynamic Limited -13e1 Kaibo Wire & Cable (Shenzhen) Co., Ltd. -13e5 Rane -13e6 TechnoScope Co., Ltd. -13ea Hengstler -13ec Zydacron -13ee MosArt -13fd Initio Corporation -13fe Kingston Technology Company Inc. -1400 Axxion Group Corp. -1402 Bowe Bell & Howell -1403 Sitronix -1404 Fundamental Software, Inc. -1409 IDS Imaging Development Systems GmbH -140e Telechips, Inc. -1410 Novatel Wireless -1415 Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc. -1419 ABILITY ENTERPRISE CO., LTD. -1421 Sensor Technology -1424 Posnet Polska S.A. -1429 Vega Technologies Industrial (Austria) Co. -142a Thales E-Transactions -142b Arbiter Systems, Inc. -1430 RedOctane -1431 Pertech Resources, Inc. -1435 Wistron NeWeb -1436 Denali Software, Inc. -143c Altek Corporation -1443 Digilent -1446 X.J.GROUP -1451 Force Dimension -1452 Dai Nippon Printing, Inc -1453 Radio Shack -1456 Extending Wire & Cable Co., Ltd. -1457 First International Computer, Inc. -145f Trust - 0176 Isla Keyboard - 01e5 Keyboard [GXT 830] -1460 Tatung Co. -1461 Staccato Communications -1462 Micro Star International -146b BigBen Interactive -1472 Huawei-3Com -147a Formosa Industrial Computing, Inc. -147e Upek -147f Hama GmbH & Co., KG -1482 Vaillant -1484 Elsa AG [hex] -1485 Silicom -1487 DSP Group, Ltd. -148e EVATRONIX SA -148f Ralink Technology, Corp. -1491 Futronic Technology Co. Ltd. -1493 Suunto -1497 Panstrong Company Ltd. -1498 Microtek International Inc. -149a Imagination Technologies -14aa WideView Technology Inc. -14ad CTK Corporation -14ae Printronix Inc. -14af ATP Electronics Inc. -14b0 StarTech.com Ltd. -14b2 Ralink Technology, Corp. -14c0 Rockwell Automation, Inc. -14c2 Gemlight Computer, Ltd -14c8 Zytronic -14cd Super Top -14d8 JAMER INDUSTRIES CO., LTD. -14dd Raritan Computer, Inc. -14e0 WiNRADiO Communications -14e1 Dialogue Technology Corp. -14e5 SAIN Information & Communications Co., Ltd. -14ea Planex Communications -14ed Shure Inc. -14f7 TechniSat Digital GmbH -1500 Ellisys -1501 Pine-Tum Enterprise Co., Ltd. -1504 Bixolon CO LTD -1509 First International Computer, Inc. -1513 medMobile -1514 Actel -1516 CompUSA -1518 Cheshire Engineering Corp. -1519 Comneon -151f Opal Kelly Incorporated -1520 Bitwire Corp. -1524 ENE Technology Inc -1527 Silicon Portals -1529 UBIQUAM Co., Ltd. -152a Thesycon Systemsoftware & Consulting GmbH -152b MIR Srl -152d JMicron Technology Corp. / JMicron USA Technology Corp. -152e LG (HLDS) -1532 Razer USA, Ltd - 0023 Gaming Keyboard [TRON] - 002b Gaming Keyboard [Star Wars: The Old Republic] - 004a RZ03-0133 Gaming Lapboard, Keyboard Mouse Combo, Dongle [Turret Dongle] - 0102 Tarantula Keyboard - 0103 Gaming Keyboard [Reclusa] - 0105 Gaming Keyboard [ProType] - 0106 Gaming Keyboard [ProType] - 0109 Lycosa Keyboard - 010b Gaming Keyboard [Arctosa] - 0118 RZ03-0080, Gaming Keyboard [Deathstalker Essential] - 0119 Gaming Keyboard [Lycosa] - 011e Gaming Keyboard Dock [Edge Keyboard Dock] - 0200 Gaming Keyboard [Reclusa] - 020d Cynosa Pro keyboard (Cynosa Pro Bundle) - 021b Gaming Keyboard [BlackWidow X Tournament Edition] - 0221 RZ03-0203 Gaming Keyboard [BlackWidow Chroma V2] - 023f RZ03-0274 Gaming Keyboard [Cynosa Lite] - 0904 R201-0282 Gaming Keyboard, Mouse Combination [Turret For Xbox One] -153b TerraTec Electronic GmbH -1546 U-Blox AG -1547 SG Intec Ltd & Co KG -154a Celectronic GmbH -154b PNY -154d ConnectCounty Holdings Berhad -154e D&M Holdings, Inc. (Denon/Marantz) -154f SNBC CO., Ltd -1554 Prolink Microsystems Corp. -1557 OQO -1568 Sunf Pu Technology Co., Ltd -156f Quantum Corporation -1570 ALLTOP TECHNOLOGY CO., LTD. -157b Ketron SRL -157e TRENDnet -1582 Fiberline -1587 SMA Technologie AG -158d Oakley Inc. -158e JDS Uniphase Corporation (JDSU) -1598 Kunshan Guoji Electronics Co., Ltd. -15a2 Freescale Semiconductor, Inc. -15a4 Afatech Technologies, Inc. -15a8 Teams Power Limited -15a9 Gemtek -15aa Gearway Electronics (Dong Guan) Co., Ltd. -15ad VMware Inc. -15ba Olimex Ltd. - 003c TERES Keyboard+Touchpad -15c0 XL Imaging -15c2 SoundGraph Inc. -15c5 Advance Multimedia Internet Technology Inc. (AMIT) -15c6 Laboratoires MXM -15c8 KTF Technologies -15c9 D-Box Technologies -15ca Textech International Ltd. -15d5 Coulomb Electronics Ltd. -15d9 Trust International B.V. -15dc Hynix Semiconductor Inc. -15e0 Seong Ji Industrial Co., Ltd. -15e1 RSA -15e4 Numark -15e8 SohoWare -15e9 Pacific Digital Corp. -15ec Belcarra Technologies Corp. -15f4 HanfTek -1604 Tascam -1605 ACCES I/O Products, Inc. -1606 Umax -1608 Inside Out Networks [hex] -160a VIA Technologies, Inc. -160e INRO -1614 Amoi Electronics -1617 Sony Corp. -1619 L & K Precision Technology Co., Ltd. -161c Digitech Systems -1621 Wionics Research -1628 Stonestreet One, Inc. -162a Airgo Networks Inc. -162f WiQuest Communications, Inc. -1630 2Wire, Inc. -1631 Good Way Technology -1633 AIM GmbH -1645 Entrega [hex] -1649 SofTec Microsystems -164a ChipX -164c Matrix Vision GmbH -1657 Struck Innovative Systeme GmbH -165b Frontier Design Group -165c Kondo Kagaku -1660 Creatix Polymedia GmbH -1667 GIGA-TMS INC. - 0005 PCR330A RFID Reader (125 kHz, keyboard emulation) -1668 Actiontec Electronics, Inc. [hex] -1669 PiKRON Ltd. [hex] -166a Clipsal -1677 China Huada Integrated Circuit Design (Group) Co., Ltd. (CIDC Group) -1679 Total Phase -167b Pure Digital Technologies, Inc. -1680 Golden Bridge Electech Inc. -1681 Prevo Technologies, Inc. -1682 Maxwise Production Enterprise Ltd. -1684 Godspeed Computer Corp. -1685 Delock -1686 ZOOM Corporation -1687 Kingmax Digital Inc. -1688 Saab AB -1689 Razer USA, Ltd -168c Atheros Communications -1690 Askey Computer Corp. [hex] -1696 Hitachi Video and Information System, Inc. -1697 VTec Test, Inc. -16a5 Shenzhen Zhengerya Cable Co., Ltd. -16a6 Unigraf -16ab Global Sun Technology -16ac Dongguan ChingLung Wire & Cable Co., Ltd. -16b4 iStation -16b5 Persentec, Inc. -16c0 Van Ooijen Technische Informatica - 047c Teensy Keyboard - 047d Teensy Keyboard+Debug - 0482 Teensyduino Keyboard+Mouse+Joystick - 0487 Teensyduino Serial+Keyboard+Mouse+Joystick - 05df HID device except mice, keyboards, and joysticks - 27d9 HID device except mice, keyboards, and joysticks - 27db Keyboard -16ca Wireless Cables, Inc. -16cc silex technology, Inc. -16d0 MCS -16d1 Suprema Inc. -16d3 Frontline Test Equipment, Inc. -16d5 AnyDATA Corporation -16d6 JABLOCOM s.r.o. -16d8 CMOTECH Co., Ltd. -16dc Wiener, Plein & Baus -16de Telemecanique -16df King Billion Electronics Co., Ltd. -16f0 GN ReSound A/S -16f5 Futurelogic Inc. -1702 FDI-MATELEC -1706 BlueView Technologies, Inc. -1707 ARTIMI -170b Swissonic -170d Avnera -1711 Leica Microsystems -1724 Meyer Instruments (MIS) -1725 Vitesse Semiconductor -1726 Axesstel, Inc. -172f Waltop International Corp. -1733 Cellink Technology Co., Ltd -1736 CANON IMAGING SYSTEM TECHNOLOGIES INC. -1737 802.11g Adapter [Linksys WUSB54GC v3] -173a Roche -173d QSENN - 0002 GP-K7000 keyboard -1740 Senao -1743 General Atomics -1748 MQP Electronics -174c ASMedia Technology Inc. -174f Syntek -1753 GERTEC Telecomunicacoes Ltda. -1756 ENENSYS Technologies -1759 LucidPort Technology, Inc. -1761 ASUSTek Computer, Inc. (wrong ID) -1770 MSI - ff00 steel series rgb keyboard -1772 System Level Solutions, Inc. -1776 Arowana -1777 Microscan Systems, Inc. -177f Sweex -1781 Multiple Vendors -1782 Spreadtrum Communications Inc. -1784 TopSeed Technology Corp. -1787 ATI AIB -1788 ShenZhen Litkconn Technology Co., Ltd. -178e ASUSTek Computer, Inc. (wrong ID) -1796 Printrex, Inc. -1797 JALCO CO., LTD. -1799 Thales Norway A/S -179d Ricavision International, Inc. -17a0 Samson Technologies Corp. -17a4 Concept2 -17a5 Advanced Connection Technology Inc. -17a7 MICOMSOFT CO., LTD. -17a8 Kamstrup A/S -17b3 Grey Innovation -17b5 Lunatone -17ba SAURIS GmbH -17c3 Singim International Corp. -17cc Native Instruments -17cf Hip Hing Cable & Plug Mfy. Ltd. -17d0 Sanford L.P. -17d3 Korea Techtron Co., Ltd. -17e9 DisplayLink -17eb Cornice, Inc. -17ef Lenovo - 6007 Smartcard Keyboard - 6009 ThinkPad Keyboard with TrackPoint - 6014 Mini Wireless Keyboard N5901 - 6022 Ultraslim Plus Wireless Keyboard and Mouse - 602d Black Silk Keyboard - 6032 Wireless Dongle for Keyboard and Mouse - 6047 ThinkPad Compact Keyboard with TrackPoint - 609b Professional Wireless Keyboard and Mouse Combo - 609c Professional Wireless Keyboard - b000 Virtual Keyboard and Mouse - b003 Virtual Keyboard and Mouse / Mass Storage -17f4 WaveSense -17f5 K.K. Rocky -17f6 Unicomp, Inc. - 0709 Model M Keyboard - 0822 Ruffian 6 Keyboard v3 [Model M] -1809 Advantech -1822 Twinhan -1831 Gwo Jinn Industries Co., Ltd. -1832 Huizhou Shenghua Industrial Co., Ltd. -183d VIVOphone -1843 Vaisala -1849 ASRock Incorporation -184f K2L GmbH -1852 GYROCOM C&C Co., LTD -1854 Memory Devices Ltd. -185b Compro -1861 Tech Technology Industrial Company -1862 Teridian Semiconductor Corp. -1870 Nexio Co., Ltd -1871 Aveo Technology Corp. -1873 Navilock -187c Alienware Corporation -187f Siano Mobile Silicon -1892 Vast Technologies, Inc. -1894 Topseed -1897 Evertop Wire Cable Co. -189f 3Shape A/S -18a4 CSSN -18a5 Verbatim, Ltd -18b1 Petalynx -18b4 e3C Technologies -18b6 Mikkon Technology Limited -18b7 Zotek Electronic Co., Ltd. -18c5 AMIT Technology, Inc. -18cd Ecamm -18d1 Google Inc. -18d5 Starline International Group Limited -18d9 Kaba -18dc LKC Technologies, Inc. -18dd Planon System Solutions Inc. -18e3 Fitipower Integrated Technology Inc -18e8 Qcom -18ea Matrox Graphics, Inc. -18ec Arkmicro Technologies Inc. -18ef ELV Elektronik AG -18f8 [Maxxter] -18fb Scriptel Corporation -18fd FineArch Inc. -1901 GE Healthcare -1908 GEMBIRD -190d Motorola GSG -1914 Alco Digital Devices Limited -1915 Nordic Semiconductor ASA -191c Innovative Technology LTD -1923 FitLinxx -1926 NextWindow -1928 Proceq SA -192f Avago Technologies, Pte. -1930 Shenzhen Xianhe Technology Co., Ltd. -1931 Ningbo Broad Telecommunication Co., Ltd. -1934 Feature Integration Technology Inc. (Fintek) -1935 Elektron Music Machines -1938 Meinberg Funkuhren GmbH & Co. KG -1941 Dream Link -1943 Sensoray Co., Inc. -1949 Lab126, Inc. -194f PreSonus Audio Electronics, Inc. -1951 Hyperstone AG -1953 Ironkey Inc. -1954 Radiient Technologies -195d Itron Technology iONE - 7777 Scorpius wireless keyboard -1965 Uniden Corporation -1967 CASIO HITACHI Mobile Communications Co., Ltd. -196b Wispro Technology Inc. -1970 Dane-Elec Corp. USA -1975 Dongguan Guneetal Wire & Cable Co., Ltd. -1976 Chipsbrand Microelectronics (HK) Co., Ltd. -1977 T-Logic -197d Leuze electronic -1989 Nuconn Technology Corp. -198f Beceem Communications Inc. -1990 Acron Precision Industrial Co., Ltd. -1995 Trillium Technology Pty. Ltd. -1996 PixeLINK -199b MicroStrain, Inc. -199e The Imaging Source Europe GmbH -199f Benica Corporation -19a8 Biforst Technology Inc. -19ab Bodelin -19af S Life -19b2 Batronix -19b4 Celestron -19b5 B & W Group -19b6 Infotech Logistic, LLC -19b9 Data Robotics -19c2 Futuba -19ca Mindtribe -19cf Parrot SA -19d2 ZTE WCDMA Technologies MSM -19db KFI Printers -19e1 WeiDuan Electronic Accessory (S.Z.) Co., Ltd. -19e8 Industrial Technology Research Institute -19ef Pak Heng Technology (Shenzhen) Co., Ltd. -19f7 RODE Microphones -19fa Gampaq Co.Ltd -19ff Dynex -1a08 Bellwood International, Inc. -1a0a USB-IF non-workshop -1a12 KES Co., Ltd. -1a1d Veho -1a25 Amphenol East Asia Ltd. -1a2a Seagate Branded Solutions -1a2c China Resource Semico Co., Ltd - 0021 Keyboard - 0024 Multimedia Keyboard -1a32 Quanta Microsystems, Inc. -1a34 ACRUX -1a36 Biwin Technology Ltd. -1a40 Terminus Technology Inc. -1a41 Action Electronics Co., Ltd. -1a44 VASCO Data Security International -1a4a Silicon Image -1a4b SafeBoot International B.V. -1a5a Tandberg Data -1a61 Abbott Diabetes Care -1a6a Spansion Inc. -1a6d SamYoung Electronics Co., Ltd -1a6e Global Unichip Corp. -1a6f Sagem Orga GmbH -1a72 Physik Instrumente -1a79 Bayer Health Care LLC -1a7b Lumberg Connect GmbH & Co. KG -1a7c Evoluent -1a81 Holtek Semiconductor, Inc. -1a86 QinHeng Electronics -1a89 Dynalith Systems Co., Ltd. -1a8b SGS Taiwan Ltd. -1a8d BandRich, Inc. -1a98 Leica Camera AG -1aa4 Data Drive Thru, Inc. -1aa5 UBeacon Technologies, Inc. -1aa6 eFortune Technology Corp. -1aad KeeTouch -1ab1 Rigol Technologies -1acb Salcomp Plc -1acc Midiplus Co, Ltd. -1ad1 Desay Wire Co., Ltd. -1ad4 APS -1adb SEL C662 Serial Cable -1ae4 ic-design Reinhard Gottinger GmbH -1ae7 X-TENSIONS -1aed High Top Precision Electronic Co., Ltd. -1aef Conntech Electronic (Suzhou) Corporation -1af1 Connect One Ltd. -1afe A. Eberle GmbH & Co. KG -1b04 Meilhaus Electronic GmbH -1b0e BLUTRONICS S.r.l. -1b1c Corsair - 0a60 Vengeance K60 Keyboard - 1b04 Raptor K50 Keyboard - 1b07 Vengeance K65 Gaming Keyboard - 1b08 Vengeance K95 Keyboard - 1b09 Vengeance K70R keyboard - 1b11 K95 RGB Mechanical Gaming Keyboard - 1b13 Vengeance K70RGB keyboard -1b1f eQ-3 Entwicklung GmbH -1b20 MStar Semiconductor, Inc. -1b22 WiLinx Corp. -1b26 Cellex Power Products, Inc. -1b27 Current Electronics Inc. -1b28 NAVIsis Inc. -1b32 Ugobe Life Forms, Inc. -1b36 ViXS Systems, Inc. -1b3b iPassion Technology Inc. -1b3f Generalplus Technology Inc. -1b47 Energizer Holdings, Inc. -1b48 Plastron Precision Co., Ltd. -1b52 ARH Inc. -1b59 K.S. Terminals Inc. -1b5a Chao Zhou Kai Yuan Electric Co., Ltd. -1b65 The Hong Kong Standards and Testing Centre Ltd. -1b71 Fushicai -1b72 ATERGI TECHNOLOGY CO., LTD. -1b73 Fresco Logic -1b75 Ovislink Corp. -1b76 Legend Silicon Corp. -1b80 Afatech -1b86 Dongguan Guanshang Electronics Co., Ltd. -1b88 ShenMing Electron (Dong Guan) Co., Ltd. -1b8c Altium Limited -1b8d e-MOVE Technology Co., Ltd. -1b8e Amlogic, Inc. -1b8f MA LABS, Inc. -1b96 N-Trig -1b98 YMax Communications Corp. -1b99 Shenzhen Yuanchuan Electronic -1ba1 JINQ CHERN ENTERPRISE CO., LTD. -1ba2 Lite Metals & Plastic (Shenzhen) Co., Ltd. -1ba4 Ember Corporation -1ba6 Abilis Systems -1ba8 China Telecommunication Technology Labs -1bad Harmonix Music -1bae Vuzix Corporation -1bbb T & A Mobile Phones -1bc4 Ford Motor Co. -1bc5 AVIXE Technology (China) Ltd. -1bc7 Telit Wireless Solutions -1bce Contac Cable Industrial Limited -1bcf Sunplus Innovation Technology Inc. - 05c5 SPRF2413A [2.4GHz Wireless Keyboard/Mouse Receiver] - 05cf Micro keyboard & mouse receiver -1bd0 Hangzhou Riyue Electronic Co., Ltd. -1bd5 BG Systems, Inc. -1bde P-TWO INDUSTRIES, INC. -1bef Shenzhen Tongyuan Network-Communication Cables Co., Ltd -1bf0 RealVision Inc. -1bf5 Extranet Systems Inc. -1bf6 Orient Semiconductor Electronics, Ltd. -1bfd TouchPack -1c02 Kreton Corporation -1c04 QNAP System Inc. -1c0c Ionics EMS, Inc. -1c0d Relm Wireless -1c10 Lanterra Industrial Co., Ltd. -1c13 ALECTRONIC LIMITED -1c1a Datel Electronics Ltd. -1c1b Volkswagen of America, Inc. -1c1f Goldvish S.A. -1c20 Fuji Electric Device Technology Co., Ltd. -1c21 ADDMM LLC -1c22 ZHONGSHAN CHIANG YU ELECTRIC CO., LTD. -1c26 Shanghai Haiying Electronics Co., Ltd. -1c27 HuiYang D & S Cable Co., Ltd. -1c29 Elster GmbH -1c31 LS Cable Ltd. -1c34 SpringCard -1c37 Authorizer Technologies, Inc. -1c3d NONIN MEDICAL INC. -1c3e Wep Peripherals -1c40 EZPrototypes -1c49 Cherng Weei Technology Corp. -1c4f SiGma Micro - 0002 Keyboard TRACER Gamma Ivory - 000e Genius KB-120 Keyboard - 0026 Keyboard -1c6b Philips & Lite-ON Digital Solutions Corporation -1c6c Skydigital Inc. -1c73 AMT -1c77 Kaetat Industrial Co., Ltd. -1c78 Datascope Corp. -1c79 Unigen Corporation -1c7a LighTuning Technology Inc. -1c7b LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD. -1c83 Schomaecker GmbH -1c87 2N TELEKOMUNIKACE a.s. -1c88 Somagic, Inc. -1c89 HONGKONG WEIDIDA ELECTRON LIMITED -1c8e ASTRON INTERNATIONAL CORP. -1c98 ALPINE ELECTRONICS, INC. -1c9e OMEGA TECHNOLOGY -1ca0 ACCARIO Inc. -1ca1 Symwave -1cac Kinstone -1cb3 Aces Electronic Co., Ltd. -1cb4 OPEX CORPORATION -1cb6 IdeaCom Technology Inc. -1cbe Luminary Micro Inc. -1cbf FORTAT SKYMARK INDUSTRIAL COMPANY -1cc0 PlantSense -1cca NextWave Broadband Inc. -1ccd Bodatong Technology (Shenzhen) Co., Ltd. -1cd4 adp corporation -1cd5 Firecomms Ltd. -1cd6 Antonio Precise Products Manufactory Ltd. -1cde Telecommunications Technology Association (TTA) -1cdf WonTen Technology Co., Ltd. -1ce0 EDIMAX TECHNOLOGY CO., LTD. -1ce1 Amphenol KAE -1cf1 Dresden Elektronik -1cfc ANDES TECHNOLOGY CORPORATION -1cfd Flextronics Digital Design Japan, LTD. -1d03 iCON -1d07 Solid-Motion -1d08 NINGBO HENTEK DRAGON ELECTRONICS CO., LTD. -1d09 TechFaith Wireless Technology Limited -1d0a Johnson Controls, Inc. The Automotive Business Unit -1d0b HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD. -1d0f Sonix Technology Co., Ltd. -1d14 ALPHA-SAT TECHNOLOGY LIMITED -1d17 C-Thru Music Ltd. - 0001 AXiS-49 Harmonic Table MIDI Keyboard -1d19 Dexatek Technology Ltd. -1d1f Diostech Co., Ltd. -1d20 SAMTACK INC. -1d27 ASUS -1d34 Dream Cheeky -1d45 Touch -1d4d PEGATRON CORPORATION -1d50 OpenMoko, Inc. - 6027 Key64 Keyboard - 6028 Teensy 2.0 Development Board [ErgoDox Keyboard] - 6033 frobiac / adnw keyboard - 609c antiAFK keyboard - 60a3 keyboard (bootloader) - 60e8 Alpen Clack keyboard - 60e9 keyman64 keyboard itercepter -1d57 Xenta - 0005 Wireless Receiver (Keyboard and Mouse) - 32da 2.4GHz Receiver (Keyboard and Mouse) - ac01 Wireless Receiver (Keyboard and Mouse) -1d5b Smartronix, Inc. -1d5c Fresco Logic -1d6b Linux Foundation -1d90 Citizen -1d9d Sigma Sport -1de1 Actions Microelectronics Co. -1e0e Qualcomm / Option -1e10 Point Grey Research, Inc. -1e17 Mirion Technologies Dosimetry Services Division -1e1d Kanguru Solutions -1e1f INVIA -1e29 Festo AG & Co. KG -1e3d Chipsbank Microelectronics Co., Ltd -1e41 Cleverscope -1e4e Cubeternet -1e54 TypeMatrix - 2030 2030 USB Keyboard -1e68 TrekStor GmbH & Co. KG -1e71 NZXT -1e74 Coby Electronics Corporation -1e7d ROCCAT - 30d4 Arvo Keyboard -1ea7 SHARKOON Technologies GmbH - 0066 [Mediatrack Edge Mini Keyboard] - 2007 SHARK ZONE K30 Illuminated Gaming Keyboard -1ebb NuCORE Technology, Inc. -1eda AirTies Wireless Networks -1edb Blackmagic design -1ee8 ONDA COMMUNICATION S.p.a. -1ef6 EADS Deutschland GmbH -1f28 Cal-Comp -1f3a Onda (unverified) -1f44 The Neat Company -1f48 H-TRONIC GmbH -1f4d G-Tek Electronics Group -1f6f Aliph -1f75 Innostor Technology Corporation -1f82 TANDBERG -1f84 Alere, Inc. -1f87 Stantum -1f9b Ubiquiti Networks, Inc. -1fab Samsung Opto-Electroncs Co., Ltd. -1fbd Delphin Technology AG -1fc9 NXP Semiconductors -1fde ILX Lightwave Corporation -1fe7 Vertex Wireless Co., Ltd. -1ff7 CVT Electronics.Co.,Ltd -1fff Ideofy Inc. -2001 D-Link Corp. -2002 DAP Technologies -2003 detectomat -200c Reloop -2013 PCTV Systems -2019 PLANEX -203d Encore Electronics Inc. -2040 Hauppauge -2047 Texas Instruments -2058 Nano River Technology -2077 Taicang T&W Electronics Co. Ltd -2080 Barnes & Noble -2086 SIMPASS -2087 Cando -20a0 Clay Logic -20b1 XMOS Ltd -20b3 Hanvon -20b7 Qi Hardware -20ce Minicircuits -20df Simtec Electronics -20f1 NET New Electronic Technology GmbH -20f4 TRENDnet -20f7 XIMEA -2100 RT Systems -2101 ActionStar -2109 VIA Labs, Inc. -2113 Softkinetic -2149 Advanced Silicon S.A. -2162 Creative (?) -2184 GW Instek -21a1 Emotiv Systems Pty. Ltd. -21d6 Agecodagis SARL -2207 Fuzhou Rockchip Electronics Company -2222 MacAlly - 0004 iWebKey Keyboard -2227 SAMWOO Enterprise -2232 Silicon Motion -2233 RadioShack Corporation -2237 Kobo Inc. -224f APDM -225d Morpho -228d 8D Technologies inc. -22a6 Pie Digital, Inc. -22b8 Motorola PCS -22b9 eTurboTouch Technology, Inc. -22ba Technology Innovation Holdings, Ltd -22c9 StepOver GmbH -22cd Kinova Robotics Inc. -22e0 secunet Security Networks AG -2304 Pinnacle Systems, Inc. -2318 Shining Technologies, Inc. [hex] -2341 Arduino SA -2357 TP-Link -2373 Pumatronix Ltda -2375 Digit@lway, Inc. -2406 SANHO Digital Electronics Co., Ltd. -2443 Aessent Technology Ltd -2478 Tripp-Lite -248a Maxxter -249c M2Tech s.r.l. -24e1 Paratronic -2516 Cooler Master Co., Ltd. - 0004 Storm QuickFire Rapid Mechanical Keyboard - 0020 QuickFire Rapid-i Keyboard -2548 Pulse-Eight -25b5 FlatFrog -2632 TwinMOS -2639 Xsens -2650 Electronics For Imaging, Inc. [hex] -2659 Sundtek -2676 Basler AG -2717 Xiaomi Inc. -2730 Citizen -2735 DigitalWay -273f Hughski Limited -2770 NHJ, Ltd -27b8 ThingM -27c6 Shenzhen Goodix Technology Co.,Ltd. -2821 ASUSTek Computer Inc. -2899 Toptronic Industrial Co., Ltd -289b Dracal/Raphnet technologies - 000a Dreamcast (Keyboard mode) - 000b Gamecube/N64 controller v2.9 (Keyboard mode) -28de Valve Software -2931 Jolla Oy -2939 Zaber Technologies Inc. -2a03 dog hunter AG -2a37 RTD Embedded Technologies, Inc. -2a45 Meizu Corp. -2ac7 Ultrahaptics Ltd. -2b24 KeepKey LLC -2c02 Planex Communications -2c1a Dolphin Peripherals -2c23 Supermicro Computer Incorporated -2c7c Quectel Wireless Solutions Co., Ltd. -2cdc Sea & Sun Technology GmbH -2dcf Dialog Semiconductor -2fb2 Fujitsu, Ltd -3016 Boundary Devices, LLC -30a4 Blues Wireless -30c2 UNPARALLEL Innovation, Lda -30c9 Luxvisions Innotech Limited -30ee Fujitsu Connected Technologies Limited -3125 Eagletron -3136 Navini Networks -3176 Whanam Electronics Co., Ltd -3195 Link Instruments -3275 VidzMedia Pte Ltd -3333 InLine -3334 AEI -3340 Yakumo -3344 Leaguer Microelectronics (LME) -3504 Micro Star -3538 Power Quotient International Co., Ltd -3579 DIVA -357d Sharkoon -3636 InVibro -3838 WEM -3923 National Instruments Corp. -40bb I-O Data -4101 i-rocks -4102 iRiver, Ltd. -413c Dell Computer Corp. - 0000 DRAC 5 Virtual Keyboard and Mouse - 1001 Keyboard Hub - 1002 Keyboard Hub - 1003 Keyboard Hub - 1005 Multimedia Pro Keyboard Hub - 2001 Keyboard HID Support - 2002 SK-8125 Keyboard - 2003 Keyboard - 2005 RT7D50 Keyboard - 2010 Keyboard - 2011 Multimedia Pro Keyboard - 2100 SK-3106 Keyboard - 2101 SmartCard Reader Keyboard - 2105 Model L100 Keyboard - 2106 Dell QuietKey Keyboard - 8157 Integrated Keyboard - 8161 Integrated Keyboard -4146 USBest Technology -4168 Targus -4242 USB Design by Example -4255 GoPro -4317 Broadcom Corp. -4348 WinChipHead -4572 Shuttle, Inc. -4586 Panram -4670 EMS Production -4752 Miditech -4757 GW Instek -4766 Aceeca -4855 Memorex -4971 SimpleTech -4d46 Musical Fidelity -5032 Grandtec -5041 Linksys (?) -50c2 Averatec (?) -5173 Sweex -5219 I-Tetra -5345 Owon -534c SatoshiLabs -5354 Meyer Instruments (MIS) -544d Transmeta Corp. -5543 UC-Logic Technology Corp. -5555 Epiphan Systems Inc. -55aa OnSpec Electronic, Inc. -5654 Gotview -5656 Uni-Trend Group Limited -595a IRTOUCHSYSTEMS Co. Ltd. -5986 Acer, Inc -59e3 Nonolith Labs -5a57 Zinwell -6000 Beholder International Ltd. -601a Ingenic Semiconductor Ltd. -6189 Sitecom -6244 LightingSoft AG -6253 TwinHan Technology Co., Ltd -636c CoreLogic, Inc. -6472 Unknown (Sony?) -6547 Arkmicro Technologies Inc. -6615 IRTOUCHSYSTEMS Co. Ltd. -6666 Prototype product Vendor ID -6677 WiseGroup, Ltd. -6891 3Com -695c Opera1 -6993 Yealink Network Technology Co., Ltd. -6a75 Shanghai Jujo Electronics Co., Ltd -7104 CME (Central Music Co.) - 2202 UF5/UF6/UF7/UF8 MIDI Master Keyboard -726c StackFoundry LLC -734c TBS Technologies China -7373 Beijing STONE Technology Co. Ltd. -7392 Edimax Technology Co., Ltd -8086 Intel Corp. - 0dad Cherry MiniatureCard Keyboard -8087 Intel Corp. -80ee VirtualBox -8282 Keio -8341 EGO Systems, Inc. -8564 Transcend Information, Inc. -8644 Intenso GmbG -8e06 CH Products, Inc. -9016 Sitecom -9022 TeVii Technology Ltd. -9148 GeoLab, Ltd -9710 MosChip Semiconductor -9849 Bestmedia CD Recordable GmbH & Co. KG -9999 Odeon -99fa Grandtec -9ac4 J. Westhues -9e88 Marvell Semiconductor, Inc. - 01 Keyboard - 01 Keyboard - 006 Keyboard -HUT 07 Keyboard - 001 Keyboard ErrorRollOver - 002 Keyboard POSTfail - 003 Keyboard Error Undefined - 032 # and ~ (Hash and Tilde, Non-US Keyboard near right shift) - 064 \ and | (Backslash and Bar, UK and Non-US Keyboard near left shift) - 065 Keyboard Application (Windows Key for Win95 or Compose) \ No newline at end of file diff --git a/kinto_old/system-config/keyswap.service b/kinto_old/system-config/keyswap.service deleted file mode 100644 index 38a1fce..0000000 --- a/kinto_old/system-config/keyswap.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=keyswap for Terminal and GUI -PartOf=graphical-session.target - -[Service] -Type=simple -Restart=always -# eg DISPLAY=:0.0 -#Environment=DISPLAY={displayid} -RestartSec=1 -WorkingDirectory={homedir}/.config/kinto -ExecStart=/bin/bash -c "{homedir}/.config/kinto/xactive.sh carrots" -ExecStop=/bin/bash {homedir}/.config/kinto/cleanup.sh - -[Install] -WantedBy=default.target diff --git a/kinto_old/system-config/keyswap.timer b/kinto_old/system-config/keyswap.timer deleted file mode 100644 index e2232c1..0000000 --- a/kinto_old/system-config/keyswap.timer +++ /dev/null @@ -1,11 +0,0 @@ -# keyswap.timer -[Unit] -Description=Runs the keyswap.service 5 seconds after boot up - -[Timer] -#OnBootSec=5s -OnActiveSec=5s -Unit=keyswap.service - -[Install] -WantedBy=default.target diff --git a/kinto_old/system-config/keyswap_toggle.sh b/kinto_old/system-config/keyswap_toggle.sh deleted file mode 100644 index 4e2bb8a..0000000 --- a/kinto_old/system-config/keyswap_toggle.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -# Manual keyswap -systemtype=$1 -internalid=$2 -usbid=$3 -swapbehavior=$4 - -swapcmd_term="setxkbmap -option;setxkbmap -option altwin:swap_alt_win" -fallbackcmd_gui="" -if [[ "$systemtype" == "windows" || "$systemtype" == "mac" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" -elif [[ "$systemtype" == "mac_only" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" -# Chromebook keyboard options -elif [[ "$swapbehavior" == "both_mac" ]]; then - swapcmd_gui="setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" - swapcmd_term="setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" -elif [[ "$swapbehavior" == "both_win" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win" - fallbackcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" -elif [[ "$swapbehavior" == "none" ]]; then - swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" -fi - -if [[ "$systemtype" == "mac_only" ]]; then - check=`setxkbmap -query | grep -c 'alt_super_win'` -elif [[ "$swapbehavior" == "both_win" ]]; then - check=`setxkbmap -query | grep -q 'ctrl_alt_win'; echo $?` -else - check=`setxkbmap -query | grep -c 'swap_alt_win'` -fi - -echo $check -if [ $check -eq 0 ]; then - echo "internal gui to term" - eval "$swapcmd_term" -else - echo "internal term to gui" - eval "$swapcmd_gui" -fi \ No newline at end of file diff --git a/kinto_old/system-config/kinto.desktop b/kinto_old/system-config/kinto.desktop deleted file mode 100644 index 9bb45fb..0000000 --- a/kinto_old/system-config/kinto.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Kinto -GenericName=Kinto -Comment=Make Linux Type Like it's a Mac -Exec=/bin/bash -c "/bin/sleep 5 && /usr/bin/systemctl --user start keyswap" -Terminal=false -Type=Application -X-GNOME-Autostart-enabled=true \ No newline at end of file diff --git a/kinto_old/system-config/xactive.sh b/kinto_old/system-config/xactive.sh deleted file mode 100644 index bf6de8f..0000000 --- a/kinto_old/system-config/xactive.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -if [ $# -eq 0 ] - then - # No arguments - ./kintox11 -else - ./caret_status.sh & - ./kintox11 -fi diff --git a/kinto_old/user_config.json b/kinto_old/user_config.json deleted file mode 100644 index 2727077..0000000 --- a/kinto_old/user_config.json +++ /dev/null @@ -1,76 +0,0 @@ -{"config":[{ - "name":"gui", - "run":"", - "run_onInput":"", - "run_offInput": "killall xbindkeys > /dev/null 2>&1", - "symbols":"", - "types":"", - "de":[], - "appnames":[ "" ] - }, - { - "name":"term", - "run":"", - "run_onInput":"", - "run_offInput": "killall xbindkeys > /dev/null 2>&1", - "symbols":"", - "types":"", - "de":[], - "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty","alacritty","mate-terminal","tilix","xfce4-terminal" ] - }, - { - "name": "firefox", - "run": "", - "run_onInput": "pkill -f ~/.config/kinto/.firefox-nw", - "run_offInput": "xbindkeys -f $HOME/.config/kinto/.firefox-nw", - "symbols": "", - "types": "", - "de": [], - "appnames": [ "Firefox" ] - }, - { - "name": "chrome", - "run": "", - "run_onInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", - "run_offInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui.chrome $DISPLAY", - "symbols": "", - "types": "", - "de": [], - "appnames": [ "Chromium","Chromium-browser","Google-chrome","Epiphany" ] - }], - "init": [], - "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], - "de":[{ - "id": 1, - "type": ["gnome3"], - "active": false, - "intent":"init", - "name":"gnome-init", - "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", - "run":"gsettings set org.gnome.mutter overlay-key ''", - "run_term":"", - "run_gui":"" - }, - { - "id": 2, - "type": ["gnome3"], - "active": false, - "intent":"gui_term", - "name":"Gnome Activities Overview", - "description":"Cmd+Space activates Activities Overview", - "run":"", - "run_term":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"", - "run_gui":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" - }, - { - "id": 3, - "type": ["kde5"], - "active": false, - "intent":"init", - "name":"kde-init", - "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", - "run":"kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure", - "run_term":"", - "run_gui":"" - }] -} diff --git a/kinto_old/xkeysnail_service.sh b/kinto_old/xkeysnail_service.sh deleted file mode 100755 index f002ce1..0000000 --- a/kinto_old/xkeysnail_service.sh +++ /dev/null @@ -1,508 +0,0 @@ -#!/bin/bash - -# set about:config?filter=ui.key.menuAccessKeyFocuses -# to false for wordwise to work in Firefox - -typeset -l distro -distro=$(awk -F= '$1=="NAME" { print $2 ;}' /etc/os-release) -typeset -l dename -dename=$(./system-config/dename.sh | cut -d " " -f1) - -function uninstall { - - while true; do - read -rep $'\nPress R to restore your original shortcuts.\nPress F to reset to factory shortcuts. (f/r)\n' yn - case $yn in - [Ff]* ) yn="f"; break;; - [Rr]* ) yn="r";break;; - * ) echo "Please answer yes or no.";; - esac - done - - if [ "$yn" == "f" ];then - echo "Reset to factory shortcuts" - if [ "$dename" == "gnome" ];then - echo "Resetting DE hotkeys..." - echo "gsettings reset-recursively org.gnome.desktop.wm.keybindings" - gsettings reset-recursively org.gnome.desktop.wm.keybindings - echo "gsettings reset-recursively org.gnome.mutter.keybindings" - gsettings reset-recursively org.gnome.mutter.keybindings - echo "gsettings set org.gnome.mutter overlay-key 'super'" - gsettings set org.gnome.mutter overlay-key 'super' - dconf dump /org/gnome/mutter/ > mutter.conf - dconf load /org/gnome/mutter/ < mutter.conf - elif [ "$dename" == "kde" ];then - echo "Resetting DE hotkeys..." - mv ~/.config/kwinrc ~/.config/kwinrc.kinto - mv ~/.config/kglobalshortcutsrc ~/.config/kglobalshortcutsrc.kinto - elif [ "$dename" == "xfce" ];then - echo "Resetting DE hotkeys..." - cp /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml - fi - elif [ "$yn" == "r" ]; then - echo "Restore original user shortcuts" - if [ "$dename" == "gnome" ]; then - echo "Restoring DE hotkeys..." - wmkeys=$(ls | grep -m1 "keybinding") - mutterkeys=$(ls | grep -m1 "mutter_") - if [[ ${#wmkeys} > 0 ]]; then - echo "dconf load /org/gnome/desktop/wm/keybindings/ < $wmkeys" - dconf load /org/gnome/desktop/wm/keybindings/ < "$wmkeys" - else - echo "Gnome Desktop keybindings backup not found..." - fi - if [[ ${#mutterkeys} > 0 ]]; then - echo "dconf load /org/gnome/mutter/keybindings/ < $mutterkeys" - dconf load /org/gnome/mutter/keybindings/ <"$mutterkeys" - fi - if [[ ${#wmkeys} > 0 ]] || [[ ${#mutterkeys} > 0 ]]; then - echo "Gnome hotkeys have been successfully restored." - fi - elif [ "$dename" == "kde" ]; then - echo "Restoring DE hotkeys..." - kwinkeys=$(ls | grep -m1 "kwinrc") - kdekeys=$(ls | grep -m1 "kglobalshortcutsrc") - cp ./"$kdekeys" ~/.config/kglobalshortcutsrc - cp ./"$kwinkeys" ~/.config/kwinrc - elif [ "$dename" == "xfce" ]; then - echo "Restoring DE hotkeys..." - xfcekeys=$(ls | grep -m1 "xfce4-keyboard") - cp ./"$xfcekeys" ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml - fi - fi -} - -function removeAppleKB { - # Undo Apple keyboard cmd & alt swap - if test -f "/sys/module/hid_apple/parameters/swap_opt_cmd" && [ `cat /sys/module/hid_apple/parameters/swap_opt_cmd` == "1" ]; then - echo '0' | sudo tee /sys/module/hid_apple/parameters/swap_opt_cmd - echo 'options hid_apple swap_opt_cmd=0' | sudo tee /etc/modprobe.d/hid_apple.conf - sudo update-initramfs -u -k all - fi - if test -f "/sys/module/applespi/parameters/swap_opt_cmd" && [ `cat /sys/module/applespi/parameters/swap_opt_cmd` == "1" ]; then - echo '0' | sudo tee /sys/module/applespi/parameters/swap_opt_cmd - echo 'options applespi swap_opt_cmd=0' | sudo tee /etc/modprobe.d/applespi.conf - sudo update-initramfs -u -k all - fi -} - -function trayApp { - if [ -f /usr/bin/budgie-desktop ];then - while true; do - read -rep $'Would you like to install the Kinto Budgie Applet? (y/n)\n(You will need log off & back on and go to Budgie Desktop Settings & add Kinto to your top panel.)\n' yn - case $yn in - [Yy]* ) yn="y"; break;; - [Nn]* ) yn="n";break;; - * ) echo "Please answer yes or no.";; - esac - done - if [ "$yn" == "y" ]; then - cd ./xkeysnail-config/trayapps/BudgieApplet/ - sudo ./install-applet.sh - cd ../../../ - echo "Please logoff and back on for the Applet to be available for the top panel." - sudo /usr/local/bin/logoff.sh $USER $DISPLAY& - fi - else - while true; do - read -rep $'Would you like to install the Kinto Gnome/XFCE System Tray? (y/n)\n' yn - case $yn in - [Yy]* ) yn="y"; break;; - [Nn]* ) yn="n";break;; - * ) echo "Please answer yes or no.";; - esac - done - if [ "$yn" == "y" ]; then - echo "Kinto Gnome/XFCE System Tray Installed." - fi - fi -} - -function budgieUninstall { - if [ -f /usr/bin/budgie-desktop ];then - read -n 1 -s -r -p "Your system may log you off immediately during the restoration of budgie-daemon. Press any key to continue..." - bdmd5="$(md5sum /usr/bin/budgie-daemon | awk '{ print $1 }')" - oldbdmd5=$(md5sum ./budgie-daemon_10.5.1.bak | awk '{ print $1 }') - if [ "$bdmd5" != "$oldbdmd5" ]; then - echo -e "\nReplacing budgie-daemon with backup..." - sudo pkill budgie-daemon && sudo cp ./budgie-daemon_10.5.1.bak /usr/bin/budgie-daemon - else - echo -e "\nBudgie-daemon is already an original." - fi - fi -} - -function budgieUpdate { - # Check for budgie and install App Switching hack - if [ -f /usr/bin/budgie-desktop ];then - while true; do - read -rep $'Would you like to update Budgie to support proper App Switching? (y/n)\n(Your system may immediately log you out after this runs.)\n' yn - case $yn in - [Yy]* ) yn="y"; break;; - [Nn]* ) yn="n";break;; - * ) echo "Please answer yes or no.";; - esac - done - if [ "$yn" == "y" ]; then - budgieVersion="$(/usr/bin/budgie-desktop --version | awk '{ print $2; }' | head -n1)" - if [ "$budgieVersion" == "10.5.1" ]; then - if ! [ -f ./system-config/budgie-daemon_10.5.1 ]; then - wget https://github.com/rbreaves/budgie-desktop/blob/binaries/binaries/budgie-daemon_10.5.1?raw=true -O ./system-config/budgie-daemon_10.5.1 - fi - bdmd5=$(md5sum /usr/bin/budgie-daemon | awk '{ print $1 }') - newbdmd5=$(md5sum ./system-config/budgie-daemon_10.5.1 | awk '{ print $1 }') - if [ "$bdmd5" != "$newbdmd5" ]; then - cp /usr/bin/budgie-daemon ./budgie-daemon_"$budgieVersion".bak - sudo pkill budgie-daemon && sudo cp ./system-config/budgie-daemon_10.5.1 /usr/bin/budgie-daemon - echo "Updated Budgie to use App Switching Patch" - else - echo "Budgie-daemon already patched, skipping replacement." - fi - else - echo "Your Budgie version was $budgieVersion and the patch is for 10.5.1." - while true; do - read -rep $'Would you like to replace it any ways? (y/n)\n(A backup will be made)\n' yn - case $yn in - [Yy]* ) yn="y"; break;; - [Nn]* ) yn="n";break;; - * ) echo "Please answer yes or no.";; - esac - done - if [ "$yn" == "y" ]; then - if ! [ -f ./system-config/budgie-daemon_10.5.1 ]; then - wget https://github.com/rbreaves/budgie-desktop/raw/43d3b44243b0bcaee3262a79818024a651475b58/binaries/budgie-daemon_10.5.1 -O ./system-config/budgie-daemon_10.5.1 - fi - cp /usr/bin/budgie-daemon ./budgie-daemon_"$budgieVersion".bak - sudo pkill budgie-daemon && sudo cp ./system-config/budgie-daemon_10.5.1 /usr/bin/budgie-daemon - echo "Updated Budgie to use App Switching Patch" - fi - fi - fi - fi -} - -if [ $# -eq 0 ]; then - echo "Install Kinto - xkeysnail (udev)" - echo " 1) Windows & Mac (HID driver) - Most Standard keyboards (& 1st party usb/bt Apple keyboards)" - echo " 2) Mac Only & VMs on Macbooks - 3rd & 1st party Apple keyboards" - echo " 3) Chromebook - Chromebook running Linux" - echo " 4) IBM M - Keyboards w/o Super/Win keys" - # echo " 5) Uninstall" - - read n - - set "$n" -fi - -# Kinto tray -installtray=false -# multi-language -rightalt=false -# VS code remap -vssublime=false - -if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "4" || $1 == "winmac" || $1 == "mac" || $1 == "chromebook" || $1 == "ibm" ]]; then - if [[ $dename == "gnome" || $dename == "budgie" || $dename == "mate" || $dename == "xfce" ]];then - installtray=true - while true; do - read -rep $'\nWould you like to install the Kinto System Tray (AppInidcator)? (Y/n)\n' yn - case $yn in - [Nn]* ) installtray=false; break;; - * ) break;; - esac - done - if [[ $dename == "gnome" ]]; then - echo "Please install KStatusNotifierItem for AppIndicators to show up." - echo "https://extensions.gnome.org/extension/615/appindicator-support/" - echo "Note: This may still fail. If so use the Kinto gui app instead." - read -p "Press enter to continue" - fi - fi - - while true; do - read -rep $'\nDo you want multi-language on Right Alt key? (y/N)\naka Left side remaps, right side doesn\'t\n' yn - case $yn in - [Yy]* ) rightalt=true; break;; - * ) break;; - esac - done - while true; do - read -rep $'\nWould you like to give VS Code Sublime Text keymaps? (y/N)\n' yn - case $yn in - [Yy]* ) vssublime=true; break;; - * ) break;; - esac - done - # branch=$(git rev-parse --abbrev-ref HEAD) - # if [ "$branch" == "dev" ] || [ "$branch" == "alpha" ];then - # while true; do - # read -rep $'\nExperimental Support for Firefox/Chrome Back/Forward hotkeys (Cmd+Left/Right)?\n(Keys could get stuck, switch windows or press ctrl &/or super to release) (y/n)\n' yn - # case $yn in - # [Yy]* ) exp='/sbin/runuser -l {username} -c "export DISPLAY={displayid};{homedir}/.config/kinto/caret_status_xkey.sh\&";'; expsh='"{homedir}/.config/kinto/caret_status_xkey.sh"'; break;; - # [Nn]* ) exp=" "; expsh=" " break;; - # # * ) echo "Please answer yes or no.";; - # esac - # done - # else - # echo -e "\nSupport for Firefox/Chrome Back/Forward hotkeys (Cmd+Left/Right) disabled on $branch w/ xkeysnail \n" - exp=" " - expsh=" " - # fi - sudo systemctl enable xkeysnail >/dev/null 2>&1 - # if ! [ -x "$(command -v inotifywait)" ]; then - # echo "Will need to install inotify-tools to restart key remapper live for config file changes..." - # sudo ./system-config/unipkg.sh inotify-tools - # fi - if ! [ -x "$(command -v pip3)" ]; then - echo "Will need to install python3-pip..." - sudo ./system-config/unipkg.sh python3-pip - fi - if ! [ -x "$(command -v python3-config)" ]; then - if [ "$distro" == "ubuntu" ] || [ "$distro" == "debian" ] || [ "$distro" == '"linux mint"' ]; then - pydev="python3-dev" - elif [ "$distro" == "fedora" ]; then - pydev="python3-devel" - fi - if [ "$distro" == "gnome" ] || [ "$distro" == "fedora" ] || [ "$distro" == "debian" ] || [ "$distro" == '"linux mint"' ]; then - echo "Will need to install $pydev..." - sudo ./system-config/unipkg.sh "$pydev" - fi - fi - if ! [ -x "$(command -v xhost)" ] || ! [ -x "$(command -v gcc)" ]; then - if [ "$distro" == "\"manjaro linux\"" ]; then - sudo ./system-config/unipkg.sh "xorg-xhost gcc" - fi - fi - if [ "$distro" == '"linux mint"' ]; then - pip3 install setuptools - fi - - # echo "Transferring files..." - mkdir -p ~/.config/kinto - - # KDE xhost fix - # mkdir -p ~/.kde/Autostart - # echo -e '#!/bin/sh\rxhost +SI:localuser:root' > ~/.kde/Autostart/kintohost.sh - # chmod +x ~/.kde/Autostart/kintohost.sh - - # KDE startup - xhost fix - mkdir -p ~/.config/autostart - yes | cp -rf ./xkeysnail-config/xkeysnail.desktop ~/.config/autostart/xkeysnail.desktop - - # yes | cp -rf ./xkeysnail-config/xkeystart.sh ~/.config/kinto/xkeystart.sh - - # *** More testing needing, universal way of killing kinto on user log out? *** - # yes | sudo cp -rf xkeysnail-config/root_logoff.sh /usr/local/bin/logoff.sh - # sudo chown root:root /usr/local/bin/logoff.sh - # sudo chmod u+rwx /usr/local/bin/logoff.sh - # sudo chmod go-w+rx /usr/local/bin/logoff.sh - # *** End universal killing of kinto - if $installtray ; then - yes | sudo cp -rf xkeysnail-config/gnome_logoff.sh ~/.config/kinto/logoff.sh - fi - - yes | cp -rf ./xkeysnail-config/kinto.py ./xkeysnail-config/kinto.py.new - yes | cp -rf ./xkeysnail-config/limitedadmins ./xkeysnail-config/limitedadmins.new - yes | cp -rf ./xkeysnail-config/killdups.sh ~/.config/kinto/killdups.sh - yes | cp -rf ./xkeysnail-config/appleKB.sh ~/.config/kinto/appleKB.sh - yes | cp -rf ./xkeysnail-config/trayapps/appindicator/kintotray.py ~/.config/kinto/kintotray.py - yes | cp -rf ./xkeysnail-config/trayapps/appindicator/kintotray.desktop ~/.config/kinto/kintotray.desktop - yes | cp -rf ./xkeysnail-config/trayapps/BudgieApplet/icons/kinto-color-16.svg ~/.config/kinto/kinto-color.svg - yes | cp -rf ./xkeysnail-config/trayapps/BudgieApplet/icons/kinto-invert-16.svg ~/.config/kinto/kinto-invert.svg - yes | cp -rf ./xkeysnail-config/trayapps/BudgieApplet/icons/kinto-solid-16.svg ~/.config/kinto/kinto-solid.svg - # yes | cp -rf ./system-config/caret_status_xkey.sh ~/.config/kinto/caret_status_xkey.sh - yes | cp -rf ./xkeysnail-config/xkeysnail.service ./xkeysnail-config/xkeysnail.service.new - # yes | cp -rf ./xkeysnail-config/xkeysnail.timer ~/.config/systemd/user/xkeysnail.timer - sed -i "s#{experimental-caret}#$exp#g" ./xkeysnail-config/xkeysnail.service.new - if [ "$expsh" != " " ];then - sed -i "s#{kill-caret}#/usr/bin/pkill -f $expsh#g" ./xkeysnail-config/xkeysnail.service.new - else - sed -i "s#{kill-caret}#$expsh#g" ./xkeysnail-config/xkeysnail.service.new - fi - sed -i "s/{username}/`whoami`/g" ./xkeysnail-config/xkeysnail.service.new - sed -i "s#{homedir}#`echo "$HOME"`#g" ./xkeysnail-config/xkeysnail.service.new - sed -i "s#{homedir}#`echo "$HOME"`#g" ~/.config/kinto/kintotray.desktop - sed -i "s#{xhost}#`\\which xhost`#g" ./xkeysnail-config/xkeysnail.service.new - sed -i "s/{username}/`whoami`/g" ./xkeysnail-config/limitedadmins.new - sed -i "s#{systemctl}#`\\which systemctl`#g" ./xkeysnail-config/limitedadmins.new - sed -i "s#{pkill}#`\\which pkill`#g" ./xkeysnail-config/limitedadmins.new - sed -i "s#{xkeysnail}#/usr/local/bin/xkeysnail#g" ./xkeysnail-config/limitedadmins.new - sudo chown root:root ./xkeysnail-config/limitedadmins.new - sudo mv ./xkeysnail-config/limitedadmins.new /etc/sudoers.d/limitedadmins - sed -i "s#{systemctl}#`\\which systemctl`#g" ~/.config/autostart/xkeysnail.desktop - yes | cp -rf ~/.config/kinto/kintotray.desktop ~/.config/autostart/kintotray.desktop - if $installtray ; then - sed -i "s#-c \"grep#-c \"python3 {homedir}/.config/kinto/kintotray.py;grep#g" ~/.config/autostart/xkeysnail.desktop - sed -i "s#xkeysnail\"#xkeysnail;{homedir}/.config/kinto/logoff.sh\"#g" ~/.config/autostart/xkeysnail.desktop - fi - sed -i "s#{xhost}#`\\which xhost`#g" ~/.config/autostart/xkeysnail.desktop - sed -i "s#{homedir}#`echo "$HOME"`#g" ~/.config/autostart/xkeysnail.desktop - # sed -i "s#{homedir}#`echo "$HOME"`#g" ~/.config/kinto/prexk.sh - sed -i "s/{displayid}/`echo "$DISPLAY"`/g" ./xkeysnail-config/xkeysnail.service.new - # sed -i "s/{displayid}/`echo "$DISPLAY"`/g" ~/.config/kinto/prexk.sh - - if $vssublime ; then - perl -pi -e "s/(# )(.*)(- Sublime)/\$2\$3/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1 - fi -fi - -if [[ $dename == "gnome" || dename == "budgie" ]]; then - perl -pi -e "s/(# )(.*)(# gnome)/\$2\$3/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1 -fi -if [[ $dename == "kde" ]]; then - echo "Applying Cmd-Space to open App Launcher for KDE..." - perl -pi -e "s/(# )(.*)(#.*kde)/\$2\$3/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1 -fi - -if [[ $1 == "1" || $1 == "winmac" ]]; then - if ls /sys/module | grep hid_apple >/dev/null 2>&1 ; then - echo '1' | sudo tee /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all - fi - if ls /sys/module | grep applespi >/dev/null 2>&1 ; then - echo '1' | sudo tee /sys/module/applespi/parameters/swap_opt_cmd;echo 'options applespi swap_opt_cmd=1' | sudo tee /etc/modprobe.d/applespi.conf;sudo update-initramfs -u -k all - fi - if ! ls /sys/module | grep apple ; then - removeAppleKB - fi - perl -pi -e "s/(# )(.*)(# WinMac)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - if [[ $dename == "xfce" ]]; then - perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - perl -pi -e "s/(\w.*)(# Default not-xfce4)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new - fi -elif [[ $1 == "2" || $1 == "mac" ]]; then - removeAppleKB - perl -pi -e "s/(# )(.*)(# Mac)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - if [[ $dename == "xfce" ]]; then - perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - perl -pi -e "s/(\w.*)(# Default not-xfce4)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new - fi -elif [[ $1 == "3" || $1 == "chromebook" ]]; then - perl -pi -e "s/(# )(.*)(# Chromebook)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - perl -pi -e "s/(\w.*)(# Default)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new -elif [[ $1 == "4" || $1 == "ibm" ]]; then - perl -pi -e "s/(# )(.*)(# IBM)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - perl -pi -e "s=(# )(.*)(# Chromebook/IBM)=\$2\$3=g" ./xkeysnail-config/kinto.py.new - # perl -pi -e "s/(# )(.*)(# xfce4)/\$2\$3/g" ./xkeysnail-config/kinto.py.new - perl -pi -e "s/(\w.*)(# Default)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new -fi -if [[ $dename == "xfce" ]] && ls /etc/apt/sources.list.d/enso* 1> /dev/null 2>&1; then - echo "enso OS detected, applying Cmd-Space for Launchy..." - perl -pi -e "s/(K\(\"RC-Space)(.*)(# )(xfce4)/\$3\$1\$2\$3\$4/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1 - xfconf-query --channel xfce4-keyboard-shortcuts --property "/commands/custom/space" --create --type string --set "launchy" -fi - -if $rightalt ; then - perl -pi -e "s/(\w.*)(Multi-language)/# \$1\$2/g" ./xkeysnail-config/kinto.py.new >/dev/null 2>&1 -fi - -if [[ $1 == "1" || $1 == "2" || $1 == "3" || $1 == "winmac" || $1 == "mac" || $1 == "chromebook" ]]; then - mv ./xkeysnail-config/kinto.py.new ~/.config/kinto/kinto.py - git describe --tags | perl -ne "print \"\$1 build `git rev-parse --short HEAD`\n\" for m/\b(.*)-\w+-\w{8}/" > ~/.config/kinto/version - # if [ "$distro" == "fedora" ];then - sudo rm /etc/systemd/system/xkeysnail.service - if [ -d /usr/lib/systemd/system ];then - xkeypath="/usr/lib/systemd/system/" - elif [ -d /lib/systemd/system ];then - xkeypath="/lib/systemd/system/" - fi - sudo mv ./xkeysnail-config/xkeysnail.service.new "$xkeypath"xkeysnail.service && echo "Service file added to "$xkeypath"xkeysnail.service" - sudo chown -R root:root "$xkeypath"xkeysnail.service && echo "Ownership set for root..." || echo "Failed to set ownership..." - sudo chmod 644 "$xkeypath"xkeysnail.service && echo "Permissions set to 644..." || echo "Failed to set permissions..." - sudo ln -s "$xkeypath"xkeysnail.service /etc/systemd/system/xkeysnail.service && echo "Created soft symlink..." || echo "Failed to create soft symlink..." - sudo ln -s "$xkeypath"xkeysnail.service /etc/systemd/system/graphical.target.wants/xkeysnail.service && echo "Created soft symlink for graphical target..." || echo "Failed to create soft symlink for graphical target..." - xhost +SI:localuser:root - git clone --depth 10 https://github.com/rbreaves/xkeysnail.git || git pull --depth 10 - cd xkeysnail - git checkout 51c369084e0045a8410d227bab52411bf84fb65b - giturl=$(git ls-remote --get-url) - if [ "$giturl" != "https://github.com/rbreaves/xkeysnail.git" ];then - echo -e "\nreplacing xkeysnail with fork...\n" - cd .. - rm -rf ./xkeysnail - git clone --depth 10 https://github.com/rbreaves/xkeysnail.git - cd xkeysnail - git checkout 51c369084e0045a8410d227bab52411bf84fb65b - fi - sudo pip3 install --upgrade . - cd .. - sudo systemctl daemon-reload - sudo systemctl disable xkeysnail - # sudo systemctl --state=not-found --all | grep xkeysnail - # if [ "$distro" == "fedora" ];then - # systemctl enable xkeysnail.service - # else - # sudo systemctl enable xkeysnail.service - # fi - sudo systemctl restart xkeysnail - sudo pkill -f kintotray >/dev/null 2>&1 - nohup python3 ~/.config/kinto/kintotray.py& >/dev/null 2>&1 - - echo -e "Adding xhost fix...\n" - - LINE='xhost +SI:localuser:root' - - if [ ! -e "~/.xprofile" ]; then - # Ubuntu xhost fix - echo "$LINE" > ~/.xprofile - # echo "$LINE" > ~/.xinitrc - fi - # Ubuntu xhost fix - grep -qF -- "$LINE" ~/.xprofile || echo "$LINE" >> ~/.xprofile - # KDE xhost fix - # grep -qF -- "$LINE" ~/.bashrc || echo "$LINE" >> ~/.bashrc - # grep -qF -- "$LINE" ~/.xinitrc || echo "$LINE" >> ~/.xinitrc - - # remove kintox11 login startup - if test -f "~/.config/autostart/kinto.desktop"; then - rm ~/.config/autostart/kinto.desktop - fi - - echo -e "Kinto install is \e[1m\e[32mcomplete\e[0m.\n" - if `sudo systemctl is-active --quiet xkeysnail`;then - echo -e "Kinto \e[1m\e[32mxkeysnail service is running\e[0m.\n" - echo "Commands for controlling Kinto's xkeysnail service" - echo "sudo systemctl restart xkeysnail" - echo "sudo systemctl stop xkeysnail" - echo "sudo systemctl start xkeysnail" - echo "sudo systemctl status xkeysnail" - else - echo -e "Kinto \e[1m\e[91mxkeysnail service has failed.\e[0m" - echo "You can run 'sudo systemctl status xkeysnail' for more info" - echo "You can also run 'sudo journalctl -u xkeysnail'" - fi - echo "" - if $vssublime ; then - echo -e "\e[1m\e[32mEnabled\e[0m VS Code Sublime Text remap." - fi - if $rightalt ; then - echo -e "\e[1m\e[32mEnabled\e[0m mutli-language support." - fi - - # trayApp - -elif [[ $1 == "5" || $1 == "uninstall" || $1 == "Uninstall" ]]; then - echo "Uninstalling Kinto - xkeysnail (udev)" - uninstall - removeAppleKB - pkill -f kintotray >/dev/null 2>&1 - sudo systemctl stop xkeysnail >/dev/null 2>&1 - sudo systemctl disable xkeysnail >/dev/null 2>&1 - sudo rm /etc/sudoers.d/limitedadmins - rm ~/.config/autostart/xkeysnail.desktop - rm -rf ~/.config/kinto - sudo rm /etc/systemd/system/xkeysnail.service >/dev/null 2>&1 - sudo rm /etc/systemd/system/graphical.target.wants/xkeysnail.service >/dev/null 2>&1 - sudo rm /usr/lib/systemd/system/xkeysnail.service >/dev/null 2>&1 - if [ -f /usr/local/bin/logoff.sh ];then - sudo rm /usr/local/bin/logoff.sh - fi - sudo systemctl daemon-reload - sudo systemctl --state=not-found --all | grep xkeysnail - budgieUninstall - exit 0 -elif [[ $1 == "budgieUpdate" ]]; then - budgieUpdate -else - echo "Expected argument was not provided" -fi diff --git a/references/app-configs/sublime-text3/linux.sublime-keybinds.chromebook b/references/app-configs/sublime-text3/linux.sublime-keybinds.chromebook deleted file mode 100644 index e4d0be2..0000000 --- a/references/app-configs/sublime-text3/linux.sublime-keybinds.chromebook +++ /dev/null @@ -1,705 +0,0 @@ -[ -/* -Custom macOS keymap for Kinto keymap -*/ - { "keys": ["ctrl+shift+n"], "command": "new_window" }, - { "keys": ["ctrl+shift+w"], "command": "close_window" }, - { "keys": ["ctrl+o"], "command": "prompt_open" }, - { "keys": ["ctrl+shift+t"], "command": "reopen_last_file" }, - { "keys": ["ctrl+super+up"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "hh", "h", "ipp", "inl", "m", "mm"]} }, - { "keys": ["ctrl+n"], "command": "new_file" }, - { "keys": ["ctrl+s"], "command": "save" }, - { "keys": ["ctrl+shift+s"], "command": "prompt_save_as" }, - { "keys": ["ctrl+super+s"], "command": "save_all" }, - { "keys": ["ctrl+w"], "command": "close" }, - - { "keys": ["ctrl+k", "ctrl+b"], "command": "toggle_side_bar" }, - { "keys": ["ctrl+alt+f"], "command": "toggle_full_screen" }, - { "keys": ["ctrl+alt+shift+f"], "command": "toggle_distraction_free" }, - - { "keys": ["ctrl+z"], "command": "undo" }, - { "keys": ["ctrl+shift+z"], "command": "redo" }, - { "keys": ["ctrl+y"], "command": "redo_or_repeat" }, - { "keys": ["ctrl+u"], "command": "soft_undo" }, - { "keys": ["ctrl+shift+u"], "command": "soft_redo" }, - - { "keys": ["ctrl+x"], "command": "cut" }, - { "keys": ["ctrl+c"], "command": "copy" }, - { "keys": ["ctrl+v"], "command": "paste" }, - { "keys": ["ctrl+shift+v"], "command": "paste_and_indent" }, - { "keys": ["ctrl+k", "ctrl+v"], "command": "paste_from_history" }, - { "keys": ["ctrl+option+v"], "command": "paste_from_history" }, - - { "keys": ["alt+super+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, - { "keys": ["alt+super+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, - { "keys": ["alt+super+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, - { "keys": ["alt+super+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, - - { "keys": ["alt+left"], "command": "move", "args": {"by": "subwords", "forward": false} }, - { "keys": ["alt+right"], "command": "move", "args": {"by": "subword_ends", "forward": true} }, - { "keys": ["alt+shift+left"], "command": "move", "args": {"by": "subwords", "forward": false, "extend": true} }, - { "keys": ["alt+shift+right"], "command": "move", "args": {"by": "subword_ends", "forward": true, "extend": true} }, - - { "keys": ["alt+super+up"], "command": "scroll_lines", "args": {"amount": 1.0} }, - { "keys": ["alt+super+down"], "command": "scroll_lines", "args": {"amount": -1.0} }, - - { "keys": ["alt+shift+up"], "command": "select_lines", "args": {"forward": false} }, - { "keys": ["alt+shift+down"], "command": "select_lines", "args": {"forward": true} }, - - { "keys": ["ctrl+shift+["], "command": "prev_view" }, - { "keys": ["ctrl+shift+]"], "command": "next_view" }, - { "keys": ["ctrl+super+left"], "command": "prev_view" }, - { "keys": ["ctrl+super+right"], "command": "next_view" }, - - { "keys": ["alt+tab"], "command": "next_view_in_stack" }, - { "keys": ["alt+shift+tab"], "command": "prev_view_in_stack" }, - - { "keys": ["ctrl+a"], "command": "select_all" }, - { "keys": ["ctrl+shift+l"], "command": "split_selection_into_lines" }, - { "keys": ["escape"], "command": "single_selection", "context": - [ - { "key": "num_selections", "operator": "not_equal", "operand": 1 } - ] - }, - { "keys": ["escape"], "command": "clear_fields", "context": - [ - { "key": "has_next_field", "operator": "equal", "operand": true } - ] - }, - { "keys": ["escape"], "command": "clear_fields", "context": - [ - { "key": "has_prev_field", "operator": "equal", "operand": true } - ] - }, - { "keys": ["escape"], "command": "hide_panel", "args": {"cancel": true}, - "context": - [ - { "key": "panel_visible", "operator": "equal", "operand": true } - ] - }, - { "keys": ["escape"], "command": "hide_overlay", "context": - [ - { "key": "overlay_visible", "operator": "equal", "operand": true } - ] - }, - { "keys": ["escape"], "command": "hide_popup", "context": - [ - { "key": "popup_visible", "operator": "equal", "operand": true } - ] - }, - { "keys": ["escape"], "command": "hide_auto_complete", "context": - [ - { "key": "auto_complete_visible", "operator": "equal", "operand": true } - ] - }, - - { "keys": ["ctrl+]"], "command": "indent" }, - { "keys": ["ctrl+["], "command": "unindent" }, - - { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": true} }, - { "keys": ["tab"], "command": "insert_best_completion", "args": {"default": "\t", "exact": false}, - "context": - [ - { "key": "setting.tab_completion", "operator": "equal", "operand": true }, - { "key": "preceding_text", "operator": "not_regex_match", "operand": ".*\\b[0-9]+$", "match_all": true }, - ] - }, - { "keys": ["tab"], "command": "replace_completion_with_next_completion", "context": - [ - { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, - { "key": "setting.tab_completion", "operator": "equal", "operand": true } - ] - }, - { "keys": ["tab"], "command": "reindent", "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_match", "operand": "^$", "match_all": true }, - { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true } - ] - }, - { "keys": ["tab"], "command": "indent", "context": - [ - { "key": "text", "operator": "regex_contains", "operand": "\n" } - ] - }, - { "keys": ["tab"], "command": "next_field", "context": - [ - { "key": "has_next_field", "operator": "equal", "operand": true } - ] - }, - { "keys": ["tab"], "command": "commit_completion", "context": - [ - { "key": "auto_complete_visible" }, - { "key": "setting.auto_complete_commit_on_tab" } - ] - }, - - { "keys": ["shift+tab"], "command": "insert", "args": {"characters": "\t"} }, - { "keys": ["shift+tab"], "command": "unindent", "context": - [ - { "key": "setting.shift_tab_unindent", "operator": "equal", "operand": true } - ] - }, - { "keys": ["shift+tab"], "command": "unindent", "context": - [ - { "key": "preceding_text", "operator": "regex_match", "operand": "^[\t ]*" } - ] - }, - { "keys": ["shift+tab"], "command": "unindent", "context": - [ - { "key": "text", "operator": "regex_contains", "operand": "\n" } - ] - }, - { "keys": ["shift+tab"], "command": "prev_field", "context": - [ - { "key": "has_prev_field", "operator": "equal", "operand": true } - ] - }, - - { "keys": ["ctrl+l"], "command": "expand_selection", "args": {"to": "line"} }, - { "keys": ["ctrl+d"], "command": "find_under_expand" }, - { "keys": ["ctrl+k", "ctrl+d"], "command": "find_under_expand_skip" }, - { "keys": ["ctrl+shift+space"], "command": "expand_selection", "args": {"to": "scope"} }, - { "keys": ["alt+shift+m"], "command": "expand_selection", "args": {"to": "brackets"} }, - { "keys": ["alt+m"], "command": "move_to", "args": {"to": "brackets"} }, - { "keys": ["ctrl+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} }, - { "keys": ["ctrl+shift+a"], "command": "expand_selection", "args": {"to": "tag"} }, - - { "keys": ["ctrl+super+."], "command": "close_tag" }, - - { "keys": ["alt+q"], "command": "toggle_record_macro" }, - { "keys": ["alt+shift+q"], "command": "run_macro" }, - - { "keys": ["ctrl+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line.sublime-macro"} }, - { "keys": ["ctrl+shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line Before.sublime-macro"} }, - { "keys": ["enter"], "command": "commit_completion", "context": - [ - { "key": "auto_complete_visible" }, - { "key": "setting.auto_complete_commit_on_tab", "operand": false } - ] - }, - - { "keys": ["ctrl+t"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} }, - { "keys": ["ctrl+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} }, - { "keys": ["ctrl+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} }, - { "keys": ["ctrl+alt+p"], "command": "prompt_select_workspace" }, - { "keys": ["ctrl+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} }, - { "keys": ["alt+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} }, - { "keys": ["f12"], "command": "goto_definition" }, - { "keys": ["ctrl+super+down"], "command": "goto_definition" }, - { "keys": ["ctrl+shift+r"], "command": "goto_symbol_in_project" }, - { "keys": ["alt+minus"], "command": "jump_back" }, - { "keys": ["alt+shift+minus"], "command": "jump_forward" }, - - { "keys": ["ctrl+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse": false} }, - { "keys": ["ctrl+shift+i"], "command": "show_panel", "args": {"panel": "incremental_find", "reverse": true} }, - { "keys": ["ctrl+f"], "command": "show_panel", "args": {"panel": "find", "reverse": false} }, - { "keys": ["ctrl+super+f"], "command": "show_panel", "args": {"panel": "replace", "reverse": false} }, - { "keys": ["ctrl+super+e"], "command": "replace_next" }, - { "keys": ["ctrl+g"], "command": "find_next" }, - { "keys": ["ctrl+shift+g"], "command": "find_prev" }, - { "keys": ["ctrl+e"], "command": "slurp_find_string" }, - { "keys": ["ctrl+shift+e"], "command": "slurp_replace_string" }, - - { "keys": ["super+ctrl+g"], "command": "find_under" }, - { "keys": ["shift+super+ctrl+g"], "command": "find_under_prev" }, - { "keys": ["alt+ctrl+g"], "command": "find_all_under" }, - - { "keys": ["ctrl+shift+f"], "command": "show_panel", "args": {"panel": "find_in_files"} }, - { "keys": ["f4"], "command": "next_result" }, - { "keys": ["shift+f4"], "command": "prev_result" }, - - { "keys": ["f6"], "command": "toggle_setting", "args": {"setting": "spell_check"} }, - { "keys": ["alt+f6"], "command": "next_misspelling" }, - { "keys": ["alt+shift+f6"], "command": "prev_misspelling" }, - - { "keys": ["alt+ctrl+up"], "command": "swap_line_up" }, - { "keys": ["alt+ctrl+down"], "command": "swap_line_down" }, - - { "keys": ["alt+backspace"], "command": "delete_word", "args": { "forward": false, "sub_words": true } }, - { "keys": ["alt+delete"], "command": "delete_word", "args": { "forward": true, "sub_words": true } }, - - { "keys": ["ctrl+forward_slash"], "command": "toggle_comment", "args": { "block": false } }, - { "keys": ["ctrl+super+forward_slash"], "command": "toggle_comment", "args": { "block": true } }, - - { "keys": ["ctrl+j"], "command": "join_lines" }, - { "keys": ["ctrl+shift+d"], "command": "duplicate_line" }, - - { "keys": ["alt+backquote"], "command": "show_panel", "args": {"panel": "console", "toggle": true} }, - - { "keys": ["alt+space"], "command": "auto_complete" }, - { "keys": ["alt+space"], "command": "replace_completion_with_auto_complete", "context": - [ - { "key": "last_command", "operator": "equal", "operand": "insert_best_completion" }, - { "key": "auto_complete_visible", "operator": "equal", "operand": false }, - { "key": "setting.tab_completion", "operator": "equal", "operand": true } - ] - }, - - { "keys": ["ctrl+super+p"], "command": "show_scope_name" }, - { "keys": ["alt+shift+p"], "command": "show_scope_name" }, - - { "keys": ["f7"], "command": "build" }, - { "keys": ["ctrl+b"], "command": "build" }, - { "keys": ["ctrl+shift+b"], "command": "build", "args": {"select": true} }, - - { "keys": ["alt+c"], "command": "cancel_build" }, - - { "keys": ["alt+t"], "command": "transpose" }, - - { "keys": ["f5"], "command": "sort_lines", "args": {"case_sensitive": false} }, - { "keys": ["alt+f5"], "command": "sort_lines", "args": {"case_sensitive": true} }, - - // Auto-pair quotes - { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"$0\""}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair single quotes - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair brackets - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - - // Auto-pair square brackets - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - - // Auto-pair curly brackets - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } - ] - }, - { "keys": ["{"], "command": "wrap_block", "args": {"begin": "{", "end": "}"}, "context": - [ - { "key": "indented_block", "match_all": true }, - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true }, - ] - }, - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "auto_indent_tag", "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair single quotes - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair brackets - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - - // Auto-pair square brackets - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - - // Auto-pair curly brackets - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } - ] - }, - { "keys": ["{"], "command": "wrap_block", "args": {"begin": "{", "end": "}"}, "context": - [ - { "key": "indented_block", "match_all": true }, - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true }, - ] - }, - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "auto_indent_tag", "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair single quotes - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair brackets - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - - // Auto-pair square brackets - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - - // Auto-pair curly brackets - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } - ] - }, - { "keys": ["{"], "command": "wrap_block", "args": {"begin": "{", "end": "}"}, "context": - [ - { "key": "indented_block", "match_all": true }, - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true }, - ] - }, - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "auto_indent_tag", "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "[\"a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["\""], "command": "insert_snippet", "args": {"contents": "\"${0:$SELECTION}\""}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["\""], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\"$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\"", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.double - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair single quotes - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true }, - { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true } - ] - }, - { "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }, - { "key": "selector", "operator": "not_equal", "operand": "punctuation.definition.string.begin", "match_all": true }, - { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single - punctuation.definition.string.end", "match_all": true }, - ] - }, - - // Auto-pair brackets - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "($0)"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["("], "command": "insert_snippet", "args": {"contents": "(${0:$SELECTION})"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": [")"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\($", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\)", "match_all": true } - ] - }, - - // Auto-pair square brackets - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[$0]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|;|\\}|$)", "match_all": true } - ] - }, - { "keys": ["["], "command": "insert_snippet", "args": {"contents": "[${0:$SELECTION}]"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["]"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\[$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\]", "match_all": true } - ] - }, - - // Auto-pair curly brackets - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{$0}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|$)", "match_all": true } - ] - }, - { "keys": ["{"], "command": "wrap_block", "args": {"begin": "{", "end": "}"}, "context": - [ - { "key": "indented_block", "match_all": true }, - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true }, - ] - }, - { "keys": ["{"], "command": "insert_snippet", "args": {"contents": "{${0:$SELECTION}}"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true } - ] - }, - { "keys": ["}"], "command": "move", "args": {"by": "characters", "forward": true}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["backspace"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Left Right.sublime-macro"}, "context": - [ - { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line in Braces.sublime-macro"}, "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": "\\{$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^\\}", "match_all": true } - ] - }, - - { "keys": ["enter"], "command": "auto_indent_tag", "context": - [ - { "key": "setting.auto_indent", "operator": "equal", "operand": true }, - { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true }, - { "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true }, - { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^$", "match_all": true }, - { "key": "following_text", "operator": "regex_contains", "operand": "^" - else: - if window_class: - win_class = window_class.value.split('\x00')[1] - if isinstance(win_class, bytes): - # Apparently COMPOUND_TEXT is so arcane that this is how - # tools like xprop deal with receiving it these days - win_class = win_class.split('\x00')[1].decode('latin1', 'replace') - return win_class - else: - title = "" - - return "{} (XID: {})".format(title, win_obj.id) - -def get_window_class(win_id): - """Look up the window name for a given X11 window ID""" - if not win_id: - last_seen['title'] = "" - return last_seen['title'] - - title_changed = False - with window_obj(win_id) as wobj: - if wobj: - win_title = _get_window_class_inner(wobj) - title_changed = (win_title != last_seen['title']) - last_seen['title'] = win_title - - return last_seen['title'], title_changed - -def handle_xevent(event): - # Loop through, ignoring events until we're notified of focus/title change - if event.type != Xlib.X.PropertyNotify: - return - - changed = False - if event.atom == NET_ACTIVE_WINDOW: - if get_active_window()[1]: - changed = changed or get_window_class(last_seen['xid'])[1] - elif event.atom in (NET_WM_CLASS, WM_CLASS): - changed = changed or get_window_class(last_seen['xid'])[1] - - if changed: - handle_change(last_seen) - -def handle_change(new_state): - """Replace this with whatever you want to actually do""" - print(new_state['title']) - -if __name__ == '__main__': - # Listen for _NET_ACTIVE_WINDOW changes - root.change_attributes(event_mask=Xlib.X.PropertyChangeMask) - - # Prime last_seen with whatever window was active when we started this - get_window_class(get_active_window()[0]) - handle_change(last_seen) - - while True: # next_event() sleeps until we get an event - handle_xevent(disp.next_event()) \ No newline at end of file diff --git a/references/old-files/chromebook.sh b/references/old-files/chromebook.sh deleted file mode 100755 index 8b2d666..0000000 --- a/references/old-files/chromebook.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -mkdir -p ~/.xkb/{keymap,symbols,types} -cp ./.xkb/symbols/chromebook ~/.xkb/symbols/chromebook -cp ./.xkb/symbols/mac_gui ~/.xkb/symbols/mac_gui -cp ./.xkb/types/mac_gui ~/.xkb/types/mac_gui -setxkbmap -option -setxkbmap -print > ~/.xkb/keymap/kbd.chromebook.gui -setxkbmap -print > ~/.xkb/keymap/kbd.chromebook.term -line=$(cat ~/.xkb/keymap/kbd.chromebook.gui | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.chromebook.gui -sleep 1 -line=$(cat ~/.xkb/keymap/kbd.chromebook.gui | grep -n 'xkb_types' | cut -f1 -d:) -sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.chromebook.gui -sleep 1 -line=$(cat ~/.xkb/keymap/kbd.chromebook.term | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(swap_alt_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.chromebook.term diff --git a/references/old-files/install.py b/references/old-files/install.py deleted file mode 100755 index 3252d54..0000000 --- a/references/old-files/install.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python3 -import os, platform, sysconfig, sys, subprocess, time - -yellow = "\033[1;33m" -green = "\033[0;32m" -red = "\033[1;31m" -italic = "\033[3m" -reset = "\033[0;0m" - -platform_name = platform.system() -# print sysconfig.get_platform() - -sys.stdout.write(yellow) -cloud = '\u2601' -circleo = '\u25CE' -clocko = '\u2B6E' -syme = '\u0250' -syma = '\u0251' -# bang = '\u1F589'.decode('unicode-escape') - -internalid = 0 -usbid = 0 - -def keyboard_detect(): - global internalid, usbid, chromeswap, system_type - internal_kbname = "" - usb_kbname = "" - - # If chromebook - if system_type == "2": - print() - print("Looking for keyboards...") - print() - result = subprocess.check_output('xinput list | grep -iv "Virtual\|USB" | grep -i "keyboard.*keyboard" | grep -o -P "(?<=↳).*(?=id\=)";exit 0', shell=True).decode('utf-8') - if result != "": - internal_kbname = result.strip() - internalid = subprocess.check_output('xinput list | grep -iv "Virtual\|USB" | grep -i "keyboard.*keyboard" | cut -d "=" -f 2- | awk \'{print $1}\' | tail -1;exit 0', shell=True).decode('utf-8') - print("Internal Keyboard\nName: " + internal_kbname + "\nID: " + internalid) - - result = subprocess.check_output('udevadm info -e | grep -o -P "(?<=by-id/usb-).*(?=-event-kbd)" | head -1;exit 0', shell=True).decode('utf-8') - if result != "": - usb_kbname = result.strip() - - # Loop the following to ensure the id is picked up after 5-10 tries - usbid = "" - usbcount=0 - while usbid == "": - usbid = subprocess.check_output('udevadm info -e | stdbuf -oL grep -o -P "(?<=event-kbd /dev/input/by-path/pci-0000:00:).*(?=.0-usb) | head -n 1";exit 0', shell=True).decode('utf-8') - if usbid == "": - usbcount += 1 - # print('usbid not found '+ str(usbcount)) - if usbcount == 5: - usbid = "0" - time.sleep(1) - print("\nUSB Keyboard\n" + "Name: " + usb_kbname + "\nID: " + usbid) - - if system_type == "1": - system_type = "windows" - elif system_type == "2": - system_type = "chromebook" - elif system_type == "3": - result = subprocess.check_output('lsmod | grep hid_apple 1>/dev/null; echo $?', shell=True).decode('utf-8') - if result.strip() == "0": - system_type = "mac" - else: - system_type = "mac_only" - print("Apple hid_apple driver is not loaded, a keymap that is specific for only Apple keyboards will be used.") - - if system_type == "windows" or system_type == "mac": - subprocess.check_output('/bin/bash -c ./mac_wordwise.sh', shell=True).decode('utf-8') - cmdgui = '"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY"' - elif system_type == "mac_only": - subprocess.check_output('/bin/bash -c ./mac_only.sh', shell=True).decode('utf-8') - cmdgui = '"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY"' - elif system_type == "chromebook": - subprocess.check_output('/bin/bash -c ./chromebook.sh', shell=True).decode('utf-8') - cmdgui = '"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY"' - - # password = getpass("Please enter your password to complete the keyswap: ") - # proc = Popen("echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd".split(), stdin=PIPE, stdout=PIPE, stderr=PIPE) - # proc.communicate(password.encode()) - - if swap_behavior == 1: - print("Setting up " + system_type + " keyswap as a service.") - print("You can disable and remove the service by using the following command in the Kinto directory.") - print("./uninstall.sh") - - keyswapcmd = '/bin/bash -c "./keyswap_service.sh 1 0 ' + system_type + ' ' + str(internalid).strip() + ' ' + str(usbid).strip() + ' ' + str(chromeswap) + '"' - # print(keyswapcmd) - subprocess.check_output(keyswapcmd, shell=True).decode('utf-8') - else: - print("Setting up " + system_type + " keyswap inside your profiles ~/.Xsession file.") - print("You can modify or remove the file if you want you want to remove the modification.") - keyswapcmd = '/bin/bash -c \'./keyswap_service.sh 0 ' + cmdgui + '\'' - subprocess.check_output(keyswapcmd, shell=True).decode('utf-8') - - if system_type == "mac": - print() - print("An Apple keyboard with the hid_apple driver was detected.") - print("Please run the following commands to swap alt/option and Command.") - print("Your Kinto keymapping will not work right on Apple keyboards without it.") - print() - print("echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd") - print('echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf') - print('sudo update-initramfs -u -k all') - - - -def os_detect(): - print() - print("Checking for OS and system information...") - print() - print("OS Type") - # print(" Platform: " + platform_name) - if platform_name == 'Linux': - result = subprocess.check_output("lsb_release -a | grep -v LSB ", shell=True).decode('ascii') - print(result) - -def hwinfo(): - print("Requires user password to display hardware information...") - result = subprocess.check_output('sudo dmidecode | grep -A 9 "System Information" | grep -v "UUID\|Serial\|SKU\|Wake"', shell=True).decode('ascii') - print(result) - -def kblist(): - result = subprocess.check_output('xinput list', shell=True).decode('ascii') - print(result) - -print() -print() -print(" Kint" + circleo) -sys.stdout.write(reset) -print(italic + " - F!x the d" + syma + "mn k" + syme + "yb" + circleo + syma + "rd. - ") -sys.stdout.write(reset) -print() -input("Press Enter to begin...") - -system_type = input("\nWhat type of keyboard are you using? (If Mac and Windows then select Mac)\n\ - 1) Windows\n\ - 2) Chromebook\n\ - 3) Mac\n") - -swap_behavior = 1 -chromeswap = 0 -# Chromebook -if system_type == "2": - if not input("\nWould you like to swap Alt to Super/Win and Search key to Ctrl when using terminal applications? (y/n)\n\ -Note: For a more mac like experience & less issues with terminal based interactions y is recommended.\n").lower().strip()[:1] == "y": - swap_behavior = 0 -# Windows -if system_type == "1": - if not input("\nWould you like to swap Alt to Super/Win and Ctrl key back to Ctrl when using terminal applications? (y/n)\n\ -Note: For a more mac like experience & less issues with terminal based interactions y is recommended.\n").lower().strip()[:1] == "y": - swap_behavior = 0 -# Mac -if system_type == "3": - if not input("\nWould you like to swap Command back to Super/Win and Ctrl key back to Ctrl when using terminal applications? (y/n)\n\ -Note: For a more mac like experience & less issues with terminal based interactions y is recommended.\n").lower().strip()[:1] == "y": - swap_behavior = 0 - -if int(system_type) == 2 and swap_behavior == 1: - chromeswap = input("\nIf the keyswap is applied on a chromebook with both an internal and external Apple keyboard\n\ -you may need to press a key on the external Apple keyboard any time you switch between the terminal and gui based apps.\n\ -Are you ok with that, or would you like to only apply the keyswap on one keyboard type?\n\ - 1) Built-in\n\ - 2) Both - (Chromebook & Windows)\n\ - 3) Both - (Chromebook & Mac)\n\ - 4) USB External - (Mac)\n") - - if chromeswap == "1": - chromeswap = "none" - elif chromeswap == "2": - chromeswap = "both_win" - elif chromeswap == "3" or chromeswap == "4": - chromeswap = "both_mac" - -keyboard_detect() diff --git a/references/old-files/mac_only.sh b/references/old-files/mac_only.sh deleted file mode 100755 index 0ebd002..0000000 --- a/references/old-files/mac_only.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -mkdir -p ~/.xkb/{keymap,symbols,types} -cp ./.xkb/symbols/mac_gui ~/.xkb/symbols/mac_gui -cp ./.xkb/types/mac_gui ~/.xkb/types/mac_gui -setxkbmap -option -setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui -setxkbmap -print > ~/.xkb/keymap/kbd.mac.term -line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.gui -sleep 1 -line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:) -sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.mac.gui -sleep 1 -line=$(cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(alt_super_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.term diff --git a/references/old-files/mac_wordwise.sh b/references/old-files/mac_wordwise.sh deleted file mode 100755 index 684a9d8..0000000 --- a/references/old-files/mac_wordwise.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -mkdir -p ~/.xkb/{keymap,symbols,types} -cp ./.xkb/symbols/mac_gui ~/.xkb/symbols/mac_gui -cp ./.xkb/types/mac_gui ~/.xkb/types/mac_gui -setxkbmap -option -setxkbmap -print > ~/.xkb/keymap/kbd.mac.gui -setxkbmap -print > ~/.xkb/keymap/kbd.mac.term -line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.gui -sleep 1 -line=$(cat ~/.xkb/keymap/kbd.mac.gui | grep -n 'xkb_types' | cut -f1 -d:) -sed -ie "${line}s/\"/+mac_gui(addmac_levels)\"/2" ~/.xkb/keymap/kbd.mac.gui -sleep 1 -line=$(cat ~/.xkb/keymap/kbd.mac.term | grep -n 'xkb_symbols' | cut -f1 -d:) -sed -ie "${line}s/\"/+altwin(swap_alt_win)+mac_term(mac_levelssym)\"/2" ~/.xkb/keymap/kbd.mac.term diff --git a/references/old-files/old_uninstall.sh b/references/old-files/old_uninstall.sh deleted file mode 100755 index 1b3eec0..0000000 --- a/references/old-files/old_uninstall.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -systemctl --user stop keyswap -systemctl --user disable keyswap -rm -rf ~/.config/autostart/keyswap.sh -rm -rf ~/.config/xactive.sh -rm -rf ~/.xkb - -sed -i '/xkb/d' ~/.Xsession \ No newline at end of file diff --git a/references/old-files/test.py b/references/old-files/test.py deleted file mode 100755 index b7a848c..0000000 --- a/references/old-files/test.py +++ /dev/null @@ -1,316 +0,0 @@ -# pip3 install pynput -# pip3 install --no-deps pynput - -from pynput.keyboard import Key, Listener -import sys, subprocess - -uitype=sys.argv[1] -apply_rules=sys.argv[2] -windows=sys.argv[3] -chromebook=sys.argv[4] -mac=sys.argv[5] - -class color: - PURPLE = '\033[95m' - CYAN = '\033[96m' - DARKCYAN = '\033[36m' - BLUE = '\033[94m' - GREEN = '\033[92m' - YELLOW = '\033[93m' - RED = '\033[91m' - BOLD = '\033[1m' - UNDERLINE = '\033[4m' - END = '\033[0m' - -def on_press(key): - print('{0} pressed'.format(key)) - -def on_release(key): - # print('{0} release'.format(key)) - if key == Key.esc: - # Stop listener - return False - -def is_ctrl_winchrome(key): - if key == Key.ctrl: - # print(str(key).replace("Key.", "").title() +' successfully mapped to physical Alt key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Alt is now Ctrl') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Alt key.'.format(key)) - return False - -def is_ctrl_mac(key): - if key == Key.ctrl: - # print(str(key).replace("Key.", "").title() +' successfully mapped to physical Alt key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Command is now Ctrl') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Command key.'.format(key)) - return False - -def is_ctrl_terminal(key): - if key == Key.ctrl: - # print(str(key).replace("Key.", "").title() +' successfully mapped to physical Ctrl key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Ctrl remains Ctrl,\nwhile in terminal apps.') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Ctrl key.'.format(key)) - return False - -def is_alt_chromebook(key): - if key == Key.alt: - # print(str(key).replace("Key.", "").title() +' successfully mapped to the physical Ctrl key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Ctrl is now Alt') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Ctrl key.'.format(key)) - return False - -def is_alt_windows(key): - if key == Key.alt: - # print(str(key).replace("Key.", "").title() +' successfully mapped to the physical Ctrl key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Win/Super is now Alt') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Win/Super key.'.format(key)) - return False - -def is_alt_mac(key): - if key == Key.alt: - # print(str(key).replace("Key.", "").title() +' successfully mapped to the physical Ctrl key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Alt remains Alt') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Alt key.'.format(key)) - return False - -def is_alt_chromebook_terminal(key): - if key == Key.alt: - # print(str(key).replace("Key.", "").title() +' successfully mapped to the physical Search key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Search is now Alt,\nwhile in terminals apps.') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Search key.'.format(key)) - return False - -def is_super_winmac(key): - if key == Key.cmd: - # print('Super/Win successfully mapped to the physical Search key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Ctrl key is Super/Win') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Ctrl key.'.format(key)) - return False - -def is_super_chromebook(key): - if key == Key.cmd: - # print('Super/Win successfully mapped to the physical Search key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Search key is Super/Win') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Search key.'.format(key)) - return False - -def is_super_terminal(key): - if key == Key.cmd: - # print('Super/Win successfully mapped to the physical Alt key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Alt is now Super/Win,\nwhile in terminal apps.') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Alt key.'.format(key)) - return False - -def is_super_mac_terminal(key): - if key == Key.cmd: - # print('Super/Win successfully mapped to the physical Alt key.'.format(key)) - print(color.GREEN + 'Success' + color.END + ' Command is now Super/Win,\nwhile in terminal apps.') - return False - elif key == Key.esc: - return False - else: - print('keymap failure, ' + str(key).replace("Key.", "").title() + ' may have been mapped to the physical Command key.'.format(key)) - return False - -def chromebook_keys_gui(): - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Alt" + color.END + " key to confirm the new keymapping to Ctrl..") - with Listener( - # on_press=on_press, - on_release=is_ctrl_winchrome) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Ctrl" + color.END + " key to confirm the new keymapping to Alt..") - with Listener( - # on_press=on_press, - on_release=is_alt_chromebook) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Search" + color.END + " key to confirm the new keymapping to Super/Win..") - with Listener( - # on_press=on_press, - on_release=is_super_chromebook) as listener: - listener.join() - -def chromebook_keys_terminal(): - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Alt" + color.END + " key to confirm the new keymapping to Super/Win..") - with Listener( - # on_press=on_press, - on_release=is_super_terminal) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Ctrl" + color.END + " key to confirm the new keymapping to Ctrl..") - with Listener( - # on_press=on_press, - on_release=is_ctrl_terminal) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Search" + color.END + " key to confirm the new keymapping to Alt..") - with Listener( - # on_press=on_press, - on_release=is_alt_chromebook_terminal) as listener: - listener.join() - -def windows_keys_gui(): - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Alt" + color.END + " key to confirm the new keymapping to Ctrl..") - with Listener( - # on_press=on_press, - on_release=is_ctrl_winchrome) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Win/Super" + color.END + " key to confirm the new keymapping to Alt..") - with Listener( - # on_press=on_press, - on_release=is_alt_windows) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Ctrl" + color.END + " key to confirm the new keymapping to Win/Super..") - with Listener( - # on_press=on_press, - on_release=is_super_winmac) as listener: - listener.join() - -def windows_keys_terminal(): - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Alt" + color.END + " key to confirm the new keymapping to Super/Win..") - with Listener( - # on_press=on_press, - on_release=is_super_terminal) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Win/Super" + color.END + " key to confirm the new keymapping to Alt..") - with Listener( - # on_press=on_press, - on_release=is_alt_windows) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Ctrl" + color.END + " key to confirm the new keymapping to Ctrl..") - with Listener( - # on_press=on_press, - on_release=is_ctrl_terminal) as listener: - listener.join() - -def mac_keys_gui(): - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Command" + color.END + " key to confirm the new keymapping to Ctrl..") - with Listener( - # on_press=on_press, - on_release=is_ctrl_mac) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Alt" + color.END + " key to confirm it remains Alt..") - with Listener( - # on_press=on_press, - on_release=is_alt_mac) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Ctrl" + color.END + " key to confirm the new keymapping to Win/Super..") - with Listener( - # on_press=on_press, - on_release=is_super_winmac) as listener: - listener.join() - -def mac_keys_terminal(): - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Command" + color.END + " key to confirm the new keymapping to Super/Win..") - with Listener( - # on_press=on_press, - on_release=is_super_mac_terminal) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Alt" + color.END + " key to confirm it remains Alt..") - with Listener( - # on_press=on_press, - on_release=is_alt_mac) as listener: - listener.join() - print() - print(color.UNDERLINE + color.YELLOW + "Press the physical Ctrl" + color.END + " key to confirm it remains Ctrl..") - with Listener( - # on_press=on_press, - on_release=is_ctrl_terminal) as listener: - listener.join() - -if uitype == 'gui': - if chromebook == '1': - if apply_rules == '1': - subprocess.check_output('setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY', shell=True).decode('utf-8') - print() - print("Testing chromebook - GUI apps - Kinto keymapping...") - chromebook_keys_gui() - - if windows == '1': - if apply_rules == '1': - subprocess.check_output('setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY', shell=True).decode('utf-8') - print() - print ("Testing windows keyboard - GUI apps - Kinto keymapping...") - windows_keys_gui() - - if mac == '1': - if apply_rules == '1': - subprocess.check_output('setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY', shell=True).decode('utf-8') - print ("Testing mac keyboard - GUI apps - Kinto keymapping...") - mac_keys_gui() - -if uitype == 'term': - if chromebook == '1': - if apply_rules == '1': - subprocess.check_output('setxkbmap -option;setxkbmap -option altwin:swap_lalt_lwin', shell=True).decode('utf-8') - print("Testing chromebook - terminal - Kinto keymapping...") - chromebook_keys_terminal() - - if windows == '1': - if apply_rules == '1': - subprocess.check_output('setxkbmap -option;setxkbmap -option altwin:swap_alt_win', shell=True).decode('utf-8') - print ("Testing windows keyboard - terminal - Kinto keymapping...") - windows_keys_terminal() - - if mac == '1': - if apply_rules == '1': - subprocess.check_output('setxkbmap -option;setxkbmap -option altwin:swap_alt_win', shell=True).decode('utf-8') - print ("Testing mac keyboard - terminal - Kinto keymapping...") - mac_keys_terminal() - -if apply_rules == '1': - subprocess.run('setxkbmap -option', shell=True) \ No newline at end of file diff --git a/references/shortcuts b/references/shortcuts deleted file mode 100644 index 698a9eb..0000000 --- a/references/shortcuts +++ /dev/null @@ -1,75 +0,0 @@ -# GalliumOS Notes - -xfconf-query -c xfce4-keyboard-shortcuts -lv | grep "show_desktop_key\|cycle_windows_key\|cycle_reverse_windows_key\|close_window_key\|maximize_window_key\|xfce4-popup-whiskermenu\|move_window_next_workspace_key\|move_window_prev_workspace_key\|hide" | grep -v "default\|m" - -# Show Desktop -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/d" --create --type string --set "show_desktop_key" - -# Undo show desktop -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/d" --reset - -# GUI Alt Tab - Window Switching -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Tab" --set "cycle_reverse_windows_key" -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Tab" --set "cycle_windows_key" - -# Term Alt Tab - Window Switching -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Tab" --set "cycle_windows_key" -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Tab" --set "cycle_reverse_windows_key" - -# Hide/minimize Window -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/h" --create --type string --set "hide_window_key" - -# Spotlight -xfconf-query --channel xfce4-keyboard-shortcuts --property "/commands/custom/space" --create --type string --set "xfce4-popup-whiskermenu" - -# Change workspace to left -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Left" --create --type string --set "move_window_prev_workspace_key" - -# Change workspace to right -xfconf-query --channel xfce4-keyboard-shortcuts --property "/xfwm4/custom/Right" --create --type string --set "move_window_next_workspace_key" - -# PopOS - -# Close App Alt+F4 (Super+w) -gsettings set org.gnome.desktop.wm.keybindings close "['F4','w']" -# Undo -gsettings set org.gnome.desktop.wm.keybindings close "['w']" - -# Maximize Window -gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['F10','Up']" -# Undo -gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['Up']" - -# Ubuntu 19.10 -# Change Workspace -gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['Left','Left']" -gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['Right','Right']" - -# ElementaryOS -# Show Desktop -gsettings set org.gnome.desktop.wm.keybindings show-desktop "['d','Down']" -# Maximize Window -gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['F10','Up']" -# Spotlight -gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['Space','Space']" - -# Fedora 31 -# Show Desktop -gsettings set org.gnome.desktop.wm.keybindings show-desktop "['d']" -# Change Workspace -gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['Left','Left']" -gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['Right','Right']" - -# Manjaro/Arch KDE -# Maximize -kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" \ ---key "Maximize Window" "Alt+F10,Meta+PgUp,Maximize Window" -# Minimize -kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" \ ---key "Minimize Window" "Meta+h,Meta+PgDown,Minimize Window" -# Switch Desktops -kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" \ ---key "Switch to Next Desktop" "Meta+Right,Meta+Right,Switch to Next Desktop" -kwriteconfig5 --file "$HOME/.config/kglobalshortcutsrc" --group "kwin" \ ---key "Switch to Previous Desktop" "Meta+Left,Meta+Left,Switch to Previous Desktop" -kquitapp5 kglobalaccel && sleep 2s && kglobalaccel5 & \ No newline at end of file diff --git a/references/symbol_names.txt b/references/symbol_names.txt deleted file mode 100644 index e07ff75..0000000 --- a/references/symbol_names.txt +++ /dev/null @@ -1,1411 +0,0 @@ -name[Group1]=English (US) -TLDE=grave,asciitilde -AE01=1,exclam -AE02=2,at -AE03=3,numbersign -AE04=4,dollar -AE05=5,percent -AE06=6,asciicircum -AE07=7,ampersand -AE08=8,asterisk -AE09=9,parenleft -AE10=0,parenright -AE11=minus,underscore -AE12=equal,plus -AD01=q,Q -AD02=w,W -AD03=e,E -AD04=r,R -AD05=t,T -AD06=y,Y -AD07=u,U -AD08=i,I -AD09=o,O -AD10=p,P -AD11=bracketleft,braceleft -AD12=bracketright,braceright -AC01=a,A -AC02=s,S -AC03=d,D -AC04=f,F -AC05=g,G -AC06=h,H -AC07=j,J -AC08=k,K -AC09=l,L -AC10=semicolon,colon -AC11=apostrophe,quotedbl -AB01=z,Z -AB02=x,X -AB03=c,C -AB04=v,V -AB05=b,B -AB06=n,N -AB07=m,M -AB08=comma,less -AB09=period,greater -AB10=slash,question -BKSL=backslash,bar - -hidden partial alphanumeric_keys -xkb_symbols=media_common -I01=XF86AudioMedia -I10=XF86AudioPrev -I19=XF86AudioNext -I20=XF86AudioMute -I22=XF86AudioPlay, XF86AudioPause -I24=XF86AudioStop, XF86Eject -I2E=XF86AudioLowerVolume -I30=XF86AudioRaiseVolume -K5A=XF86Eject -K6C=XF86Eject - -hidden partial alphanumeric_keys -xkb_symbols=nav_common -I21=XF86Calculator -I32=XF86WWW -I65=XF86Search -I66=XF86Favorites -I67=XF86Reload -I68=XF86Stop -I69=XF86Forward -I6A=XF86Back -I6B=XF86MyComputer -I6C=XF86Mail -I6D=XF86AudioMedia - -hidden partial alphanumeric_keys -xkb_symbols=acpi_common -I5E=XF86PowerOff -I5F=XF86Standby -I63=XF86WakeUp -I74=XF86Battery -I76=XF86WLAN -I16=XF86Sleep - -partial alphanumeric_keys -xkb_symbols=evdev -MUTE=XF86AudioMute -VOL-=XF86AudioLowerVolume -VOL+=XF86AudioRaiseVolume -POWR=XF86PowerOff -STOP=Cancel -AGAI=Redo -PROP=SunProps -UNDO=Undo -FRNT=SunFront -COPY=XF86Copy -OPEN=XF86Open -PAST=XF86Paste -FIND=Find -CUT=XF86Cut -HELP=Help -LNFD=Linefeed - - -HKTG=Hiragana_Katakana -HENK=Henkan -MUHE=Muhenkan -KATA=Katakana -HIRA=Hiragana -RO=Romaji - -HNGL=Hangul -HJCV=Hangul_Hanja -FK21=XF86TouchpadToggle -FK22=XF86TouchpadOn -FK23=XF86TouchpadOff -FK20=XF86AudioMicMute -I126=plusminus -I128=XF86LaunchA -I147=XF86MenuKB -I148=XF86Calculator -I150=XF86Sleep -I151=XF86WakeUp -I152=XF86Explorer -I153=XF86Send -I155=XF86Xfer -I156=XF86Launch1 -I157=XF86Launch2 -I158=XF86WWW -I159=XF86DOS -I160=XF86ScreenSaver -I161=XF86RotateWindows -I162=XF86TaskPane -I163=XF86Mail -I164=XF86Favorites -I165=XF86MyComputer -I166=XF86Back -I167=XF86Forward -I169=XF86Eject -I170=XF86Eject, XF86Eject -I171=XF86AudioNext -I172=XF86AudioPlay, XF86AudioPause -I173=XF86AudioPrev -I174=XF86AudioStop, XF86Eject -I175=XF86AudioRecord -I176=XF86AudioRewind -I177=XF86Phone -I179=XF86Tools -I180=XF86HomePage -I181=XF86Reload -I182=XF86Close -I185=XF86ScrollUp -I186=XF86ScrollDown -I187=parenleft -I188=parenright -I189=XF86New -I190=Redo -I192=XF86LaunchA -I193=XF86LaunchC -I194=XF86LaunchD -I195=XF86LaunchE -I196=XF86LaunchF -I208=XF86AudioPlay -I209=XF86AudioPause -I210=XF86Launch3 -I211=XF86Launch4 -I212=XF86LaunchB -I213=XF86Suspend -I214=XF86Close -I215=XF86AudioPlay -I216=XF86AudioForward -I218=Print -I220=XF86WebCam -I223=XF86Mail -I225=XF86Search -I227=XF86Finance -I229=XF86Shop -I231=Cancel -I232=XF86MonBrightnessDown -I233=XF86MonBrightnessUp -I234=XF86AudioMedia -I235=XF86Display -I239=XF86Send -I240=XF86Reply -I241=XF86MailForward -I242=XF86Save -I243=XF86Documents -I244=XF86Battery -I245=XF86Bluetooth -I246=XF86WLAN -FK13=XF86Tools -FK14=XF86Launch5 -FK15=XF86Launch6 -FK16=XF86Launch7 -FK17=XF86Launch8 -FK18=XF86Launch9 - - - -partial alphanumeric_keys -xkb_symbols=airkey -I13=XF86AudioNext -I15=XF86AudioPlay, XF86AudioPause -I16=XF86Mail -I18=XF86AudioPrev -I19=XF86AudioMute -I24=XF86WWW -I26=XF86AudioLowerVolume -I2D=XF86AudioRaiseVolume -I2F=XF86Terminal -I31=XF86AudioStop, XF86Eject - -partial alphanumeric_keys -xkb_symbols=acer_c300 -I17=F14 -I1F=F13 -I20=XF86AudioMute -I2E=XF86AudioLowerVolume -I30=XF86AudioRaiseVolume -I5E=XF86Launch2 -I75=Help -IR7C=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=acer_ferrari4k -I24=dollar -I25=EuroSign -I26=XF86Display -I70=Help -I71=XF86Launch1 -I72=XF86Launch2 -I73=XF86Launch3 -I74=XF86Launch4 - -partial alphanumeric_keys -xkb_symbols=acer_laptop - - - - - -partial alphanumeric_keys -xkb_symbols=azonaRF2300 -I02=XF86HomePage -I17=XF86AudioStop -I1E=XF86AudioRaiseVolume -I1F=XF86AudioPlay, XF86AudioPause -I22=XF86AudioNext -I24=XF86AudioPrev -I25=XF86AudioLowerVolume -I26=XF86AudioMute -I3C=XF86Copy -I78=XF86Cut - - - -partial alphanumeric_keys -xkb_symbols=brother -I10=XF86ScrollUp -I12=XF86AudioPlay, XF86AudioPause -I17=XF86AudioPrev -I18=XF86ScrollDown -I19=XF86ZoomOut -I1E=XF86AudioMute -I21=XF86WWW -I22=Menu -I23=XF86AudioStop -I24=XF86Calculator -I25=XF86Xfer -I26=XF86Mail -I2E=XF86AudioNext -I30=XF86AudioRaiseVolume -I32=XF86ZoomIn -I68=XF86AudioLowerVolume - - - -partial alphanumeric_keys -xkb_symbols=btc5113rf -I10=XF86AudioStop -I12=XF86AudioMute -I19=XF86AudioPlay, XF86AudioPause -I1E=XF86AudioRaiseVolume -I20=XF86Favorites -I21=XF86Eject -I22=XF86AudioPrev -I24=XF86AudioNext -I25=XF86AudioLowerVolume -I26=XF86Back -I30=XF86WWW -I32=XF86Search - -partial alphanumeric_keys -xkb_symbols=btc9000 -I10=XF86AudioStop -I12=XF86AudioMute -I19=XF86AudioPlay, XF86AudioPause -I1E=XF86AudioRaiseVolume -I20=XF86Favorites -I21=XF86AudioMedia -I22=XF86AudioPrev -I24=XF86AudioNext -I25=XF86AudioLowerVolume -I26=XF86Reload -I2E=XF86Mail -I30=XF86HomePage -I32=XF86Search - -partial alphanumeric_keys -xkb_symbols=btc9000a -I10=XF86AudioStop -I12=XF86AudioMute -I19=XF86AudioPlay, XF86AudioPause -I1E=XF86AudioRaiseVolume -I20=XF86Favorites -I21=XF86Eject -I22=XF86AudioPrev -I24=XF86AudioNext -I25=XF86AudioLowerVolume -I26=XF86HomePage -I2E=Help -I30=XF86WWW -I32=XF86Search - -xkb_symbols=btc9001ah -I02=XF86HomePage -I17=XF86AudioStop -I1E=XF86AudioRaiseVolume -I1F=XF86AudioPlay, XF86AudioPause -I22=XF86AudioNext -I24=XF86AudioPrev -I25=XF86AudioLowerVolume -I26=XF86AudioMute -I6C=XF86Mail -RWIN=XF86Eject - -partial alphanumeric_keys -xkb_symbols=btc5090 -I26=XF86Start -I33=XF86Eject - -partial alphanumeric_keys -xkb_symbols=btc9019u -FK17=XF86Search -I02=XF86HomePage - - - -partial alphanumeric_keys -xkb_symbols=cherryblue -FK16=XF86Reload -I02=XF86HomePage -I17=XF86AudioStop -I1E=XF86AudioRaiseVolume -I1F=XF86AudioPlay, XF86AudioPause -I22=XF86AudioNext -I24=XF86AudioPrev -I25=XF86AudioLowerVolume -I26=XF86AudioMute -I63=XF86Standby -PRSC=XF86Terminal -IR7C=XF86Go - -partial alphanumeric_keys -xkb_symbols=cherryblueb -FK16=XF86Reload -I02=XF86HomePage -I07=XF86Forward -I08=XF86Back -I0A=XF86Copy -I0B=XF86ScrollUp -I12=XF86ScrollDown -I17=XF86Cut -I18=XF86Paste -I1E=XF86AudioRaiseVolume -I25=XF86AudioLowerVolume -I26=XF86AudioMute -I2C=XF86Book -I32=XF86Finance -I63=XF86Standby -I67=XF86AudioRewind -I70=XF86Eject -I71=XF86Book -I72=XF86Book -PRSC=XF86Terminal -IR7C=XF86Go - -partial alphanumeric_keys -xkb_symbols=cherrybluea -I6D=XF86Go - -partial alphanumeric_keys -xkb_symbols=cherrycyboard -FK17=XF86Search -I02=XF86HomePage -K67=XF86Terminal -IR7C=XF86AudioMedia - -partial alphanumeric_keys -xkb_symbols=cherrycmexpert -FK15=XF86Mail - - - -partial alphanumeric_keys -xkb_symbols=chicony -I12=XF86AudioMute -I17=XF86Mail -I19=XF86AudioLowerVolume -I1E=XF86Forward -I20=XF86AudioNext -I21=XF86AudioPlay, XF86AudioPause -I22=XF86AudioPrev -I23=XF86AudioRaiseVolume -I24=XF86AudioStop -I25=XF86Back -I26=XF86LaunchB -I2E=XF86LaunchC -I30=XF86LaunchA -I32=XF86WWW -I5F=XF86ContrastAdjust -I63=XF86BrightnessAdjust - -partial alphanumeric_keys -xkb_symbols=chicony0108 - -partial alphanumeric_keys -xkb_symbols=chicony0420 -I01=XF86AudioMedia -K67=XF86MyComputer - -partial alphanumeric_keys -xkb_symbols=chicony9885 -I12=XF86AudioMute -I17=XF86Mail -I19=XF86AudioLowerVolume -I1E=XF86Forward -I20=XF86AudioNext -I21=XF86AudioPlay, XF86AudioPause -I22=XF86AudioPrev -I23=XF86AudioRaiseVolume -I24=XF86AudioStop -I25=XF86Back -I26=XF86LaunchB -I2E=XF86LaunchC -I30=XF86LaunchA -I32=XF86WWW - - - -partial alphanumeric_keys -xkb_symbols=compaqeak8 -I13=XF86Community -I14=XF86Market -I15=XF86Meeting -I1A=XF86Search -I1B=XF86News -I1E=XF86Mail -I1F=XF86HomePage -I23=XF86WWW - -partial alphanumeric_keys -xkb_symbols=compaqik7 -I12=XF86LightBulb -I1E=XF86Mail -I21=XF86Search -I23=Help -I25=XF86VendorHome -I26=XF86HomePage -I32=XF86Shop - -partial alphanumeric_keys -xkb_symbols=compaqik13 -I1E=XF86Mail -I1F=XF86Go -I21=XF86Search -I23=XF86WWW -I32=XF86Shop - -partial alphanumeric_keys -xkb_symbols=compaqik18 -I12=XF86LightBulb -I18=XF86Eject -I1E=XF86Mail -I1F=XF86Go -I21=XF86Search -I23=XF86WWW -I25=XF86VendorHome -I26=XF86Community -I32=XF86Shop -I68=Print - -partial alphanumeric_keys -xkb_symbols=armada -I1A=XF86Search -I1E=XF86Mail -I1F=XF86HomePage -I23=XF86WWW -I6F=XF86AudioMedia - -partial alphanumeric_keys -xkb_symbols=presario -I14=XF86Q -I18=XF86Launch2 -I1E=XF86Mail -I1F=XF86Launch1 -I23=XF86WWW -I32=XF86Shop -I75=XF86AudioMedia - -partial alphanumeric_keys -xkb_symbols=ipaq -FK16=XF86Shop -I02=XF86Standby -I65=XF86Search -I66=XF86Travel -I69=XF86BackForward -I6A=XF86Q -I6C=XF86Mail - - - -partial alphanumeric_keys -xkb_symbols=dell -I12=XF86Mail -I1E=XF86Search -I26=XF86HomePage - -partial alphanumeric_keys -xkb_symbols=dellm65 -I04=XF86PowerOff -LWIN=Super_L - -partial alphanumeric_keys -xkb_symbols=inspiron -I02=XF86AudioStop -I04=XF86AudioNext -I21=XF86Eject -I56=XF86Display -IR7D=XF86AudioPrev -IR7C=XF86AudioPlay, XF86AudioPause - -partial alphanumeric_keys -xkb_symbols=dellusbmm -I02=XF86HomePage -K67=XF86MyComputer -IR7C=XF86AudioMedia - - - -partial alphanumeric_keys -xkb_symbols=diamond -I6D=XF86Go - - - -partial alphanumeric_keys -xkb_symbols=ennyah_dkb1008 -IR7C=XF86AudioMedia - - - -partial alphanumeric_keys -xkb_symbols=genius -I12=XF86AudioRaiseVolume -I17=XF86Calculator -I19=XF86AudioLowerVolume -I1E=XF86Forward -I21=XF86AudioNext -I23=XF86AudioPrev -I25=XF86Back -I26=XF86ScreenSaver -I2E=XF86Mail -I30=XF86Eject -I32=XF86WWW - -partial alphanumeric_keys -xkb_symbols=geniuscomfy2 -I23=Return - - - -partial alphanumeric_keys -xkb_symbols=gyration -FK16=XF86Reload -I02=XF86HomePage -I17=XF86AudioStop -I1E=XF86AudioRaiseVolume -I1F=XF86AudioPlay, XF86AudioPause -I22=XF86AudioNext -I24=XF86AudioPrev -I25=XF86AudioLowerVolume -I26=XF86AudioMute - - - -partial alphanumeric_keys -xkb_symbols=hpi6 -I02=XF86HomePage -I12=XF86Search -I14=XF86VendorHome -I15=XF86Community -I16=XF86AudioMedia -I18=XF86Eject -I1E=XF86Shop -I1F=XF86Launch1 -I26=Help -I27=XF86Finance -I39=Print -I75=Help - -partial alphanumeric_keys -xkb_symbols=hp250x -I12=XF86Tools -I17=XF86Search -I18=XF86Eject -I1E=XF86Mail -I20=XF86AudioMute -I21=XF86Launch5 -I22=XF86Launch3 -I23=XF86Launch2 -I24=XF86Launch4 -I25=XF86Standby -I26=Help -I2E=XF86AudioLowerVolume -I30=XF86AudioRaiseVolume -I32=XF86WWW - -partial alphanumeric_keys -xkb_symbols=hpxe3gc -I71=Help -I72=XF86Launch1 -I73=XF86WWW -I74=XF86Mail - -partial alphanumeric_keys -xkb_symbols=hpxe3gf -I73=Help -I74=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=hpxt1000 -I71=XF86Launch3 -I72=Help -I73=XF86Launch2 -I74=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=hpzt11xx -I71=XF86Launch3 -I72=Help -I73=XF86Launch2 -I74=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=hpdv5 -I12=XF86ScreenSaver -I32=XF86WWW -I75=Help -K6D=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=hpxe4xxx -I70=Help -I71=XF86Launch2 -I73=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=hp500fa -I73=Help -I74=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=hp5xx -I73=Help -I74=XF86Launch1 - - - -partial alphanumeric_keys -xkb_symbols=honeywell_euroboard -I10=XF86Game -I12=XF86AudioPrev -I17=XF86Eject -I18=XF86Launch2 -I19=XF86AudioPlay, XF86AudioPause -I1E=XF86Launch1 -I20=XF86AudioMute -I22=XF86AudioNext -I23=XF86AudioStop -I24=XF86Mail -I25=XF86ScreenSaver -I26=XF86Calculator -I2E=XF86AudioLowerVolume -I30=XF86AudioRaiseVolume -I32=XF86WWW - - - -partial alphanumeric_keys -xkb_symbols=rapidaccess -I12=XF86AudioMute -I17=XF86Launch2 -I1E=XF86AudioLowerVolume -I20=XF86AudioRaiseVolume -I21=XF86AudioNext -I22=XF86AudioPause -I22=XF86AudioPlay, XF86AudioPause -I23=XF86AudioPrev -I24=XF86AudioStop -I25=XF86Standby -I26=Help -I2E=XF86Launch4 -I30=XF86Launch3 -I32=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=rapidaccess2 -I12=XF86AudioNext -I17=XF86Favorites -I1E=XF86AudioMute -I20=XF86AudioStop -I21=XF86AudioLowerVolume -I22=XF86AudioPlay, XF86AudioPause -I23=XF86AudioRaiseVolume -I24=XF86AudioPrev -I25=XF86HomePage -I26=XF86Shop -I2E=XF86Search -I30=XF86MyComputer -I32=XF86VendorHome - -partial alphanumeric_keys -xkb_symbols=thinkpad60 -I1F=XF86VendorHome - -partial alphanumeric_keys -xkb_symbols=ibm_spacesaver -NMLK=type="ONE_LEVEL", -symbols[Group1]= [ Num_Lock ] - - - - -hidden partial alphanumeric_keys -xkb_symbols=logitech_base -I02=XF86HomePage -I15=XF86Community -I16=XF86ScrollClick -I21=XF86VendorHome -I3B=XF86New -I3C=XF86Reply -I43=XF86MyComputer -I44=XF86Documents -I57=XF86Pictures -I58=XF86Music - -hidden partial alphanumeric_keys -xkb_symbols=logitech_set3 -I17=XF86AudioStop -I1E=XF86AudioRaiseVolume -I1F=XF86AudioPlay, XF86AudioPause -I22=XF86AudioNext -I24=XF86AudioPrev -I25=XF86AudioLowerVolume -I26=XF86AudioMute -I69=XF86Go -IR7C=XF86AudioMedia - -partial alphanumeric_keys -xkb_symbols=logiaccess -FK13=XF86MailForward -FK14=XF86Send -I11=XF86Messenger -I12=XF86WebCam - -partial alphanumeric_keys -xkb_symbols=logicda - -partial alphanumeric_keys -xkb_symbols=logicink -I11=XF86Shop -I12=XF86VendorHome -I13=XF86Finance -I14=XF86Start - -partial alphanumeric_keys -xkb_symbols=logiex110 - -partial alphanumeric_keys -xkb_symbols=logiinkse -I11=XF86Messenger -I12=XF86WebCam -I13=XF86VendorHome -I14=XF86Shop - -partial alphanumeric_keys -xkb_symbols=logiinkseusb - -partial alphanumeric_keys -xkb_symbols=logiitc -I2F=XF86AudioRaiseVolume - -I30=XF86Launch1 - -partial alphanumeric_keys -xkb_symbols=logiik -I12=Find -I17=Print -I18=XF86Favorites -I19=XF86Reload -I1E=XF86Search -I20=XF86HotLinks -I22=XF86Forward -I23=XF86HomePage -I24=XF86Stop -I25=XF86OpenURL -I26=XF86AddFavorite -I32=XF86History -I7A=XF86WWW - -partial alphanumeric_keys -xkb_symbols=itouch -I1F=XF86AudioMute -I2B=XF86AudioLowerVolume -I2D=XF86AudioRaiseVolume - -partial alphanumeric_keys -xkb_symbols=logiultraxc -FK16=XF86AudioMute -FK17=XF86AudioLowerVolume -I2B=XF86AudioNext -I2D=XF86AudioPrev -I2C=XF86AudioPlay, XF86AudioPause -KPDC=XF86AudioRaiseVolume - -partial alphanumeric_keys -xkb_symbols=logidinovo -I02=XF86HomePage -I12=XF86Standby -I17=XF86Search -I21=XF86AudioRaiseVolume -K66=XF86AudioLowerVolume -KPDC=XF86AudioMute -IR7C=XF86AudioMedia - -partial alphanumeric_keys -xkb_symbols=logidinovoedge -I02=XF86HomePage -I6C=XF86Mail -FK17=XF86Search -IR7C=XF86AudioMedia - -partial alphanumeric_keys -xkb_symbols=logitech_g15 -AE13=XF86Messenger -HKTG=XF86Launch7 -key