diff --git a/keyboards/gboards/engine/engine.c b/keyboards/gboards/engine/engine.c index 6e0c6a7a56f4..23c8c3041d45 100755 --- a/keyboards/gboards/engine/engine.c +++ b/keyboards/gboards/engine/engine.c @@ -1,32 +1,32 @@ -/* This is a stripped down version of the Georgi engine meant for use with - * Ginni. As such serial-Steno features are disabled, chords are 16bits and - * crap is removed where possible +/* This is a stripped down version of the Georgi engine meant for use with + * Ginni. As such serial-Steno features are disabled, chords are 16bits and + * crap is removed where possible * - * Do not use this on anything other then Ginny if you want to be sane + * Do not use this on anything other then Ginny if you want to be sane */ #include "engine.h" // Chord state -C_SIZE cChord = 0; // Current Chord -int chordIndex = 0; // Keys in previousachord -int pressed = 0; // number of held keys -C_SIZE chordState[32]; // Full Chord history -#define QWERBUF 24 // Size of chords to buffer for output - -bool repeatFlag = false; // Should we repeat? -C_SIZE pChord = 0; // Previous Chord -C_SIZE stickyBits = 0; // Or'd with every incoming press -int pChordIndex = 0; // Keys in previousachord -C_SIZE pChordState[32]; // Previous chord sate +C_SIZE cChord = 0; // Current Chord +int chordIndex = 0; // Keys in previousachord +C_SIZE pressed = 0; // number of held keys +C_SIZE chordState[32]; // Full Chord history +#define QWERBUF 24 // Size of chords to buffer for output + +bool repeatFlag = false; // Should we repeat? +C_SIZE pChord = 0; // Previous Chord +C_SIZE stickyBits = 0; // Or'd with every incoming press +int pChordIndex = 0; // Keys in previousachord +C_SIZE pChordState[32]; // Previous chord sate // Key Dicts -extern const struct keyEntry keyDict[]; +extern const struct keyEntry keyDict[]; extern size_t keyLen; -extern const struct comboEntry cmbDict[]; +extern const struct comboEntry cmbDict[]; extern size_t comboLen; -extern const struct funcEntry funDict[]; +extern const struct funcEntry funDict[]; extern size_t funcsLen; -extern const struct stringEntry strDict[]; +extern const struct stringEntry strDict[]; extern size_t stringLen; extern const struct specialEntry spcDict[]; extern size_t specialLen; @@ -38,354 +38,365 @@ enum MODE cMode = QWERTY; // Command State #define MAX_CMD_BUF 20 -uint8_t CMDLEN = 0; -uint8_t CMDBUF[MAX_CMD_BUF]; +uint8_t CMDLEN = 0; +uint8_t CMDBUF[MAX_CMD_BUF]; // Key Repeat state -bool inChord = false; -bool repEngaged = false; -uint16_t repTimer = 0; +bool inChord = false; +bool repEngaged = false; +uint16_t repTimer = 0; #define REP_INIT_DELAY 750 -#define REP_DELAY 25 +#define REP_DELAY 25 // Mousekeys state -bool inMouse = false; -int8_t mousePress; +bool inMouse = false; +int8_t mousePress; // All processing done at chordUp goes through here void processKeysUp() { - // Check for mousekeys, this is release + // Check for mousekeys, this is release #ifdef MOUSEKEY_ENABLE - if (inMouse) { - inMouse = false; - mousekey_off(mousePress); - mousekey_send(); - } + if (inMouse) { + inMouse = false; + mousekey_off(mousePress); + mousekey_send(); + } #endif - // handle command mode - if (cChord == COMMAND_MODE) { + // handle command mode + if (cChord == COMMAND_MODE) { #ifndef NO_DEBUG - uprintf("COMMAND Toggle\n"); + uprintf("COMMAND Toggle\n"); #endif - if (cMode != COMMAND) { // Entering Command Mode - CMDLEN = 0; - pMode = cMode; - cMode = COMMAND; - } else { // Exiting Command Mode - cMode = pMode; - - // Press all and release all - for (int i = 0; i < CMDLEN; i++) { - register_code(CMDBUF[i]); - } - clear_keyboard(); - } - } - - // Process and reset state - processChord(); - cChord = 0; - inChord = false; - chordIndex = 0; - clear_keyboard(); - repEngaged = false; - for (int i = 0; i < 32; i++) - chordState[i] = 0xFFFF; + if (cMode != COMMAND) { // Entering Command Mode + CMDLEN = 0; + pMode = cMode; + cMode = COMMAND; + } else { // Exiting Command Mode + cMode = pMode; + + // Press all and release all + for (int i = 0; i < CMDLEN; i++) { + register_code(CMDBUF[i]); + } + clear_keyboard(); + } + } + + // Process and reset state + processChord(); + cChord = pressed; + inChord = false; + chordIndex = 0; + clear_keyboard(); + repEngaged = false; + for (int i = 0; i < 32; i++) + chordState[i] = 0xFFFF; } // Update Chord State bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // Everything happens in here when steno keys come in. - // Bail on keyup - bool pr = record->event.pressed; - if (record->event.pressed) { - pressed++; - } else { - pressed--; - } - - // All keys up, send it! - if (pressed == 0) { - processKeysUp(); - repEngaged = false; - return false; - } - - // Update key repeat timers - repTimer = timer_read(); - inChord = true; - - // Switch on the press adding to chord - switch (keycode) { - ENGINE_CONFIG - default: return true; - } - - // Store previous state for fastQWER - if (pr) { - chordState[chordIndex] = cChord; - chordIndex++; - } + // Everything happens in here when steno keys come in. + // Bail on keyup + + // Update key repeat timers + repTimer = timer_read(); + bool pr = record->event.pressed; + // Switch on the press adding to chord + switch (keycode) { + ENGINE_CONFIG + default: return true; + } + + // All keys up, send it! + if (inChord && !pr && (pressed & IN_CHORD_MASK) == 0) { + processKeysUp(); + return false; + } + if(pressed == 0 && !pr) { + processKeysUp(); + return false; + } + + cChord |= pressed; + + inChord = (cChord & IN_CHORD_MASK) != 0; + + // Store previous state for fastQWER + if (pr) { + chordState[chordIndex] = cChord; + chordIndex++; + } #ifndef NO_DEBUG - uprintf("Chord: %u\n", cChord); + uprintf("Chord: %u\n", cChord); #endif - return false; + return false; } void matrix_scan_user(void) { - // We abuse this for early sending of key - // Key repeat only on QWER/SYMB layers - if (cMode != QWERTY || !inChord) return; - - // Check timers -#ifndef NO_REPEAT - if (repEngaged && timer_elapsed(repTimer) > REP_DELAY) { - // Process Key for report - processChord(); - - // Send report to host - send_keyboard_report(); - clear_keyboard(); - repTimer = timer_read(); - } - - if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) { - repEngaged = true; - } + // We abuse this for early sending of key + // Key repeat only on QWER/SYMB layers + if (cMode != QWERTY || !inChord) return; + + // Check timers +#ifndef NO_HOLD + if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) { + // Process Key for report + processChord(); + + // Send report to host + send_keyboard_report(); + repEngaged = true; + } #endif }; // Try and match cChord -C_SIZE mapKeys(bool lookup) { +C_SIZE mapKeys(C_SIZE chord, bool lookup) { + lookup = lookup || repEngaged; #ifndef NO_DEBUG - if (!lookup) uprint("SENT!"); + if (!lookup) uprint("SENT!\n"); #endif - // Single key chords - for (int i = 0; i < keyLen; i++) { - if (keyDict[i].chord == cChord) { - if (!lookup) SEND(keyDict[i].key); - return cChord; - } - } - - // strings - for (int i = 0; i < stringLen; i++) { - struct stringEntry fromPgm; - memcpy_P(&fromPgm, &strDict[i], sizeof(stringEntry_t)); - if (fromPgm.chord == cChord) { - if (!lookup) send_string_P((PGM_P)(fromPgm.str)); - return cChord; - } - } - - // combos - for (int i = 0; i < comboLen; i++) { - struct comboEntry fromPgm; - memcpy_P(&fromPgm, &cmbDict[i], sizeof(comboEntry_t)); - if (fromPgm.chord == cChord) { + // Single key chords + for (int i = 0; i < keyLen; i++) { + if (keyDict[i].chord == chord) { + if (!lookup) SEND(keyDict[i].key); + return chord; + } + } + + // strings + for (int i = 0; i < stringLen; i++) { + struct stringEntry fromPgm; + memcpy_P(&fromPgm, &strDict[i], sizeof(stringEntry_t)); + if (fromPgm.chord == chord) { + if (!lookup) { + if(get_mods() & (MOD_LSFT | MOD_RSFT)) { + set_mods(get_mods() & ~(MOD_LSFT | MOD_RSFT)); + set_oneshot_mods(MOD_LSFT); + } + send_string_P((PGM_P)(fromPgm.str)); + } + return chord; + } + } + + // combos + for (int i = 0; i < comboLen; i++) { + struct comboEntry fromPgm; + memcpy_P(&fromPgm, &cmbDict[i], sizeof(comboEntry_t)); + if (fromPgm.chord == chord) { #ifndef NO_DEBUG - uprintf("%d found combo\n", i); + uprintf("%d found combo\n", i); #endif - if (!lookup) { - uint8_t comboKeys[COMBO_MAX]; - memcpy_P(&comboKeys, fromPgm.keys, sizeof(uint8_t)*COMBO_MAX); - for (int j = 0; j < COMBO_MAX; j++) + if (!lookup) { + uint8_t comboKeys[COMBO_MAX]; + memcpy_P(&comboKeys, fromPgm.keys, sizeof(uint8_t)*COMBO_MAX); + for (int j = 0; j < COMBO_MAX; j++) #ifndef NO_DEBUG - uprintf("Combo [%u]: %u\n", j, comboKeys[j]); + uprintf("Combo [%u]: %u\n", j, comboKeys[j]); #endif - for (int j = 0; (j < COMBO_MAX) && (comboKeys[j] != COMBO_END); j++) { + for (int j = 0; (j < COMBO_MAX) && (comboKeys[j] != COMBO_END); j++) { #ifndef NO_DEBUG - uprintf("Combo [%u]: %u\n", j, comboKeys[j]); + uprintf("Combo [%u]: %u\n", j, comboKeys[j]); #endif - SEND(comboKeys[j]); - } - } - return cChord; - } - } - - // functions - for (int i = 0; i < funcsLen; i++) { - if (funDict[i].chord == cChord) { - if (!lookup) funDict[i].act(); - return cChord; - } - } - - // Special handling - for (int i = 0; i < specialLen; i++) { - if (spcDict[i].chord == cChord) { - if (!lookup) { - uint16_t arg = spcDict[i].arg; - switch (spcDict[i].action) { - case SPEC_STICKY: - SET_STICKY(arg); - break; - case SPEC_REPEAT: - REPEAT(); - break; - case SPEC_CLICK: - CLICK_MOUSE((uint8_t)arg); - break; - case SPEC_SWITCH: - SWITCH_LAYER(arg); - break; - default: - SEND_STRING("Invalid Special in Keymap"); - } - } - return cChord; - } - } - + SEND(comboKeys[j]); + } + } + return chord; + } + } + + // functions + for (int i = 0; i < funcsLen; i++) { + if (funDict[i].chord == chord) { + if (!lookup) funDict[i].act(); + return chord; + } + } + + // Special handling + for (int i = 0; i < specialLen; i++) { + if (spcDict[i].chord == chord) { + if (!lookup) { + uint16_t arg = spcDict[i].arg; + switch (spcDict[i].action) { + case SPEC_STICKY: + SET_STICKY(arg); + break; + case SPEC_REPEAT: + REPEAT(); + break; + case SPEC_CLICK: + CLICK_MOUSE((uint8_t)arg); + break; + case SPEC_SWITCH: + SWITCH_LAYER(arg); + break; + default: + SEND_STRING("Invalid Special in Keymap"); + } + } + return chord; + } + } + + if ((chord & IN_CHORD_MASK) != chord && mapKeys((chord & IN_CHORD_MASK), true) == (chord & IN_CHORD_MASK)) { +#ifndef NO_DEBUG + uprintf("Try with ignore mask\n"); +#endif + mapKeys((chord & ~IN_CHORD_MASK), lookup); + mapKeys((chord & IN_CHORD_MASK), lookup); + return chord; + } #ifndef NO_DEBUG - uprintf("Reached end\n"); + uprintf("Reached end\n"); #endif - return 0; + return 0; } // Traverse the chord history to a given point // Returns the mask to use void processChord(void) { - // Save the clean chord state - C_SIZE savedChord = cChord; - - // Apply Stick Bits if needed - if (stickyBits != 0) { - cChord |= stickyBits; - for (int i = 0; i <= chordIndex; i++) - chordState[i] |= stickyBits; - } - - // First we test if a whole chord was passsed - // If so we just run it handling repeat logic - if (mapKeys(true) == cChord) { - mapKeys(false); - // Repeat logic - if (repeatFlag) { + // Save the clean chord state + C_SIZE savedChord = cChord; + + // Apply Stick Bits if needed + if (stickyBits != 0) { + cChord |= stickyBits; + for (int i = 0; i <= chordIndex; i++) + chordState[i] |= stickyBits; + } + + // First we test if a whole chord was passsed + // If so we just run it handling repeat logic + if (mapKeys(cChord, true) == cChord) { + mapKeys(cChord, false); + // Repeat logic + if (repeatFlag) { #ifndef NO_DEBUG - uprintf("repeating?\n"); + uprintf("repeating?\n"); #endif - restoreState(); - repeatFlag = false; - processChord(); - } else { - saveState(cChord); - } - return; - } + restoreState(); + repeatFlag = false; + processChord(); + } else { + saveState(cChord); + } + return; + } + #ifndef NO_DEBUG - uprintf("made it past the maw"); + uprintf("made it past the maw"); #endif - // Iterate through chord picking out the individual - // and longest chords - C_SIZE bufChords[QWERBUF]; - int bufLen = 0; - C_SIZE mask = 0; - - // We iterate over it multiple times to catch the longest - // chord. Then that gets addded to the mask and re run. - while (savedChord != mask) { - C_SIZE test = 0; - C_SIZE longestChord = 0; - - for (int i = 0; i <= chordIndex; i++) { - cChord = chordState[i] & ~mask; - if (cChord == 0) - continue; - - test = mapKeys(true); - if (test != 0) { - longestChord = test; - } - } - - mask |= longestChord; - bufChords[bufLen] = longestChord; - bufLen++; - - // That's a loop of sorts, halt processing - if (bufLen >= QWERBUF) { + // Iterate through chord picking out the individual + // and longest chords + C_SIZE bufChords[QWERBUF]; + int bufLen = 0; + C_SIZE mask = 0; + + // We iterate over it multiple times to catch the longest + // chord. Then that gets addded to the mask and re run. + while (savedChord != mask) { + C_SIZE test = 0; + C_SIZE longestChord = 0; + + for (int i = 0; i <= chordIndex; i++) { + cChord = chordState[i] & ~mask; + if (cChord == 0) + continue; + + test = mapKeys(cChord, true); + if (test != 0) { + longestChord = test; + } + } + + mask |= longestChord; + bufChords[bufLen] = longestChord; + bufLen++; + + // That's a loop of sorts, halt processing + if (bufLen >= QWERBUF) { #ifndef NO_DEBUG - uprintf("looped. exiting"); + uprintf("looped. exiting"); #endif - return; - } - } - - // Now that the buffer is populated, we run it - for (int i = 0; i < bufLen ; i++) { - cChord = bufChords[i]; + return; + } + } + + // Now that the buffer is populated, we run it + for (int i = 0; i < bufLen ; i++) { + cChord = bufChords[i]; #ifndef NO_DEBUG - uprintf("sending: %x\n", cChord); + uprintf("sending: %u\n", cChord); #endif - mapKeys(false); - } + mapKeys(cChord, false); + } - // Save state in case of repeat - if (!repeatFlag) { - saveState(savedChord); - } + // Save state in case of repeat + if (!repeatFlag) { + saveState(savedChord); + } - // Restore cChord for held repeat - cChord = savedChord; - return; + // Restore cChord for held repeat + cChord = savedChord; + return; } void saveState(C_SIZE cleanChord) { - pChord = cleanChord; - pChordIndex = chordIndex; - for (int i = 0; i < 32; i++) - pChordState[i] = chordState[i]; + pChord = cleanChord; + pChordIndex = chordIndex; + for (int i = 0; i < 32; i++) + pChordState[i] = chordState[i]; } void restoreState() { - cChord = pChord; - chordIndex = pChordIndex; - for (int i = 0; i < 32; i++) - chordState[i] = pChordState[i]; + cChord = pChord; + chordIndex = pChordIndex; + for (int i = 0; i < 32; i++) + chordState[i] = pChordState[i]; } // Macros for calling from keymap.c void SEND(uint8_t kc) { - // Send Keycode, Does not work for Quantum Codes - if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) { + // Send Keycode, Does not work for Quantum Codes + if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) { #ifndef NO_DEBUG - uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF); + uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF); #endif - CMDBUF[CMDLEN] = kc; - CMDLEN++; - } + CMDBUF[CMDLEN] = kc; + CMDLEN++; + } - if (cMode != COMMAND) register_code(kc); - return; + if (cMode != COMMAND) register_code(kc); + return; } void REPEAT(void) { - if (cMode != QWERTY) - return; + if (cMode != QWERTY) + return; - repeatFlag = true; - return; + repeatFlag = true; + return; } void SET_STICKY(C_SIZE stick) { - stickyBits ^= stick; - return; + stickyBits ^= stick; + return; } void CLICK_MOUSE(uint8_t kc) { #ifdef MOUSEKEY_ENABLE - mousekey_on(kc); - mousekey_send(); + mousekey_on(kc); + mousekey_send(); - // Store state for later use - inMouse = true; - mousePress = kc; + // Store state for later use + inMouse = true; + mousePress = kc; #endif } void SWITCH_LAYER(int layer) { #ifndef NO_ACTION_LAYER - if (keymapsCount >= layer) - layer_on(layer); + if (keymapsCount >= layer) + layer_on(layer); #endif } diff --git a/keyboards/gboards/engine/engine.h b/keyboards/gboards/engine/engine.h index 36249194792b..fb91a6326d40 100755 --- a/keyboards/gboards/engine/engine.h +++ b/keyboards/gboards/engine/engine.h @@ -96,5 +96,4 @@ void CLICK_MOUSE(uint8_t); // Shift to internal representation // i.e) S(teno)R(ight)F #define STN(n) ((C_SIZE)1<. // Space saving jazz #define NO_ACTION_LAYER #define NO_ACTION_TAPPING -#define NO_ACTION_ONESHOT +//#define NO_ACTION_ONESHOT // General keyboard configs #define BOOTMAGIC_LITE_ROW 9 diff --git a/keyboards/ginny/config_engine.h b/keyboards/ginny/config_engine.h index f7cb98d05457..3c9373eaaea5 100644 --- a/keyboards/ginny/config_engine.h +++ b/keyboards/ginny/config_engine.h @@ -2,37 +2,39 @@ // Configuration options for the engine -#define C_SIZE uint16_t // type for chord -#define COMBO_MAX 4 // Longest Combo +#define C_SIZE uint16_t // type for chord +#define COMBO_MAX 4 // Longest Combo // Key Aliases, must fit within C_SIZE! // These are for Ginni + Asetniop -#define AA STN(0) -#define AS STN(1) -#define AE STN(2) -#define AT STN(3) -#define AN STN(4) -#define AI STN(5) -#define AO STN(6) -#define AP STN(7) -#define AL STN(8) // Left/Right thumbs -#define AR STN(9) -#define NUM STN(10) // Sticky Layer 1 -#define USR STN(11) // Sticky Layer 2 -#define CMD STN(12) // Sticky Layer 3 +#define AA STN(0) +#define AS STN(1) +#define AE STN(2) +#define AT STN(3) +#define AN STN(4) +#define AI STN(5) +#define AO STN(6) +#define AP STN(7) +#define AL STN(8) // Left/Right thumbs +#define AR STN(9) +#define NUM STN(10) // Sticky Layer 1 +#define USR STN(11) // Sticky Layer 2 +#define CMD STN(12) // Sticky Layer 3 // Chord to start buffering strokes -#define COMMAND_MODE (AI | AN | AT | AE) +#define COMMAND_MODE (AI | AN | AT | AE) // Mapping of QMK Keycodes to chord positions -#define ENGINE_CONFIG \ - ENGINE_HOOK(KC_A, AA) \ - ENGINE_HOOK(KC_S, AS) \ - ENGINE_HOOK(KC_E, AE) \ - ENGINE_HOOK(KC_T, AT) \ - ENGINE_HOOK(KC_N, AN) \ - ENGINE_HOOK(KC_I, AI) \ - ENGINE_HOOK(KC_O, AO) \ - ENGINE_HOOK(KC_P, AP) \ - ENGINE_HOOK(KC_L, AL) \ - ENGINE_HOOK(KC_R, AR) +#define ENGINE_CONFIG \ + ENGINE_HOOK(KC_A, AA) \ + ENGINE_HOOK(KC_S, AS) \ + ENGINE_HOOK(KC_E, AE) \ + ENGINE_HOOK(KC_T, AT) \ + ENGINE_HOOK(KC_N, AN) \ + ENGINE_HOOK(KC_I, AI) \ + ENGINE_HOOK(KC_O, AO) \ + ENGINE_HOOK(KC_P, AP) \ + ENGINE_HOOK(KC_L, AL) \ + ENGINE_HOOK(KC_R, AR) + +#define IN_CHORD_MASK (0xFFFF ^ AL) diff --git a/keyboards/ginny/keymaps/default/dicts.def b/keyboards/ginny/keymaps/default/dicts.def index a408e3484a2c..624f377712f2 100644 --- a/keyboards/ginny/keymaps/default/dicts.def +++ b/keyboards/ginny/keymaps/default/dicts.def @@ -16,4 +16,4 @@ #include "user.def" // For Debugging -#include "dicts/testing/test.def" +//#include "dicts/testing/test.def" diff --git a/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def b/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def index 6d12cd171639..16494b0285d1 100755 --- a/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def +++ b/keyboards/ginny/keymaps/default/dicts/aset/en-keymap.def @@ -30,213 +30,218 @@ PRES(AE|AP, PRES(AO|AP, KC_SCLN) PRES(AE|AO, KC_MINS) PRES(AT|AP, KC_BSPC) -PRES(AA|AP, KC_QUOT) +KEYS(AA|AP, cmb_81e9e9a3de9d1216, {KC_LSFT, KC_SLSH, COMBO_END}) +PRES(AA|AP|AL, KC_SLSH) PRES(AN|AI|AO|AP, KC_ENT) -SUBS(AN|AI|AO, str_c7cd45d62ba33f37, "oh ") -SUBS(AE|AN|AI, str_c4d48e3111a94bab, "he ") -SUBS(AE|AI|AP, str_e5d0dbf6833c9487, "'i ") -SUBS(AE|AT|AO, str_b97355b02dce4543, "or ") -SUBS(AE|AN|AP, str_a0aa5b74c096e40b, "my ") -SUBS(AS|AE|AO, str_16ae4be38d2f26c0, "do ") -SUBS(AA|AT|AO, str_bf38370c83727d39, "of ") -SUBS(AS|AN|AO, str_93e9ac18af76041f, "us ") -SUBS(AN|AO|AP, str_d443d6f10491fb2b, "up ") -SUBS(AA|AN|AI, str_bf40c27e59daac7b, "ah ") -SUBS(AS|AN|AP, str_a38fea2a97c8f836, "ms ") -SUBS(AA|AE|AI, str_d2f95ea81f7c61d5, "ix ") -SUBS(AA|AT|AI, str_d7978d4ae69e4592, "if ") -SUBS(AA|AS|AE, str_c8f40bd7102b7e24, "we ") -SUBS(AE|AT|AN, str_7d2440fbbf9d0256, "be ") -SUBS(AS|AT|AN, str_f270b528e852fc3e, "bc ") -SUBS(AT|AO|AP, str_8574f11beb82545c, "top ") -SUBS(AS|AE|AT, str_fa675aa04c2e42e3, "set ") -SUBS(AA|AT|AN, str_538f2d3a0a77d97b, "fan ") -SUBS(AN|AI|AP, str_ecb888fdf52591cf, "him ") -SUBS(AT|AI|AO, str_412cdd1e78ea9b08, "lot ") -SUBS(AA|AT|AP, str_7a06301d23dd2e0f, "pat ") -SUBS(AT|AI|AP, str_eddb4b5d8e6e6cf7, "tip ") -SUBS(AS|AI|AP, str_50e8eda878796d86, "sip ") -SUBS(AE|AI|AO, str_e7368ade4f929a85, "lie ") -SUBS(AS|AT|AI, str_732fcc97258e0fd6, "its ") -SUBS(AT|AN|AI, str_c13c85985e26bfc4, "bit ") -SUBS(AE|AT|AP, str_342f8caca85f0ad6, "per ") -SUBS(AS|AE|AI, str_3e9f631f6868b537, "did ") -SUBS(AA|AI|AO, str_9f8eb086c328f80a, "all ") -SUBS(AA|AS|AO, str_f8126ba90c544306, "wow ") -SUBS(AA|AS|AI, str_afd48c0d96c26c82, "ask ") -SUBS(AA|AN|AP, str_7814ab9a9d941ffb, "man ") -SUBS(AA|AE|AN, str_83396da0d7927d05, "any ") -SUBS(AS|AN|AI, str_e9d65b1f0cc7b588, "his ") -SUBS(AA|AS|AN, str_45a403a4960ee226, "san ") -SUBS(AT|AN|AO, str_30278ac8bad5995c, "but ") -SUBS(AA|AE|AT, str_83c8874562c3df81, "are ") -SUBS(AE|AN|AO, str_e429bf3ee734ff3a, "you ") -SUBS(AS|AI|AO, str_a9a527945928efb, "look ") -SUBS(AS|AT|AO, str_f33c271ea486b8bf, "cost ") -SUBS(AS|AE|AN, str_9cfd6f6c59053f15, "eyes ") -SUBS(AA|AS|AP, str_4dfae898587fe4fe, "pass ") -SUBS(AE|AO|AP, str_aab1d405f8d273af, "pope ") -SUBS(AI|AO|AP, str_e21e9a5405e9a529, "pool ") -SUBS(AE|AT|AI, str_f867205888e811d6, "ever ") -SUBS(AS|AE|AP, str_851ef570f98047b6, "deep ") -SUBS(AA|AS|AT, str_51931d246213d5ba, "fact ") -SUBS(AE|AT|AN|AP, str_10a1a694946fa759, "mr ") -SUBS(AA|AI|AP, str_9effc1ea3eea7dcb, "pizza ") -SUBS(AA|AE|AT|AO, str_dae84f2729acce2b, "for ") -SUBS(AS|AE|AN|AI, str_b164ba3889b2fb9e, "she ") -SUBS(AT|AN|AO|AP, str_9b3f02a3d0bba370, "put ") -SUBS(AA|AS|AT|AN, str_90ab495adeb4039c, "can ") -SUBS(AA|AT|AN|AP, str_4ef41f48d393118d, "mba ") -SUBS(AA|AT|AO|AP, str_69ea1f9262ff90f7, "gap ") -SUBS(AA|AS|AE|AN, str_c1fdc4ab8597a676, "and ") -SUBS(AT|AN|AI|AP, str_af1fe256dc6bb784, "tim ") -SUBS(AA|AS|AN|AI, str_f9f466f11b521e6f, "has ") -SUBS(AE|AT|AN|AI, str_c571ccd7fa5faef, "the ") -SUBS(AA|AS|AT|AO, str_35228752979d35d, "two ") -SUBS(AA|AI|AO|AP, str_42719932f51c5677, "lap ") -SUBS(AE|AN|AI|AP, str_2a2f016faa9b3070, "i'm ") -SUBS(AA|AN|AO|AP, str_cb3ae7249e334094, "mao ") -SUBS(AA|AS|AN|AO, str_78916562f1d9bfaa, "now ") -SUBS(AE|AT|AI|AP, str_67bf6cf47b192c42, "i've ") -SUBS(AS|AN|AI|AO, str_b24523534c6d82c9, "john ") -SUBS(AE|AT|AI|AO, str_2cce6615ddd45c8e, "over ") -SUBS(AA|AT|AI|AO, str_f7cdc52fe2976dd4, "fall ") -SUBS(AS|AE|AN|AO, str_c9f20bc0a0f63318, "done ") -SUBS(AS|AN|AI|AP, str_ee6db6f94a1dbf2a, "miss ") -SUBS(AA|AN|AI|AP, str_968af4858b6521be, "pain ") -SUBS(AS|AT|AN|AO, str_c039d2a5d9fc5d72, "just ") -SUBS(AE|AT|AO|AP, str_e77049b6fc0b816e, "poor ") -SUBS(AA|AE|AT|AP, str_2569286750c7b4f4, "part ") -SUBS(AS|AE|AT|AP, str_72a3e3974353ad96, "step ") -SUBS(AA|AS|AO|AP, str_4d4a66ab4047501d, "soap ") -SUBS(AA|AE|AN|AI, str_749613dbddf6c21, "yeah ") -SUBS(AE|AT|AN|AO, str_8c5e240f4e5d3061, "your ") -SUBS(AS|AE|AT|AN, str_fa42caaa8023b228, "best ") -SUBS(AE|AN|AI|AO, str_67863008ae8fd451, "only ") -SUBS(AA|AT|AN|AI, str_da20b440a7186a4b, "that ") -SUBS(AA|AE|AN|AP, str_223dd41a813d045f, "many ") -SUBS(AA|AE|AT|AN, str_8f95067beb108348, "next ") -SUBS(AS|AT|AI|AP, str_8d03100afd2419c2, "pick ") -SUBS(AA|AN|AI|AO, str_54deaa1a3f19a7fc, "hall ") -SUBS(AA|AS|AE|AI, str_b39cdb39ba4edfe7, "said ") -SUBS(AS|AT|AN|AI, str_f67830c3e4e560ab, "this ") -SUBS(AA|AS|AE|AO, str_4436aac714307c5b, "wood ") -SUBS(AS|AI|AO|AP, str_eb8b6118d400de1, "lips ") -SUBS(AS|AE|AI|AP, str_3be3101b06222c42, "keep ") -SUBS(AA|AS|AN|AP, str_84ea13866e40cff7, "mass ") -SUBS(AA|AS|AT|AP, str_718051f50c1745f9, "past ") -SUBS(AA|AS|AE|AT, str_467af751a93d5fea, "were ") -SUBS(AS|AT|AO|AP, str_cb532d5ded67e46b, "stop ") -SUBS(AS|AE|AT|AO, str_806a00e99f47f1e, "good ") -SUBS(AS|AE|AI|AO, str_312a2e7e56737afe, "like ") -SUBS(AA|AS|AI|AO, str_cc94e0c76922bf90, "will ") -SUBS(AS|AN|AO|AP, str_e320ed557b21c7c3, "jump ") -SUBS(AA|AE|AI|AO, str_4d67956a1937c06a, "alex ") -SUBS(AT|AN|AI|AO, str_e9481f155c267491, "into ") -SUBS(AA|AE|AT|AI, str_40711ef1bb6ce033, "five ") -SUBS(AA|AS|AT|AI, str_b9bd537963cf3ede, "wait ") -SUBS(AA|AT|AN|AO, str_28bb10c5bb93cde6, "about ") -SUBS(AT|AI|AO|AP, str_c97da9851380ebac, "pilot ") -SUBS(AE|AN|AO|AP, str_39e44b61b232dc17, "money ") -SUBS(AS|AT|AI|AO, str_503f03dcee6cb398, "still ") -SUBS(AS|AE|AT|AI, str_a9281666a28e6ec3, "tried ") -SUBS(AA|AS|AE|AP, str_d6daeab665ce4271, "passed ") -SUBS(AS|AE|AT|AN|AP, str_e7aff3fb05cb8051, "mrs ") -SUBS(AA|AE|AN|AO, str_7d50a0c65c92712f, "anyone ") -SUBS(AS|AE|AN|AP, str_abdd78cfd9534f96, "seemed ") -SUBS(AA|AS|AN|AI|AO, str_4e6e8e4c9b45508f, "who ") -SUBS(AA|AS|AE|AN|AI, str_b8157ea41e09d921, "had ") -SUBS(AE|AI|AO|AP, str_56b0c240ea9fe481, "people ") -SUBS(AS|AE|AT|AN|AO, str_ba082b87d184320c, "once ") -SUBS(AA|AS|AE|AN|AP, str_6a27ff657eabc9be, "made ") -SUBS(AE|AT|AN|AO|AP, str_ca73dc3f774cbabc, "more ") -SUBS(AA|AT|AN|AI|AP, str_bc2c779464890843, "path ") -SUBS(AE|AT|AN|AI|AP, str_224997add6df35ba, "them ") -SUBS(AA|AS|AT|AI|AP, str_e784b575d979691f, "pack ") -SUBS(AA|AS|AT|AN|AP, str_389afa2e457b3e69, "camp ") -SUBS(AS|AN|AI|AO|AP, str_88f447f6c429c220, "shop ") -SUBS(AA|AS|AT|AO|AP, str_ad78df7dde0d91b8, "gaps ") -SUBS(AS|AE|AT|AI|AP, str_8553c9ae3540a19d, "it's ") -SUBS(AA|AE|AT|AO|AP, str_5e0c8ecdade5f1a0, "page ") -SUBS(AE|AN|AI|AO|AP, str_ac07faffdc50a99f, "home ") -SUBS(AA|AS|AE|AN|AO, str_1d76c98090617d6e, "down ") -SUBS(AA|AS|AT|AN|AO, str_5146c3491da57e2b, "town ") -SUBS(AS|AE|AN|AO|AP, str_29703c252684465e, "some ") -SUBS(AS|AE|AN|AI|AP, str_a7ed86ef765aff1, "mind ") -SUBS(AA|AS|AE|AI|AO, str_5a3cc09208d67861, "well ") -SUBS(AA|AE|AT|AI|AO, str_b49c2360c17bfaa5, "life ") -SUBS(AS|AT|AN|AO|AP, str_502f482b79087297, "most ") -SUBS(AA|AS|AT|AN|AI, str_87226571ae131d8a, "with ") -SUBS(AA|AE|AT|AN|AI, str_89e5d4bb42bf5ac6, "have ") -SUBS(AS|AT|AN|AI|AO, str_af3d9eaa19f822d9, "such ") -SUBS(AA|AS|AT|AI|AO, str_a57e20b51804cf2c, "last ") -SUBS(AS|AE|AT|AI|AO, str_9f3ebe9397348d28, "told ") -SUBS(AA|AS|AE|AT|AI, str_f3e5067a2519ad56, "first ") -SUBS(AA|AT|AI|AO|AP, str_a475be09185ad1f, "plato ") -SUBS(AA|AE|AN|AI|AP, str_acd7c28d984a2833, "happy ") -SUBS(AA|AS|AE|AT|AP, str_66f9514dbfa60ef2, "we're ") -SUBS(AA|AS|AE|AT|AO, str_6fd3d941462f3451, "words ") -SUBS(AA|AT|AN|AI|AO, str_25f54e15b0b3abc1, "again ") -SUBS(AE|AT|AN|AI|AO, str_36fad9241cea5c82, "other ") -SUBS(AA|AE|AI|AO|AP, str_f7d795e2de04290f, "apple ") -SUBS(AS|AE|AT|AN|AI, str_5cdcf79352e2d725, "these ") -SUBS(AA|AE|AN|AI|AO, str_88405ef2e946d1d6, "alone ") -SUBS(AA|AS|AE|AT|AN, str_6bb7e1a1ca75bfb5, "years ") -SUBS(AA|AS|AN|AO|AP, str_ba3809ce0e475488, "woman ") -SUBS(AE|AT|AI|AO|AP, str_a72c9ea66c108632, "prove ") -SUBS(AS|AE|AI|AO|AP, str_dd746578c42672fd, "spoke ") -SUBS(AT|AN|AI|AO|AP, str_9ae637bd5fd038a8, "might ") -SUBS(AS|AT|AN|AI|AP, str_a523540c97d0bdfb, "smith ") -SUBS(AA|AT|AN|AO|AP, str_612ae2fb632ad051, "among ") -SUBS(AA|AN|AI|AO|AP, str_debd70c653b8860b, "human ") -SUBS(AA|AS|AE|AI|AP, str_8e1be82c44ad245, "speak ") -SUBS(AA|AS|AI|AO|AP, str_f36f1306b68b4b29, "pillow ") -SUBS(AA|AE|AT|AN|AP, str_c7589dce3d265d20, "matter ") -SUBS(AS|AE|AN|AI|AO, str_6c75dac99724579f, "should ") -SUBS(AS|AE|AO|AP, str_329f2d4d4e320928, "possessed ") -SUBS(AA|AE|AT|AN|AO, str_6e7eec08674ed6d1, "before ") -SUBS(AA|AE|AN|AI|AO|AP, str_6eea10216935e72d, "play ") -SUBS(AA|AS|AE|AN|AI|AP, str_4643015f5002abff, "make ") -SUBS(AA|AS|AE|AO|AP, str_b2bf1dd0344af8af, "exposed ") -SUBS(AA|AE|AT|AN|AO|AP, str_2dcb6a06ff45764b, "from ") -SUBS(AS|AE|AT|AO|AP, str_5204c59b3bf29e2f, "process ") -SUBS(AA|AS|AE|AT|AI|AO, str_2a1fe2610765b6af, "work ") -SUBS(AA|AE|AT|AI|AP, str_1cf1e20a6157822c, "private ") -SUBS(AA|AS|AN|AI|AP, str_2411238235bdc80f, "spanish ") -SUBS(AS|AT|AN|AI|AO|AP, str_401efb5649b2ebb4, "much ") -SUBS(AA|AS|AE|AT|AN|AP, str_8dffd42ce860597c, "came ") -SUBS(AA|AS|AE|AN|AI|AO, str_83235a0fa2f65989, "would ") -SUBS(AA|AS|AN|AI|AO|AP, str_841274c574bc6f3c, "small ") -SUBS(AS|AE|AT|AN|AO|AP, str_2457621be8ffdd2e, "don't ") -SUBS(AS|AT|AI|AO|AP, str_c319bffa441d1ba3, "politics ") -SUBS(AA|AS|AE|AT|AI|AP, str_4f6c506138fb813d, "paris ") -SUBS(AA|AE|AT|AI|AO|AP, str_58dbac3080f43a2c, "april ") -SUBS(AA|AS|AE|AN|AO|AP, str_7b4540acd20a8e39, "women ") -SUBS(AA|AS|AE|AT|AO|AP, str_4d2a6306f9c9bfcb, "power ") -SUBS(AA|AS|AE|AT|AN|AI, str_ec4217a15a7e46ca, "where ") -SUBS(AS|AE|AT|AN|AI|AO, str_cd4abc5e1c8e848a, "could ") -SUBS(AA|AS|AE|AI|AO|AP, str_6e1297423b061106, "please ") -SUBS(AA|AS|AT|AN|AO|AP, str_9f163fd928c775b2, "famous ") -SUBS(AS|AE|AT|AN|AI|AP, str_f371381a7fbc125d, "didn't ") -SUBS(AA|AE|AT|AN|AI|AP, str_61ff1ae647568c2a, "remain ") -SUBS(AE|AT|AN|AI|AO|AP, str_88ca21737ccd8555, "mother ") -SUBS(AS|AE|AN|AI|AO|AP, str_8a65747e667f35ed, "simply ") -SUBS(AA|AE|AT|AN|AI|AO, str_c8defae65fa4ef3e, "another ") -SUBS(AA|AS|AE|AT|AN|AO, str_c358a55785d991ba, "because ") -SUBS(AA|AS|AT|AN|AI|AO, str_f1cf6af5d5bfd0af, "without ") -SUBS(AS|AE|AT|AI|AO|AP, str_2ff09aba6aa2e0e4, "replied ") -SUBS(AA|AS|AT|AN|AI|AP, str_9bf471cfa3e278c9, "captain ") -SUBS(AA|AS|AE|AT|AI|AO|AP, str_156052b6d0cc2f4a, "place ") -SUBS(AA|AS|AE|AT|AN|AI|AP, str_6bc2917c61a3f92d, "that's ") -SUBS(AA|AS|AT|AN|AI|AO|AP, str_95c7f6f3d4db5b15, "almost ") -SUBS(AA|AS|AT|AI|AO|AP, str_f0f9720f9f9b0214, "political ") -SUBS(AA|AE|AT|AN|AI|AO|AP, str_7a84f6987c8a0811, "family ") -SUBS(AA|AS|AE|AN|AI|AO|AP, str_5de5dc9f9633371b, "played ") -SUBS(AA|AS|AE|AT|AN|AO|AP, str_2bfafc3eb8546058, "company ") -SUBS(AA|AS|AE|AT|AN|AI|AO, str_af21cbc44bf9f140, "already ") +PRES(AA|AS|AE|AT, KC_TAB) +SUBS(AN|AI|AO|AR, str_c7cd45d62ba33f37, "oh ") +SUBS(AE|AN|AI|AR, str_c4d48e3111a94bab, "he ") +SUBS(AE|AI|AP|AR, str_e5d0dbf6833c9487, "'i ") +SUBS(AE|AT|AO|AR, str_b97355b02dce4543, "or ") +SUBS(AE|AN|AP|AR, str_a0aa5b74c096e40b, "my ") +SUBS(AS|AE|AO|AR, str_16ae4be38d2f26c0, "do ") +SUBS(AA|AT|AO|AR, str_bf38370c83727d39, "of ") +SUBS(AS|AN|AO|AR, str_93e9ac18af76041f, "us ") +SUBS(AN|AO|AP|AR, str_d443d6f10491fb2b, "up ") +SUBS(AA|AN|AI|AR, str_bf40c27e59daac7b, "ah ") +SUBS(AS|AN|AP|AR, str_a38fea2a97c8f836, "ms ") +SUBS(AA|AE|AI|AR, str_d2f95ea81f7c61d5, "ix ") +SUBS(AA|AT|AI|AR, str_d7978d4ae69e4592, "if ") +SUBS(AA|AS|AE|AR, str_c8f40bd7102b7e24, "we ") +SUBS(AE|AT|AN|AR, str_7d2440fbbf9d0256, "be ") +SUBS(AS|AT|AN|AR, str_f270b528e852fc3e, "bc ") +SUBS(AT|AO|AP|AR, str_8574f11beb82545c, "top ") +SUBS(AS|AE|AT|AR, str_fa675aa04c2e42e3, "set ") +SUBS(AA|AT|AN|AR, str_538f2d3a0a77d97b, "fan ") +SUBS(AN|AI|AP|AR, str_ecb888fdf52591cf, "him ") +SUBS(AT|AI|AO|AR, str_412cdd1e78ea9b08, "lot ") +SUBS(AA|AT|AP|AR, str_7a06301d23dd2e0f, "pat ") +SUBS(AT|AI|AP|AR, str_eddb4b5d8e6e6cf7, "tip ") +SUBS(AS|AI|AP|AR, str_50e8eda878796d86, "sip ") +SUBS(AE|AI|AO|AR, str_e7368ade4f929a85, "lie ") +SUBS(AS|AT|AI|AR, str_732fcc97258e0fd6, "its ") +SUBS(AT|AN|AI|AR, str_c13c85985e26bfc4, "bit ") +SUBS(AE|AT|AP|AR, str_342f8caca85f0ad6, "per ") +SUBS(AS|AE|AI|AR, str_3e9f631f6868b537, "did ") +SUBS(AA|AI|AO|AR, str_9f8eb086c328f80a, "all ") +SUBS(AA|AS|AO|AR, str_f8126ba90c544306, "wow ") +SUBS(AA|AS|AI|AR, str_afd48c0d96c26c82, "ask ") +SUBS(AA|AN|AP|AR, str_7814ab9a9d941ffb, "man ") +SUBS(AA|AE|AN|AR, str_83396da0d7927d05, "any ") +SUBS(AS|AN|AI|AR, str_e9d65b1f0cc7b588, "his ") +SUBS(AA|AS|AN|AR, str_45a403a4960ee226, "san ") +SUBS(AT|AN|AO|AR, str_30278ac8bad5995c, "but ") +SUBS(AA|AE|AT|AR, str_83c8874562c3df81, "are ") +SUBS(AE|AN|AO|AR, str_e429bf3ee734ff3a, "you ") +SUBS(AS|AI|AO|AR, str_a9a527945928efb, "look ") +SUBS(AS|AT|AO|AR, str_f33c271ea486b8bf, "cost ") +SUBS(AS|AE|AN|AR, str_9cfd6f6c59053f15, "eyes ") +SUBS(AA|AS|AP|AR, str_4dfae898587fe4fe, "pass ") +SUBS(AE|AO|AP|AR, str_aab1d405f8d273af, "pope ") +SUBS(AI|AO|AP|AR, str_e21e9a5405e9a529, "pool ") +SUBS(AE|AT|AI|AR, str_f867205888e811d6, "ever ") +SUBS(AS|AE|AP|AR, str_851ef570f98047b6, "deep ") +SUBS(AA|AS|AT|AR, str_51931d246213d5ba, "fact ") +SUBS(AE|AT|AN|AP|AR, str_10a1a694946fa759, "mr ") +SUBS(AA|AI|AP|AR, str_9effc1ea3eea7dcb, "pizza ") +SUBS(AA|AE|AT|AO|AR, str_dae84f2729acce2b, "for ") +SUBS(AS|AE|AN|AI|AR, str_b164ba3889b2fb9e, "she ") +SUBS(AT|AN|AO|AP|AR, str_9b3f02a3d0bba370, "put ") +SUBS(AA|AS|AT|AN|AR, str_90ab495adeb4039c, "can ") +SUBS(AA|AT|AN|AP|AR, str_4ef41f48d393118d, "mba ") +SUBS(AA|AT|AO|AP|AR, str_69ea1f9262ff90f7, "gap ") +SUBS(AA|AS|AE|AN|AR, str_c1fdc4ab8597a676, "and ") +SUBS(AT|AN|AI|AP|AR, str_af1fe256dc6bb784, "tim ") +SUBS(AA|AS|AN|AI|AR, str_f9f466f11b521e6f, "has ") +SUBS(AE|AT|AN|AI|AR, str_c571ccd7fa5faef, "the ") +SUBS(AA|AS|AT|AO|AR, str_35228752979d35d, "two ") +SUBS(AA|AI|AO|AP|AR, str_42719932f51c5677, "lap ") +SUBS(AE|AN|AI|AP|AR, str_2a2f016faa9b3070, "i'm ") +SUBS(AA|AN|AO|AP|AR, str_cb3ae7249e334094, "mao ") +SUBS(AA|AS|AN|AO|AR, str_78916562f1d9bfaa, "now ") +SUBS(AE|AT|AI|AP|AR, str_67bf6cf47b192c42, "i've ") +SUBS(AS|AN|AI|AO|AR, str_b24523534c6d82c9, "john ") +SUBS(AE|AT|AI|AO|AR, str_2cce6615ddd45c8e, "over ") +SUBS(AA|AT|AI|AO|AR, str_f7cdc52fe2976dd4, "fall ") +SUBS(AS|AE|AN|AO|AR, str_c9f20bc0a0f63318, "done ") +SUBS(AS|AN|AI|AP|AR, str_ee6db6f94a1dbf2a, "miss ") +SUBS(AA|AN|AI|AP|AR, str_968af4858b6521be, "pain ") +SUBS(AS|AT|AN|AO|AR, str_c039d2a5d9fc5d72, "just ") +SUBS(AE|AT|AO|AP|AR, str_e77049b6fc0b816e, "poor ") +SUBS(AA|AE|AT|AP|AR, str_2569286750c7b4f4, "part ") +SUBS(AS|AE|AT|AP|AR, str_72a3e3974353ad96, "step ") +SUBS(AA|AS|AO|AP|AR, str_4d4a66ab4047501d, "soap ") +SUBS(AA|AE|AN|AI|AR, str_749613dbddf6c21, "yeah ") +SUBS(AE|AT|AN|AO|AR, str_8c5e240f4e5d3061, "your ") +SUBS(AS|AE|AT|AN|AR, str_fa42caaa8023b228, "best ") +SUBS(AE|AN|AI|AO|AR, str_67863008ae8fd451, "only ") +SUBS(AA|AT|AN|AI|AR, str_da20b440a7186a4b, "that ") +SUBS(AA|AE|AN|AP|AR, str_223dd41a813d045f, "many ") +SUBS(AA|AE|AT|AN|AR, str_8f95067beb108348, "next ") +SUBS(AS|AT|AI|AP|AR, str_8d03100afd2419c2, "pick ") +SUBS(AA|AN|AI|AO|AR, str_54deaa1a3f19a7fc, "hall ") +SUBS(AA|AS|AE|AI|AR, str_b39cdb39ba4edfe7, "said ") +SUBS(AS|AT|AN|AI|AR, str_f67830c3e4e560ab, "this ") +SUBS(AA|AS|AE|AO|AR, str_4436aac714307c5b, "wood ") +SUBS(AS|AI|AO|AP|AR, str_eb8b6118d400de1, "lips ") +SUBS(AS|AE|AI|AP|AR, str_3be3101b06222c42, "keep ") +SUBS(AA|AS|AN|AP|AR, str_84ea13866e40cff7, "mass ") +SUBS(AA|AS|AT|AP|AR, str_718051f50c1745f9, "past ") +SUBS(AA|AS|AE|AT|AR, str_467af751a93d5fea, "were ") +SUBS(AS|AT|AO|AP|AR, str_cb532d5ded67e46b, "stop ") +SUBS(AS|AE|AT|AO|AR, str_806a00e99f47f1e, "good ") +SUBS(AS|AE|AI|AO|AR, str_312a2e7e56737afe, "like ") +SUBS(AA|AS|AI|AO|AR, str_cc94e0c76922bf90, "will ") +SUBS(AS|AN|AO|AP|AR, str_e320ed557b21c7c3, "jump ") +SUBS(AA|AE|AI|AO|AR, str_4d67956a1937c06a, "alex ") +SUBS(AT|AN|AI|AO|AR, str_e9481f155c267491, "into ") +SUBS(AA|AE|AT|AI|AR, str_40711ef1bb6ce033, "five ") +SUBS(AA|AS|AT|AI|AR, str_b9bd537963cf3ede, "wait ") +SUBS(AA|AT|AN|AO|AR, str_28bb10c5bb93cde6, "about ") +SUBS(AT|AI|AO|AP|AR, str_c97da9851380ebac, "pilot ") +SUBS(AE|AN|AO|AP|AR, str_39e44b61b232dc17, "money ") +SUBS(AS|AT|AI|AO|AR, str_503f03dcee6cb398, "still ") +SUBS(AS|AE|AT|AI|AR, str_a9281666a28e6ec3, "tried ") +SUBS(AA|AS|AE|AP|AR, str_d6daeab665ce4271, "passed ") +SUBS(AS|AE|AT|AN|AP|AR, str_e7aff3fb05cb8051, "mrs ") +SUBS(AA|AE|AN|AO|AR, str_7d50a0c65c92712f, "anyone ") +SUBS(AS|AE|AN|AP|AR, str_abdd78cfd9534f96, "seemed ") +SUBS(AA|AS|AN|AI|AO|AR, str_4e6e8e4c9b45508f, "who ") +SUBS(AA|AS|AE|AN|AI|AR, str_b8157ea41e09d921, "had ") +SUBS(AE|AI|AO|AP|AR, str_56b0c240ea9fe481, "people ") +SUBS(AS|AE|AT|AN|AO|AR, str_ba082b87d184320c, "once ") +SUBS(AA|AS|AE|AN|AP|AR, str_6a27ff657eabc9be, "made ") +SUBS(AE|AT|AN|AO|AP|AR, str_ca73dc3f774cbabc, "more ") +SUBS(AA|AT|AN|AI|AP|AR, str_bc2c779464890843, "path ") +SUBS(AE|AT|AN|AI|AP|AR, str_224997add6df35ba, "them ") +SUBS(AA|AS|AT|AI|AP|AR, str_e784b575d979691f, "pack ") +SUBS(AA|AS|AT|AN|AP|AR, str_389afa2e457b3e69, "camp ") +SUBS(AS|AN|AI|AO|AP|AR, str_88f447f6c429c220, "shop ") +SUBS(AA|AS|AT|AO|AP|AR, str_ad78df7dde0d91b8, "gaps ") +SUBS(AS|AE|AT|AI|AP|AR, str_8553c9ae3540a19d, "it's ") +SUBS(AA|AE|AT|AO|AP|AR, str_5e0c8ecdade5f1a0, "page ") +SUBS(AE|AN|AI|AO|AP|AR, str_ac07faffdc50a99f, "home ") +SUBS(AA|AS|AE|AN|AO|AR, str_1d76c98090617d6e, "down ") +SUBS(AA|AS|AT|AN|AO|AR, str_5146c3491da57e2b, "town ") +SUBS(AS|AE|AN|AO|AP|AR, str_29703c252684465e, "some ") +SUBS(AS|AE|AN|AI|AP|AR, str_a7ed86ef765aff1, "mind ") +SUBS(AA|AS|AE|AI|AO|AR, str_5a3cc09208d67861, "well ") +SUBS(AA|AE|AT|AI|AO|AR, str_b49c2360c17bfaa5, "life ") +SUBS(AS|AT|AN|AO|AP|AR, str_502f482b79087297, "most ") +SUBS(AA|AS|AT|AN|AI|AR, str_87226571ae131d8a, "with ") +SUBS(AA|AE|AT|AN|AI|AR, str_89e5d4bb42bf5ac6, "have ") +SUBS(AS|AT|AN|AI|AO|AR, str_af3d9eaa19f822d9, "such ") +SUBS(AA|AS|AT|AI|AO|AR, str_a57e20b51804cf2c, "last ") +SUBS(AS|AE|AT|AI|AO|AR, str_9f3ebe9397348d28, "told ") +SUBS(AA|AS|AE|AT|AI|AR, str_f3e5067a2519ad56, "first ") +SUBS(AA|AT|AI|AO|AP|AR, str_a475be09185ad1f, "plato ") +SUBS(AA|AE|AN|AI|AP|AR, str_acd7c28d984a2833, "happy ") +SUBS(AA|AS|AE|AT|AP|AR, str_66f9514dbfa60ef2, "we're ") +SUBS(AA|AS|AE|AT|AO|AR, str_6fd3d941462f3451, "words ") +SUBS(AA|AT|AN|AI|AO|AR, str_25f54e15b0b3abc1, "again ") +SUBS(AE|AT|AN|AI|AO|AR, str_36fad9241cea5c82, "other ") +SUBS(AA|AE|AI|AO|AP|AR, str_f7d795e2de04290f, "apple ") +SUBS(AS|AE|AT|AN|AI|AR, str_5cdcf79352e2d725, "these ") +SUBS(AA|AE|AN|AI|AO|AR, str_88405ef2e946d1d6, "alone ") +SUBS(AA|AS|AE|AT|AN|AR, str_6bb7e1a1ca75bfb5, "years ") +SUBS(AA|AS|AN|AO|AP|AR, str_ba3809ce0e475488, "woman ") +SUBS(AE|AT|AI|AO|AP|AR, str_a72c9ea66c108632, "prove ") +SUBS(AS|AE|AI|AO|AP|AR, str_dd746578c42672fd, "spoke ") +SUBS(AT|AN|AI|AO|AP|AR, str_9ae637bd5fd038a8, "might ") +SUBS(AS|AT|AN|AI|AP|AR, str_a523540c97d0bdfb, "smith ") +SUBS(AA|AT|AN|AO|AP|AR, str_612ae2fb632ad051, "among ") +SUBS(AA|AN|AI|AO|AP|AR, str_debd70c653b8860b, "human ") +SUBS(AA|AS|AE|AI|AP|AR, str_8e1be82c44ad245, "speak ") +SUBS(AA|AS|AI|AO|AP|AR, str_f36f1306b68b4b29, "pillow ") +SUBS(AA|AE|AT|AN|AP|AR, str_c7589dce3d265d20, "matter ") +SUBS(AS|AE|AN|AI|AO|AR, str_6c75dac99724579f, "should ") +SUBS(AS|AE|AO|AP|AR, str_329f2d4d4e320928, "possessed ") +SUBS(AA|AE|AT|AN|AO|AR, str_6e7eec08674ed6d1, "before ") +SUBS(AA|AE|AN|AI|AO|AP|AR, str_6eea10216935e72d, "play ") +SUBS(AA|AS|AE|AN|AI|AP|AR, str_4643015f5002abff, "make ") +SUBS(AA|AS|AE|AO|AP|AR, str_b2bf1dd0344af8af, "exposed ") +SUBS(AA|AE|AT|AN|AO|AP|AR, str_2dcb6a06ff45764b, "from ") +SUBS(AS|AE|AT|AO|AP|AR, str_5204c59b3bf29e2f, "process ") +SUBS(AA|AS|AE|AT|AI|AO|AR, str_2a1fe2610765b6af, "work ") +SUBS(AA|AE|AT|AI|AP|AR, str_1cf1e20a6157822c, "private ") +SUBS(AA|AS|AN|AI|AP|AR, str_2411238235bdc80f, "spanish ") +SUBS(AS|AT|AN|AI|AO|AP|AR, str_401efb5649b2ebb4, "much ") +SUBS(AA|AS|AE|AT|AN|AP|AR, str_8dffd42ce860597c, "came ") +SUBS(AA|AS|AE|AN|AI|AO|AR, str_83235a0fa2f65989, "would ") +SUBS(AA|AS|AN|AI|AO|AP|AR, str_841274c574bc6f3c, "small ") +SUBS(AS|AE|AT|AN|AO|AP|AR, str_2457621be8ffdd2e, "don't ") +SUBS(AS|AT|AI|AO|AP|AR, str_c319bffa441d1ba3, "politics ") +SUBS(AA|AS|AE|AT|AI|AP|AR, str_4f6c506138fb813d, "paris ") +SUBS(AA|AE|AT|AI|AO|AP|AR, str_58dbac3080f43a2c, "april ") +SUBS(AA|AS|AE|AN|AO|AP|AR, str_7b4540acd20a8e39, "women ") +SUBS(AA|AS|AE|AT|AO|AP|AR, str_4d2a6306f9c9bfcb, "power ") +SUBS(AA|AS|AE|AT|AN|AI|AR, str_ec4217a15a7e46ca, "where ") +SUBS(AS|AE|AT|AN|AI|AO|AR, str_cd4abc5e1c8e848a, "could ") +SUBS(AA|AS|AE|AI|AO|AP|AR, str_6e1297423b061106, "please ") +SUBS(AA|AS|AT|AN|AO|AP|AR, str_9f163fd928c775b2, "famous ") +SUBS(AS|AE|AT|AN|AI|AP|AR, str_f371381a7fbc125d, "didn't ") +SUBS(AA|AE|AT|AN|AI|AP|AR, str_61ff1ae647568c2a, "remain ") +SUBS(AE|AT|AN|AI|AO|AP|AR, str_88ca21737ccd8555, "mother ") +SUBS(AS|AE|AN|AI|AO|AP|AR, str_8a65747e667f35ed, "simply ") +SUBS(AA|AE|AT|AN|AI|AO|AR, str_c8defae65fa4ef3e, "another ") +SUBS(AA|AS|AE|AT|AN|AO|AR, str_c358a55785d991ba, "because ") +SUBS(AA|AS|AT|AN|AI|AO|AR, str_f1cf6af5d5bfd0af, "without ") +SUBS(AS|AE|AT|AI|AO|AP|AR, str_2ff09aba6aa2e0e4, "replied ") +SUBS(AA|AS|AT|AN|AI|AP|AR, str_9bf471cfa3e278c9, "captain ") +SUBS(AA|AS|AE|AT|AI|AO|AP|AR, str_156052b6d0cc2f4a, "place ") +SUBS(AA|AS|AE|AT|AN|AI|AP|AR, str_6bc2917c61a3f92d, "that's ") +SUBS(AA|AS|AT|AN|AI|AO|AP|AR, str_95c7f6f3d4db5b15, "almost ") +SUBS(AA|AS|AT|AI|AO|AP|AR, str_f0f9720f9f9b0214, "political ") +SUBS(AA|AE|AT|AN|AI|AO|AP|AR, str_7a84f6987c8a0811, "family ") +SUBS(AA|AS|AE|AN|AI|AO|AP|AR, str_5de5dc9f9633371b, "played ") +SUBS(AA|AS|AE|AT|AN|AO|AP|AR, str_2bfafc3eb8546058, "company ") +SUBS(AA|AS|AE|AT|AN|AI|AO|AR, str_af21cbc44bf9f140, "already ") KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END}) KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END}) KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END}) -SUBS(AA|AT|AN|AI|AO|AP, str_ed3d57e7a6cc9262, "imagination ") -SUBS(AS|AE|AT|AN|AI|AO|AP, str_d6ee20239053ced9, "something ") -SUBS(AA|AS|AE|AT|AN|AI|AO|AP, str_db27096f0ec176e2, "himself ") +KEYS(AI|AP|AL, cmb_78737f3c98f133fe, {KC_LSFT, KC_2, COMBO_END}) +PRES(AA|AO|AL, KC_LBRC) +PRES(AS|AP|AL, KC_RBRC) +SUBS(AA|AT|AN|AI|AO|AP|AR, str_ed3d57e7a6cc9262, "imagination ") +SUBS(AS|AE|AT|AN|AI|AO|AP|AR, str_d6ee20239053ced9, "something ") +SUBS(AA|AS|AE|AT|AN|AI|AO|AP|AR, str_db27096f0ec176e2, "himself ") diff --git a/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def b/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def index 038bc19ecd02..8af082f8d368 100644 --- a/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def +++ b/keyboards/ginny/keymaps/default/dicts/aset/layer-keymap.def @@ -1,22 +1,22 @@ // Thumb Keys -PRES(AL, KC_LSFT) -PRES(AR, KC_SPC) +PRES(AL, KC_LSFT) +PRES(AR, KC_SPC) // Layer Switches // To Number -SPEC( AR | AA | AT | AN | AP, SPEC_STICKY, NUM) -SPEC(NUM | AR | AA | AT | AN | AP, SPEC_STICKY, NUM) -SPEC(CMD | AR | AA | AT | AN | AP, SPEC_STICKY, NUM) -SPEC(USR | AR | AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC( AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC(NUM | AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC(CMD | AA | AT | AN | AP, SPEC_STICKY, NUM) +SPEC(USR | AA | AT | AN | AP, SPEC_STICKY, NUM) // To Command -SPEC( AR | AS | AE | AI | AO, SPEC_STICKY, CMD) -SPEC(NUM | AR | AS | AE | AI | AO, SPEC_STICKY, CMD) -SPEC(CMD | AR | AE | AI | AO, SPEC_STICKY, NUM) -SPEC(USR | AR | AE | AI | AO, SPEC_STICKY, CMD) +SPEC( AS | AE | AI | AO, SPEC_STICKY, CMD) +SPEC(NUM | AS | AE | AI | AO, SPEC_STICKY, CMD) +SPEC(CMD | AS | AE | AI | AO, SPEC_STICKY, CMD) +SPEC(USR | AS | AE | AI | AO, SPEC_STICKY, CMD) // To User -SPEC( AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) -SPEC(NUM | AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) -SPEC(CMD | AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) -SPEC(USR | AA | AS | AE | AT | AN | AI | AO | AP | AL | AR, SPEC_STICKY, USR) +SPEC( AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) +SPEC(NUM | AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) +SPEC(CMD | AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) +SPEC(USR | AA | AS | AE | AT | AN | AI | AO | AP, SPEC_STICKY, USR) diff --git a/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def b/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def index 75084d75cd08..b31787bf6f07 100755 --- a/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def +++ b/keyboards/ginny/keymaps/default/dicts/aset/num-keymap.def @@ -11,7 +11,6 @@ PRES(NUM|AE|AT, PRES(NUM|AS|AT, KC_NO) PRES(NUM|AN|AO, KC_NO) PRES(NUM|AS|AI, KC_EQL) -PRES(NUM|AA|AS, KC_SPC) PRES(NUM|AS|AO, KC_DOT) PRES(NUM|AI|AO, KC_EQL) PRES(NUM|AS|AN, KC_END) @@ -27,9 +26,8 @@ PRES(NUM|AE|AO, PRES(NUM|AO|AP, KC_SCLN) PRES(NUM|AE|AI, KC_COMM) PRES(NUM|AE|AP, KC_QUOT) -PRES(NUM|AN|AI|AO|AP, KC_TAB) -PRES(NUM|AA|AT|AN|AP, KC_SPC) -PRES(NUM|AA|AS|AE|AT|AN|AI|AO|AP, KC_SPC) +PRES(NUM|AA|AS|AE|AT, KC_TAB) +PRES(NUM|AN|AI|AO|AP, KC_ENT) KEYS(NUM|AS|AP, cmb_ea889bef063f6825, {KC_LSFT, KC_0, COMBO_END}) KEYS(NUM|AA|AI, cmb_e9bf29584cf72c14, {KC_LSFT, KC_1, COMBO_END}) KEYS(NUM|AA|AO, cmb_bff41f9e9cd6fd93, {KC_LSFT, KC_9, COMBO_END}) diff --git a/keyboards/ginny/rules.mk b/keyboards/ginny/rules.mk index fc1bad603e51..2f851ee53a04 100755 --- a/keyboards/ginny/rules.mk +++ b/keyboards/ginny/rules.mk @@ -1,21 +1,21 @@ # MCU name -MCU = atmega32u4 -BOOTLOADER = atmel-dfu +MCU = atmega32u4 +BOOTLOADER = atmel-dfu -CUSTOM_MATRIX = yes -VIRTSER_ENABLE = no -NKRO_ENABLE = yes -DEBOUNCE_TYPE = eager_pr +CUSTOM_MATRIX = yes +VIRTSER_ENABLE = no +NKRO_ENABLE = no +DEBOUNCE_TYPE = eager_pr # Lets try and save some space eh? -MOUSEKEY_ENABLE = no -EXTRAKEY_ENABLE = no -CONSOLE_ENABLE = yes -COMMAND_ENABLE = no +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = no +CONSOLE_ENABLE = no +COMMAND_ENABLE = no -VPATH += keyboards/gboards/engine -SRC += matrix.c engine.c -QUANTUM_LIB_SRC += i2c_master.c -OPT_DEFS += -DONLYQWERTY -#OPT_DEFS += -DONLYQWERTY -DDEBUG_MATRIX -save-temps -c -LTO_ENABLE = yes +VPATH += keyboards/gboards/engine +SRC += matrix.c engine.c +QUANTUM_LIB_SRC += i2c_master.c +OPT_DEFS += -DONLYQWERTY +#OPT_DEFS += -DONLYQWERTY -DDEBUG_MATRIX -save-temps -c +LTO_ENABLE = yes