diff options
18 files changed, 2941 insertions, 237 deletions
| diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c index 050152b47d..ab98693649 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ -// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c +// Note: Many advanced functions referenced in this file are defined in /users/gourdo1/gourdo1.c  #include QMK_KEYBOARD_H @@ -52,7 +52,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {          KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          BELOWENC,          KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,          KC_PGUP,          CAPSNUM, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,           KC_PGDN, -        LSFTCAPSWIN,      KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END, +        KC_LSFT,          KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,          KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT      ), @@ -76,10 +76,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      #ifdef GAME_ENABLE      [_FN1] = LAYOUT(          EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP, -        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG, +        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,          _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R,  QK_BOOT,           KC_HOME,          KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______,          _______,           KC_END, -        _______,          RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______, +        _______,          RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,          _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI      ), @@ -95,11 +95,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      #else      [_FN1] = LAYOUT(          EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP, -        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG, +        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,          _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, KC_PAUS, SWAP_L,  SWAP_R,  QK_BOOT,           KC_HOME,          KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______,          _______,           KC_END, -        _______,          RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______, -        _______, KC_WINLCK, _______,                          _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI +        _______,          RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______, +        _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI      ),      #endif  //GAME_ENABLE @@ -125,7 +125,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {          _______, KC_P1,   KC_P2,   KC_P3,   KC_P4,   KC_P5,   KC_P6,   KC_P7,   KC_P8,   KC_P9,   KC_P0,   KC_PMNS, KC_PPLS, _______,          _______,          _______, KC_PGUP, KC_UP,   KC_PGDN, KC_NO,   KC_NO,   KC_NO,   KC_P4,   KC_P5,   KC_P6,   KC_PPLS, _______, _______, _______,          KC_WH_U,          _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,   KC_NO,   KC_P1,   KC_P2,   KC_P3,   KC_PAST, _______,          KC_PENT,          KC_WH_D, -        _______,          KC_NO,   _______, _______, _______, KC_NO,   KC_NO,   KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2, +        _______,          KC_NO,   _______, _______, _______, _______, _______, KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2,          _______, _______, _______,                            KC_PENT,                            _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R      ), @@ -253,6 +253,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          rgb_matrix_set_color(LED_F12, RGB_RED);      } +/*      // System NumLock warning indicator RGB setup      #ifdef INVERT_NUMLOCK_INDICATOR      if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled @@ -271,6 +272,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          rgb_matrix_set_color(LED_FN, RGB_ORANGE2);      }      #endif // INVERT_NUMLOCK_INDICATOR +*/      // CapsLock RGB setup      if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) { @@ -348,12 +350,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          rgb_matrix_set_color(LED_R8, RGB_RED);          rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);          rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE); + +        // Indicator for paddle game enabled in build          #ifdef GAME_ENABLE          rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);          #else          rgb_matrix_set_color(LED_P, RGB_RED);          #endif // GAME_ENABLE +        // System NumLock warning indicator RGB setup +        #ifdef INVERT_NUMLOCK_INDICATOR  +        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #else +        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #endif // INVERT_NUMLOCK_INDICATOR +          //Add RGB statuses for user.config toggles          if (user_config.rgb_hilite_caps) {          rgb_matrix_set_color(LED_1, RGB_GREEN); @@ -395,6 +410,11 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          } else {          rgb_matrix_set_color(LED_8, RGB_PURPLE);          } +        if (user_config.autocorrect) { +        rgb_matrix_set_color(LED_9, RGB_GREEN); +        } else { +        rgb_matrix_set_color(LED_9, RGB_PURPLE); +        }          // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code          uint16_t timeout_threshold = get_timeout_threshold(); @@ -411,6 +431,15 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          // Numpad & Mouse Keys overlay RGB      case _NUMPADMOUSE: +        #ifdef INVERT_NUMLOCK_INDICATOR  +        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #else +        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #endif // INVERT_NUMLOCK_INDICATOR          if (user_config.rgb_hilite_numpad) {              for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {                  rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE); diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md index c378276434..aebccf6d14 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md @@ -1,69 +1,76 @@ -# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ANSI layout +# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro Keyboard Layouts -This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) GMMK Pro layout with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB effects and controls. +These Windows-centric layouts are based on Jonavin's GMMK Pro [layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, Pascal Getreuer's [autocorrect](https://getreuer.info/posts/keyboards/autocorrection/), Tomas Guinan's [paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls and effects.   -## Features: +* Up-to-date [Changelog](https://github.com/gourdo1/gmmkpro-media/blob/main/changelog.md) +* Latest [ANSI firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)) +* Latest [ISO firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_iso_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)) +* Printable Keyboard [Cheatsheet](https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf) + +## Features  ### Core Functionality -* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde key) to view toggle-able features. (added Jun 29, 2022) -* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022) +* Support for both [ANSI](https://keebnews.com/ansi-vs-iso/) and [ISO](https://keebnews.com/ansi-vs-iso/) keyboard layouts. +* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde on ANSI; the key left of '1' on ISO layouts) to view toggle-able settings. +* [VIA](https://www.caniusevia.com/) support enabled. +* AutoCorrection:  Pascal Getreuer's AutoCorrect code incorporated with 400 word dictionary on words > 4 characters.  * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled  * [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R -* 1000Hz polling rate with 5ms debounce time for quick response in games -* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse -* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry -* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys -* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time. (added Feb 25, 2022) -* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor (added Apr 11, 2022) -* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted) -* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit (added May 5, 2022) -* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/ (added May 14, 2022) -* Single-handed shortcut for WinKey-L (lock Windows): [FN]L (added May 17, 2022) -* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com. (added Apr 7, 2022) -* FN-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) -* Home key on F13, Del key right of Backspace -* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer) +* 1000Hz polling rate with 5ms debounce time for quick response in games. +* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse. +* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry. +* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys. +* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time. +* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor. +* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted). +* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit. +* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/ +* Single-handed shortcut for WinKey-L (lock Windows): [FN]L +* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com. +* [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) accessible via [FN]Backslash for ANSI and FN(key next to Left Shift) for ISO  * PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13  * [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple) -* Double tap ESC any time to revert to base layer (added Feb 26, 2022) -* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022) -* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022) +* Double tap ESC any time to revert to base layer. +* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes. +* RGB backlight now remembers last color & effect settings after power down.  ### Quick & Easy Customization  * Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence. -* Print current settings by opening a text editor and pressing [FN]~ (CAUTION: verbose!) +* Print current settings by opening a text editor and pressing [FN]~ (the key left of '1' on ISO layout keyboards)  * Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF)  #### Toggle-able Settings: -    1. CapsLock RGB - highlight under alpha keys -    2. Numpad RGB - highlight under numpad layer keys +    1. CapsLock RGB - Highlight under alpha keys +    2. Numpad RGB - Highlight under numpad layer keys      3. ESC key - Double tap ESC key to go to base layer      4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC      5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock -    6. Encoder button - default mutes volume; alternate plays/pauses media +    6. Encoder button - Default mutes volume; alternate plays/pauses media      7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL      8. Modded-Space override - Use standard Space in place of modded-Space functions +    9. AutoCorrect - Internal (English) AutoCorrect; default is enabled +    0. (ISO layouts only) CapsLock highlights extended alpha keys  ### Numpad + Mouse Keys (Capslock key)  * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting -* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022) +* Numpad uses Space-bar as Enter for rapid number entry.  * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)  * FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)  * Double zero on comma key. -* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022) +* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard.  * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel  * Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green  ### Encoder Functionality  * Default knob turn changes volume; button press toggles mute -* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022) +* Exponential encoder: quick repeated volume up doubles increase; quick repeated volume down triples decrease.  * FN + knob turn changes RGB idle timeout -* FN + knob push puts PC to Sleep (Added May 14, 2022) +* FN + knob push puts PC to Sleep  * holding Left Shift changes layers  * holding Right Shift navigates page up/down  * holding Left Ctrl navigates prev/next word @@ -86,44 +93,24 @@ This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/  * RGB backlight effect speed: [FN]left/right  * RGB backlight hue cycle: [FN]A/D  * RGB backlight brightness: [FN]W/S -* RGB backlight saturation: [FN]Q/E (added Feb 4, 2022) +* RGB backlight saturation: [FN]Q/E  * RGB backlight night mode toggle: [FN]Z (indicators still work) -* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes) (updated June 28, 2022) +* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes)      *  F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes  * [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle -* Left side RGB indicators in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green). +* Left side RGB indicators in order from top: Scroll Lock (red), Numpad (blue), Capslock (green).  ### Advanced Controls -* [FN]\ to get to bootloader mode -* [FN][ESC] to clear EEPROM (added Apr 11, 2022) -* [FN]R to toggle N-key Rollover (added Apr 11, 2022) -* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022) -* [FN]L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022) -* [FN][Encoder press] to sleep Windows PC (added May 14, 2022) - -Link to latest firmware binary: https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin - -Link to cheatsheet: https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf - - -## rules.mk Options - -STARTUP_NUMLOCK_ON = yes             - Turns on NUMLOCK by default - -ENCODER_DEFAULTACTIONS_ENABLE = yes  - Enabled default encoder functions - -TD_LSFT_CAPSLOCK_ENABLE = yes        - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS - -IDLE_TIMEOUT_ENABLE = yes            - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically - -INVERT_NUMLOCK_INDICATOR             - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should  be off when numpad layer is active unless you have an external numpad. - -COLEMAK_LAYER_ENABLE = yes           - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer. - -GAME_ENABLE ?= yes                   - Enables Paddle Game +* [FN]\ or [FN]B to get to bootloader mode (use key next to Left Shift on ISO) +* [FN][ESC] to clear EEPROM +* [FN]R to toggle N-key Rollover +* [FN]N to toggle system numlock +* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete +* [FN]L is single-handed shortcut to Win-L (lock Windows) +* [FN][Encoder press] to sleep Windows PC -## Layer Diagrams +## Layer Diagrams (ANSI)  ### Base layer   diff --git a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk index 585f7846dd..3a6786af68 100644 --- a/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk +++ b/keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk @@ -5,7 +5,7 @@ BOOTMAGIC_ENABLE = yes         # Enable Bootmagic Lite  VIA_ENABLE = yes  MOUSEKEY_ENABLE = yes -TAP_DANCE_ENABLE = yes +TAP_DANCE_ENABLE = no  CAPS_WORD_ENABLE = yes         # Enable built-in Caps Word functionality  IDLE_TIMEOUT_ENABLE = yes  STARTUP_NUMLOCK_ON = yes diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c index 24a1e8a359..776fd210f3 100644 --- a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ -// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c +// Note: Many advanced functions referenced in this file are defined in /users/gourdo1/gourdo1.c  #include QMK_KEYBOARD_H @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {          KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          BELOWENC,          KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,                   KC_PGUP,          CAPSNUM, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,           KC_PGDN, -        LSFTCAPSWIN,KC_NUBS, KC_Z, KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END, +        KC_LSFT, KC_NUBS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,          KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT      ), @@ -68,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {       * |---------+------+------+------+------+------+------+------+------+------+------+------+------+       ++------|       * |  Capslock  |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | ___ | ____ || End  |       * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------| -     * |  ____ |RESET |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD  | ______ ||RGBMOD|| ____ | +     * | ____ |QK_BOOT|RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD  | ______ ||RGBMOD|| ____ |       * |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|       * |  ____  | WinKyLk |  ____  |               _____                  | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI|       * `------------------------------------------------------------------------------------------------------------' @@ -77,10 +77,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      #ifdef GAME_ENABLE      [_FN1] = LAYOUT(          EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP, -        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG, +        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR,TG_ENGCAP,RGB_TOD,RGB_TOI, _______,           RGB_TOG,          _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R,                     KC_HOME,          KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______, _______, _______,           KC_END, -        _______, RESET,   RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______, +        _______, QK_BOOT, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,          _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI      ), @@ -96,11 +96,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {      #else      [_FN1] = LAYOUT(          EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP, -        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG, +        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR,TG_ENGCAP,RGB_TOD,RGB_TOI, _______,           RGB_TOG,          _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, KC_PAUS, SWAP_L,  SWAP_R,                     KC_HOME,          KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______, _______, _______,           KC_END, -        _______, RESET,   RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______, -        _______, KC_WINLCK, _______,                          _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI +        _______, QK_BOOT, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______, +        _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI      ),      #endif  //GAME_ENABLE @@ -126,7 +126,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {          _______, KC_P1,   KC_P2,   KC_P3,   KC_P4,   KC_P5,   KC_P6,   KC_P7,   KC_P8,   KC_P9,   KC_P0,   KC_PMNS, KC_PPLS, _______,          _______,          _______, KC_PGUP, KC_UP,   KC_PGDN, KC_NO,   KC_NO,   KC_NO,   KC_P4,   KC_P5,   KC_P6,   KC_PPLS, _______, _______,                   KC_WH_U,          _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,   KC_NO,   KC_P1,   KC_P2,   KC_P3,   KC_PAST, _______, _______, KC_PENT,          KC_WH_D, -        _______, _______, KC_NO,   _______, _______, _______, KC_NO,   KC_NO,   KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2, +        _______, _______, KC_NO,   _______, _______, _______, _______, _______, KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2,          _______, _______, _______,                            KC_PENT,                            _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R      ), @@ -254,6 +254,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          rgb_matrix_set_color(LED_F12, RGB_RED);      } +/*      // System NumLock warning indicator RGB setup      #ifdef INVERT_NUMLOCK_INDICATOR      if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled @@ -272,12 +273,20 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          rgb_matrix_set_color(LED_FN, RGB_ORANGE2);      }      #endif // INVERT_NUMLOCK_INDICATOR +*/      // CapsLock RGB setup      if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {          if (user_config.rgb_hilite_caps) { -            for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) { -                rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE); +            if (user_config.rgb_english_caps) { +                for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) { +                    rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE); +                } +            } +            else { +                for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS_DE); i++) { +                    rgb_matrix_set_color(LED_LIST_LETTERS_DE[i], RGB_CHARTREUSE); +                }              }              rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);              rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE); @@ -349,12 +358,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          rgb_matrix_set_color(LED_R8, RGB_RED);          rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);          rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE); + +        // Indicator for paddle game enabled in build          #ifdef GAME_ENABLE          rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);          #else          rgb_matrix_set_color(LED_P, RGB_RED);          #endif // GAME_ENABLE +        // System NumLock warning indicator RGB setup +        #ifdef INVERT_NUMLOCK_INDICATOR  +        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #else +        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #endif // INVERT_NUMLOCK_INDICATOR +          //Add RGB statuses for user.config toggles          if (user_config.rgb_hilite_caps) {          rgb_matrix_set_color(LED_1, RGB_GREEN); @@ -396,6 +418,16 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          } else {          rgb_matrix_set_color(LED_8, RGB_PURPLE);          } +        if (user_config.autocorrect) { +        rgb_matrix_set_color(LED_9, RGB_GREEN); +        } else { +        rgb_matrix_set_color(LED_9, RGB_PURPLE); +        } +        if (user_config.rgb_english_caps) { +        rgb_matrix_set_color(LED_0, RGB_GREEN); +        } else { +        rgb_matrix_set_color(LED_0, RGB_PURPLE); +        }          // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code          uint16_t timeout_threshold = get_timeout_threshold(); @@ -412,6 +444,15 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {          // Numpad & Mouse Keys overlay RGB      case _NUMPADMOUSE: +        #ifdef INVERT_NUMLOCK_INDICATOR  +        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #else +        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON +            rgb_matrix_set_color(LED_N, RGB_ORANGE2); +        } +        #endif // INVERT_NUMLOCK_INDICATOR          if (user_config.rgb_hilite_numpad) {              for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {                  rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE); diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md index 31f4539fde..aebccf6d14 100644 --- a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md @@ -1,54 +1,76 @@ -# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ISO layout +# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro Keyboard Layouts -This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/iso/keymaps/jonavin) GMMK Pro layout with several additions, fixes, a tweaked keymap, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls. +These Windows-centric layouts are based on Jonavin's GMMK Pro [layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, Pascal Getreuer's [autocorrect](https://getreuer.info/posts/keyboards/autocorrection/), Tomas Guinan's [paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls and effects.   -## Features: +* Up-to-date [Changelog](https://github.com/gourdo1/gmmkpro-media/blob/main/changelog.md) +* Latest [ANSI firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)) +* Latest [ISO firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_iso_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)) +* Printable Keyboard [Cheatsheet](https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf) + +## Features  ### Core Functionality -* ISO layout (added July xx, 2022) -* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022) +* Support for both [ANSI](https://keebnews.com/ansi-vs-iso/) and [ISO](https://keebnews.com/ansi-vs-iso/) keyboard layouts. +* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde on ANSI; the key left of '1' on ISO layouts) to view toggle-able settings. +* [VIA](https://www.caniusevia.com/) support enabled. +* AutoCorrection:  Pascal Getreuer's AutoCorrect code incorporated with 400 word dictionary on words > 4 characters.  * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled -* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with Fn+R -* 1000Hz polling rate with 5ms debounce time for quick response in games -* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you on the road? Use cursor keys to move the mouse. -* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry -* Gaming mode (Fn+Win-key) locks out Win-key as well as double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming related keys -* [Caps Word](https://getreuer.info/posts/keyboards/caps-word/index.html) enabled: To capitalize the next word only, press and release both left and right shift keys at the same time. (added Feb 25, 2022) -* Multi-monitor app moving shortcuts: Fn+[,] (square brackets) to move current app window to next monitor (added Apr 11, 2022) -* Capslock toggled by double tap of Left Shift key or Fn + Capslock (RGB green highlighted) -* Paddle game accessible via Fn+P; Hit Fn+P again or double tap ESC to exit (added May 5, 2022) -* Single-handed shortcut for Ctrl-Alt-Delete: Fn+/ (added May 14, 2022) -* Single-handed shortcut for Win-L (lock Windows): Fn+L (added May 17, 2022) -* Domain shortcuts: Fn+.=".com", Fn+O="outlook.com", Fn+Y="yahoo.com", Fn+H="hotmail.com", Fn+G="gmail.com". (added Apr 7, 2022) -* Fn-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) -* Home key on F13, Del key right of Backspace -* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer) -* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: Fn+F11, Fn+F12, Fn+F13 -* [Colemak](https://colemak.com/) key layout support (Layer accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple) -* Double tap ESC any time to revert to base layer (added Feb 26, 2022) -* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022) -* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022) +* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R +* 1000Hz polling rate with 5ms debounce time for quick response in games. +* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse. +* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry. +* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys. +* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time. +* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor. +* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted). +* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit. +* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/ +* Single-handed shortcut for WinKey-L (lock Windows): [FN]L +* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com. +* [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) accessible via [FN]Backslash for ANSI and FN(key next to Left Shift) for ISO +* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13 +* [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple) +* Double tap ESC any time to revert to base layer. +* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes. +* RGB backlight now remembers last color & effect settings after power down. + +### Quick & Easy Customization +* Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence. +* Print current settings by opening a text editor and pressing [FN]~ (the key left of '1' on ISO layout keyboards) +* Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF) + +#### Toggle-able Settings: +    1. CapsLock RGB - Highlight under alpha keys +    2. Numpad RGB - Highlight under numpad layer keys +    3. ESC key - Double tap ESC key to go to base layer +    4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC +    5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock +    6. Encoder button - Default mutes volume; alternate plays/pauses media +    7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL +    8. Modded-Space override - Use standard Space in place of modded-Space functions +    9. AutoCorrect - Internal (English) AutoCorrect; default is enabled +    0. (ISO layouts only) CapsLock highlights extended alpha keys  ### Numpad + Mouse Keys (Capslock key)  * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting -* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022) +* Numpad uses Space-bar as Enter for rapid number entry.  * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use) -* Fn and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output (Fn+N to toggle) +* FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)  * Double zero on comma key. -* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022) +* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard.  * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel  * Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green  ### Encoder Functionality  * Default knob turn changes volume; button press toggles mute -* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022) -* Fn + knob turn changes RGB idle timeout -* Fn + knob push puts PC to Sleep (Added May 14, 2022) +* Exponential encoder: quick repeated volume up doubles increase; quick repeated volume down triples decrease. +* FN + knob turn changes RGB idle timeout +* FN + knob push puts PC to Sleep  * holding Left Shift changes layers  * holding Right Shift navigates page up/down  * holding Left Ctrl navigates prev/next word @@ -58,65 +80,45 @@ This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/q  ### Paddle Game  * Based on [Tomas Guinan's excellent GMMK Pro paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) -* Paddle Game playable by pressing Fn+P (P lights up green in Fn layer if game is enabled in firmware, otherwise it lights up red) +* Paddle Game playable by pressing [FN]P (P lights up green in FN layer if game is enabled in firmware, otherwise it lights up red)  * Use rotary encoder to control paddle  * Contains 12 levels, indicated by blue LED on F-key row  * Player has 4 lives, indicated by nav cluster  * Deflect white balls while avoiding red ones -* Use Fn+P, double tap ESC or otherwise change layer to quit game +* Use [FN]P, double tap ESC or otherwise change layer to quit game  ### Global RGB Controls -* RGB backlight lighting effect: Fn+up/down -* RGB backlight effect speed: Fn+left/right -* RGB backlight hue cycle: Fn+A/D -* RGB backlight brightness: Fn+W/S -* RGB backlight saturation: Fn+Q/E (added Feb 4, 2022) -* RGB backlight night mode toggle: Fn+Z (indicators still work) -* RGB backlight timeout: Fn+Encoder or "-" and "=" (default 15 minutes) (updated Apr 7, 2022) -    * indicators in Fn layer using RGB in F-key and number rows to show the current timeout in minutes -* Fn+Z to turn off RGB backlighting (indicator lights still work); press again to toggle -* RGB indicators on left side LEDs in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green). +* RGB backlight lighting effect: [FN]up/down +* RGB backlight effect speed: [FN]left/right +* RGB backlight hue cycle: [FN]A/D +* RGB backlight brightness: [FN]W/S +* RGB backlight saturation: [FN]Q/E +* RGB backlight night mode toggle: [FN]Z (indicators still work) +* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes) +    *  F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes +* [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle +* Left side RGB indicators in order from top: Scroll Lock (red), Numpad (blue), Capslock (green).  ### Advanced Controls -* Fn+\ to get to bootloader mode -* Fn+[ESC] to clear EEPROM (then unplug and re-plug) (added Apr 11, 2022) -* Fn+R to toggle N-key Rollover (added Apr 11, 2022) -* Fn+/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022) -* Fn+L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022) -* Fn+[Encoder press] to sleep Windows PC (added May 14, 2022) - -Link to latest firmware binary: https://github.com/gourdo1/media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin - -Link to cheatsheet: https://github.com/gourdo1/media/raw/main/GMMK_Pro_Cheatsheet.pdf - - -## rules.mk Options - -STARTUP_NUMLOCK_ON = yes             - Turns on NUMLOCK by default - -ENCODER_DEFAULTACTIONS_ENABLE = yes  - Enabled default encoder functions - -TD_LSFT_CAPSLOCK_ENABLE = yes        - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS - -IDLE_TIMEOUT_ENABLE = yes            - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically - -INVERT_NUMLOCK_INDICATOR             - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should  be off when numpad layer is active unless you have an external numpad. - -COLEMAK_LAYER_ENABLE = yes           - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer. - -GAME_ENABLE ?= yes                   - Enables Paddle Game +* [FN]\ or [FN]B to get to bootloader mode (use key next to Left Shift on ISO) +* [FN][ESC] to clear EEPROM +* [FN]R to toggle N-key Rollover +* [FN]N to toggle system numlock +* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete +* [FN]L is single-handed shortcut to Win-L (lock Windows) +* [FN][Encoder press] to sleep Windows PC -## Layer Diagrams +## Layer Diagrams (ANSI)  ### Base layer - + -### Fn Layer - +### FN Layer +  ### Layer 2 (Numpad) - +  ### COLEMAK layer   diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h index 36e42ee7f4..abcdb82aeb 100644 --- a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h @@ -200,16 +200,6 @@ const uint8_t LED_LIST_NUMROW[] = {  };  const uint8_t LED_LIST_LETTERS[] = { -/*    LED_1, -    LED_2, -    LED_3, -    LED_4, -    LED_5, -    LED_6, -    LED_7, -    LED_8, -    LED_9, -    LED_0, */      LED_Q,      LED_W,      LED_E, @@ -238,6 +228,38 @@ const uint8_t LED_LIST_LETTERS[] = {      LED_M  }; +const uint8_t LED_LIST_LETTERS_DE[] = { +    LED_Q, +    LED_W, +    LED_E, +    LED_R, +    LED_T, +    LED_Y, +    LED_U, +    LED_I, +    LED_O, +    LED_P, +    LED_A, +    LED_S, +    LED_D, +    LED_F, +    LED_G, +    LED_H, +    LED_J, +    LED_K, +    LED_L, +    LED_Z, +    LED_X, +    LED_C, +    LED_V, +    LED_B, +    LED_N, +    LED_M, +    LED_SCLN, +    LED_LBRC, +    LED_QUOT +}; +  const uint8_t LED_LIST_NUMPAD[] = {      LED_1,      LED_2, diff --git a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk index 37e81e3dbb..1eb14ebbef 100644 --- a/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk +++ b/keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk @@ -4,7 +4,7 @@ COMMAND_ENABLE = no  MOUSEKEY_ENABLE = yes  VIA_ENABLE = yes -TAP_DANCE_ENABLE = yes +TAP_DANCE_ENABLE = no  BOOTMAGIC_ENABLE = yes         # Enable Bootmagic Lite  CAPS_WORD_ENABLE = yes         # Enable built-in Caps Word functionality diff --git a/users/gourdo1/autocorrect/autocorrection.c b/users/gourdo1/autocorrect/autocorrection.c new file mode 100644 index 0000000000..bc711016d9 --- /dev/null +++ b/users/gourdo1/autocorrect/autocorrection.c @@ -0,0 +1,182 @@ +// Copyright 2021-2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +//     https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// For full documentation, see +// https://getreuer.info/posts/keyboards/autocorrection + +#include "autocorrection.h" + +#include <string.h> +#include "autocorrection_data.h" + +#if AUTOCORRECTION_MIN_LENGTH < 4 +// Odd output or hard locks on the board have been observed when the min typo +// length is 3 or lower (https://github.com/getreuer/qmk-keymap/issues/2). +// Additionally, autocorrection entries for short typos are more likely to false +// trigger, so it is suggested that typos be at least 5 characters. +#error "Min typo length is less than 4. Autocorrection may behave poorly." +#endif + +bool process_autocorrection(uint16_t keycode, keyrecord_t* record) { +    if (user_config.autocorrect) { +      static uint8_t typo_buffer[AUTOCORRECTION_MAX_LENGTH] = {0}; +      static uint8_t typo_buffer_size = 0; + +      // Ignore key release; we only process key presses. +      if (!record->event.pressed) { return true; } + +    #ifndef NO_ACTION_ONESHOT +      const uint8_t mods = get_mods() | get_oneshot_mods(); +    #else +      const uint8_t mods = get_mods(); +    #endif  // NO_ACTION_ONESHOT +      // Disable autocorrection while a mod other than shift is active. +      if ((mods & ~MOD_MASK_SHIFT) != 0) { +        typo_buffer_size = 0; +        return true; +      } + +      // The following switch cases address various kinds of keycodes. This logic is +      // split over two switches rather than merged into one. The first switch may +      // extract a basic keycode which is then further handled by the second switch, +      // e.g. a layer-tap key with Caps Lock `LT(layer, KC_CAPS)`. +      switch (keycode) { +    #ifndef NO_ACTION_TAPPING +        case QK_MOD_TAP ... QK_MOD_TAP_MAX:  // Tap-hold keys. +    #ifndef NO_ACTION_LAYER +        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: +    #endif  // NO_ACTION_LAYER +          // Ignore when tap-hold keys are held. +          if (record->tap.count == 0) { return true; } +          // Otherwise when tapped, get the basic keycode. +          // Fallthrough intended. +    #endif  // NO_ACTION_TAPPING + +        // Handle shifted keys, e.g. symbols like KC_EXLM = S(KC_1). +        case QK_LSFT ... QK_LSFT + 255: +        case QK_RSFT ... QK_RSFT + 255: +          keycode &= 0xff;  // Get the basic keycode. +          break; + +        // NOTE: Space Cadet keys expose no info to check whether they are being +        // tapped vs. held. This makes autocorrection ambiguous, e.g. KC_LCPO might +        // be '(', which we would treat as a word break, or it might be shift, which +        // we would treat as having no effect. To behave cautiously, we allow Space +        // Cadet keycodes to fall to the logic below and clear autocorrection state. +      } + +      switch (keycode) { +        // Ignore shifts, Caps Lock, one-shot mods, and layer switch keys. +        case KC_NO: +        case KC_LSFT: +        case KC_RSFT: +        case KC_CAPS: +        case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: +        case QK_TO ... QK_TO_MAX: +        case QK_MOMENTARY ... QK_MOMENTARY_MAX: +        case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: +        case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: +        case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: +        case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: +        case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: +          return true;  // Ignore these keys. +      } + +      if (keycode == KC_QUOT) { +        // Treat " (shifted ') as a word boundary. +        if ((mods & MOD_MASK_SHIFT) != 0) { keycode = KC_SPC; } +      } else if (!(KC_A <= keycode && keycode <= KC_Z)) { +        if (keycode == KC_BSPC) { +          // Remove last character from the buffer. +          if (typo_buffer_size > 0) { --typo_buffer_size; } +          return true; +        } else if (KC_1 <= keycode && keycode <= KC_SLSH && keycode != KC_ESC) { +          // Set a word boundary if space, period, digit, etc. is pressed. +          // Behave more conservatively for the enter key. Reset, so that enter +          // can't be used on a word ending. +          if (keycode == KC_ENT) { typo_buffer_size = 0; } +          keycode = KC_SPC; +        } else { +          // Clear state if some other non-alpha key is pressed. +          typo_buffer_size = 0; +          return true; +        } +      } + +      // If the buffer is full, rotate it to discard the oldest character. +      if (typo_buffer_size >= AUTOCORRECTION_MAX_LENGTH) { +        memmove(typo_buffer, typo_buffer + 1, AUTOCORRECTION_MAX_LENGTH - 1); +        typo_buffer_size = AUTOCORRECTION_MAX_LENGTH - 1; +      } + +      // Append `keycode` to the buffer. +      // NOTE: `keycode` must be a basic keycode (0-255) by this point. +      typo_buffer[typo_buffer_size++] = (uint8_t) keycode; +      // Early return if not many characters have been buffered so far. +      if (typo_buffer_size < AUTOCORRECTION_MIN_LENGTH) { return true; } + +      // Check whether the buffer ends in a typo. This is done using a trie +      // stored in `autocorrection_data`. +      uint16_t state = 0; +      uint8_t code = pgm_read_byte(autocorrection_data + state); +      for (int i = typo_buffer_size - 1; i >= 0; --i) { +        const uint8_t key_i = typo_buffer[i]; + +        if (code & 64) { // Check for match in node with multiple children. +          code &= 63; +          for (; code != key_i; +              code = pgm_read_byte(autocorrection_data + (state += 3))) { +            if (!code) { return true; } +          } + +          // Follow link to child node. +          state = (uint16_t)( +              (uint_fast16_t)pgm_read_byte(autocorrection_data + state + 1) +              | (uint_fast16_t)pgm_read_byte(autocorrection_data + state + 2) << 8); +        // Otherwise check for match in node with a single child. +        } else if (code != key_i) { +          return true; +        } else if (!(code = pgm_read_byte(autocorrection_data + (++state)))) { +          ++state; +        } + +        // Stop if `state` becomes an invalid index. This should not normally +        // happen, it is a safeguard in case of a bug, data corruption, etc. +        if (state >= sizeof(autocorrection_data)) { +          return true; +        } + +        // Read first byte of the next node. +        code = pgm_read_byte(autocorrection_data + state); + +        if (code & 128) { // A typo was found! Apply autocorrection. +          const int backspaces = code & 63; +          for (int i = 0; i < backspaces; ++i) { tap_code(KC_BSPC); } +            send_string_P((char const*)(autocorrection_data + state + 1)); + +          if (keycode == KC_SPC) { +            typo_buffer[0] = KC_SPC; +            typo_buffer_size = 1; +            return true; +          } else { +            typo_buffer_size = 0; +            return false; +          } +        } +      } +      return true; +    } +    return true; +} diff --git a/users/gourdo1/autocorrect/autocorrection.h b/users/gourdo1/autocorrect/autocorrection.h new file mode 100644 index 0000000000..d344a815f7 --- /dev/null +++ b/users/gourdo1/autocorrect/autocorrection.h @@ -0,0 +1,40 @@ +// Copyright 2021-2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +//     https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// Autocorrection on your keyboard. +// +// This library implements rudimentary autocorrection, automatically detecting +// and fixing some misspellings. Beware that the autocorrection logic is +// unaware of hotkey or mouse-based cursor movement. +// +// For full documentation, see +// https://getreuer.info/posts/keyboards/autocorrection + +#pragma once + +#include "quantum.h" + +#include "gourdo1.h" + +#ifdef __cplusplus +extern "C" { +#endif + +bool process_autocorrection(uint16_t keycode, keyrecord_t* record); + +#ifdef __cplusplus +} +#endif + diff --git a/users/gourdo1/autocorrect/autocorrection_data.h b/users/gourdo1/autocorrect/autocorrection_data.h new file mode 100644 index 0000000000..66518201e2 --- /dev/null +++ b/users/gourdo1/autocorrect/autocorrection_data.h @@ -0,0 +1,722 @@ +// Generated code. + +// Autocorrection dictionary (400 entries): +//   :acheiv    -> achiev +//   :agian     -> again +//   :agred     -> agreed +//   :ajust     -> adjust +//   :alot:     -> a lot +//   :andteh    -> and the +//   :andthe    -> and the +//   :anual     -> annual +//   :asign     -> assign +//   :aslo:     -> also +//   :asthe     -> as the +//   :atthe     -> at the +//   :casue     -> cause +//   :choses    -> chooses +//   :eveyr     -> every +//   :foudn     -> found +//   :gaurd     -> guard +//   :goign     -> going +//   :gonig     -> going +//   :graet     -> great +//   :grammer   -> grammar +//   :guage     -> gauge +//   :haev      -> have +//   :hapen     -> happen +//   :htere     -> there +//   :htikn     -> think +//   :htink     -> think +//   :hwihc     -> which +//   :hwile     -> while +//   :idaes     -> ideas +//   :jstu:     -> just +//   :jsut:     -> just +//   :knwo      -> know +//   :konw      -> know +//   :kwno      -> know +//   :moeny     -> money +//   :ocuntry   -> country +//   :ocur      -> occur +//   :olther    -> other +//   :otehr     -> other +//   :owudl     -> would +//   :rference  -> reference +//   :sicne     -> since +//   :socre     -> score +//   :szie      -> size +//   :the:the:  -> the +//   :theri     -> their +//   :thier     -> their +//   :thsoe     -> those +//   :tothe     -> to the +//   :ture      -> true +//   :turth     -> truth +//   :uesd:     -> used +//   :usally    -> usually +//   :yaers     -> years +//   :yeasr     -> years +//   abbout     -> about +//   aberation  -> aberration +//   abilties   -> abilities +//   abilty     -> ability +//   abotu      -> about +//   abouta     -> about a +//   aboutit    -> about it +//   aboutthe   -> about the +//   abvove     -> above +//   accesories -> accessories +//   accomodate -> accommodate +//   accross    -> across +//   acommodate -> accommodate +//   acomplish  -> accomplish +//   actualy    -> actually +//   acurate    -> accurate +//   acutally   -> actually +//   addtion    -> addition +//   adviced    -> advised +//   againnst   -> against +//   aganist    -> against +//   aggreed    -> agreed +//   agianst    -> against +//   ahppn      -> happen +//   aledge     -> allege +//   alledge    -> allege +//   allign     -> align +//   almsot     -> almost +//   alomst     -> almost +//   alwasy     -> always +//   alwyas     -> always +//   amature    -> amateur +//   anohter    -> another +//   anomolous  -> anomalous +//   anomoly    -> anomaly +//   anytying   -> anything +//   aparent    -> apparent +//   aparrent   -> apparent +//   apparant   -> apparent +//   apparrent  -> apparent +//   aquire     -> acquire +//   aroud      -> around +//   arround    -> around +//   arund      -> around +//   asthetic   -> aesthetic +//   auxilary   -> auxiliary +//   auxillary  -> auxiliary +//   auxilliary -> auxiliary +//   availabe   -> available +//   availaible -> available +//   availalbe  -> available +//   availble   -> available +//   availiable -> available +//   avalable   -> available +//   avaliable  -> available +//   avilable   -> available +//   baceause   -> because +//   bandwith   -> bandwidth +//   bankrupcy  -> bankruptcy +//   baout      -> about +//   beacuse    -> because +//   becasue    -> because +//   beccause   -> because +//   becouse    -> because +//   becuase    -> because +//   bedore     -> before +//   beeing     -> being +//   befoer     -> before +//   begginer   -> beginner +//   beleif     -> belief +//   beleive    -> believe +//   belive     -> believe +//   beteen     -> between +//   beween     -> between +//   bewteen    -> between +//   breif      -> brief +//   burried    -> buried +//   busness    -> business +//   bussiness  -> business +//   cacheing   -> caching +//   calander   -> calendar +//   caluclate  -> calculate +//   caluculate -> calculate +//   calulate   -> calculate +//   catagory   -> category +//   cauhgt     -> caught +//   ceratin    -> certain +//   certian    -> certain +//   cheif      -> chief +//   chekc      -> check +//   childen    -> children +//   chnage     -> change +//   choosen    -> chosen +//   cieling    -> ceiling +//   circut     -> circuit +//   claer      -> clear +//   clasic     -> classic +//   cmoputer   -> computer +//   coform     -> conform +//   cognizent  -> cognizant +//   collegue   -> colleague +//   comapny    -> company +//   comittee   -> committee +//   comming:   -> coming +//   commitee   -> committee +//   competance -> competence +//   competant  -> competent +//   complier   -> compiler +//   concensus  -> consensus +//   considerd  -> considered +//   contian    -> contain +//   copywrite: -> copyright +//   cosnt      -> const +//   coudl      -> could +//   dervied    -> derived +//   desicion   -> decision +//   didnot     -> did not +//   diferent   -> different +//   diferrent  -> different +//   differnt   -> different +//   diffrent   -> different +//   divison    -> division +//   doulbe     -> double +//   dyanmic    -> dynamic +//   effecient  -> efficient +//   elasped    -> elapsed +//   eligable   -> eligible +//   elpased    -> elapsed +//   embarass   -> embarrass +//   embeded    -> embedded +//   encypt     -> encrypt +//   excecut    -> execut +//   excercise  -> exercise +//   failse     -> false +//   fales      -> false +//   fasle      -> false +//   feild      -> field +//   finaly     -> finally +//   firend     -> friend +//   firts      -> first +//   fitler     -> filter +//   flase      -> false +//   follwo     -> follow +//   foriegn    -> foreign +//   foward     -> forward +//   fraciton   -> fraction +//   freind     -> friend +//   frequecy   -> frequency +//   fromthe    -> from the +//   fucntion   -> function +//   fufill     -> fulfill +//   fullfill   -> fulfill +//   futher     -> further +//   ganerate   -> generate +//   garantee   -> guarantee +//   gaurantee  -> guarantee +//   generaly   -> generally +//   govement   -> government +//   govenment  -> government +//   goverment  -> government +//   governmnet -> government +//   govorment  -> government +//   govornment -> government +//   greatful   -> grateful +//   guaratee   -> guarantee +//   heigher    -> higher +//   heigth     -> height +//   heirarchy  -> hierarchy +//   higest     -> highest +//   howver     -> however +//   hydogen    -> hydrogen +//   hygeine    -> hygiene +//   hypocracy  -> hypocrisy +//   hypocrasy  -> hypocrisy +//   hypocricy  -> hypocrisy +//   hypocrit:  -> hypocrite +//   iamge      -> image +//   importamt  -> important +//   inclued    -> include +//   indeces    -> indices +//   indecies   -> indices +//   indicies   -> indices +//   inital     -> initial +//   insted     -> instead +//   interator  -> iterator +//   intput     -> input +//   intrest    -> interest +//   invliad    -> invalid +//   laguage    -> language +//   largst     -> largest +//   learnign   -> learning +//   lenght     -> length +//   levle      -> level +//   liasion    -> liaison +//   libary     -> library +//   likly      -> likely +//   lisense    -> license +//   listner    -> listener +//   littel     -> little +//   looses:    -> loses +//   looup      -> lookup +//   macthing   -> matching +//   maintence  -> maintenance +//   manefist   -> manifest +//   mesage     -> message +//   morgage    -> mortgage +//   mysefl     -> myself +//   namesapce  -> namespace +//   namespcae  -> namespace +//   naturual   -> natural +//   neccesary  -> necessary +//   necesary   -> necessary +//   nulltpr    -> nullptr +//   occassion  -> occasion +//   occured    -> occurred +//   operaotr   -> operator +//   ouptut     -> output +//   ouput      -> output +//   overide    -> override +//   ovveride   -> override +//   pallete    -> palette +//   paralel    -> parallel +//   parralel   -> parallel +//   parrallel  -> parallel +//   particualr -> particular +//   paticular  -> particular +//   peaple     -> people +//   peice      -> piece +//   peolpe     -> people +//   peopel     -> people +//   perhasp    -> perhaps +//   perheaps   -> perhaps +//   perhpas    -> perhaps +//   perphas    -> perhaps +//   persue     -> pursue +//   poeople    -> people +//   poeple     -> people +//   poitner    -> pointer +//   posess     -> possess +//   postion    -> position +//   preiod     -> period +//   primarly   -> primarily +//   priviledge -> privilege +//   privte     -> private +//   probablly  -> probably +//   probaly    -> probably +//   probelm    -> problem +//   proccess   -> process +//   proeprty   -> property +//   prominant  -> prominent +//   proove     -> prove +//   propery    -> property +//   propogate  -> propagate +//   psuedo     -> pseudo +//   raelly     -> really +//   realtion   -> relation +//   realy      -> really +//   reasearch  -> research +//   receiev    -> receiv +//   recepient  -> recipient +//   reciept    -> receipt +//   reciev     -> receiv +//   recipiant  -> recipient +//   recrod     -> record +//   recuring   -> recurring +//   referece   -> reference +//   refered    -> referred +//   regluar    -> regular +//   relaly     -> really +//   releated   -> related +//   relevent   -> relevant +//   repitition -> repetition +//   reponse    -> response +//   reprot     -> report +//   resutl     -> result +//   retrun     -> return +//   retun      -> return +//   reuslt     -> result +//   reutrn     -> return +//   reveiw     -> review +//   saftey     -> safety +//   safty      -> safety +//   satisifed  -> satisfied +//   scheduel   -> schedule +//   seperat    -> separat +//   sequnce    -> sequence +//   shoudl     -> should +//   similiar   -> similar +//   simmilar   -> similar +//   singed     -> signed +//   singel     -> single +//   slighly    -> slightly +//   somehwat   -> somewhat +//   spectogram -> spectrogram +//   statment   -> statement +//   stirng     -> string +//   stregth    -> strength +//   strengh    -> strength +//   strign     -> string +//   succsess   -> success +//   sucess     -> success +//   sugest     -> suggest +//   sumary     -> summary +//   supress    -> suppress +//   surpress   -> suppress +//   swithc     -> switch +//   swtich     -> switch +//   symetric   -> symmetric +//   teamplate  -> template +//   tempalte   -> template +//   theese     -> these +//   therfore   -> therefore +//   thign      -> thing +//   thigsn     -> things +//   thikn      -> think +//   thiunk     -> think +//   thnigs     -> things +//   thresold   -> threshold +//   throught   -> thought +//   tihkn      -> think +//   tkaes      -> takes +//   todya      -> today +//   toghether  -> together +//   tolerence  -> tolerance +//   tongiht    -> tonight +//   tranpose   -> transpose +//   typcial    -> typical +//   udpate     -> update +//   unkown     -> unknown +//   unqiue     -> unique +//   ususally   -> usually +//   verticies  -> vertices +//   virutal    -> virtual +//   vitual     -> virtual +//   whcih      -> which +//   whereever  -> wherever +//   wherre     -> where +//   whihc      -> which +//   whlch      -> which +//   widht      -> width +//   wierd      -> weird +//   wihch      -> which +//   woudl      -> would +//   yeild      -> yield + +#define AUTOCORRECTION_MIN_LENGTH 5  // "abotu" +#define AUTOCORRECTION_MAX_LENGTH 10  // "auxilliary" + +static const uint8_t autocorrection_data[5967] PROGMEM = {108, 67, 0, 4, 212, 0, +  6, 236, 0, 7, 100, 1, 8, 15, 3, 9, 169, 8, 10, 204, 8, 11, 68, 9, 12, 246, 9, +  14, 0, 10, 15, 28, 10, 16, 79, 11, 17, 129, 11, 18, 175, 13, 19, 227, 13, 21, +  253, 13, 22, 194, 15, 23, 121, 17, 24, 201, 20, 25, 210, 20, 26, 8, 21, 28, +  34, 21, 0, 71, 89, 0, 8, 99, 0, 10, 130, 0, 18, 142, 0, 22, 152, 0, 23, 163, +  0, 24, 202, 0, 0, 22, 8, 24, 44, 0, 131, 115, 101, 100, 0, 75, 106, 0, 23, +  115, 0, 0, 23, 44, 8, 11, 23, 44, 0, 132, 0, 12, 21, 26, 28, 19, 18, 6, 0, +  133, 114, 105, 103, 104, 116, 0, 17, 12, 16, 16, 18, 6, 0, 132, 105, 110, 103, +  0, 15, 22, 4, 44, 0, 131, 108, 115, 111, 0, 8, 22, 18, 18, 15, 0, 132, 115, +  101, 115, 0, 76, 173, 0, 18, 183, 0, 24, 193, 0, 0, 21, 6, 18, 19, 28, 11, 0, +  128, 101, 0, 15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117, +  115, 116, 0, 23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 219, 0, 28, 228, 0, +  0, 24, 18, 5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 246, 0, +  12, 28, 1, 14, 92, 1, 0, 76, 253, 0, 23, 20, 1, 0, 75, 4, 1, 26, 10, 1, 0, 26, +  0, 129, 99, 104, 0, 11, 44, 0, 132, 119, 104, 105, 99, 104, 0, 12, 26, 22, 0, +  129, 99, 104, 0, 80, 41, 1, 21, 53, 1, 22, 67, 1, 23, 76, 1, 0, 17, 4, 28, 7, +  0, 132, 110, 97, 109, 105, 99, 0, 23, 8, 16, 28, 22, 0, 132, 109, 101, 116, +  114, 105, 99, 0, 4, 15, 6, 0, 129, 115, 105, 99, 0, 8, 11, 23, 22, 4, 0, 134, +  101, 115, 116, 104, 101, 116, 105, 99, 0, 8, 11, 6, 0, 129, 99, 107, 0, 68, +  122, 1, 8, 134, 1, 15, 84, 2, 17, 124, 2, 18, 180, 2, 21, 207, 2, 24, 7, 3, 0, +  12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 70, 168, 1, 7, 178, 1, 8, +  188, 1, 9, 199, 1, 10, 212, 1, 12, 222, 1, 19, 248, 1, 21, 3, 2, 22, 38, 2, +  23, 50, 2, 24, 75, 2, 0, 12, 25, 7, 4, 0, 130, 115, 101, 100, 0, 8, 5, 16, 8, +  0, 129, 100, 101, 100, 0, 21, 10, 10, 4, 0, 132, 114, 101, 101, 100, 0, 12, +  22, 12, 23, 4, 22, 0, 131, 102, 105, 101, 100, 0, 17, 12, 22, 0, 131, 103, +  110, 101, 100, 0, 85, 229, 1, 25, 238, 1, 0, 21, 24, 5, 0, 131, 105, 101, 100, +  0, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 22, 4, 15, 8, 0, 131, 112, 115, +  101, 100, 0, 72, 13, 2, 10, 22, 2, 24, 29, 2, 0, 9, 8, 21, 0, 129, 114, 101, +  100, 0, 4, 44, 0, 128, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 4, 19, +  15, 8, 0, 132, 97, 112, 115, 101, 100, 0, 68, 57, 2, 22, 68, 2, 0, 8, 15, 8, +  21, 0, 132, 97, 116, 101, 100, 0, 17, 12, 0, 128, 97, 100, 0, 15, 6, 17, 12, +  0, 129, 100, 101, 0, 76, 91, 2, 18, 112, 2, 0, 8, 0, 73, 100, 2, 28, 106, 2, +  0, 131, 105, 101, 108, 100, 0, 131, 105, 101, 108, 100, 0, 22, 8, 21, 11, 23, +  0, 130, 104, 111, 108, 100, 0, 72, 134, 2, 12, 145, 2, 24, 155, 2, 0, 21, 12, +  9, 0, 132, 114, 105, 101, 110, 100, 0, 8, 21, 9, 0, 131, 105, 101, 110, 100, +  0, 82, 162, 2, 21, 172, 2, 0, 21, 21, 4, 0, 132, 111, 117, 110, 100, 0, 4, 0, +  130, 111, 117, 110, 100, 0, 76, 187, 2, 21, 198, 2, 0, 8, 21, 19, 0, 132, 101, +  114, 105, 111, 100, 0, 6, 8, 21, 0, 130, 111, 114, 100, 0, 68, 217, 2, 8, 228, +  2, 24, 253, 2, 0, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 71, 235, 2, +  12, 245, 2, 0, 12, 22, 17, 18, 6, 0, 128, 101, 100, 0, 26, 0, 131, 101, 105, +  114, 100, 0, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4, 0, 128, 110, +  100, 0, 68, 67, 3, 5, 80, 3, 6, 123, 3, 7, 251, 3, 8, 23, 4, 10, 107, 4, 11, +  227, 4, 12, 52, 5, 15, 61, 5, 17, 0, 6, 18, 27, 6, 19, 37, 6, 21, 47, 6, 22, +  156, 6, 23, 82, 7, 24, 45, 8, 25, 115, 8, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130, +  97, 99, 101, 0, 68, 87, 3, 15, 97, 3, 0, 15, 12, 4, 25, 4, 0, 128, 108, 101, +  0, 68, 104, 3, 24, 115, 3, 0, 15, 12, 4, 25, 4, 0, 130, 98, 108, 101, 0, 18, +  7, 0, 130, 98, 108, 101, 0, 72, 136, 3, 12, 147, 3, 17, 156, 3, 19, 238, 3, 0, +  21, 8, 9, 8, 21, 0, 129, 110, 99, 101, 0, 8, 19, 0, 131, 105, 101, 99, 101, 0, +  68, 166, 3, 8, 179, 3, 24, 228, 3, 0, 23, 8, 19, 16, 18, 6, 0, 131, 101, 110, +  99, 101, 0, 85, 186, 3, 23, 217, 3, 0, 8, 0, 73, 195, 3, 15, 208, 3, 0, 21, +  44, 0, 134, 101, 102, 101, 114, 101, 110, 99, 101, 0, 18, 23, 0, 131, 97, 110, +  99, 101, 0, 17, 12, 4, 16, 0, 129, 97, 110, 99, 101, 0, 20, 8, 22, 0, 130, +  101, 110, 99, 101, 0, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12, +  21, 8, 25, 0, 82, 7, 4, 25, 13, 4, 0, 130, 114, 105, 100, 101, 0, 18, 0, 133, +  101, 114, 114, 105, 100, 101, 0, 23, 0, 68, 38, 4, 12, 49, 4, 17, 59, 4, 23, +  94, 4, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 16, 16, 18, 6, 0, 129, +  116, 101, 101, 0, 4, 21, 0, 68, 69, 4, 24, 81, 4, 0, 10, 0, 134, 117, 97, 114, +  97, 110, 116, 101, 101, 0, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101, +  101, 0, 12, 16, 18, 6, 0, 132, 109, 105, 116, 116, 101, 101, 0, 68, 117, 4, 7, +  184, 4, 16, 218, 4, 0, 74, 130, 4, 17, 141, 4, 22, 150, 4, 24, 159, 4, 0, 21, +  18, 16, 0, 131, 116, 103, 97, 103, 101, 0, 11, 6, 0, 131, 97, 110, 103, 101, +  0, 8, 16, 0, 130, 115, 97, 103, 101, 0, 10, 0, 108, 168, 4, 4, 174, 4, 0, 131, +  97, 117, 103, 101, 0, 15, 0, 132, 110, 103, 117, 97, 103, 101, 0, 8, 15, 0, +  68, 197, 4, 12, 203, 4, 15, 212, 4, 0, 131, 108, 101, 103, 101, 0, 25, 12, 21, +  19, 0, 130, 103, 101, 0, 4, 0, 130, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103, +  101, 0, 23, 0, 71, 245, 4, 16, 255, 4, 18, 9, 5, 22, 18, 5, 23, 27, 5, 0, 17, +  4, 44, 0, 130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0, +  23, 44, 0, 130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68, +  34, 5, 24, 42, 5, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32, +  116, 104, 101, 0, 29, 22, 44, 0, 130, 105, 122, 101, 0, 69, 77, 5, 12, 190, 5, +  19, 201, 5, 22, 241, 5, 25, 249, 5, 0, 68, 87, 5, 12, 167, 5, 15, 179, 5, 0, +  74, 97, 5, 12, 107, 5, 15, 137, 5, 0, 12, 15, 8, 0, 131, 105, 98, 108, 101, 0, +  15, 0, 68, 116, 5, 12, 127, 5, 0, 25, 4, 0, 133, 105, 108, 97, 98, 108, 101, +  0, 4, 25, 4, 0, 132, 97, 98, 108, 101, 0, 68, 144, 5, 12, 155, 5, 0, 25, 4, 0, +  132, 105, 108, 97, 98, 108, 101, 0, 25, 4, 0, 133, 97, 105, 108, 97, 98, 108, +  101, 0, 4, 15, 12, 4, 25, 4, 0, 131, 98, 108, 101, 0, 12, 4, 25, 4, 0, 130, +  97, 98, 108, 101, 0, 26, 11, 44, 0, 132, 119, 104, 105, 108, 101, 0, 68, 211, +  5, 8, 220, 5, 18, 230, 5, 0, 8, 19, 0, 131, 111, 112, 108, 101, 0, 18, 19, 0, +  132, 101, 111, 112, 108, 101, 0, 8, 18, 19, 0, 133, 101, 111, 112, 108, 101, +  0, 4, 9, 0, 130, 108, 115, 101, 0, 8, 15, 0, 129, 101, 108, 0, 70, 7, 6, 12, +  16, 6, 0, 12, 22, 44, 0, 130, 110, 99, 101, 0, 8, 10, 28, 11, 0, 131, 105, +  101, 110, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8, 19, 0, +  130, 112, 108, 101, 0, 70, 66, 6, 8, 76, 6, 12, 87, 6, 18, 99, 6, 21, 127, 6, +  24, 134, 6, 0, 18, 22, 44, 0, 131, 99, 111, 114, 101, 0, 23, 11, 44, 0, 132, +  116, 104, 101, 114, 101, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0, +  71, 106, 6, 9, 115, 6, 0, 8, 5, 0, 131, 102, 111, 114, 101, 0, 21, 8, 11, 23, +  0, 131, 101, 102, 111, 114, 101, 0, 8, 11, 26, 0, 129, 101, 0, 23, 0, 108, +  143, 6, 4, 148, 6, 0, 130, 114, 117, 101, 0, 16, 4, 0, 130, 101, 117, 114, 0, +  68, 178, 6, 8, 203, 6, 12, 211, 6, 15, 226, 6, 17, 235, 6, 18, 9, 7, 24, 22, +  7, 0, 79, 185, 6, 24, 193, 6, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0, +  131, 97, 117, 115, 101, 0, 8, 11, 23, 0, 130, 115, 101, 0, 6, 21, 8, 6, 27, 8, +  0, 134, 101, 114, 99, 105, 115, 101, 0, 12, 4, 9, 0, 131, 108, 115, 101, 0, +  72, 242, 6, 18, 253, 6, 0, 22, 12, 15, 0, 132, 99, 101, 110, 115, 101, 0, 19, +  8, 21, 0, 132, 115, 112, 111, 110, 115, 101, 0, 19, 17, 4, 21, 23, 0, 131, +  115, 112, 111, 115, 101, 0, 68, 32, 7, 6, 61, 7, 18, 72, 7, 0, 70, 39, 7, 8, +  49, 7, 0, 6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97, +  117, 115, 101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131, +  97, 117, 115, 101, 0, 68, 95, 7, 8, 13, 8, 15, 24, 8, 25, 36, 8, 0, 71, 111, +  7, 10, 148, 7, 15, 161, 7, 19, 228, 7, 21, 238, 7, 0, 18, 16, 0, 80, 121, 7, +  18, 136, 7, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0, +  6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 18, 19, 18, 21, 19, 0, 132, +  97, 103, 97, 116, 101, 0, 70, 171, 7, 19, 184, 7, 24, 197, 7, 0, 24, 15, 4, 6, +  0, 133, 99, 117, 108, 97, 116, 101, 0, 16, 4, 8, 23, 0, 134, 109, 112, 108, +  97, 116, 101, 0, 70, 204, 7, 15, 217, 7, 0, 24, 15, 4, 6, 0, 134, 99, 117, +  108, 97, 116, 101, 0, 4, 6, 0, 132, 99, 117, 108, 97, 116, 101, 0, 7, 24, 0, +  132, 112, 100, 97, 116, 101, 0, 72, 245, 7, 24, 2, 8, 0, 17, 4, 10, 0, 134, +  101, 110, 101, 114, 97, 116, 101, 0, 6, 4, 0, 132, 99, 117, 114, 97, 116, 101, +  0, 15, 15, 4, 19, 0, 131, 101, 116, 116, 101, 0, 4, 19, 16, 8, 23, 0, 131, +  108, 97, 116, 101, 0, 12, 21, 19, 0, 129, 97, 116, 101, 0, 74, 55, 8, 12, 67, +  8, 22, 77, 8, 0, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 20, 17, 24, +  0, 131, 105, 113, 117, 101, 0, 68, 84, 8, 21, 105, 8, 0, 6, 0, 108, 93, 8, 8, +  98, 8, 0, 130, 117, 115, 101, 0, 5, 0, 130, 117, 115, 101, 0, 8, 19, 0, 132, +  117, 114, 115, 117, 101, 0, 76, 122, 8, 18, 147, 8, 0, 72, 129, 8, 15, 139, 8, +  0, 15, 8, 5, 0, 131, 105, 101, 118, 101, 0, 8, 5, 0, 129, 101, 118, 101, 0, +  82, 154, 8, 25, 161, 8, 0, 21, 19, 0, 130, 118, 101, 0, 5, 4, 0, 131, 111, +  118, 101, 0, 12, 8, 0, 75, 182, 8, 15, 189, 8, 21, 197, 8, 0, 6, 0, 130, 105, +  101, 102, 0, 8, 5, 0, 130, 105, 101, 102, 0, 5, 0, 130, 105, 101, 102, 0, 76, +  211, 8, 17, 221, 8, 0, 17, 18, 10, 44, 0, 130, 105, 110, 103, 0, 76, 228, 8, +  21, 58, 9, 0, 72, 244, 8, 11, 11, 9, 15, 24, 9, 21, 36, 9, 28, 47, 9, 0, 72, +  251, 8, 11, 2, 9, 0, 5, 0, 131, 105, 110, 103, 0, 6, 4, 6, 0, 131, 105, 110, +  103, 0, 23, 6, 4, 16, 0, 133, 116, 99, 104, 105, 110, 103, 0, 8, 12, 6, 0, +  133, 101, 105, 108, 105, 110, 103, 0, 24, 6, 8, 21, 0, 130, 114, 105, 110, +  103, 0, 23, 28, 17, 4, 0, 131, 104, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114, +  105, 110, 103, 0, 70, 87, 9, 8, 142, 9, 10, 154, 9, 12, 164, 9, 22, 173, 9, +  23, 191, 9, 0, 75, 100, 9, 12, 109, 9, 15, 119, 9, 21, 127, 9, 0, 12, 26, 0, +  131, 104, 105, 99, 104, 0, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, 11, 26, +  0, 130, 105, 99, 104, 0, 4, 8, 22, 4, 8, 21, 0, 134, 115, 101, 97, 114, 99, +  104, 0, 23, 7, 17, 4, 44, 0, 130, 32, 116, 104, 101, 0, 17, 8, 21, 23, 22, 0, +  128, 116, 104, 0, 6, 11, 26, 0, 130, 105, 99, 104, 0, 12, 15, 19, 16, 18, 6, +  4, 0, 134, 99, 111, 109, 112, 108, 105, 115, 104, 0, 74, 201, 9, 12, 225, 9, +  21, 236, 9, 0, 72, 208, 9, 12, 218, 9, 0, 21, 23, 22, 0, 130, 110, 103, 116, +  104, 0, 8, 11, 0, 129, 104, 116, 0, 26, 7, 17, 4, 5, 0, 129, 100, 116, 104, 0, +  24, 23, 44, 0, 131, 114, 117, 116, 104, 0, 21, 8, 11, 23, 44, 0, 129, 105, +  114, 0, 17, 0, 76, 9, 10, 24, 20, 10, 0, 23, 11, 44, 0, 132, 116, 104, 105, +  110, 107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 50, 10, 7, 134, 10, 8, 177, +  10, 9, 17, 11, 15, 26, 11, 23, 55, 11, 24, 64, 11, 0, 76, 60, 10, 23, 71, 10, +  24, 96, 10, 0, 6, 19, 28, 23, 0, 131, 105, 99, 97, 108, 0, 76, 78, 10, 24, 86, +  10, 0, 17, 12, 0, 129, 105, 97, 108, 0, 21, 12, 25, 0, 131, 116, 117, 97, 108, +  0, 81, 106, 10, 21, 115, 10, 23, 124, 10, 0, 4, 44, 0, 130, 110, 117, 97, 108, +  0, 24, 23, 4, 17, 0, 130, 97, 108, 0, 12, 25, 0, 131, 114, 116, 117, 97, 108, +  0, 24, 0, 82, 143, 10, 26, 167, 10, 0, 70, 153, 10, 11, 157, 10, 26, 163, 10, +  0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0, 129, 108, 100, 0, 18, 44, 0, +  132, 119, 111, 117, 108, 100, 0, 74, 193, 10, 15, 201, 10, 19, 247, 10, 23, +  255, 10, 24, 7, 11, 0, 17, 12, 22, 0, 129, 108, 101, 0, 68, 208, 10, 15, 234, +  10, 0, 21, 0, 68, 217, 10, 21, 224, 10, 0, 19, 0, 129, 108, 101, 108, 0, 4, +  19, 0, 132, 97, 108, 108, 101, 108, 0, 4, 21, 21, 4, 19, 0, 133, 97, 108, 108, +  101, 108, 0, 18, 8, 19, 0, 129, 108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0, +  7, 8, 11, 6, 22, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102, 0, 12, +  9, 0, 79, 36, 11, 24, 46, 11, 0, 15, 24, 9, 0, 132, 102, 105, 108, 108, 0, 9, +  0, 131, 108, 102, 105, 108, 108, 0, 24, 22, 8, 21, 0, 129, 108, 116, 0, 9, 23, +  4, 8, 21, 10, 0, 133, 97, 116, 101, 102, 117, 108, 0, 68, 89, 11, 15, 106, 11, +  21, 117, 11, 0, 21, 10, 18, 23, 6, 8, 19, 22, 0, 132, 114, 111, 103, 114, 97, +  109, 0, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 18, 9, 18, 6, 0, 131, 110, +  102, 111, 114, 109, 0, 68, 166, 11, 7, 206, 11, 8, 215, 11, 10, 58, 12, 12, +  141, 12, 14, 153, 12, 18, 192, 12, 19, 108, 13, 21, 120, 13, 22, 131, 13, 24, +  141, 13, 26, 164, 13, 0, 12, 0, 74, 175, 11, 23, 183, 11, 0, 4, 44, 0, 130, +  97, 105, 110, 0, 81, 190, 11, 21, 198, 11, 0, 18, 6, 0, 130, 97, 105, 110, 0, +  8, 6, 0, 130, 97, 105, 110, 0, 24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 231, +  11, 8, 241, 11, 10, 27, 12, 19, 39, 12, 22, 48, 12, 0, 15, 12, 11, 6, 0, 129, +  114, 101, 110, 0, 87, 248, 11, 26, 17, 12, 0, 72, 255, 11, 26, 7, 12, 0, 5, 0, +  130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8, 5, 0, +  131, 116, 119, 101, 101, 110, 0, 18, 7, 28, 11, 0, 131, 114, 111, 103, 101, +  110, 0, 4, 11, 44, 0, 129, 112, 101, 110, 0, 18, 18, 11, 6, 0, 131, 115, 101, +  110, 0, 72, 65, 12, 12, 76, 12, 0, 12, 21, 18, 9, 0, 131, 101, 105, 103, 110, +  0, 75, 95, 12, 15, 101, 12, 17, 109, 12, 18, 118, 12, 21, 125, 12, 22, 132, +  12, 0, 23, 0, 129, 110, 103, 0, 15, 4, 0, 131, 105, 103, 110, 0, 21, 4, 8, 15, +  0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 23, 22, 0, 129, 110, 103, 0, +  4, 44, 0, 130, 115, 105, 103, 110, 0, 23, 4, 21, 8, 6, 0, 131, 116, 97, 105, +  110, 0, 75, 160, 12, 12, 169, 12, 0, 12, 23, 0, 131, 104, 105, 110, 107, 0, +  75, 176, 12, 23, 182, 12, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0, 132, 116, +  104, 105, 110, 107, 0, 76, 202, 12, 22, 86, 13, 23, 96, 13, 0, 70, 212, 12, +  22, 225, 12, 23, 251, 12, 0, 12, 22, 8, 7, 0, 133, 99, 105, 115, 105, 111, +  110, 0, 68, 232, 12, 22, 241, 12, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4, +  6, 6, 18, 0, 131, 105, 111, 110, 0, 68, 14, 13, 7, 27, 13, 12, 37, 13, 15, 52, +  13, 17, 64, 13, 22, 76, 13, 0, 21, 8, 5, 4, 0, 132, 114, 97, 116, 105, 111, +  110, 0, 7, 4, 0, 131, 105, 116, 105, 111, 110, 0, 23, 12, 19, 8, 21, 0, 134, +  101, 116, 105, 116, 105, 111, 110, 0, 4, 8, 21, 0, 133, 108, 97, 116, 105, +  111, 110, 0, 6, 24, 9, 0, 133, 110, 99, 116, 105, 111, 110, 0, 18, 19, 0, 131, +  105, 116, 105, 111, 110, 0, 12, 25, 12, 7, 0, 129, 105, 111, 110, 0, 12, 6, 4, +  21, 9, 0, 131, 116, 105, 111, 110, 0, 19, 11, 4, 0, 132, 104, 97, 112, 112, +  101, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 10, 12, 11, 23, 0, +  130, 110, 103, 115, 0, 85, 148, 13, 23, 157, 13, 0, 23, 8, 21, 0, 130, 117, +  114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 18, 14, 17, 24, 0, 130, 110, 111, +  119, 110, 0, 71, 185, 13, 17, 196, 13, 26, 205, 13, 0, 8, 24, 22, 19, 0, 131, +  101, 117, 100, 111, 0, 26, 14, 44, 0, 130, 110, 111, 119, 0, 79, 212, 13, 17, +  220, 13, 0, 15, 18, 9, 0, 129, 111, 119, 0, 14, 44, 0, 129, 111, 119, 0, 86, +  234, 13, 24, 244, 13, 0, 4, 11, 21, 8, 19, 0, 129, 112, 115, 0, 18, 18, 15, 0, +  129, 107, 117, 112, 0, 68, 28, 14, 8, 93, 14, 11, 103, 15, 15, 113, 15, 18, +  127, 15, 19, 144, 15, 22, 155, 15, 23, 164, 15, 24, 176, 15, 28, 185, 15, 0, +  76, 38, 14, 15, 48, 14, 24, 82, 14, 0, 15, 12, 16, 12, 22, 0, 130, 97, 114, 0, +  76, 55, 14, 24, 66, 14, 0, 16, 16, 12, 22, 0, 132, 105, 108, 97, 114, 0, 6, +  12, 23, 4, 19, 0, 134, 114, 116, 105, 99, 117, 108, 97, 114, 0, 15, 10, 8, 21, +  0, 131, 117, 108, 97, 114, 0, 68, 124, 14, 7, 132, 14, 11, 145, 14, 12, 203, +  14, 15, 229, 14, 16, 239, 14, 17, 249, 14, 18, 37, 15, 23, 45, 15, 25, 76, 15, +  0, 15, 6, 0, 130, 101, 97, 114, 0, 17, 4, 15, 4, 6, 0, 132, 101, 110, 100, 97, +  114, 0, 74, 152, 14, 23, 163, 14, 0, 12, 8, 11, 0, 133, 105, 103, 104, 101, +  114, 0, 72, 173, 14, 15, 185, 14, 24, 194, 14, 0, 11, 10, 18, 23, 0, 133, 101, +  116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0, 9, 0, 131, 114, +  116, 104, 101, 114, 0, 75, 210, 14, 15, 218, 14, 0, 23, 44, 0, 130, 101, 105, +  114, 0, 19, 16, 18, 6, 0, 131, 105, 108, 101, 114, 0, 23, 12, 9, 0, 131, 108, +  116, 101, 114, 0, 16, 4, 21, 10, 44, 0, 129, 97, 114, 0, 76, 0, 15, 23, 12, +  15, 0, 10, 10, 8, 5, 0, 132, 105, 110, 110, 101, 114, 0, 76, 19, 15, 22, 28, +  15, 0, 18, 19, 0, 131, 110, 116, 101, 114, 0, 12, 15, 0, 130, 101, 110, 101, +  114, 0, 9, 8, 5, 0, 129, 114, 101, 0, 75, 52, 15, 24, 62, 15, 0, 18, 17, 4, 0, +  131, 116, 104, 101, 114, 0, 19, 18, 16, 6, 0, 134, 111, 109, 112, 117, 116, +  101, 114, 0, 72, 83, 15, 26, 94, 15, 0, 8, 21, 8, 11, 26, 0, 131, 118, 101, +  114, 0, 18, 11, 0, 130, 101, 118, 101, 114, 0, 8, 23, 18, 44, 0, 130, 104, +  101, 114, 0, 4, 24, 6, 12, 23, 21, 4, 19, 0, 130, 108, 97, 114, 0, 23, 4, 21, +  8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 23, 15, 15, 24, +  17, 0, 130, 112, 116, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 18, 4, 21, 8, +  19, 18, 0, 130, 116, 111, 114, 0, 6, 18, 44, 0, 129, 99, 117, 114, 0, 8, 25, +  8, 44, 0, 129, 114, 121, 0, 68, 219, 15, 8, 3, 16, 10, 147, 16, 19, 158, 16, +  21, 170, 16, 22, 181, 16, 23, 77, 17, 24, 85, 17, 0, 75, 229, 15, 19, 240, 15, +  28, 250, 15, 0, 19, 21, 8, 19, 0, 131, 104, 97, 112, 115, 0, 11, 21, 8, 19, 0, +  130, 97, 112, 115, 0, 26, 15, 4, 0, 130, 97, 121, 115, 0, 68, 19, 16, 6, 42, +  16, 12, 53, 16, 15, 129, 16, 22, 136, 16, 0, 71, 26, 16, 14, 34, 16, 0, 12, +  44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0, 8, 7, 17, 12, +  0, 131, 105, 99, 101, 115, 0, 70, 63, 16, 21, 102, 16, 23, 117, 16, 0, 72, 70, +  16, 12, 80, 16, 0, 7, 17, 12, 0, 132, 105, 99, 101, 115, 0, 71, 87, 16, 23, +  94, 16, 0, 17, 12, 0, 130, 101, 115, 0, 21, 8, 25, 0, 130, 101, 115, 0, 18, +  22, 8, 6, 6, 4, 0, 132, 115, 111, 114, 105, 101, 115, 0, 15, 12, 5, 4, 0, 131, +  105, 116, 105, 101, 115, 0, 4, 9, 0, 129, 115, 101, 0, 18, 11, 6, 44, 0, 130, +  111, 115, 101, 115, 0, 12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 4, 8, +  11, 21, 8, 19, 0, 131, 97, 112, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97, 114, +  115, 0, 68, 191, 16, 8, 203, 16, 18, 66, 17, 0, 21, 4, 5, 16, 8, 0, 130, 114, +  97, 115, 115, 0, 70, 216, 16, 17, 240, 16, 21, 13, 17, 22, 42, 17, 0, 70, 223, +  16, 24, 232, 16, 0, 18, 21, 19, 0, 131, 101, 115, 115, 0, 22, 0, 130, 99, 101, +  115, 115, 0, 76, 247, 16, 22, 3, 17, 0, 22, 22, 24, 5, 0, 133, 105, 110, 101, +  115, 115, 0, 24, 5, 0, 131, 105, 110, 101, 115, 115, 0, 19, 0, 85, 22, 17, 24, +  33, 17, 0, 24, 22, 0, 133, 112, 112, 114, 101, 115, 115, 0, 22, 0, 131, 112, +  114, 101, 115, 115, 0, 70, 49, 17, 18, 58, 17, 0, 6, 24, 22, 0, 131, 101, 115, +  115, 0, 19, 0, 130, 115, 101, 115, 115, 0, 21, 6, 6, 4, 0, 132, 114, 111, 115, +  115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 82, 92, 17, 22, 106, 17, 0, 15, 18, +  16, 18, 17, 4, 0, 132, 97, 108, 111, 117, 115, 0, 17, 8, 6, 17, 18, 6, 0, 133, +  115, 101, 110, 115, 117, 115, 0, 68, 158, 17, 8, 188, 17, 10, 217, 17, 11, +  227, 17, 12, 25, 18, 15, 36, 18, 16, 47, 18, 17, 59, 18, 18, 151, 19, 19, 189, +  19, 22, 217, 19, 24, 107, 20, 0, 85, 165, 17, 26, 176, 17, 0, 8, 19, 8, 22, 0, +  131, 97, 114, 97, 116, 0, 11, 8, 16, 18, 22, 0, 131, 119, 104, 97, 116, 0, 68, +  195, 17, 17, 204, 17, 0, 21, 10, 44, 0, 130, 101, 97, 116, 0, 16, 17, 21, 8, +  25, 18, 10, 0, 130, 101, 110, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0, +  71, 237, 17, 10, 244, 17, 12, 14, 18, 0, 12, 26, 0, 129, 116, 104, 0, 81, 251, +  17, 24, 2, 18, 0, 8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111, +  117, 103, 104, 116, 0, 10, 17, 18, 23, 0, 131, 105, 103, 104, 116, 0, 23, 24, +  18, 5, 4, 0, 129, 32, 105, 116, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116, +  0, 4, 23, 21, 18, 19, 16, 12, 0, 129, 110, 116, 0, 68, 72, 18, 8, 128, 18, 21, +  132, 19, 22, 143, 19, 0, 76, 85, 18, 17, 96, 18, 21, 107, 18, 23, 117, 18, 0, +  19, 12, 6, 8, 21, 0, 130, 101, 110, 116, 0, 12, 16, 18, 21, 19, 0, 130, 101, +  110, 116, 0, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 8, 19, 16, 18, 6, 0, 130, +  101, 110, 116, 0, 76, 144, 18, 16, 177, 18, 21, 21, 19, 25, 111, 19, 29, 121, +  19, 0, 70, 151, 18, 19, 164, 18, 0, 8, 9, 9, 8, 0, 133, 105, 99, 105, 101, +  110, 116, 0, 8, 6, 8, 21, 0, 133, 105, 112, 105, 101, 110, 116, 0, 72, 190, +  18, 17, 202, 18, 21, 235, 18, 23, 10, 19, 0, 25, 18, 10, 0, 131, 114, 110, +  109, 101, 110, 116, 0, 72, 209, 18, 21, 221, 18, 0, 25, 18, 10, 0, 132, 114, +  110, 109, 101, 110, 116, 0, 18, 25, 18, 10, 0, 134, 101, 114, 110, 109, 101, +  110, 116, 0, 72, 242, 18, 18, 253, 18, 0, 25, 18, 10, 0, 131, 110, 109, 101, +  110, 116, 0, 25, 18, 10, 0, 133, 101, 114, 110, 109, 101, 110, 116, 0, 4, 23, +  22, 0, 131, 101, 109, 101, 110, 116, 0, 68, 34, 19, 8, 45, 19, 9, 57, 19, 21, +  68, 19, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 9, 12, 7, 0, 132, +  102, 101, 114, 101, 110, 116, 0, 9, 12, 7, 0, 131, 101, 114, 101, 110, 116, 0, +  68, 75, 19, 8, 99, 19, 0, 19, 0, 68, 84, 19, 19, 92, 19, 0, 133, 112, 97, 114, +  101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 9, 12, 7, 0, 133, 102, 101, +  114, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 12, 17, 10, 18, +  6, 0, 130, 97, 110, 116, 0, 8, 9, 9, 12, 7, 0, 129, 101, 110, 116, 0, 18, 6, +  0, 130, 110, 115, 116, 0, 81, 161, 19, 21, 171, 19, 22, 180, 19, 0, 7, 12, 7, +  0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116, 0, 16, 15, 4, +  0, 130, 111, 115, 116, 0, 72, 196, 19, 28, 207, 19, 0, 12, 6, 8, 21, 0, 131, +  101, 105, 112, 116, 0, 6, 17, 8, 0, 130, 114, 121, 112, 116, 0, 72, 236, 19, +  10, 21, 20, 12, 30, 20, 16, 59, 20, 17, 69, 20, 24, 96, 20, 0, 74, 243, 19, +  21, 10, 20, 0, 76, 250, 19, 24, 2, 20, 0, 11, 0, 130, 104, 101, 115, 116, 0, +  22, 0, 130, 103, 101, 115, 116, 0, 23, 17, 12, 0, 131, 101, 114, 101, 115, +  116, 0, 21, 4, 15, 0, 129, 101, 115, 116, 0, 73, 37, 20, 17, 49, 20, 0, 8, 17, +  4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 4, 10, 4, 0, 131, 105, 110, 115, +  116, 0, 18, 15, 4, 0, 131, 109, 111, 115, 116, 0, 68, 76, 20, 17, 87, 20, 0, +  12, 10, 4, 0, 132, 97, 105, 110, 115, 116, 0, 12, 4, 10, 4, 0, 130, 115, 116, +  0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0, 70, 120, 20, 18, 144, 20, +  19, 168, 20, 23, 191, 20, 0, 72, 127, 20, 21, 137, 20, 0, 6, 27, 8, 0, 132, +  101, 99, 117, 116, 0, 12, 6, 0, 128, 105, 116, 0, 68, 151, 20, 5, 160, 20, 0, +  5, 0, 132, 97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 175, +  20, 24, 183, 20, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112, +  117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129, +  117, 116, 0, 72, 217, 20, 12, 253, 20, 0, 68, 224, 20, 12, 231, 20, 0, 11, 44, +  0, 129, 118, 101, 0, 70, 238, 20, 8, 246, 20, 0, 8, 21, 0, 130, 101, 105, 118, +  0, 6, 8, 21, 0, 129, 118, 0, 8, 11, 6, 4, 44, 0, 130, 105, 101, 118, 0, 76, +  15, 21, 17, 25, 21, 0, 8, 25, 8, 21, 0, 130, 105, 101, 119, 0, 18, 14, 44, 0, +  130, 110, 111, 119, 0, 70, 59, 21, 8, 118, 21, 11, 128, 21, 15, 146, 21, 17, +  87, 22, 21, 114, 22, 22, 12, 23, 23, 39, 23, 0, 68, 72, 21, 8, 84, 21, 12, 95, +  21, 19, 106, 21, 0, 21, 6, 18, 19, 28, 11, 0, 130, 105, 115, 121, 0, 24, 20, +  8, 21, 9, 0, 129, 110, 99, 121, 0, 21, 6, 18, 19, 28, 11, 0, 129, 115, 121, 0, +  24, 21, 14, 17, 4, 5, 0, 129, 116, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116, +  121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121, +  0, 68, 165, 21, 11, 232, 21, 14, 242, 21, 15, 250, 21, 18, 66, 22, 21, 76, 22, +  0, 69, 184, 21, 8, 193, 21, 15, 199, 21, 17, 208, 21, 21, 215, 21, 24, 224, +  21, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0, +  131, 97, 108, 108, 121, 0, 12, 9, 0, 128, 108, 121, 0, 8, 17, 8, 10, 0, 128, +  108, 121, 0, 23, 6, 4, 0, 128, 108, 121, 0, 10, 12, 15, 22, 0, 129, 116, 108, +  121, 0, 12, 15, 0, 129, 101, 108, 121, 0, 68, 4, 22, 5, 47, 22, 8, 56, 22, 0, +  86, 11, 22, 23, 35, 22, 0, 24, 0, 108, 20, 22, 22, 27, 22, 0, 131, 117, 97, +  108, 108, 121, 0, 24, 0, 132, 97, 108, 108, 121, 0, 24, 6, 4, 0, 133, 116, +  117, 97, 108, 108, 121, 0, 4, 5, 18, 21, 19, 0, 129, 121, 0, 4, 21, 0, 132, +  101, 97, 108, 108, 121, 0, 16, 18, 17, 4, 0, 130, 97, 108, 121, 0, 4, 16, 12, +  21, 19, 0, 129, 105, 108, 121, 0, 72, 94, 22, 19, 103, 22, 0, 18, 16, 44, 0, +  130, 110, 101, 121, 0, 4, 16, 18, 6, 0, 131, 112, 97, 110, 121, 0, 68, 127, +  22, 8, 231, 22, 18, 240, 22, 23, 253, 22, 0, 69, 143, 22, 12, 152, 22, 15, +  165, 22, 16, 193, 22, 22, 202, 22, 0, 12, 15, 0, 130, 114, 97, 114, 121, 0, +  15, 15, 12, 27, 24, 4, 0, 132, 105, 97, 114, 121, 0, 76, 172, 22, 15, 182, 22, +  0, 27, 24, 4, 0, 130, 105, 97, 114, 121, 0, 12, 27, 24, 4, 0, 131, 105, 97, +  114, 121, 0, 24, 22, 0, 130, 109, 97, 114, 121, 0, 8, 6, 0, 70, 212, 22, 8, +  223, 22, 0, 8, 17, 0, 133, 101, 115, 115, 97, 114, 121, 0, 17, 0, 130, 115, +  97, 114, 121, 0, 19, 18, 21, 19, 0, 128, 116, 121, 0, 10, 4, 23, 4, 6, 0, 132, +  101, 103, 111, 114, 121, 0, 17, 24, 6, 18, 44, 0, 134, 99, 111, 117, 110, 116, +  114, 121, 0, 4, 0, 85, 21, 23, 26, 32, 23, 0, 6, 18, 19, 28, 11, 0, 130, 105, +  115, 121, 0, 15, 4, 0, 129, 121, 115, 0, 73, 49, 23, 15, 57, 23, 21, 66, 23, +  0, 4, 22, 0, 129, 101, 116, 121, 0, 12, 5, 4, 0, 129, 105, 116, 121, 0, 19, 8, +  18, 21, 19, 0, 132, 112, 101, 114, 116, 121, 0}; + diff --git a/users/gourdo1/autocorrect/autocorrection_data.h (large) b/users/gourdo1/autocorrect/autocorrection_data.h (large) new file mode 100644 index 0000000000..66518201e2 --- /dev/null +++ b/users/gourdo1/autocorrect/autocorrection_data.h (large) @@ -0,0 +1,722 @@ +// Generated code. + +// Autocorrection dictionary (400 entries): +//   :acheiv    -> achiev +//   :agian     -> again +//   :agred     -> agreed +//   :ajust     -> adjust +//   :alot:     -> a lot +//   :andteh    -> and the +//   :andthe    -> and the +//   :anual     -> annual +//   :asign     -> assign +//   :aslo:     -> also +//   :asthe     -> as the +//   :atthe     -> at the +//   :casue     -> cause +//   :choses    -> chooses +//   :eveyr     -> every +//   :foudn     -> found +//   :gaurd     -> guard +//   :goign     -> going +//   :gonig     -> going +//   :graet     -> great +//   :grammer   -> grammar +//   :guage     -> gauge +//   :haev      -> have +//   :hapen     -> happen +//   :htere     -> there +//   :htikn     -> think +//   :htink     -> think +//   :hwihc     -> which +//   :hwile     -> while +//   :idaes     -> ideas +//   :jstu:     -> just +//   :jsut:     -> just +//   :knwo      -> know +//   :konw      -> know +//   :kwno      -> know +//   :moeny     -> money +//   :ocuntry   -> country +//   :ocur      -> occur +//   :olther    -> other +//   :otehr     -> other +//   :owudl     -> would +//   :rference  -> reference +//   :sicne     -> since +//   :socre     -> score +//   :szie      -> size +//   :the:the:  -> the +//   :theri     -> their +//   :thier     -> their +//   :thsoe     -> those +//   :tothe     -> to the +//   :ture      -> true +//   :turth     -> truth +//   :uesd:     -> used +//   :usally    -> usually +//   :yaers     -> years +//   :yeasr     -> years +//   abbout     -> about +//   aberation  -> aberration +//   abilties   -> abilities +//   abilty     -> ability +//   abotu      -> about +//   abouta     -> about a +//   aboutit    -> about it +//   aboutthe   -> about the +//   abvove     -> above +//   accesories -> accessories +//   accomodate -> accommodate +//   accross    -> across +//   acommodate -> accommodate +//   acomplish  -> accomplish +//   actualy    -> actually +//   acurate    -> accurate +//   acutally   -> actually +//   addtion    -> addition +//   adviced    -> advised +//   againnst   -> against +//   aganist    -> against +//   aggreed    -> agreed +//   agianst    -> against +//   ahppn      -> happen +//   aledge     -> allege +//   alledge    -> allege +//   allign     -> align +//   almsot     -> almost +//   alomst     -> almost +//   alwasy     -> always +//   alwyas     -> always +//   amature    -> amateur +//   anohter    -> another +//   anomolous  -> anomalous +//   anomoly    -> anomaly +//   anytying   -> anything +//   aparent    -> apparent +//   aparrent   -> apparent +//   apparant   -> apparent +//   apparrent  -> apparent +//   aquire     -> acquire +//   aroud      -> around +//   arround    -> around +//   arund      -> around +//   asthetic   -> aesthetic +//   auxilary   -> auxiliary +//   auxillary  -> auxiliary +//   auxilliary -> auxiliary +//   availabe   -> available +//   availaible -> available +//   availalbe  -> available +//   availble   -> available +//   availiable -> available +//   avalable   -> available +//   avaliable  -> available +//   avilable   -> available +//   baceause   -> because +//   bandwith   -> bandwidth +//   bankrupcy  -> bankruptcy +//   baout      -> about +//   beacuse    -> because +//   becasue    -> because +//   beccause   -> because +//   becouse    -> because +//   becuase    -> because +//   bedore     -> before +//   beeing     -> being +//   befoer     -> before +//   begginer   -> beginner +//   beleif     -> belief +//   beleive    -> believe +//   belive     -> believe +//   beteen     -> between +//   beween     -> between +//   bewteen    -> between +//   breif      -> brief +//   burried    -> buried +//   busness    -> business +//   bussiness  -> business +//   cacheing   -> caching +//   calander   -> calendar +//   caluclate  -> calculate +//   caluculate -> calculate +//   calulate   -> calculate +//   catagory   -> category +//   cauhgt     -> caught +//   ceratin    -> certain +//   certian    -> certain +//   cheif      -> chief +//   chekc      -> check +//   childen    -> children +//   chnage     -> change +//   choosen    -> chosen +//   cieling    -> ceiling +//   circut     -> circuit +//   claer      -> clear +//   clasic     -> classic +//   cmoputer   -> computer +//   coform     -> conform +//   cognizent  -> cognizant +//   collegue   -> colleague +//   comapny    -> company +//   comittee   -> committee +//   comming:   -> coming +//   commitee   -> committee +//   competance -> competence +//   competant  -> competent +//   complier   -> compiler +//   concensus  -> consensus +//   considerd  -> considered +//   contian    -> contain +//   copywrite: -> copyright +//   cosnt      -> const +//   coudl      -> could +//   dervied    -> derived +//   desicion   -> decision +//   didnot     -> did not +//   diferent   -> different +//   diferrent  -> different +//   differnt   -> different +//   diffrent   -> different +//   divison    -> division +//   doulbe     -> double +//   dyanmic    -> dynamic +//   effecient  -> efficient +//   elasped    -> elapsed +//   eligable   -> eligible +//   elpased    -> elapsed +//   embarass   -> embarrass +//   embeded    -> embedded +//   encypt     -> encrypt +//   excecut    -> execut +//   excercise  -> exercise +//   failse     -> false +//   fales      -> false +//   fasle      -> false +//   feild      -> field +//   finaly     -> finally +//   firend     -> friend +//   firts      -> first +//   fitler     -> filter +//   flase      -> false +//   follwo     -> follow +//   foriegn    -> foreign +//   foward     -> forward +//   fraciton   -> fraction +//   freind     -> friend +//   frequecy   -> frequency +//   fromthe    -> from the +//   fucntion   -> function +//   fufill     -> fulfill +//   fullfill   -> fulfill +//   futher     -> further +//   ganerate   -> generate +//   garantee   -> guarantee +//   gaurantee  -> guarantee +//   generaly   -> generally +//   govement   -> government +//   govenment  -> government +//   goverment  -> government +//   governmnet -> government +//   govorment  -> government +//   govornment -> government +//   greatful   -> grateful +//   guaratee   -> guarantee +//   heigher    -> higher +//   heigth     -> height +//   heirarchy  -> hierarchy +//   higest     -> highest +//   howver     -> however +//   hydogen    -> hydrogen +//   hygeine    -> hygiene +//   hypocracy  -> hypocrisy +//   hypocrasy  -> hypocrisy +//   hypocricy  -> hypocrisy +//   hypocrit:  -> hypocrite +//   iamge      -> image +//   importamt  -> important +//   inclued    -> include +//   indeces    -> indices +//   indecies   -> indices +//   indicies   -> indices +//   inital     -> initial +//   insted     -> instead +//   interator  -> iterator +//   intput     -> input +//   intrest    -> interest +//   invliad    -> invalid +//   laguage    -> language +//   largst     -> largest +//   learnign   -> learning +//   lenght     -> length +//   levle      -> level +//   liasion    -> liaison +//   libary     -> library +//   likly      -> likely +//   lisense    -> license +//   listner    -> listener +//   littel     -> little +//   looses:    -> loses +//   looup      -> lookup +//   macthing   -> matching +//   maintence  -> maintenance +//   manefist   -> manifest +//   mesage     -> message +//   morgage    -> mortgage +//   mysefl     -> myself +//   namesapce  -> namespace +//   namespcae  -> namespace +//   naturual   -> natural +//   neccesary  -> necessary +//   necesary   -> necessary +//   nulltpr    -> nullptr +//   occassion  -> occasion +//   occured    -> occurred +//   operaotr   -> operator +//   ouptut     -> output +//   ouput      -> output +//   overide    -> override +//   ovveride   -> override +//   pallete    -> palette +//   paralel    -> parallel +//   parralel   -> parallel +//   parrallel  -> parallel +//   particualr -> particular +//   paticular  -> particular +//   peaple     -> people +//   peice      -> piece +//   peolpe     -> people +//   peopel     -> people +//   perhasp    -> perhaps +//   perheaps   -> perhaps +//   perhpas    -> perhaps +//   perphas    -> perhaps +//   persue     -> pursue +//   poeople    -> people +//   poeple     -> people +//   poitner    -> pointer +//   posess     -> possess +//   postion    -> position +//   preiod     -> period +//   primarly   -> primarily +//   priviledge -> privilege +//   privte     -> private +//   probablly  -> probably +//   probaly    -> probably +//   probelm    -> problem +//   proccess   -> process +//   proeprty   -> property +//   prominant  -> prominent +//   proove     -> prove +//   propery    -> property +//   propogate  -> propagate +//   psuedo     -> pseudo +//   raelly     -> really +//   realtion   -> relation +//   realy      -> really +//   reasearch  -> research +//   receiev    -> receiv +//   recepient  -> recipient +//   reciept    -> receipt +//   reciev     -> receiv +//   recipiant  -> recipient +//   recrod     -> record +//   recuring   -> recurring +//   referece   -> reference +//   refered    -> referred +//   regluar    -> regular +//   relaly     -> really +//   releated   -> related +//   relevent   -> relevant +//   repitition -> repetition +//   reponse    -> response +//   reprot     -> report +//   resutl     -> result +//   retrun     -> return +//   retun      -> return +//   reuslt     -> result +//   reutrn     -> return +//   reveiw     -> review +//   saftey     -> safety +//   safty      -> safety +//   satisifed  -> satisfied +//   scheduel   -> schedule +//   seperat    -> separat +//   sequnce    -> sequence +//   shoudl     -> should +//   similiar   -> similar +//   simmilar   -> similar +//   singed     -> signed +//   singel     -> single +//   slighly    -> slightly +//   somehwat   -> somewhat +//   spectogram -> spectrogram +//   statment   -> statement +//   stirng     -> string +//   stregth    -> strength +//   strengh    -> strength +//   strign     -> string +//   succsess   -> success +//   sucess     -> success +//   sugest     -> suggest +//   sumary     -> summary +//   supress    -> suppress +//   surpress   -> suppress +//   swithc     -> switch +//   swtich     -> switch +//   symetric   -> symmetric +//   teamplate  -> template +//   tempalte   -> template +//   theese     -> these +//   therfore   -> therefore +//   thign      -> thing +//   thigsn     -> things +//   thikn      -> think +//   thiunk     -> think +//   thnigs     -> things +//   thresold   -> threshold +//   throught   -> thought +//   tihkn      -> think +//   tkaes      -> takes +//   todya      -> today +//   toghether  -> together +//   tolerence  -> tolerance +//   tongiht    -> tonight +//   tranpose   -> transpose +//   typcial    -> typical +//   udpate     -> update +//   unkown     -> unknown +//   unqiue     -> unique +//   ususally   -> usually +//   verticies  -> vertices +//   virutal    -> virtual +//   vitual     -> virtual +//   whcih      -> which +//   whereever  -> wherever +//   wherre     -> where +//   whihc      -> which +//   whlch      -> which +//   widht      -> width +//   wierd      -> weird +//   wihch      -> which +//   woudl      -> would +//   yeild      -> yield + +#define AUTOCORRECTION_MIN_LENGTH 5  // "abotu" +#define AUTOCORRECTION_MAX_LENGTH 10  // "auxilliary" + +static const uint8_t autocorrection_data[5967] PROGMEM = {108, 67, 0, 4, 212, 0, +  6, 236, 0, 7, 100, 1, 8, 15, 3, 9, 169, 8, 10, 204, 8, 11, 68, 9, 12, 246, 9, +  14, 0, 10, 15, 28, 10, 16, 79, 11, 17, 129, 11, 18, 175, 13, 19, 227, 13, 21, +  253, 13, 22, 194, 15, 23, 121, 17, 24, 201, 20, 25, 210, 20, 26, 8, 21, 28, +  34, 21, 0, 71, 89, 0, 8, 99, 0, 10, 130, 0, 18, 142, 0, 22, 152, 0, 23, 163, +  0, 24, 202, 0, 0, 22, 8, 24, 44, 0, 131, 115, 101, 100, 0, 75, 106, 0, 23, +  115, 0, 0, 23, 44, 8, 11, 23, 44, 0, 132, 0, 12, 21, 26, 28, 19, 18, 6, 0, +  133, 114, 105, 103, 104, 116, 0, 17, 12, 16, 16, 18, 6, 0, 132, 105, 110, 103, +  0, 15, 22, 4, 44, 0, 131, 108, 115, 111, 0, 8, 22, 18, 18, 15, 0, 132, 115, +  101, 115, 0, 76, 173, 0, 18, 183, 0, 24, 193, 0, 0, 21, 6, 18, 19, 28, 11, 0, +  128, 101, 0, 15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117, +  115, 116, 0, 23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 219, 0, 28, 228, 0, +  0, 24, 18, 5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 246, 0, +  12, 28, 1, 14, 92, 1, 0, 76, 253, 0, 23, 20, 1, 0, 75, 4, 1, 26, 10, 1, 0, 26, +  0, 129, 99, 104, 0, 11, 44, 0, 132, 119, 104, 105, 99, 104, 0, 12, 26, 22, 0, +  129, 99, 104, 0, 80, 41, 1, 21, 53, 1, 22, 67, 1, 23, 76, 1, 0, 17, 4, 28, 7, +  0, 132, 110, 97, 109, 105, 99, 0, 23, 8, 16, 28, 22, 0, 132, 109, 101, 116, +  114, 105, 99, 0, 4, 15, 6, 0, 129, 115, 105, 99, 0, 8, 11, 23, 22, 4, 0, 134, +  101, 115, 116, 104, 101, 116, 105, 99, 0, 8, 11, 6, 0, 129, 99, 107, 0, 68, +  122, 1, 8, 134, 1, 15, 84, 2, 17, 124, 2, 18, 180, 2, 21, 207, 2, 24, 7, 3, 0, +  12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 70, 168, 1, 7, 178, 1, 8, +  188, 1, 9, 199, 1, 10, 212, 1, 12, 222, 1, 19, 248, 1, 21, 3, 2, 22, 38, 2, +  23, 50, 2, 24, 75, 2, 0, 12, 25, 7, 4, 0, 130, 115, 101, 100, 0, 8, 5, 16, 8, +  0, 129, 100, 101, 100, 0, 21, 10, 10, 4, 0, 132, 114, 101, 101, 100, 0, 12, +  22, 12, 23, 4, 22, 0, 131, 102, 105, 101, 100, 0, 17, 12, 22, 0, 131, 103, +  110, 101, 100, 0, 85, 229, 1, 25, 238, 1, 0, 21, 24, 5, 0, 131, 105, 101, 100, +  0, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 22, 4, 15, 8, 0, 131, 112, 115, +  101, 100, 0, 72, 13, 2, 10, 22, 2, 24, 29, 2, 0, 9, 8, 21, 0, 129, 114, 101, +  100, 0, 4, 44, 0, 128, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 4, 19, +  15, 8, 0, 132, 97, 112, 115, 101, 100, 0, 68, 57, 2, 22, 68, 2, 0, 8, 15, 8, +  21, 0, 132, 97, 116, 101, 100, 0, 17, 12, 0, 128, 97, 100, 0, 15, 6, 17, 12, +  0, 129, 100, 101, 0, 76, 91, 2, 18, 112, 2, 0, 8, 0, 73, 100, 2, 28, 106, 2, +  0, 131, 105, 101, 108, 100, 0, 131, 105, 101, 108, 100, 0, 22, 8, 21, 11, 23, +  0, 130, 104, 111, 108, 100, 0, 72, 134, 2, 12, 145, 2, 24, 155, 2, 0, 21, 12, +  9, 0, 132, 114, 105, 101, 110, 100, 0, 8, 21, 9, 0, 131, 105, 101, 110, 100, +  0, 82, 162, 2, 21, 172, 2, 0, 21, 21, 4, 0, 132, 111, 117, 110, 100, 0, 4, 0, +  130, 111, 117, 110, 100, 0, 76, 187, 2, 21, 198, 2, 0, 8, 21, 19, 0, 132, 101, +  114, 105, 111, 100, 0, 6, 8, 21, 0, 130, 111, 114, 100, 0, 68, 217, 2, 8, 228, +  2, 24, 253, 2, 0, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 71, 235, 2, +  12, 245, 2, 0, 12, 22, 17, 18, 6, 0, 128, 101, 100, 0, 26, 0, 131, 101, 105, +  114, 100, 0, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4, 0, 128, 110, +  100, 0, 68, 67, 3, 5, 80, 3, 6, 123, 3, 7, 251, 3, 8, 23, 4, 10, 107, 4, 11, +  227, 4, 12, 52, 5, 15, 61, 5, 17, 0, 6, 18, 27, 6, 19, 37, 6, 21, 47, 6, 22, +  156, 6, 23, 82, 7, 24, 45, 8, 25, 115, 8, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130, +  97, 99, 101, 0, 68, 87, 3, 15, 97, 3, 0, 15, 12, 4, 25, 4, 0, 128, 108, 101, +  0, 68, 104, 3, 24, 115, 3, 0, 15, 12, 4, 25, 4, 0, 130, 98, 108, 101, 0, 18, +  7, 0, 130, 98, 108, 101, 0, 72, 136, 3, 12, 147, 3, 17, 156, 3, 19, 238, 3, 0, +  21, 8, 9, 8, 21, 0, 129, 110, 99, 101, 0, 8, 19, 0, 131, 105, 101, 99, 101, 0, +  68, 166, 3, 8, 179, 3, 24, 228, 3, 0, 23, 8, 19, 16, 18, 6, 0, 131, 101, 110, +  99, 101, 0, 85, 186, 3, 23, 217, 3, 0, 8, 0, 73, 195, 3, 15, 208, 3, 0, 21, +  44, 0, 134, 101, 102, 101, 114, 101, 110, 99, 101, 0, 18, 23, 0, 131, 97, 110, +  99, 101, 0, 17, 12, 4, 16, 0, 129, 97, 110, 99, 101, 0, 20, 8, 22, 0, 130, +  101, 110, 99, 101, 0, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12, +  21, 8, 25, 0, 82, 7, 4, 25, 13, 4, 0, 130, 114, 105, 100, 101, 0, 18, 0, 133, +  101, 114, 114, 105, 100, 101, 0, 23, 0, 68, 38, 4, 12, 49, 4, 17, 59, 4, 23, +  94, 4, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 16, 16, 18, 6, 0, 129, +  116, 101, 101, 0, 4, 21, 0, 68, 69, 4, 24, 81, 4, 0, 10, 0, 134, 117, 97, 114, +  97, 110, 116, 101, 101, 0, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101, +  101, 0, 12, 16, 18, 6, 0, 132, 109, 105, 116, 116, 101, 101, 0, 68, 117, 4, 7, +  184, 4, 16, 218, 4, 0, 74, 130, 4, 17, 141, 4, 22, 150, 4, 24, 159, 4, 0, 21, +  18, 16, 0, 131, 116, 103, 97, 103, 101, 0, 11, 6, 0, 131, 97, 110, 103, 101, +  0, 8, 16, 0, 130, 115, 97, 103, 101, 0, 10, 0, 108, 168, 4, 4, 174, 4, 0, 131, +  97, 117, 103, 101, 0, 15, 0, 132, 110, 103, 117, 97, 103, 101, 0, 8, 15, 0, +  68, 197, 4, 12, 203, 4, 15, 212, 4, 0, 131, 108, 101, 103, 101, 0, 25, 12, 21, +  19, 0, 130, 103, 101, 0, 4, 0, 130, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103, +  101, 0, 23, 0, 71, 245, 4, 16, 255, 4, 18, 9, 5, 22, 18, 5, 23, 27, 5, 0, 17, +  4, 44, 0, 130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0, +  23, 44, 0, 130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68, +  34, 5, 24, 42, 5, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32, +  116, 104, 101, 0, 29, 22, 44, 0, 130, 105, 122, 101, 0, 69, 77, 5, 12, 190, 5, +  19, 201, 5, 22, 241, 5, 25, 249, 5, 0, 68, 87, 5, 12, 167, 5, 15, 179, 5, 0, +  74, 97, 5, 12, 107, 5, 15, 137, 5, 0, 12, 15, 8, 0, 131, 105, 98, 108, 101, 0, +  15, 0, 68, 116, 5, 12, 127, 5, 0, 25, 4, 0, 133, 105, 108, 97, 98, 108, 101, +  0, 4, 25, 4, 0, 132, 97, 98, 108, 101, 0, 68, 144, 5, 12, 155, 5, 0, 25, 4, 0, +  132, 105, 108, 97, 98, 108, 101, 0, 25, 4, 0, 133, 97, 105, 108, 97, 98, 108, +  101, 0, 4, 15, 12, 4, 25, 4, 0, 131, 98, 108, 101, 0, 12, 4, 25, 4, 0, 130, +  97, 98, 108, 101, 0, 26, 11, 44, 0, 132, 119, 104, 105, 108, 101, 0, 68, 211, +  5, 8, 220, 5, 18, 230, 5, 0, 8, 19, 0, 131, 111, 112, 108, 101, 0, 18, 19, 0, +  132, 101, 111, 112, 108, 101, 0, 8, 18, 19, 0, 133, 101, 111, 112, 108, 101, +  0, 4, 9, 0, 130, 108, 115, 101, 0, 8, 15, 0, 129, 101, 108, 0, 70, 7, 6, 12, +  16, 6, 0, 12, 22, 44, 0, 130, 110, 99, 101, 0, 8, 10, 28, 11, 0, 131, 105, +  101, 110, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8, 19, 0, +  130, 112, 108, 101, 0, 70, 66, 6, 8, 76, 6, 12, 87, 6, 18, 99, 6, 21, 127, 6, +  24, 134, 6, 0, 18, 22, 44, 0, 131, 99, 111, 114, 101, 0, 23, 11, 44, 0, 132, +  116, 104, 101, 114, 101, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0, +  71, 106, 6, 9, 115, 6, 0, 8, 5, 0, 131, 102, 111, 114, 101, 0, 21, 8, 11, 23, +  0, 131, 101, 102, 111, 114, 101, 0, 8, 11, 26, 0, 129, 101, 0, 23, 0, 108, +  143, 6, 4, 148, 6, 0, 130, 114, 117, 101, 0, 16, 4, 0, 130, 101, 117, 114, 0, +  68, 178, 6, 8, 203, 6, 12, 211, 6, 15, 226, 6, 17, 235, 6, 18, 9, 7, 24, 22, +  7, 0, 79, 185, 6, 24, 193, 6, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0, +  131, 97, 117, 115, 101, 0, 8, 11, 23, 0, 130, 115, 101, 0, 6, 21, 8, 6, 27, 8, +  0, 134, 101, 114, 99, 105, 115, 101, 0, 12, 4, 9, 0, 131, 108, 115, 101, 0, +  72, 242, 6, 18, 253, 6, 0, 22, 12, 15, 0, 132, 99, 101, 110, 115, 101, 0, 19, +  8, 21, 0, 132, 115, 112, 111, 110, 115, 101, 0, 19, 17, 4, 21, 23, 0, 131, +  115, 112, 111, 115, 101, 0, 68, 32, 7, 6, 61, 7, 18, 72, 7, 0, 70, 39, 7, 8, +  49, 7, 0, 6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97, +  117, 115, 101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131, +  97, 117, 115, 101, 0, 68, 95, 7, 8, 13, 8, 15, 24, 8, 25, 36, 8, 0, 71, 111, +  7, 10, 148, 7, 15, 161, 7, 19, 228, 7, 21, 238, 7, 0, 18, 16, 0, 80, 121, 7, +  18, 136, 7, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0, +  6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 18, 19, 18, 21, 19, 0, 132, +  97, 103, 97, 116, 101, 0, 70, 171, 7, 19, 184, 7, 24, 197, 7, 0, 24, 15, 4, 6, +  0, 133, 99, 117, 108, 97, 116, 101, 0, 16, 4, 8, 23, 0, 134, 109, 112, 108, +  97, 116, 101, 0, 70, 204, 7, 15, 217, 7, 0, 24, 15, 4, 6, 0, 134, 99, 117, +  108, 97, 116, 101, 0, 4, 6, 0, 132, 99, 117, 108, 97, 116, 101, 0, 7, 24, 0, +  132, 112, 100, 97, 116, 101, 0, 72, 245, 7, 24, 2, 8, 0, 17, 4, 10, 0, 134, +  101, 110, 101, 114, 97, 116, 101, 0, 6, 4, 0, 132, 99, 117, 114, 97, 116, 101, +  0, 15, 15, 4, 19, 0, 131, 101, 116, 116, 101, 0, 4, 19, 16, 8, 23, 0, 131, +  108, 97, 116, 101, 0, 12, 21, 19, 0, 129, 97, 116, 101, 0, 74, 55, 8, 12, 67, +  8, 22, 77, 8, 0, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 20, 17, 24, +  0, 131, 105, 113, 117, 101, 0, 68, 84, 8, 21, 105, 8, 0, 6, 0, 108, 93, 8, 8, +  98, 8, 0, 130, 117, 115, 101, 0, 5, 0, 130, 117, 115, 101, 0, 8, 19, 0, 132, +  117, 114, 115, 117, 101, 0, 76, 122, 8, 18, 147, 8, 0, 72, 129, 8, 15, 139, 8, +  0, 15, 8, 5, 0, 131, 105, 101, 118, 101, 0, 8, 5, 0, 129, 101, 118, 101, 0, +  82, 154, 8, 25, 161, 8, 0, 21, 19, 0, 130, 118, 101, 0, 5, 4, 0, 131, 111, +  118, 101, 0, 12, 8, 0, 75, 182, 8, 15, 189, 8, 21, 197, 8, 0, 6, 0, 130, 105, +  101, 102, 0, 8, 5, 0, 130, 105, 101, 102, 0, 5, 0, 130, 105, 101, 102, 0, 76, +  211, 8, 17, 221, 8, 0, 17, 18, 10, 44, 0, 130, 105, 110, 103, 0, 76, 228, 8, +  21, 58, 9, 0, 72, 244, 8, 11, 11, 9, 15, 24, 9, 21, 36, 9, 28, 47, 9, 0, 72, +  251, 8, 11, 2, 9, 0, 5, 0, 131, 105, 110, 103, 0, 6, 4, 6, 0, 131, 105, 110, +  103, 0, 23, 6, 4, 16, 0, 133, 116, 99, 104, 105, 110, 103, 0, 8, 12, 6, 0, +  133, 101, 105, 108, 105, 110, 103, 0, 24, 6, 8, 21, 0, 130, 114, 105, 110, +  103, 0, 23, 28, 17, 4, 0, 131, 104, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114, +  105, 110, 103, 0, 70, 87, 9, 8, 142, 9, 10, 154, 9, 12, 164, 9, 22, 173, 9, +  23, 191, 9, 0, 75, 100, 9, 12, 109, 9, 15, 119, 9, 21, 127, 9, 0, 12, 26, 0, +  131, 104, 105, 99, 104, 0, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, 11, 26, +  0, 130, 105, 99, 104, 0, 4, 8, 22, 4, 8, 21, 0, 134, 115, 101, 97, 114, 99, +  104, 0, 23, 7, 17, 4, 44, 0, 130, 32, 116, 104, 101, 0, 17, 8, 21, 23, 22, 0, +  128, 116, 104, 0, 6, 11, 26, 0, 130, 105, 99, 104, 0, 12, 15, 19, 16, 18, 6, +  4, 0, 134, 99, 111, 109, 112, 108, 105, 115, 104, 0, 74, 201, 9, 12, 225, 9, +  21, 236, 9, 0, 72, 208, 9, 12, 218, 9, 0, 21, 23, 22, 0, 130, 110, 103, 116, +  104, 0, 8, 11, 0, 129, 104, 116, 0, 26, 7, 17, 4, 5, 0, 129, 100, 116, 104, 0, +  24, 23, 44, 0, 131, 114, 117, 116, 104, 0, 21, 8, 11, 23, 44, 0, 129, 105, +  114, 0, 17, 0, 76, 9, 10, 24, 20, 10, 0, 23, 11, 44, 0, 132, 116, 104, 105, +  110, 107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 50, 10, 7, 134, 10, 8, 177, +  10, 9, 17, 11, 15, 26, 11, 23, 55, 11, 24, 64, 11, 0, 76, 60, 10, 23, 71, 10, +  24, 96, 10, 0, 6, 19, 28, 23, 0, 131, 105, 99, 97, 108, 0, 76, 78, 10, 24, 86, +  10, 0, 17, 12, 0, 129, 105, 97, 108, 0, 21, 12, 25, 0, 131, 116, 117, 97, 108, +  0, 81, 106, 10, 21, 115, 10, 23, 124, 10, 0, 4, 44, 0, 130, 110, 117, 97, 108, +  0, 24, 23, 4, 17, 0, 130, 97, 108, 0, 12, 25, 0, 131, 114, 116, 117, 97, 108, +  0, 24, 0, 82, 143, 10, 26, 167, 10, 0, 70, 153, 10, 11, 157, 10, 26, 163, 10, +  0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0, 129, 108, 100, 0, 18, 44, 0, +  132, 119, 111, 117, 108, 100, 0, 74, 193, 10, 15, 201, 10, 19, 247, 10, 23, +  255, 10, 24, 7, 11, 0, 17, 12, 22, 0, 129, 108, 101, 0, 68, 208, 10, 15, 234, +  10, 0, 21, 0, 68, 217, 10, 21, 224, 10, 0, 19, 0, 129, 108, 101, 108, 0, 4, +  19, 0, 132, 97, 108, 108, 101, 108, 0, 4, 21, 21, 4, 19, 0, 133, 97, 108, 108, +  101, 108, 0, 18, 8, 19, 0, 129, 108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0, +  7, 8, 11, 6, 22, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102, 0, 12, +  9, 0, 79, 36, 11, 24, 46, 11, 0, 15, 24, 9, 0, 132, 102, 105, 108, 108, 0, 9, +  0, 131, 108, 102, 105, 108, 108, 0, 24, 22, 8, 21, 0, 129, 108, 116, 0, 9, 23, +  4, 8, 21, 10, 0, 133, 97, 116, 101, 102, 117, 108, 0, 68, 89, 11, 15, 106, 11, +  21, 117, 11, 0, 21, 10, 18, 23, 6, 8, 19, 22, 0, 132, 114, 111, 103, 114, 97, +  109, 0, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 18, 9, 18, 6, 0, 131, 110, +  102, 111, 114, 109, 0, 68, 166, 11, 7, 206, 11, 8, 215, 11, 10, 58, 12, 12, +  141, 12, 14, 153, 12, 18, 192, 12, 19, 108, 13, 21, 120, 13, 22, 131, 13, 24, +  141, 13, 26, 164, 13, 0, 12, 0, 74, 175, 11, 23, 183, 11, 0, 4, 44, 0, 130, +  97, 105, 110, 0, 81, 190, 11, 21, 198, 11, 0, 18, 6, 0, 130, 97, 105, 110, 0, +  8, 6, 0, 130, 97, 105, 110, 0, 24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 231, +  11, 8, 241, 11, 10, 27, 12, 19, 39, 12, 22, 48, 12, 0, 15, 12, 11, 6, 0, 129, +  114, 101, 110, 0, 87, 248, 11, 26, 17, 12, 0, 72, 255, 11, 26, 7, 12, 0, 5, 0, +  130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8, 5, 0, +  131, 116, 119, 101, 101, 110, 0, 18, 7, 28, 11, 0, 131, 114, 111, 103, 101, +  110, 0, 4, 11, 44, 0, 129, 112, 101, 110, 0, 18, 18, 11, 6, 0, 131, 115, 101, +  110, 0, 72, 65, 12, 12, 76, 12, 0, 12, 21, 18, 9, 0, 131, 101, 105, 103, 110, +  0, 75, 95, 12, 15, 101, 12, 17, 109, 12, 18, 118, 12, 21, 125, 12, 22, 132, +  12, 0, 23, 0, 129, 110, 103, 0, 15, 4, 0, 131, 105, 103, 110, 0, 21, 4, 8, 15, +  0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 23, 22, 0, 129, 110, 103, 0, +  4, 44, 0, 130, 115, 105, 103, 110, 0, 23, 4, 21, 8, 6, 0, 131, 116, 97, 105, +  110, 0, 75, 160, 12, 12, 169, 12, 0, 12, 23, 0, 131, 104, 105, 110, 107, 0, +  75, 176, 12, 23, 182, 12, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0, 132, 116, +  104, 105, 110, 107, 0, 76, 202, 12, 22, 86, 13, 23, 96, 13, 0, 70, 212, 12, +  22, 225, 12, 23, 251, 12, 0, 12, 22, 8, 7, 0, 133, 99, 105, 115, 105, 111, +  110, 0, 68, 232, 12, 22, 241, 12, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4, +  6, 6, 18, 0, 131, 105, 111, 110, 0, 68, 14, 13, 7, 27, 13, 12, 37, 13, 15, 52, +  13, 17, 64, 13, 22, 76, 13, 0, 21, 8, 5, 4, 0, 132, 114, 97, 116, 105, 111, +  110, 0, 7, 4, 0, 131, 105, 116, 105, 111, 110, 0, 23, 12, 19, 8, 21, 0, 134, +  101, 116, 105, 116, 105, 111, 110, 0, 4, 8, 21, 0, 133, 108, 97, 116, 105, +  111, 110, 0, 6, 24, 9, 0, 133, 110, 99, 116, 105, 111, 110, 0, 18, 19, 0, 131, +  105, 116, 105, 111, 110, 0, 12, 25, 12, 7, 0, 129, 105, 111, 110, 0, 12, 6, 4, +  21, 9, 0, 131, 116, 105, 111, 110, 0, 19, 11, 4, 0, 132, 104, 97, 112, 112, +  101, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 10, 12, 11, 23, 0, +  130, 110, 103, 115, 0, 85, 148, 13, 23, 157, 13, 0, 23, 8, 21, 0, 130, 117, +  114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 18, 14, 17, 24, 0, 130, 110, 111, +  119, 110, 0, 71, 185, 13, 17, 196, 13, 26, 205, 13, 0, 8, 24, 22, 19, 0, 131, +  101, 117, 100, 111, 0, 26, 14, 44, 0, 130, 110, 111, 119, 0, 79, 212, 13, 17, +  220, 13, 0, 15, 18, 9, 0, 129, 111, 119, 0, 14, 44, 0, 129, 111, 119, 0, 86, +  234, 13, 24, 244, 13, 0, 4, 11, 21, 8, 19, 0, 129, 112, 115, 0, 18, 18, 15, 0, +  129, 107, 117, 112, 0, 68, 28, 14, 8, 93, 14, 11, 103, 15, 15, 113, 15, 18, +  127, 15, 19, 144, 15, 22, 155, 15, 23, 164, 15, 24, 176, 15, 28, 185, 15, 0, +  76, 38, 14, 15, 48, 14, 24, 82, 14, 0, 15, 12, 16, 12, 22, 0, 130, 97, 114, 0, +  76, 55, 14, 24, 66, 14, 0, 16, 16, 12, 22, 0, 132, 105, 108, 97, 114, 0, 6, +  12, 23, 4, 19, 0, 134, 114, 116, 105, 99, 117, 108, 97, 114, 0, 15, 10, 8, 21, +  0, 131, 117, 108, 97, 114, 0, 68, 124, 14, 7, 132, 14, 11, 145, 14, 12, 203, +  14, 15, 229, 14, 16, 239, 14, 17, 249, 14, 18, 37, 15, 23, 45, 15, 25, 76, 15, +  0, 15, 6, 0, 130, 101, 97, 114, 0, 17, 4, 15, 4, 6, 0, 132, 101, 110, 100, 97, +  114, 0, 74, 152, 14, 23, 163, 14, 0, 12, 8, 11, 0, 133, 105, 103, 104, 101, +  114, 0, 72, 173, 14, 15, 185, 14, 24, 194, 14, 0, 11, 10, 18, 23, 0, 133, 101, +  116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0, 9, 0, 131, 114, +  116, 104, 101, 114, 0, 75, 210, 14, 15, 218, 14, 0, 23, 44, 0, 130, 101, 105, +  114, 0, 19, 16, 18, 6, 0, 131, 105, 108, 101, 114, 0, 23, 12, 9, 0, 131, 108, +  116, 101, 114, 0, 16, 4, 21, 10, 44, 0, 129, 97, 114, 0, 76, 0, 15, 23, 12, +  15, 0, 10, 10, 8, 5, 0, 132, 105, 110, 110, 101, 114, 0, 76, 19, 15, 22, 28, +  15, 0, 18, 19, 0, 131, 110, 116, 101, 114, 0, 12, 15, 0, 130, 101, 110, 101, +  114, 0, 9, 8, 5, 0, 129, 114, 101, 0, 75, 52, 15, 24, 62, 15, 0, 18, 17, 4, 0, +  131, 116, 104, 101, 114, 0, 19, 18, 16, 6, 0, 134, 111, 109, 112, 117, 116, +  101, 114, 0, 72, 83, 15, 26, 94, 15, 0, 8, 21, 8, 11, 26, 0, 131, 118, 101, +  114, 0, 18, 11, 0, 130, 101, 118, 101, 114, 0, 8, 23, 18, 44, 0, 130, 104, +  101, 114, 0, 4, 24, 6, 12, 23, 21, 4, 19, 0, 130, 108, 97, 114, 0, 23, 4, 21, +  8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 23, 15, 15, 24, +  17, 0, 130, 112, 116, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 18, 4, 21, 8, +  19, 18, 0, 130, 116, 111, 114, 0, 6, 18, 44, 0, 129, 99, 117, 114, 0, 8, 25, +  8, 44, 0, 129, 114, 121, 0, 68, 219, 15, 8, 3, 16, 10, 147, 16, 19, 158, 16, +  21, 170, 16, 22, 181, 16, 23, 77, 17, 24, 85, 17, 0, 75, 229, 15, 19, 240, 15, +  28, 250, 15, 0, 19, 21, 8, 19, 0, 131, 104, 97, 112, 115, 0, 11, 21, 8, 19, 0, +  130, 97, 112, 115, 0, 26, 15, 4, 0, 130, 97, 121, 115, 0, 68, 19, 16, 6, 42, +  16, 12, 53, 16, 15, 129, 16, 22, 136, 16, 0, 71, 26, 16, 14, 34, 16, 0, 12, +  44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0, 8, 7, 17, 12, +  0, 131, 105, 99, 101, 115, 0, 70, 63, 16, 21, 102, 16, 23, 117, 16, 0, 72, 70, +  16, 12, 80, 16, 0, 7, 17, 12, 0, 132, 105, 99, 101, 115, 0, 71, 87, 16, 23, +  94, 16, 0, 17, 12, 0, 130, 101, 115, 0, 21, 8, 25, 0, 130, 101, 115, 0, 18, +  22, 8, 6, 6, 4, 0, 132, 115, 111, 114, 105, 101, 115, 0, 15, 12, 5, 4, 0, 131, +  105, 116, 105, 101, 115, 0, 4, 9, 0, 129, 115, 101, 0, 18, 11, 6, 44, 0, 130, +  111, 115, 101, 115, 0, 12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 4, 8, +  11, 21, 8, 19, 0, 131, 97, 112, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97, 114, +  115, 0, 68, 191, 16, 8, 203, 16, 18, 66, 17, 0, 21, 4, 5, 16, 8, 0, 130, 114, +  97, 115, 115, 0, 70, 216, 16, 17, 240, 16, 21, 13, 17, 22, 42, 17, 0, 70, 223, +  16, 24, 232, 16, 0, 18, 21, 19, 0, 131, 101, 115, 115, 0, 22, 0, 130, 99, 101, +  115, 115, 0, 76, 247, 16, 22, 3, 17, 0, 22, 22, 24, 5, 0, 133, 105, 110, 101, +  115, 115, 0, 24, 5, 0, 131, 105, 110, 101, 115, 115, 0, 19, 0, 85, 22, 17, 24, +  33, 17, 0, 24, 22, 0, 133, 112, 112, 114, 101, 115, 115, 0, 22, 0, 131, 112, +  114, 101, 115, 115, 0, 70, 49, 17, 18, 58, 17, 0, 6, 24, 22, 0, 131, 101, 115, +  115, 0, 19, 0, 130, 115, 101, 115, 115, 0, 21, 6, 6, 4, 0, 132, 114, 111, 115, +  115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 82, 92, 17, 22, 106, 17, 0, 15, 18, +  16, 18, 17, 4, 0, 132, 97, 108, 111, 117, 115, 0, 17, 8, 6, 17, 18, 6, 0, 133, +  115, 101, 110, 115, 117, 115, 0, 68, 158, 17, 8, 188, 17, 10, 217, 17, 11, +  227, 17, 12, 25, 18, 15, 36, 18, 16, 47, 18, 17, 59, 18, 18, 151, 19, 19, 189, +  19, 22, 217, 19, 24, 107, 20, 0, 85, 165, 17, 26, 176, 17, 0, 8, 19, 8, 22, 0, +  131, 97, 114, 97, 116, 0, 11, 8, 16, 18, 22, 0, 131, 119, 104, 97, 116, 0, 68, +  195, 17, 17, 204, 17, 0, 21, 10, 44, 0, 130, 101, 97, 116, 0, 16, 17, 21, 8, +  25, 18, 10, 0, 130, 101, 110, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0, +  71, 237, 17, 10, 244, 17, 12, 14, 18, 0, 12, 26, 0, 129, 116, 104, 0, 81, 251, +  17, 24, 2, 18, 0, 8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111, +  117, 103, 104, 116, 0, 10, 17, 18, 23, 0, 131, 105, 103, 104, 116, 0, 23, 24, +  18, 5, 4, 0, 129, 32, 105, 116, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116, +  0, 4, 23, 21, 18, 19, 16, 12, 0, 129, 110, 116, 0, 68, 72, 18, 8, 128, 18, 21, +  132, 19, 22, 143, 19, 0, 76, 85, 18, 17, 96, 18, 21, 107, 18, 23, 117, 18, 0, +  19, 12, 6, 8, 21, 0, 130, 101, 110, 116, 0, 12, 16, 18, 21, 19, 0, 130, 101, +  110, 116, 0, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 8, 19, 16, 18, 6, 0, 130, +  101, 110, 116, 0, 76, 144, 18, 16, 177, 18, 21, 21, 19, 25, 111, 19, 29, 121, +  19, 0, 70, 151, 18, 19, 164, 18, 0, 8, 9, 9, 8, 0, 133, 105, 99, 105, 101, +  110, 116, 0, 8, 6, 8, 21, 0, 133, 105, 112, 105, 101, 110, 116, 0, 72, 190, +  18, 17, 202, 18, 21, 235, 18, 23, 10, 19, 0, 25, 18, 10, 0, 131, 114, 110, +  109, 101, 110, 116, 0, 72, 209, 18, 21, 221, 18, 0, 25, 18, 10, 0, 132, 114, +  110, 109, 101, 110, 116, 0, 18, 25, 18, 10, 0, 134, 101, 114, 110, 109, 101, +  110, 116, 0, 72, 242, 18, 18, 253, 18, 0, 25, 18, 10, 0, 131, 110, 109, 101, +  110, 116, 0, 25, 18, 10, 0, 133, 101, 114, 110, 109, 101, 110, 116, 0, 4, 23, +  22, 0, 131, 101, 109, 101, 110, 116, 0, 68, 34, 19, 8, 45, 19, 9, 57, 19, 21, +  68, 19, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 9, 12, 7, 0, 132, +  102, 101, 114, 101, 110, 116, 0, 9, 12, 7, 0, 131, 101, 114, 101, 110, 116, 0, +  68, 75, 19, 8, 99, 19, 0, 19, 0, 68, 84, 19, 19, 92, 19, 0, 133, 112, 97, 114, +  101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 9, 12, 7, 0, 133, 102, 101, +  114, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 12, 17, 10, 18, +  6, 0, 130, 97, 110, 116, 0, 8, 9, 9, 12, 7, 0, 129, 101, 110, 116, 0, 18, 6, +  0, 130, 110, 115, 116, 0, 81, 161, 19, 21, 171, 19, 22, 180, 19, 0, 7, 12, 7, +  0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116, 0, 16, 15, 4, +  0, 130, 111, 115, 116, 0, 72, 196, 19, 28, 207, 19, 0, 12, 6, 8, 21, 0, 131, +  101, 105, 112, 116, 0, 6, 17, 8, 0, 130, 114, 121, 112, 116, 0, 72, 236, 19, +  10, 21, 20, 12, 30, 20, 16, 59, 20, 17, 69, 20, 24, 96, 20, 0, 74, 243, 19, +  21, 10, 20, 0, 76, 250, 19, 24, 2, 20, 0, 11, 0, 130, 104, 101, 115, 116, 0, +  22, 0, 130, 103, 101, 115, 116, 0, 23, 17, 12, 0, 131, 101, 114, 101, 115, +  116, 0, 21, 4, 15, 0, 129, 101, 115, 116, 0, 73, 37, 20, 17, 49, 20, 0, 8, 17, +  4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 4, 10, 4, 0, 131, 105, 110, 115, +  116, 0, 18, 15, 4, 0, 131, 109, 111, 115, 116, 0, 68, 76, 20, 17, 87, 20, 0, +  12, 10, 4, 0, 132, 97, 105, 110, 115, 116, 0, 12, 4, 10, 4, 0, 130, 115, 116, +  0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0, 70, 120, 20, 18, 144, 20, +  19, 168, 20, 23, 191, 20, 0, 72, 127, 20, 21, 137, 20, 0, 6, 27, 8, 0, 132, +  101, 99, 117, 116, 0, 12, 6, 0, 128, 105, 116, 0, 68, 151, 20, 5, 160, 20, 0, +  5, 0, 132, 97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 175, +  20, 24, 183, 20, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112, +  117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129, +  117, 116, 0, 72, 217, 20, 12, 253, 20, 0, 68, 224, 20, 12, 231, 20, 0, 11, 44, +  0, 129, 118, 101, 0, 70, 238, 20, 8, 246, 20, 0, 8, 21, 0, 130, 101, 105, 118, +  0, 6, 8, 21, 0, 129, 118, 0, 8, 11, 6, 4, 44, 0, 130, 105, 101, 118, 0, 76, +  15, 21, 17, 25, 21, 0, 8, 25, 8, 21, 0, 130, 105, 101, 119, 0, 18, 14, 44, 0, +  130, 110, 111, 119, 0, 70, 59, 21, 8, 118, 21, 11, 128, 21, 15, 146, 21, 17, +  87, 22, 21, 114, 22, 22, 12, 23, 23, 39, 23, 0, 68, 72, 21, 8, 84, 21, 12, 95, +  21, 19, 106, 21, 0, 21, 6, 18, 19, 28, 11, 0, 130, 105, 115, 121, 0, 24, 20, +  8, 21, 9, 0, 129, 110, 99, 121, 0, 21, 6, 18, 19, 28, 11, 0, 129, 115, 121, 0, +  24, 21, 14, 17, 4, 5, 0, 129, 116, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116, +  121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121, +  0, 68, 165, 21, 11, 232, 21, 14, 242, 21, 15, 250, 21, 18, 66, 22, 21, 76, 22, +  0, 69, 184, 21, 8, 193, 21, 15, 199, 21, 17, 208, 21, 21, 215, 21, 24, 224, +  21, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0, +  131, 97, 108, 108, 121, 0, 12, 9, 0, 128, 108, 121, 0, 8, 17, 8, 10, 0, 128, +  108, 121, 0, 23, 6, 4, 0, 128, 108, 121, 0, 10, 12, 15, 22, 0, 129, 116, 108, +  121, 0, 12, 15, 0, 129, 101, 108, 121, 0, 68, 4, 22, 5, 47, 22, 8, 56, 22, 0, +  86, 11, 22, 23, 35, 22, 0, 24, 0, 108, 20, 22, 22, 27, 22, 0, 131, 117, 97, +  108, 108, 121, 0, 24, 0, 132, 97, 108, 108, 121, 0, 24, 6, 4, 0, 133, 116, +  117, 97, 108, 108, 121, 0, 4, 5, 18, 21, 19, 0, 129, 121, 0, 4, 21, 0, 132, +  101, 97, 108, 108, 121, 0, 16, 18, 17, 4, 0, 130, 97, 108, 121, 0, 4, 16, 12, +  21, 19, 0, 129, 105, 108, 121, 0, 72, 94, 22, 19, 103, 22, 0, 18, 16, 44, 0, +  130, 110, 101, 121, 0, 4, 16, 18, 6, 0, 131, 112, 97, 110, 121, 0, 68, 127, +  22, 8, 231, 22, 18, 240, 22, 23, 253, 22, 0, 69, 143, 22, 12, 152, 22, 15, +  165, 22, 16, 193, 22, 22, 202, 22, 0, 12, 15, 0, 130, 114, 97, 114, 121, 0, +  15, 15, 12, 27, 24, 4, 0, 132, 105, 97, 114, 121, 0, 76, 172, 22, 15, 182, 22, +  0, 27, 24, 4, 0, 130, 105, 97, 114, 121, 0, 12, 27, 24, 4, 0, 131, 105, 97, +  114, 121, 0, 24, 22, 0, 130, 109, 97, 114, 121, 0, 8, 6, 0, 70, 212, 22, 8, +  223, 22, 0, 8, 17, 0, 133, 101, 115, 115, 97, 114, 121, 0, 17, 0, 130, 115, +  97, 114, 121, 0, 19, 18, 21, 19, 0, 128, 116, 121, 0, 10, 4, 23, 4, 6, 0, 132, +  101, 103, 111, 114, 121, 0, 17, 24, 6, 18, 44, 0, 134, 99, 111, 117, 110, 116, +  114, 121, 0, 4, 0, 85, 21, 23, 26, 32, 23, 0, 6, 18, 19, 28, 11, 0, 130, 105, +  115, 121, 0, 15, 4, 0, 129, 121, 115, 0, 73, 49, 23, 15, 57, 23, 21, 66, 23, +  0, 4, 22, 0, 129, 101, 116, 121, 0, 12, 5, 4, 0, 129, 105, 116, 121, 0, 19, 8, +  18, 21, 19, 0, 132, 112, 101, 114, 116, 121, 0}; + diff --git a/users/gourdo1/autocorrect/autocorrection_data.h (small) b/users/gourdo1/autocorrect/autocorrection_data.h (small) new file mode 100644 index 0000000000..f98471bb08 --- /dev/null +++ b/users/gourdo1/autocorrect/autocorrection_data.h (small) @@ -0,0 +1,152 @@ +// Copyright 2021-2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +//     https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated code. + +// Autocorrection dictionary (71 entries): +//   :guage     -> gauge +//   :the:the:  -> the +//   :thier     -> their +//   :ture      -> true +//   accomodate -> accommodate +//   acommodate -> accommodate +//   aparent    -> apparent +//   aparrent   -> apparent +//   apparant   -> apparent +//   apparrent  -> apparent +//   aquire     -> acquire +//   becuase    -> because +//   cauhgt     -> caught +//   cheif      -> chief +//   choosen    -> chosen +//   cieling    -> ceiling +//   collegue   -> colleague +//   concensus  -> consensus +//   contians   -> contains +//   cosnt      -> const +//   dervied    -> derived +//   dosen't    -> doesn't +//   fales      -> false +//   fasle      -> false +//   fitler     -> filter +//   flase      -> false +//   foward     -> forward +//   frequecy   -> frequency +//   gaurantee  -> guarantee +//   guaratee   -> guarantee +//   heigth     -> height +//   heirarchy  -> hierarchy +//   inclued    -> include +//   interator  -> iterator +//   intput     -> input +//   invliad    -> invalid +//   lenght     -> length +//   liasion    -> liaison +//   libary     -> library +//   listner    -> listener +//   looses:    -> loses +//   looup      -> lookup +//   manefist   -> manifest +//   namesapce  -> namespace +//   namespcae  -> namespace +//   occassion  -> occasion +//   occured    -> occurred +//   ouptut     -> output +//   ouput      -> output +//   overide    -> override +//   postion    -> position +//   priviledge -> privilege +//   psuedo     -> pseudo +//   recieve    -> receive +//   refered    -> referred +//   relevent   -> relevant +//   repitition -> repetition +//   retrun     -> return +//   retun      -> return +//   reuslt     -> result +//   reutrn     -> return +//   saftey     -> safety +//   seperate   -> separate +//   singed     -> signed +//   stirng     -> string +//   strign     -> string +//   swithc     -> switch +//   swtich     -> switch +//   thresold   -> threshold +//   udpate     -> update +//   widht      -> width + +#define AUTOCORRECTION_MIN_LENGTH 5  // ":ture" +#define AUTOCORRECTION_MAX_LENGTH 10  // "accomodate" + +static const uint8_t autocorrection_data[1120] PROGMEM = {108, 43, 0, 6, 71, 0, +  7, 81, 0, 8, 199, 0, 9, 240, 1, 10, 250, 1, 11, 26, 2, 17, 53, 2, 18, 190, 2, +  19, 202, 2, 21, 212, 2, 22, 20, 3, 23, 67, 3, 28, 32, 4, 0, 72, 50, 0, 22, 60, +  0, 0, 11, 23, 44, 8, 11, 23, 44, 0, 132, 0, 8, 22, 18, 18, 15, 0, 132, 115, +  101, 115, 0, 11, 23, 12, 26, 22, 0, 129, 99, 104, 0, 68, 94, 0, 8, 106, 0, 15, +  174, 0, 21, 187, 0, 0, 12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 74, +  119, 0, 12, 129, 0, 21, 140, 0, 24, 165, 0, 0, 17, 12, 22, 0, 131, 103, 110, +  101, 100, 0, 25, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 72, 147, 0, 24, 156, +  0, 0, 9, 8, 21, 0, 129, 114, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, +  15, 6, 17, 12, 0, 129, 100, 101, 0, 18, 22, 8, 21, 11, 23, 0, 130, 104, 111, +  108, 100, 0, 4, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 68, 233, 0, 6, +  246, 0, 7, 4, 1, 8, 16, 1, 10, 52, 1, 15, 81, 1, 21, 90, 1, 22, 117, 1, 23, +  144, 1, 24, 215, 1, 25, 228, 1, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130, 97, 99, +  101, 0, 19, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12, 21, 8, 25, +  18, 0, 130, 114, 105, 100, 101, 0, 23, 0, 68, 25, 1, 17, 36, 1, 0, 21, 4, 24, +  10, 0, 130, 110, 116, 101, 101, 0, 4, 21, 24, 4, 10, 0, 135, 117, 97, 114, 97, +  110, 116, 101, 101, 0, 68, 59, 1, 7, 69, 1, 0, 24, 10, 44, 0, 131, 97, 117, +  103, 101, 0, 8, 15, 12, 25, 12, 21, 19, 0, 130, 103, 101, 0, 22, 4, 9, 0, 130, +  108, 115, 101, 0, 76, 97, 1, 24, 109, 1, 0, 24, 20, 4, 0, 132, 99, 113, 117, +  105, 114, 101, 0, 23, 44, 0, 130, 114, 117, 101, 0, 4, 0, 79, 126, 1, 24, 134, +  1, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0, 131, 97, 117, 115, 101, 0, +  4, 0, 71, 156, 1, 19, 193, 1, 21, 203, 1, 0, 18, 16, 0, 80, 166, 1, 18, 181, +  1, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0, 6, 6, 4, +  0, 132, 109, 111, 100, 97, 116, 101, 0, 7, 24, 0, 132, 112, 100, 97, 116, 101, +  0, 8, 19, 8, 22, 0, 132, 97, 114, 97, 116, 101, 0, 10, 8, 15, 15, 18, 6, 0, +  130, 97, 103, 117, 101, 0, 8, 12, 6, 8, 21, 0, 131, 101, 105, 118, 101, 0, 12, +  8, 11, 6, 0, 130, 105, 101, 102, 0, 17, 0, 76, 3, 2, 21, 16, 2, 0, 15, 8, 12, +  6, 0, 133, 101, 105, 108, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114, 105, 110, +  103, 0, 70, 33, 2, 23, 44, 2, 0, 12, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, +  10, 12, 8, 11, 0, 129, 104, 116, 0, 72, 69, 2, 10, 80, 2, 18, 89, 2, 21, 156, +  2, 24, 167, 2, 0, 22, 18, 18, 11, 6, 0, 131, 115, 101, 110, 0, 12, 21, 23, 22, +  0, 129, 110, 103, 0, 12, 0, 86, 98, 2, 23, 124, 2, 0, 68, 105, 2, 22, 114, 2, +  0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4, 6, 6, 18, 0, 131, 105, 111, 110, +  0, 76, 131, 2, 22, 146, 2, 0, 23, 12, 19, 8, 21, 0, 134, 101, 116, 105, 116, +  105, 111, 110, 0, 18, 19, 0, 131, 105, 116, 105, 111, 110, 0, 23, 24, 8, 21, +  0, 131, 116, 117, 114, 110, 0, 85, 174, 2, 23, 183, 2, 0, 23, 8, 21, 0, 130, +  117, 114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 7, 8, 24, 22, 19, 0, 131, 101, +  117, 100, 111, 0, 24, 18, 18, 15, 0, 129, 107, 117, 112, 0, 72, 219, 2, 18, 3, +  3, 0, 76, 229, 2, 15, 238, 2, 17, 248, 2, 0, 11, 23, 44, 0, 130, 101, 105, +  114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114, 0, 23, 22, 12, 15, 0, 130, 101, +  110, 101, 114, 0, 23, 4, 21, 8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, +  111, 114, 0, 72, 30, 3, 17, 38, 3, 24, 51, 3, 0, 15, 4, 9, 0, 129, 115, 101, +  0, 4, 12, 23, 17, 18, 6, 0, 131, 97, 105, 110, 115, 0, 22, 17, 8, 6, 17, 18, +  6, 0, 133, 115, 101, 110, 115, 117, 115, 0, 116, 89, 3, 10, 102, 3, 11, 112, +  3, 15, 134, 3, 17, 145, 3, 22, 234, 3, 24, 248, 3, 0, 17, 8, 22, 18, 7, 0, +  132, 101, 115, 110, 39, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0, 71, +  119, 3, 10, 126, 3, 0, 12, 26, 0, 129, 116, 104, 0, 17, 8, 15, 0, 129, 116, +  104, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116, 0, 68, 155, 3, 8, 166, 3, +  22, 226, 3, 0, 21, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 85, 173, 3, 25, +  216, 3, 0, 68, 180, 3, 21, 191, 3, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, +  116, 0, 4, 19, 0, 68, 201, 3, 19, 209, 3, 0, 133, 112, 97, 114, 101, 110, 116, +  0, 4, 0, 131, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 18, 6, +  0, 130, 110, 115, 116, 0, 12, 9, 8, 17, 4, 16, 0, 132, 105, 102, 101, 115, +  116, 0, 83, 255, 3, 23, 22, 4, 0, 87, 6, 4, 24, 14, 4, 0, 17, 12, 0, 131, 112, +  117, 116, 0, 18, 0, 130, 116, 112, 117, 116, 0, 19, 24, 18, 0, 131, 116, 112, +  117, 116, 0, 70, 45, 4, 8, 57, 4, 11, 67, 4, 21, 85, 4, 0, 8, 24, 20, 8, 21, +  9, 0, 129, 110, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116, 121, 0, 6, 21, 4, +  21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121, 0, 4, 5, 12, 15, +  0, 130, 114, 97, 114, 121, 0}; + diff --git a/users/gourdo1/autocorrect/autocorrection_dict.txt b/users/gourdo1/autocorrect/autocorrection_dict.txt new file mode 100644 index 0000000000..b5f293d96c --- /dev/null +++ b/users/gourdo1/autocorrect/autocorrection_dict.txt @@ -0,0 +1,473 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +#     https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# This is a larger example typo dictionary containing 400 entries. It builds to +# a table of about 6000 bytes, so you'll need a keyboard with a generous +# amount of free firmware space to use the full dictionary. Alternatively, pick +# out a subset of entries to a separate file, then build a table from that. +# +# Dictionary syntax: +# Each line of this file defines one typo correction entry with the syntax +# "typo -> correction". Typos and corrections are case insensitive, and any +# whitespace before or after the typo and correction is ignored. The typo must be +# only the letters a-z, or the special character : representing a word break. +# +# For documentation about how to use this dictionary, see +# https://getreuer.info/posts/keyboards/autocorrection +# +# Further resources: +#  * Wikipedia has a large list of common typos at +#    https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines +# +#  * EmacsWiki has another list of typos at +#    https://www.emacswiki.org/emacs/autocorrection_abbrev_defs +# +#  * You can find data on English word frequencies at +#    https://www.wordfrequency.info/samples.asp + + +## 10 most common words. +# The words "there", "about", "their", "would", "people", "which", "could", +# "think", "other", and "because" are among the most common words in English +# that are 5 letters or longer. (We don't include entries for words shorter than +# that to avoid false triggering.) +:htere        -> there +abbout        -> about +abotu         -> about +baout         -> about +:theri        -> their +:thier        -> their +:owudl        -> would +woudl         -> would +peaple        -> people +peolpe        -> people +peopel        -> people +poeple        -> people +poeople       -> people +:hwihc        -> which +whcih         -> which +whihc         -> which +whlch         -> which +wihch         -> which +coudl         -> could +:htikn        -> think +:htink        -> think +thikn         -> think +thiunk        -> think +tihkn         -> think +:olther       -> other +:otehr        -> other +baceause      -> because +beacuse       -> because +becasue       -> because +beccause      -> because +becouse       -> because +becuase       -> because + +## Common words, 11-20. +theese        -> these +:goign        -> going +:gonig        -> going +:yaers        -> years +:yeasr        -> years +:thsoe        -> those +shoudl        -> should +raelly        -> really +realy         -> really +relaly        -> really +bedore        -> before +befoer        -> before +littel        -> little +beeing        -> being +:hwile        -> while + +## Common words, 21-30. +aroud         -> around +arround       -> around +arund         -> around +thign         -> thing +thigsn        -> things +thnigs        -> things +anohter       -> another +beteen        -> between +beween        -> between +bewteen       -> between +:eveyr        -> every +:graet        -> great +:agian        -> again +:sicne        -> since +alwasy        -> always +alwyas        -> always +throught      -> thought + + +## Words especially susceptible to skipping or transposing a letter. +# These entries are for words that are easy enough to spell, but not necessarily +# easy to press the keys in the right order. +# Catch misspellings of "achieves", "achieving", etc. +:acheiv       -> achiev +almsot        -> almost +alomst        -> almost +chnage        -> change +chekc         -> check +childen       -> children +claer         -> clear +comapny       -> company +contian       -> contain +elasped       -> elapsed +feild         -> field +fitler        -> filter +firts         -> first +follwo        -> follow +:foudn        -> found +frequecy      -> frequency +firend        -> friend +freind        -> friend +heigth        -> height +iamge         -> image +inital        -> initial +intput        -> input +laguage       -> language +lenght        -> length +levle         -> level +libary        -> library +:moeny        -> money +mysefl        -> myself +ouptut        -> output +ouput         -> output +probaly       -> probably +probelm       -> problem +recrod        -> record +reponse       -> response +reprot        -> report +singel        -> single +stregth       -> strength +strengh       -> strength +tkaes         -> takes +therfore      -> therefore +todya         -> today +toghether     -> together +unkown        -> unknown +unqiue        -> unique +widht         -> width + + +## Words with tricky spelling. +# If you are a good speller, you could drop this section. +aberation     -> aberration +accross       -> across +adviced       -> advised +aledge        -> allege +alledge       -> allege +amature       -> amateur +anomolous     -> anomalous +anomoly       -> anomaly +aparent       -> apparent +aparrent      -> apparent +apparant      -> apparent +apparrent     -> apparent +asthetic      -> aesthetic +auxilary      -> auxiliary +auxillary     -> auxiliary +auxilliary    -> auxiliary +bankrupcy     -> bankruptcy +busness       -> business +bussiness     -> business +calander      -> calendar +commitee      -> committee +comittee      -> committee +competance    -> competence +competant     -> competent +concensus     -> consensus +cognizent     -> cognizant +copywrite:    -> copyright +choosen       -> chosen +collegue      -> colleague +excercise     -> exercise +:grammer      -> grammar +:guage        -> gauge +govement      -> government +govenment     -> government +goverment     -> government +governmnet    -> government +govorment     -> government +govornment    -> government +guaratee      -> guarantee +garantee      -> guarantee +gaurantee     -> guarantee +heirarchy     -> hierarchy +hygeine       -> hygiene +hypocracy     -> hypocrisy +hypocrasy     -> hypocrisy +hypocricy     -> hypocrisy +hypocrit:     -> hypocrite +looses:       -> loses +maintence     -> maintenance +morgage       -> mortgage +neccesary     -> necessary +necesary      -> necessary +pallete       -> palette +paralel       -> parallel +parralel      -> parallel +parrallel     -> parallel +priviledge    -> privilege +probablly     -> probably +prominant     -> prominent +propogate     -> propagate +proove        -> prove +psuedo        -> pseudo +reciept       -> receipt +# Catch misspellings of "receives", "receiving", etc. +receiev       -> receiv +reciev        -> receiv +recepient     -> recipient +recipiant     -> recipient +relevent      -> relevant +repitition    -> repetition +safty         -> safety +saftey        -> safety +# Catch misspellings of "separate", "separating", etc. +seperat       -> separat +spectogram    -> spectrogram +symetric      -> symmetric +tolerence     -> tolerance + + +## Words particularly for coding. +# Entries for common code keywords ("const") and terminology ("lookup"). +cacheing      -> caching +complier      -> compiler +doulbe        -> double +dyanmic       -> dynamic +# As in "execute", "executable", "executing", ... +excecut       -> execut +failse        -> false +fales         -> false +fasle         -> false +flase         -> false +indeces       -> indices +indecies      -> indices +indicies      -> indices +interator     -> iterator +looup         -> lookup +namesapce     -> namespace +namespcae     -> namespace +nulltpr       -> nullptr +operaotr      -> operator +overide       -> override +ovveride      -> override +poitner       -> pointer +:rference     -> reference +referece      -> reference +singed        -> signed +stirng        -> string +strign        -> string +swithc        -> switch +swtich        -> switch +teamplate     -> template +tempalte      -> template +:ture         -> true +retrun        -> return +retun         -> return +reutrn        -> return +cosnt         -> const +virutal       -> virtual +vitual        -> virtual +yeild         -> yield + + +## Catch skipped spaces between common words. +:alot:        -> a lot +:andteh       -> and the +:andthe       -> and the +:asthe        -> as the +:atthe        -> at the +abouta        -> about a +aboutit       -> about it +aboutthe      -> about the +:tothe        -> to the +didnot        -> did not +fromthe       -> from the + + +## Various additional entries. +:agred        -> agreed +:ajust        -> adjust +:anual        -> annual +:asign        -> assign +:aslo:        -> also +:casue        -> cause +:choses       -> chooses +:gaurd        -> guard +:haev         -> have +:hapen        -> happen +:idaes        -> ideas +:jsut:        -> just +:jstu:        -> just +:knwo         -> know +:konw         -> know +:kwno         -> know +:ocuntry      -> country +:ocur         -> occur +:socre        -> score +:szie         -> size +:the:the:     -> the +:turth        -> truth +:uesd:        -> used +:usally       -> usually +abilties      -> abilities +abilty        -> ability +abvove        -> above +accesories    -> accessories +accomodate    -> accommodate +acommodate    -> accommodate +acomplish     -> accomplish +actualy       -> actually +acurate       -> accurate +acutally      -> actually +addtion       -> addition +againnst      -> against +aganist       -> against +aggreed       -> agreed +agianst       -> against +ahppn         -> happen +allign        -> align +anytying      -> anything +aquire        -> acquire +availabe      -> available +availaible    -> available +availalbe     -> available +availble      -> available +availiable    -> available +avalable      -> available +avaliable     -> available +avilable      -> available +bandwith      -> bandwidth +begginer      -> beginner +beleif        -> belief +beleive       -> believe +belive        -> believe +breif         -> brief +burried       -> buried +caluclate     -> calculate +caluculate    -> calculate +calulate      -> calculate +catagory      -> category +cauhgt        -> caught +ceratin       -> certain +certian       -> certain +cheif         -> chief +cieling       -> ceiling +circut        -> circuit +clasic        -> classic +cmoputer      -> computer +coform        -> conform +comming:      -> coming +considerd     -> considered +dervied       -> derived +desicion      -> decision +diferent      -> different +diferrent     -> different +differnt      -> different +diffrent      -> different +divison       -> division +effecient     -> efficient +eligable      -> eligible +elpased       -> elapsed +embarass      -> embarrass +embeded       -> embedded +encypt        -> encrypt +finaly        -> finally +foriegn       -> foreign +foward        -> forward +fraciton      -> fraction +fucntion      -> function +fufill        -> fulfill +fullfill      -> fulfill +futher        -> further +ganerate      -> generate +generaly      -> generally +greatful      -> grateful +heigher       -> higher +higest        -> highest +howver        -> however +hydogen       -> hydrogen +importamt     -> important +inclued       -> include +insted        -> instead +intrest       -> interest +invliad       -> invalid +largst        -> largest +learnign      -> learning +liasion       -> liaison +likly         -> likely +lisense       -> license +listner       -> listener +macthing      -> matching +manefist      -> manifest +mesage        -> message +naturual      -> natural +occassion     -> occasion +occured       -> occurred +particualr    -> particular +paticular     -> particular +peice         -> piece +perhasp       -> perhaps +perheaps      -> perhaps +perhpas       -> perhaps +perphas       -> perhaps +persue        -> pursue +posess        -> possess +postion       -> position +preiod        -> period +primarly      -> primarily +privte        -> private +proccess      -> process +proeprty      -> property +propery       -> property +realtion      -> relation +reasearch     -> research +recuring      -> recurring +refered       -> referred +regluar       -> regular +releated      -> related +resutl        -> result +reuslt        -> result +reveiw        -> review +satisifed     -> satisfied +scheduel      -> schedule +sequnce       -> sequence +similiar      -> similar +simmilar      -> similar +slighly       -> slightly +somehwat      -> somewhat +statment      -> statement +sucess        -> success +succsess      -> success +sugest        -> suggest +sumary        -> summary +supress       -> suppress +surpress      -> suppress +thresold      -> threshold +tongiht       -> tonight +tranpose      -> transpose +typcial       -> typical +udpate        -> update +ususally      -> usually +verticies     -> vertices +whereever     -> wherever +wherre        -> where +wierd         -> weird + diff --git a/users/gourdo1/autocorrect/make_autocorrection_data.py b/users/gourdo1/autocorrect/make_autocorrection_data.py new file mode 100644 index 0000000000..8e0bcf9e8e --- /dev/null +++ b/users/gourdo1/autocorrect/make_autocorrection_data.py @@ -0,0 +1,303 @@ +# Copyright 2021-2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +#     https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Python program to make autocorrection_data.h. + +This program reads "autocorrection_dict.txt" and generates a C source file +"autocorrection_data.h" with a serialized trie embedded as an array. Run this +program without arguments like + +$ python3 make_autocorrection_data.py + +Or to read from a different typo dict file, pass it as the first argument like + +$ python3 make_autocorrection_data.py dict.txt + +Each line of the dict file defines one typo and its correction with the syntax +"typo -> correction". Blank lines or lines starting with '#' are ignored. +Example: + +  :thier        -> their +  dosen't       -> doesn't +  fitler        -> filter +  lenght        -> length +  ouput         -> output +  widht         -> width + +See autocorrection_dict_extra.txt for a larger example. + +For full documentation, see +https://getreuer.info/posts/keyboards/autocorrection +""" + +import sys +import textwrap +from typing import Any, Dict, Iterator, List, Tuple + +try: +  from english_words import english_words_lower_alpha_set as CORRECT_WORDS +except ImportError: +  print('Autocorrection will falsely trigger when a typo is a substring of a ' +        'correctly spelled word. To check for this, install the english_words ' +        'package and rerun this script:\n\n  pip install english_words\n') +  # Use a minimal word list as a fallback. +  CORRECT_WORDS = ('apparent', 'association', 'available', 'classification', +                   'effect', 'entertainment', 'fantastic', 'information', +                   'integrate', 'international', 'language', 'loosest', +                   'manual', 'nothing', 'provides', 'reference', 'statehood', +                   'technology', 'virtually', 'wealthier', 'wonderful') + +KC_A = 4 +KC_SPC = 0x2c +KC_QUOT = 0x34 + +TYPO_CHARS = dict( +  [ +    ("'", KC_QUOT), +    (':', KC_SPC),  # "Word break" character. +  ] + +  # Characters a-z. +  [(chr(c), c + KC_A - ord('a')) for c in range(ord('a'), ord('z') + 1)] +) + + +def parse_file(file_name: str) -> List[Tuple[str, str]]: +  """Parses autocorrections dictionary file. + +  Each line of the file defines one typo and its correction with the syntax +  "typo -> correction". Blank lines or lines starting with '#' are ignored. The +  function validates that typos only have characters in TYPO_CHARS, that +  typos are not substrings of other typos, and checking that typos don't trigger +  on CORRECT_WORDS. + +  Args: +    file_name: String, path of the autocorrections dictionary. +  Returns: +    List of (typo, correction) tuples. +  """ + +  autocorrections = [] +  typos = set() +  for line_number, typo, correction in parse_file_lines(file_name): +    if typo in typos: +      print(f'Warning:{line_number}: Ignoring duplicate typo: "{typo}"') +      continue + +    # Check that `typo` is valid. +    if not(all([c in TYPO_CHARS for c in typo])): +      print(f'Error:{line_number}: Typo "{typo}" has ' +            'characters other than ' + ''.join(TYPO_CHARS.keys())) +      sys.exit(1) +    for other_typo in typos: +      if typo in other_typo or other_typo in typo: +        print(f'Error:{line_number}: Typos may not be substrings of one ' +              f'another, otherwise the longer typo would never trigger: ' +              f'"{typo}" vs. "{other_typo}".') +        sys.exit(1) +    if len(typo) < 5: +      print(f'Warning:{line_number}: It is suggested that typos are at ' +            f'least 5 characters long to avoid false triggers: "{typo}"') + +    check_typo_against_dictionary(line_number, typo) + +    autocorrections.append((typo, correction)) +    typos.add(typo) + +  return autocorrections + + +def make_trie(autocorrections: List[Tuple[str, str]]) -> Dict[str, Any]: +  """Makes a trie from the the typos, writing in reverse. + +  Args: +    autocorrections: List of (typo, correction) tuples. +  Returns: +    Dict of dict, representing the trie. +  """ +  trie = {} +  for typo, correction in autocorrections: +    node = trie +    for letter in typo[::-1]: +      node = node.setdefault(letter, {}) +    node['LEAF'] = (typo, correction) + +  return trie + + +def parse_file_lines(file_name: str) -> Iterator[Tuple[int, str, str]]: +  """Parses lines read from `file_name` into typo-correction pairs.""" + +  line_number = 0 +  for line in open(file_name, 'rt'): +    line_number += 1 +    line = line.strip() +    if line and line[0] != '#': +      # Parse syntax "typo -> correction", using strip to ignore indenting. +      tokens = [token.strip() for token in line.split('->', 1)] +      if len(tokens) != 2 or not tokens[0]: +        print(f'Error:{line_number}: Invalid syntax: "{line}"') +        sys.exit(1) + +      typo, correction = tokens +      typo = typo.lower()  # Force typos to lowercase. +      typo = typo.replace(' ', ':') + +      yield line_number, typo, correction + + +def check_typo_against_dictionary(line_number: int, typo: str) -> None: +  """Checks `typo` against English dictionary words.""" + +  if typo.startswith(':') and typo.endswith(':'): +    if typo[1:-1] in CORRECT_WORDS: +      print(f'Warning:{line_number}: Typo "{typo}" is a correctly spelled ' +            'dictionary word.') +  elif typo.startswith(':') and not typo.endswith(':'): +    for word in CORRECT_WORDS: +      if word.startswith(typo[1:]): +        print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger ' +              f'on correctly spelled word "{word}".') +  elif not typo.startswith(':') and typo.endswith(':'): +    for word in CORRECT_WORDS: +      if word.endswith(typo[:-1]): +        print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger ' +              f'on correctly spelled word "{word}".') +  elif not typo.startswith(':') and not typo.endswith(':'): +    for word in CORRECT_WORDS: +      if typo in word: +        print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger ' +              f'on correctly spelled word "{word}".') + + +def serialize_trie(autocorrections: List[Tuple[str, str]], +                   trie: Dict[str, Any]) -> List[int]: +  """Serializes trie and correction data in a form readable by the C code. + +  Args: +    autocorrections: List of (typo, correction) tuples. +    trie: Dict of dicts. +  Returns: +    List of ints in the range 0-255. +  """ +  table = [] + +  # Traverse trie in depth first order. +  def traverse(trie_node: Dict[str, Any]) -> Dict[str, Any]: +    if 'LEAF' in trie_node:  # Handle a leaf trie node. +      typo, correction = trie_node['LEAF'] +      word_boundary_ending = typo[-1] == ':' +      typo = typo.strip(':') +      i = 0  # Make the autocorrection data for this entry and serialize it. +      while i < min(len(typo), len(correction)) and typo[i] == correction[i]: +        i += 1 +      backspaces = len(typo) - i - 1 + word_boundary_ending +      assert 0 <= backspaces <= 63 +      correction = correction[i:] +      data = [backspaces + 128] + list(bytes(correction, 'ascii')) + [0] + +      entry = {'data': data, 'links': [], 'byte_offset': 0} +      table.append(entry) +    elif len(trie_node) == 1:  # Handle trie node with a single child. +      c, trie_node = next(iter(trie_node.items())) +      entry = {'chars': c, 'byte_offset': 0} + +      # It's common for a trie to have long chains of single-child nodes. We +      # find the whole chain so that we can serialize it more efficiently. +      while len(trie_node) == 1 and 'LEAF' not in trie_node: +        c, trie_node = next(iter(trie_node.items())) +        entry['chars'] += c + +      table.append(entry) +      entry['links'] = [traverse(trie_node)] +    else:  # Handle trie node with multiple children. +      entry = {'chars': ''.join(sorted(trie_node.keys())), 'byte_offset': 0} +      table.append(entry) +      entry['links'] = [traverse(trie_node[c]) for c in entry['chars']] +    return entry + +  traverse(trie) + +  def serialize(e: Dict[str, Any]) -> List[int]: +    if not e['links']:  # Handle a leaf table entry. +      return e['data'] +    elif len(e['links']) == 1:  # Handle a chain table entry. +      return [TYPO_CHARS[c] for c in e['chars']] + [0] +    else:  # Handle a branch table entry. +      data = [] +      for c, link in zip(e['chars'], e['links']): +        data += [TYPO_CHARS[c] | (0 if data else 64)] + encode_link(link) +      return data + [0] + +  byte_offset = 0 +  for e in table:  # To encode links, first compute byte offset of each entry. +    e['byte_offset'] = byte_offset +    byte_offset += len(serialize(e)) + +  return [b for e in table for b in serialize(e)]  # Serialize final table. + + +def encode_link(link: Dict[str, Any]) -> List[int]: +  """Encodes a node link as two bytes.""" +  byte_offset = link['byte_offset'] +  if not (0 <= byte_offset <= 0xffff): +    print('Error: The autocorrection table is too large, a node link exceeds ' +          '64KB limit. Try reducing the autocorrection dict to fewer entries.') +    sys.exit(1) +  return [byte_offset & 255, byte_offset >> 8] + + +def write_generated_code(autocorrections: List[Tuple[str, str]], +                         data: List[int], +                         file_name: str) -> None: +  """Writes autocorrection data as generated C code to `file_name`. + +  Args: +    autocorrections: List of (typo, correction) tuples. +    data: List of ints in 0-255, the serialized trie. +    file_name: String, path of the output C file. +  """ +  assert all(0 <= b <= 255 for b in data) + +  def typo_len(e: Tuple[str, str]) -> int: +    return len(e[0]) + +  min_typo = min(autocorrections, key=typo_len)[0] +  max_typo = max(autocorrections, key=typo_len)[0] +  generated_code = ''.join([ +    '// Generated code.\n\n', +    f'// Autocorrection dictionary ({len(autocorrections)} entries):\n', +    ''.join(sorted(f'//   {typo:<{len(max_typo)}} -> {correction}\n' +                   for typo, correction in autocorrections)), +    f'\n#define AUTOCORRECTION_MIN_LENGTH {len(min_typo)}  // "{min_typo}"\n', +    f'#define AUTOCORRECTION_MAX_LENGTH {len(max_typo)}  // "{max_typo}"\n\n', +    textwrap.fill('static const uint8_t autocorrection_data[%d] PROGMEM = {%s};' % ( +      len(data), ', '.join(map(str, data))), width=80, subsequent_indent='  '), +    '\n\n']) + +  with open(file_name, 'wt') as f: +    f.write(generated_code) + + +def main(argv): +  dict_file = argv[1] if len(argv) > 1 else 'autocorrection_dict.txt' +  autocorrections = parse_file(dict_file) +  trie = make_trie(autocorrections) +  data = serialize_trie(autocorrections, trie) +  print(f'Processed %d autocorrection entries to table with %d bytes.' +        % (len(autocorrections), len(data))) +  write_generated_code(autocorrections, data, 'autocorrection_data.h') + + +if __name__ == '__main__': +  main(sys.argv) diff --git a/users/gourdo1/custom_double_taps.h b/users/gourdo1/custom_double_taps.h index 4f551e1fa1..fe97b8cd1f 100644 --- a/users/gourdo1/custom_double_taps.h +++ b/users/gourdo1/custom_double_taps.h @@ -71,3 +71,31 @@ static bool process_esc_to_base(uint16_t keycode, keyrecord_t * record) {      }      return true;  } + +static bool process_lsft_for_caps(uint16_t keycode, keyrecord_t * record) { +    static bool tapped = false; +    static uint16_t tap_timer = 0; + +    if (keycode == KC_LSFT) { +        if (user_config.double_tap_shift_for_capslock) { +          if (!keymap_config.no_gui) { +            if (record->event.pressed) { +                if (tapped && !timer_expired(record->event.time, tap_timer)) { +                  // The key was double tapped. +                  //clear_mods();  // If needed, clear the mods. +                  // Do something interesting... +                  register_code(KC_CAPS); +                } +                tapped = true; +                tap_timer = record->event.time + TAPPING_TERM; +            } else { +                unregister_code(KC_CAPS); +            } +          } +        } +    } else { +            // On an event with any other key, reset the double tap state. +            tapped = false; +    } +    return true; +} diff --git a/users/gourdo1/gourdo1.c b/users/gourdo1/gourdo1.c index 51f774061e..26ecd8c1c0 100644 --- a/users/gourdo1/gourdo1.c +++ b/users/gourdo1/gourdo1.c @@ -21,33 +21,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include "custom_double_taps.h" -// Tap once for shift, twice for Caps Lock but only if Win Key is not disabled (also disabled by user.config variable) -void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) { -    if (user_config.double_tap_shift_for_capslock) { -        if (state -> count == 1 || keymap_config.no_gui) { -            register_code(KC_LSFT); -        } else { -            register_code(KC_CAPS); -        } -    } else { -        register_code(KC_LSFT); -    } -} - -void dance_LSFT_reset(qk_tap_dance_state_t * state, void * user_data) { -    if (state -> count == 1 || keymap_config.no_gui) { -        unregister_code(KC_LSFT); -    } else { -        unregister_code(KC_CAPS); -        unregister_code(KC_LSFT); -    } -} - -// Tap Dance definitions -qk_tap_dance_action_t tap_dance_actions[] = { -    // Tap once for shift, twice for Caps Lock -    [TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(dance_LSFT_each_tap, NULL, dance_LSFT_reset) -}; +#include "autocorrect/autocorrection.h"  // RGB NIGHT MODE  #ifdef RGB_MATRIX_ENABLE @@ -129,6 +103,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {      if (!process_record_keymap(keycode, record)) { return false; }      if (!process_capsnum(keycode, record)) { return false; }      if (!process_esc_to_base(keycode, record)) { return false; } +    if (!process_lsft_for_caps(keycode, record)) { return false; } +    if (!process_autocorrection(keycode, record)) { return false; }      // Key macros ...      switch (keycode) { @@ -136,66 +112,77 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {          // User configuration toggles      case PRNCONF:  // Print verbose status of all user_config toggles (open a text editor before engaging!!)          if (record->event.pressed) { -            //send_string("Left bracket with alt numcodes "SS_LALT(SS_TAP(X_KP_0) SS_TAP(X_KP_0) SS_TAP(X_KP_9) SS_TAP(X_KP_1))"\n"); -            send_string("\n\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C"); -            send_string(" gourdo1\x27s GMMK Pro User Settings "); -            send_string("\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\n"); -            send_string("Hold \x5B \bFn\x5D and the number corresponding to a setting below to toggle.\n"); -            send_string("Re-print this screen with \x5B \bFn\x5D \x5B`\x5D to see your changes reflected.\n"); -            send_string("Config also visible as RGB under number keys by holding \x5B \bFn\x5D.\n"); -            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"); -            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"); -            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d"); -            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n"); +            send_string("\n"SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"#########"); +            send_string(" gourdo1" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_9))"s GMMK Pro User Settings "); +            send_string("#########"SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"\n"); +            send_string("Hold "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))" and the number corresponding to a setting below to toggle.\n"); +            send_string("Re"SS_TAP(X_KP_MINUS)"print this screen with "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3)) SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"`" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))" to see your changes reflected.\n"); +            send_string("Config also visible as RGB under number keys by holding "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))".\n"); +            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)); +            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)); +            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)); +            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"\n");              send_string("1. CapsLock RGB highlight alpha keys................ ");              if (user_config.rgb_hilite_caps) { -                send_string("\x5BON\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BOFF\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              }              send_string("2. Numpad RGB highlight layer keys.................. ");              if (user_config.rgb_hilite_numpad) { -                send_string("\x5BON\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BOFF\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              }              send_string("3. Double tap ESC to revert to BASE layer........... ");              if (user_config.esc_double_tap_to_baselyr) { -                send_string("\x5BON\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BOFF\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } -            send_string("4. DEL \x26 HOME key locations......................... "); +            send_string("4. DEL "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_8))" HOME key locations......................... ");              if (user_config.del_right_home_top) { -                send_string("\x5BHOME on F13\x3B DEL right of BKSPC\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"HOME on F13"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" DEL right of BKSPC" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5B \bDEL on F13\x3B HOME right of BKSPC\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"DEL on F13"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" HOME right of BKSPC" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } -            send_string("5. Numpad on CapsLock\x3B double tap LSHIFT for Caps... "); +            send_string("5. Numpad on CapsLock"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" double tap LSHIFT for Caps... ");              if (user_config.double_tap_shift_for_capslock) { -                send_string("\x5BON\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BOFF\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              }              send_string("6. Encoder button function.......................... ");              if (user_config.encoder_press_mute_or_media) { -                send_string("\x5BMUTE\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"MUTE" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BMEDIA PLAY\x2FPAUSE\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"MEDIA PLAY"SS_TAP(X_KP_SLASH) "PAUSE" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              }              send_string("7. Insert function accessed with.................... ");              if (user_config.ins_on_shft_bkspc_or_del) { -                send_string("\x5BSHIFT\x2D \bBKSPC\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"SHIFT"SS_TAP(X_KP_MINUS)"BKSPC"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BSHIFT\x2D \bDEL\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"SHIFT"SS_TAP(X_KP_MINUS)"DEL"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } -            send_string("8. Force SHIFT \x26 CTRL\x2DSPACE to function like SPACE.. "); +            send_string("8. Force SHIFT "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_8))" CTRL"SS_TAP(X_KP_MINUS)"SPACE to function like SPACE.. ");              if (user_config.disable_space_mods) { -                send_string("\x5BON\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n"); +            } else { +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n"); +            } +            send_string("9. AutoCorrect...................................... "); +            if (user_config.autocorrect) { +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } else { -                send_string("\x5BOFF\x5D\n"); +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");              } -            send_string("\nThe latest firmware updates are always here\x3a https\x3a\x2F\x2Fgithub.com\x2Fgourdo1\x2Fgmmkpro\x2Dmedia\n"); +            send_string("0. CapsLock highlights extended alphas "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_4)SS_TAP(X_KP_0))"ISO"SS_TAP(X_KP_MINUS)"only"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_4)SS_TAP(X_KP_1))"... "); +            if (user_config.rgb_english_caps) { +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n"); +            } else { +                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n"); +            } +            send_string("\nThe latest firmware updates are always here"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_8))" https" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_8))SS_TAP(X_KP_SLASH)SS_TAP(X_KP_SLASH) "github.com"SS_TAP(X_KP_SLASH) "gourdo1"SS_TAP(X_KP_SLASH)"gmmkpro"SS_TAP(X_KP_MINUS)"media\n");          }          break; @@ -247,6 +234,18 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {              eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM          }          break; +    case TG_AUTOCR:  // Toggle AutoCorrect +        if (record->event.pressed) { +            user_config.autocorrect ^= 1; // Toggles the status +            eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM +        } +        break; +    case TG_ENGCAP:  // Toggle highlighting Non-English letters during CAPSLOCK +        if (record->event.pressed) { +            user_config.rgb_english_caps ^= 1; // Toggles the status +            eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM +        } +        break;          //return false;          // Key to the left of encoder function (default HOME) @@ -417,7 +416,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {      case KC_00:          if (record -> event.pressed) {              // when keycode KC_00 is pressed -            send_string("00"); +            send_string(SS_TAP(X_KP_0)SS_TAP(X_KP_0));          } else unregister_code16(keycode);          break; @@ -572,7 +571,7 @@ bool caps_word_press_user(uint16_t keycode) {          case KC_DQT:          case KC_COLN:          case KC_RSFT: -        case LSFTCAPSWIN: +        case KC_LSFT:              add_weak_mods(MOD_BIT(KC_LSFT));  // Apply shift to next key.              return true; @@ -625,6 +624,8 @@ void eeconfig_init_user(void) {      user_config.esc_double_tap_to_baselyr     = true;      user_config.ins_on_shft_bkspc_or_del      = true;      user_config.disable_space_mods            = true; +    user_config.autocorrect                   = true; +    user_config.rgb_english_caps              = true;      eeconfig_update_user(user_config.raw);  } diff --git a/users/gourdo1/gourdo1.h b/users/gourdo1/gourdo1.h index aa91a192d2..ecf6eaf25d 100644 --- a/users/gourdo1/gourdo1.h +++ b/users/gourdo1/gourdo1.h @@ -57,12 +57,14 @@ enum custom_user_keycodes {          TG_CAPS,       // Toggles RGB highlighting of alphas during capslock          TG_PAD,        // Toggles RGB highlighting of keys on numpad+mousekeys layer -        TG_TDCAP,      // Toggles double tap shift (tapdance) for CapsLock +        TG_TDCAP,      // Toggles double tap shift for CapsLock          TG_DEL,        // Swaps DEL and HOME key locations -        TG_ENC,        // Toggle Encoder functionality -        TG_ESC,        // Toggle ESC tapdance for _BASE layer +        TG_ENC,        // Toggle Encoder button functionality +        TG_ESC,        // Toggle ESC double tap for _BASE layer          TG_INS,        // Toggle location of INS          TG_SPCMOD,     // Toggle disabling of modded-SPACE functions +        TG_AUTOCR,     // Toggle AutoCorrect +        TG_ENGCAP,     // Toggle highlighting Non-English letters during CAPSLOCK on ISO boards          YAHOO,         // yahoo.com          OUTLOOK,       // outlook.com @@ -82,12 +84,6 @@ enum custom_user_keycodes {          NEW_SAFE_RANGE // New safe range for keymap level custom keycodes  }; - -// Tap Dance Definitions -enum custom_tapdance { -    TD_LSFT_CAPS_WIN, -}; -  // Set up boolean variables to track user customizable configuration options  typedef union {    uint32_t raw; @@ -100,12 +96,14 @@ typedef union {      bool     encoder_press_mute_or_media :1;      bool     ins_on_shft_bkspc_or_del :1;      bool     disable_space_mods :1; +    bool     autocorrect :1; +    bool     rgb_english_caps :1;    };  } user_config_t;  user_config_t user_config; -#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN) +//#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN)  // ENCODER ACTIONS  #ifdef ENCODER_ENABLE diff --git a/users/gourdo1/rules.mk b/users/gourdo1/rules.mk index e02f9e8e08..0a3a9ba426 100644 --- a/users/gourdo1/rules.mk +++ b/users/gourdo1/rules.mk @@ -1,4 +1,6 @@  SRC += gourdo1.c +SRC += autocorrect/autocorrection.c +  ifdef ENCODER_ENABLE  	# include encoder related code when enabled  	ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes) | 
