diff options
Diffstat (limited to 'keyboard/ergodox_ez')
-rw-r--r-- | keyboard/ergodox_ez/Makefile | 2 | ||||
-rw-r--r-- | keyboard/ergodox_ez/config.h | 2 | ||||
-rw-r--r-- | keyboard/ergodox_ez/keymaps/townk_osx/keymap.c | 287 | ||||
-rw-r--r-- | keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex | 1166 |
4 files changed, 1456 insertions, 1 deletions
diff --git a/keyboard/ergodox_ez/Makefile b/keyboard/ergodox_ez/Makefile index 3a07ec254f..f4a61dde4b 100644 --- a/keyboard/ergodox_ez/Makefile +++ b/keyboard/ergodox_ez/Makefile @@ -96,7 +96,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) # CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration CUSTOM_MATRIX = yes # Custom matrix file for the ErgoDox EZ -SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work # MIDI_ENABLE = yes # MIDI controls # UNICODE_ENABLE = yes # Unicode diff --git a/keyboard/ergodox_ez/config.h b/keyboard/ergodox_ez/config.h index 6a391ffb54..58ba690afd 100644 --- a/keyboard/ergodox_ez/config.h +++ b/keyboard/ergodox_ez/config.h @@ -86,5 +86,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION //#define DEBUG_MATRIX_SCAN_RATE +#define ONESHOT_TAP_TOGGLE 2 +#define ONESHOT_TIMEOUT 3000 #endif diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/keymap.c b/keyboard/ergodox_ez/keymaps/townk_osx/keymap.c new file mode 100644 index 0000000000..62ebc5c3ac --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/townk_osx/keymap.c @@ -0,0 +1,287 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" +#include "action_util.h" +#include "led.h" +#include "keymap_common.h" +#include "timer.h" + +/* + +# Why this Layout + +This layout was based on Kinesis layout and other ErgoDox user layouts +available. It's target to be used on a MacOS but I'm pretty sure it can be +addapted to Windows and/or Linux easily. + +## Function Key + +The `fn` key work almost like it would in any other keyboard with the exception +it has a semi-sticky behavior. What does that mean? + +Well, if you press the `fn` and release it, the keyboard will be put on the +_function layout_ and the next key stroke will be processed as if the `fn` key +was pressed. Aftwards, the leyout get back to _normal_. If you hold `fn` and +press any other key, when you release them, the keyboard leyout is back to +_normal_. + +While pressing the `fn` with the left hand and strikeing the other keys on the +right hand is farly easy, the same cannot being said for the other keys on the +left side. So, instead of trying to do contorcionism with my left hand, I +decided to do a semi-sticky version of `fn`. This way, I can press the `fn` +key with my pinky, release it and press the `1` key to issue an `F1` to the +operating system. + +## Key-Pad Key + +The `key pad` key is a layout switch key. If pressed, it will put the keyboard +on the _key pad layout_ and stay there until key is pressed again. + +This is used to make the keyboard behave mostly like a **num pad keyboard**. + +## Notes +- Regardless in which layout you are, keys from other layouts are not + accessible. This means that if you are on the _key pad layout_, the left hand + will be pretty much unusable. + Of course that like anything else, there are exceptions to this rule. + Modifiers should remain accessible throughout the layers. +- The _shift key_ is, like the _function key_, also configured to have a sticky + behavior. +- All sticky keys have a timeout of 3 seconds. + +*/ +#define BASE 0 +#define KEYPAD 1 +#define FN 2 + +#define MACRO_TMUX_ESC 10 +#define MACRO_SHIFT_OR_LPAREN 11 +#define MACRO_SHIFT_OR_RPAREN 12 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Base Layer + * + * ,-----------------------------------------------------. ,-----------------------------------------------------. + * | `~ | 1 | 2 | 3 | 4 | 5 | ESC | | Macro| 6 | 7 | 8 | 9 | 0 | + = | + * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| + * | Tab | Q | W | E | R | T | F16 | | F17 | Y | U | I | O | P | - _ | + * |-----------+------+------+------+------+------| Meh | | Meh |------+------+------+------+------+-----------| + * | \ (Ctrl) | A | S | D | F | G |------| |------| H | J | K | L | ; | ' " (Ctrl)| + * |-----------+------+------+------+------+------| F18 | | F19 |------+------+------+------+------+-----------| + * | LShift | Z | X | C | V | B | Hyper| | Hyper| N | M | , | . | / | RShift | + * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' + * | FN | No |LCtrl | LAlt | LGui | | RGui | RAlt | RCtrl| No | KPAD | + * `-----------------------------------' `-----------------------------------' + * ,-------------. ,-------------. + * | Left | Right| | Down | Up | + * ,------|------|------| |------+------+------. + * | | | Home | | PgUp | | | + * |Backsp| Del |------| |------| Enter| Space| + * | | | End | | PgDn | | | + * `--------------------' `--------------------' + * + * Macro = Ctrk+A Esc + * (this is used to issue the Esc key to the Tmux application) + */ +[BASE]=KEYMAP(//left half + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MEH_T(KC_F16), + CTL_T(KC_BSLS), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_FN2, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_F18), + KC_FN1, KC_NO, KC_LCTRL, KC_LALT, KC_LGUI, + KC_LEFT, KC_RIGHT, + KC_HOME, + KC_BSPC, KC_DELT, KC_END, + //right half + M(MACRO_TMUX_ESC), KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + MEH_T(KC_F17), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, CTL_T(KC_QUOT), + ALL_T(KC_F19), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_FN2, + KC_RGUI, ALT_T(KC_LBRC), CTL_T(KC_RBRC), KC_NO, TG(KEYPAD), + KC_DOWN, KC_UP, + KC_PGUP, + KC_PGDN, KC_ENT, KC_SPC), + +/* Keymap 1: KeyPad Layer + * + * ,-----------------------------------------------------. ,-----------------------------------------------------. + * | | | | | | | | | BTab | Clear| / | * | ^ | ( | LeftClick | + * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| + * | M.Accel 2 | |ScrlUp| U |ScrlDn| | | | Tab | 7 | 8 | 9 | + | ) | RightClick| + * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| + * | M.Accel 1 | | L | D | R | |------| |------| 4 | 5 | 6 | - | | MidClick | + * |-----------+------+------+------+------+------| | |Return|------+------+------+------+------+-----------| + * | M.Accel 0 | |ScrlL | |ScrlR | | | | | 1 | 2 | 3 | = | | | + * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' + * | | | | | | | 0 | . | , | | KPAD | + * `-----------------------------------' `-----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +[KEYPAD]=KEYMAP(//left half + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_MS_WH_UP, KC_MS_U, KC_MS_WH_DOWN, KC_NO, KC_NO, + KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, + KC_NO, KC_NO, KC_MS_WH_LEFT, KC_NO, KC_MS_WH_RIGHT, KC_NO, KC_NO, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO, + //right half + LSFT(KC_TAB), KC_CLEAR, KC_KP_SLASH, KC_KP_ASTERISK, KC_CIRCUMFLEX, KC_LPRN, KC_MS_BTN1, + KC_TAB, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_RPRN, KC_MS_BTN2, + KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_MINUS, KC_NO, KC_MS_BTN3, + KC_KP_ENTER, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_EQUAL, KC_NO, KC_NO, + KC_KP_0, KC_KP_DOT, KC_KP_COMMA, KC_NO, KC_TRNS, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO), + +/* Keymap 2: Functions Layer + * + * ,-----------------------------------------------------. ,-----------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | Vol. Up | + * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| + * | | Stop | Rw | Rec | FF | | XXXX | | XXXX | | | | | | Vol. Down | + * |-----------+------+------+------+------+------| XXXX | | XXXX |------+------+------+------+------+-----------| + * | CapsLock | Eject| Prev | Play | Next | |------| |------| Left | Down | Up | Right| | Mute | + * |-----------+------+------+------+------+------| XXXX | | XXXX |------+------+------+------+------+-----------| + * | L Shift | | | | | | XXXX | | XXXX | | | | | | R Shift | + * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' + * | XXXXX | | XXXX | XXXX | XXXX | | XXXX | XXXX | XXXX | | | + * `-----------------------------------' `-----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * XXX = These keys are transparent keys that, when pressed, they issue the key from the previous layer. + */ +[FN]=KEYMAP(//left half + KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_NO, KC_MEDIA_STOP, KC_MEDIA_REWIND, KC_MEDIA_SELECT, KC_MEDIA_FAST_FORWARD, KC_NO, KC_TRNS, + KC_CAPS, KC_MEDIA_EJECT, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, + KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO, + //right half + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLU, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLD, + KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_NO, KC_MUTE, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_NO, KC_NO, KC_NO)}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_ONESHOT(FN), + [2] = ACTION_MODS_ONESHOT(MOD_LSFT), // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift. +}; + +static uint16_t key_timer; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + // MACRODOWN only works in this function + switch(id) { + case MACRO_TMUX_ESC: + if (record->event.pressed) { + return MACRO(D(LCTRL), T(A), U(LCTRL), D(ESC), END); + } + return MACRO(U(ESC), END); + case MACRO_SHIFT_OR_LPAREN: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSFT); // we're now holding down Shift. + } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) < TAPPING_TERM) { // the threshhold we pick for counting something as a tap. + register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren + unregister_code(KC_9); // now let's let go of that key + } + unregister_code(KC_LSFT); // let's release the Shift key now. + } + break; + } + case MACRO_SHIFT_OR_RPAREN: { + if (record->event.pressed) { + key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key + register_code(KC_RSFT); + } else { + if (timer_elapsed(key_timer) < TAPPING_TERM) { + register_code(KC_0); + unregister_code(KC_0); + } + unregister_code(KC_RSFT); + } + break; + } + } + return MACRO_NONE; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { +}; + +uint8_t current_layer = BASE; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + ergodox_led_all_off(); + ergodox_led_all_set(LED_BRIGHTNESS_LO); + + switch (layer) { + case BASE: + current_layer = BASE; + break; + case KEYPAD: + current_layer = KEYPAD; + break; + default: + // none + break; + } + + // layer leds + if (current_layer == KEYPAD) { + ergodox_right_led_3_on(); + } + + // capslock + if (host_keyboard_leds() & (3<<USB_LED_CAPS_LOCK)) { + ergodox_right_led_1_on(); + } + + // Temporary leds + + // The function layer takes over other layers and we need to reflect that on the leds. + // If the current layer is the BASE, we simply turn on the FN led, but if the current + // layer is the KEYPAD, than we must turn it off before turning on the FN led. + if (layer == FN && !has_oneshot_layer_timed_out()) { + ergodox_right_led_3_off(); + ergodox_right_led_2_on(); + } + + // if the shifted is pressed I show the case led in a brighter color. This is nice to + // differenciate the shift from the capslock. + // Notice that I make sure that we're not using the shift on a chord shortcut (pressing + // shift togather with other modifiers). + if((keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) && // is shift pressed and there is no other + !(keyboard_report->mods & (~MOD_BIT(KC_LSFT) & ~MOD_BIT(KC_RSFT)))) || // modifier being pressed as well + (get_oneshot_mods() & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) && !has_oneshot_mods_timed_out())) { // or the one shot shift didn't timed out + ergodox_right_led_1_set(LED_BRIGHTNESS_HI); + ergodox_right_led_1_on(); + } +}; diff --git a/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex new file mode 100644 index 0000000000..89e9ffcce2 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex @@ -0,0 +1,1166 @@ +:100000000C9462020C94A6020C94A6020C94A60214 +:100010000C94A6020C94A6020C94A6020C94A602C0 +:100020000C94A6020C94A6020C94E60C0C94B80D49 +:100030000C940D1C0C94A6020C94A6020C94A6021F +:100040000C94A6020C94A6020C94A6020C94A60290 +:100050000C94A6020C94751C0C94A6020C94A60297 +:100060000C94A6020C94A6020C94A6020C94A60270 +:100070000C94A6020C94A6020C94A6020C94A60260 +:100080000C94A6020C94A6020C94A6020C94A60250 +:100090000C94A6020C94A6020C94A6020C94A60240 +:1000A0000C94A6020C94A6020C94A602250E470EF0 +:1000B000350F470E350F8C0EAF0E350F040F170F8F +:1000C000221222124E124E129612B4123014301412 +:1000D000BF123014741374132114301430142A1402 +:1000E0008113811381138113811381138113811370 +:1000F0008113811381138113811381138113811360 +:100100009213A013A713AE13B81302290001E00144 +:1001100004020402E00129000000F4A200223500DC +:100120002B003171C200C10000001E001400040049 +:100130001D0000004D001F001A0016001B00E0000B +:100140004C002000080007000600E2002A00210001 +:10015000150009001900E3004A00220017000A00F8 +:1001600005000000500029006B7700006D7F000043 +:100170004F000A306C7700006E7F000051002300B2 +:100180001C000B00110000005200240018000D009C +:100190001000E7004B0025000C000E0036002F7405 +:1001A0002C00260012000F003700307128002700B5 +:1001B00013003300380000004E002E002D00347173 +:1001C000C200015400000000000000000000010017 +:1001D000000000000000000000000000000000001F +:1001E000F900F200FB00000000000000F000F10048 +:1001F0000000000000000000FA00F300FC00000016 +:1002000000000000000000000000000000000000EE +:10021000000000000000000000002B022B00000086 +:100220005800000000009C005F005C0059000000C6 +:100230000000540060005D005A006200000055009C +:1002400061005E005B00630000002302570056005F +:100250006700850000002602270200000000000061 +:100260000000F400F500F6000000010000000000AE +:1002700000003900E100010000003A00AD00B000CC +:100280000000000000003B00BC00AC0000000100CA +:1002900000003C00AF00AE000000010000003D0087 +:1002A000BB00AB000000010000003E0000000000A9 +:1002B0000000000000003F000100000001000000FD +:1002C00000004000010000000100000000004100AB +:1002D000000050000000000000004200000051003B +:1002E0000000010000004300000052000000010077 +:1002F0000000440000004F00000001000000450025 +:1003000000000000000000000000A900AA00A800F2 +:10031000E5000000000016034500720067006F0052 +:1003200044006F007800200045005A0000001603CA +:100330004500720067006F0044006F0078002000E5 +:1003400045005A0000000403090409026D0004017D +:1003500000A0FA09040000010301010009211101B4 +:100360000001223F000705810308000A090401007B +:100370000103010200092111010001224D000705BE +:10038000820308000A090402000103000000092199 +:10039000110100012236000705830308000A090441 +:1003A00003000103000000092111010001223900AE +:1003B000070584031000011201100100000008ED80 +:1003C000FE071301000102000105010906A1010554 +:1003D0000719E029E7150025019508750181020537 +:1003E000081901290595057501910295017503917B +:1003F00001050719002977150025019578750181F8 +:1004000002C005010980A101850216010026B7007E +:100410001A01002AB700751095018100C0050C096A +:1004200001A1018503160100269C021A01002A9CE5 +:1004300002751095018100C005010902A1010901A1 +:10044000A10005091901290515002501950575016A +:10045000810295017503810105010930093115817A +:10046000257F95027508810609381581257F95013C +:1004700075088106050C0A38021581257F950175DE +:10048000088106C0C005010906A101050719E02978 +:10049000E715002501950875018102950175088110 +:1004A0000105081901290595057501910295017548 +:1004B0000391010507190029FF150025FF95067511 +:1004C000088100C011241FBECFEFDAE0DEBFCDBF30 +:1004D00004B603FE24C08091F5019091F601A0912D +:1004E000F701B091F8018730904BA740B04BB9F4B9 +:1004F0001092F5011092F6011092F7011092F80196 +:1005000014BE84B7877F84BF88E10FB6F8948093C8 +:100510006000109260000FBEE0E0FFE3099511E07B +:10052000A0E0B1E0E2E8F8E402C005900D92A43347 +:10053000B107D9F711E0A4E3B1E001C01D92A53FD6 +:10054000B107E1F70E942C0A0C943F240C940000A0 +:10055000FC016B3059F06C3029F16A3009F041C070 +:100560008281811141C08AE091E0089582818823CF +:1005700041F00E943F1C909336018093350181EE3B +:100580001BC080913501909136010E944B1C883C24 +:10059000910530F486E20E94971086E20E945F1176 +:1005A00081EE1DC08281882351F00E943F1C9093F0 +:1005B00036018093350185EE0E94971012C080911C +:1005C0003501909136010E944B1C883C910530F416 +:1005D00087E20E94971087E20E945F1185EE0E94D9 +:1005E0005F1180E090E008958DE091E00895089516 +:1005F000CF936091B4017091B5018091B601909153 +:10060000B7010E94781BC82F56985E9825982D98A0 +:1006100026982E9827982F988FE090E09093890045 +:100620008093880090938B0080938A0090938D0034 +:1006300080938C00CC2329F0C13029F4C09334017D +:1006400002C01092340180913401813011F4279A54 +:100650002F9A0E946E0F867011F0259A2D9AC23043 +:1006600041F40E94011A811104C027982F98269AFC +:100670002E9AE0910E01F0910F018081982F9272D5 +:1006800059F08D7D49F48FEF90E09093890080932D +:100690008800259A2D9A08C00E942E1B827221F094 +:1006A0000E94D419882379F3CF9108950C94F8020D +:1006B00056985E9825982D9826982E9827982F98CA +:1006C0008FEF90E0909389008093880090938B0047 +:1006D00080938A0090938D0080938C00259A2D9AA8 +:1006E0002FEF80E792E0215080409040E1F700C07A +:1006F0000000269A2E9A2FEF80E792E0215080404A +:100700009040E1F700C00000279A2F9A2FEF80E772 +:1007100092E0215080409040E1F700C00000259811 +:100720002D982FEF80E792E0215080409040E1F734 +:1007300000C0000026982E982FEF80E792E021500D +:1007400080409040E1F700C0000027982F9856980D +:100750005E9825982D9826982E9827982F9808957A +:1007600089EA8093800089E08093810024982C9806 +:100770003F988AB18F748AB96E98479A8BB1806B13 +:100780008BB9769A0E9458030C94F70280E280930A +:1007900000018091370181110EC00E94150481E093 +:1007A000809337012FEF83ED90E3215080409040FC +:1007B000E1F700C0000080E40E941B048093000168 +:1007C00081112EC00E94450480930001811128C030 +:1007D0000E94450480930001811122C08FE30E9492 +:1007E00045048093000181111BC00E943D0480E4F8 +:1007F0000E941B0480930001811112C08CE00E94B2 +:1008000045048093000181110BC00E944504809330 +:100810000001811105C08FE30E944504809300010F +:100820000E943D048091000108951092B9008AE071 +:100830008093B800089594EA9093BC009091BC0016 +:1008400097FFFCCF9091B900987F983021F09031BC +:1008500011F081E008958093BB0084E88093BC0090 +:100860008091BC0087FFFCCF8091B900887F8831E0 +:1008700011F0803471F780E0089584E98093BC0022 +:100880008091BC0084FDFCCF08958093BB0084E878 +:100890008093BC008091BC0087FFFCCF9091B90091 +:1008A000987F81E0983209F480E0089584E880938D +:1008B000BC008091BC0087FFFCCF8091BB000895F5 +:1008C00080910001811115C080E40E941B04809377 +:1008D000000181110CC082E10E9445048093000157 +:1008E000811105C08FEF0E944504809300010E9492 +:1008F0003D0484B1807F84B985B1807F85B98AB198 +:10090000837F8AB98BB1837F8BB93E9846980895CF +:100910000E94C603809300010E94600480B38C7023 +:1009200080BB81B3836F81BBA9E3B1E0E7E4F1E071 +:100930008EE08E0F11921D928E13FCCF0C94B0039B +:10094000BF92CF92DF92EF92FF920F931F93CF93BC +:10095000DF9380910001882379F0809138018F5FC7 +:1009600080933801811108C00E94C6038093000162 +:10097000811102C00E94580309E311E0C0E0D0E0F9 +:10098000DD24D39482E0C82EEE24E394F12CC7300A +:10099000D10500F580910001811164C080E40E94BE +:1009A0001B0480930001811112C082E10E94450462 +:1009B0008093000181110BC0C7010C2E01C0880F6C +:1009C0000A94EAF780950E944504809300010E94F2 +:1009D0003D0448C0CA30A1F028F4C83059F0C930ED +:1009E00061F005C0CC3089F070F0CD3089F0209AEC +:1009F000289810C0219A29980DC0229A2A980AC0D6 +:100A0000239A2B9807C0529A01C0539A5B9802C050 +:100A10003E9A469890EA9A95F1F79FB1799902C06B +:100A200082E001C080E091709D25982B7C9902C0E6 +:100A300084E001C080E0892B7D9902C038E001C0CC +:100A400030E0832B7E9902C020E101C020E0822BA0 +:100A50009FB19095991F9927991F9295990F907E14 +:100A6000892B0FC080910001811149C080E40E9450 +:100A70001B0480930001882379F1B12C0E943D046E +:100A80008B2DF8019081981719F08083C092010195 +:100A90000E94600421960F5F1F4FCE30D10509F0F0 +:100AA00076CF80910101882361F18150809301010B +:100AB000882339F08FE99FE00197F1F700C000002B +:100AC00020C0A7E4B1E0E9E3F1E0CF01825F9191BA +:100AD0009D938E13FCCF15C083E10E944504809343 +:100AE00000018111CACF81E40E941B0480930001A0 +:100AF0008111C3CF0E945604B82EB094BFCF80E0BE +:100B0000C0CF0E94560381E0DF91CF911F910F91DA +:100B1000FF90EF90DF90CF90BF900895E82FF0E026 +:100B2000E95BFE4F808108950895089596E0799FCE +:100B3000F001112494E5899FE00DF11D1124E60FC9 +:100B4000F11DEE0FFF1FE25EFE4F85919491089517 +:100B5000880F991FFC01E856F04085919491089503 +:100B6000880F991FFC01E85EFE4F859194910895CE +:100B70000F931F93CF93DF93EC018115904350F5B2 +:100B8000C11580E2D80708F0B3C0CB3BD10590F483 +:100B9000C83AD10508F05AC0C53AD10508F04BC093 +:100BA000C430D10508F0BBC1219709F0B5C101E0FF +:100BB00010E0F5C1CF3FD10511F008F0B0C1C03F42 +:100BC000D10508F092C0CE01805E9109089708F423 +:100BD000A6C1A2C1C11591E5D907A8F4C23020E58C +:100BE000D20708F09EC0C11580E5D80709F485C07A +:100BF00008F091C0C11520E4D20708F08DC1DD27AF +:100C00008E01106CCCC1C11580E8D80758F4C1150D +:100C100090E7D90708F07CC1C11520E6D20708F497 +:100C200022C17AC1C11580E9D80708F075C1DF700B +:100C30008E01106AB4C1C53AD10509F472C1C63A31 +:100C4000D10509F071C102E810E4A9C1C83AD10583 +:100C500009F46DC1C93AD10509F46CC1CA3AD1058C +:100C600009F46BC1CB3AD10509F46AC1CC3AD1057C +:100C700009F469C1CD3AD10509F468C1C03BD10579 +:100C800009F467C1CE3AD10509F466C1CF3AD1055E +:100C900009F465C1C13BD10509F464C1C23BD1056A +:100CA00009F463C1C33BD10509F462C1C43BD1055A +:100CB00009F461C1C53BD10509F460C1C63BD1054A +:100CC00009F45FC1C73BD10509F45EC1C83BD1053A +:100CD00009F45DC1C93BD10509F45CC1CA3BD1052A +:100CE00009F45BC100E014E45AC18E01106557C1DC +:100CF000CE019F700E94B00553C10E9484149FEFE3 +:100D000024E38CE0915020408040E1F700C00000D7 +:100D10000E949A1C44C18091D60181608093D601C3 +:100D20003EC10E94431E811102C00E94291E0E94E2 +:100D3000601E90E09093F5018093F401C23090E53D +:100D4000D90721F48091F401816086C0C43020E588 +:100D5000D20721F48091F40182607EC0C63080E524 +:100D6000D80721F48091F401846076C0C83090E502 +:100D7000D90719F48091F40127C0CA3020E5D207C1 +:100D800021F48091F401806167C0CC3080E5D80700 +:100D900021F48091F40180625FC0CE3090E5D907E4 +:100DA00021F48091F401806457C0C03120E5D2075E +:100DB00021F48091F40180684FC0C23180E5D807EA +:100DC00029F48091F4018460886046C0C33090E5C6 +:100DD000D90721F48091F4018E7F3EC0C53020E513 +:100DE000D20721F48091F4018D7F36C0C73080E5B1 +:100DF000D80721F48091F4018B7F2EC0C93090E593 +:100E0000D90719F48091F40126C0CB3020E5D20730 +:100E100021F48091F4018F7E1FC0CD3080E5D8078A +:100E200021F48091F4018F7D17C0CF3090E5D90770 +:100E300021F48091F4018F7B0FC0C13120E5D207EE +:100E400021F48091F4018F7707C0C331D04531F48C +:100E50008091F4018B7F877F8093F4018091F4016E +:100E60000E94641E9CC08D2F99278F709927813016 +:100E70009105D9F49E012370332702C0880F991F72 +:100E80002A95E2F79C688E0144E0000F111F4A95F5 +:100E9000E1F700271370802B912B53E0CC0FDD1F5F +:100EA0005A95E1F7C076DD272FC08230910531F4E5 +:100EB000DC2FCC278E01016F106A71C08330910541 +:100EC00069F4CE018370992701E010E002C0000FA1 +:100ED000111F8A95E2F7C8019C680FC0049709F0BA +:100EE0005EC0CE018370992701E010E002C0000FC0 +:100EF000111F8A95E2F7C8019A6823E0CC0FDD1F25 +:100F00002A95E1F7C07ED7708C010C2B1D2B47C0B2 +:100F1000DF708E01106243C000E010E040C08E011F +:100F20003EC001E810E43BC003E810E438C002EE24 +:100F300014E435C009EE14E432C00AEE14E42FC004 +:100F400005EB14E42CC006EB14E429C007EB14E411 +:100F500026C00CEC14E423C00DEC14E420C003E81C +:100F600015E41DC00AE815E41AC002E915E417C02B +:100F700004E915E414C001E216E411C003E216E42A +:100F80000EC004E216E40BC005E216E408C006E257 +:100F900016E405C007E216E402C00AE216E4C8013E +:100FA000DF91CF911F910F91089596E0799FF00105 +:100FB000112494E5899FE00DF11D1124E60FF11D28 +:100FC000EE0FFF1FE25EFE4F85919491803E9105EA +:100FD000E0F4803C910558F58133910509F46FC028 +:100FE00048F48932910509F463C08A32910509F405 +:100FF0006DC072C089339105E9F082389105D1F056 +:101000008533910509F44DC067C0833E910581F198 +:1010100038F4803E9105B9F0823E9105D9F05CC06C +:10102000863E910561F1873E9105A1F155C00E9470 +:10103000A80508952091F40120FD02C021FF4CC0B5 +:1010400080EE90E049C08091F40180FFF9CF89E300 +:1010500090E042C08091F40182FF0EC08091F401C3 +:1010600084FF03C080E090E037C083EE90E034C09E +:101070008091F40182FFF2CF82EE90E02DC080914A +:10108000F40183FF0BC08091F40184FDEBCF87EE68 +:1010900090E022C08091F40183FFF5CF86EE90E0CE +:1010A0001BC08091F40185FF07C089E290E014C065 +:1010B0008091F40185FFF9CF85E390E00DC0809128 +:1010C000F40186FF07C08AE290E006C08091F40137 +:1010D00086FFF9CF81E390E00E94B8050895089556 +:1010E0000C946F08809165010895CF93DF9300D031 +:1010F0001F92CDB7DEB79C018091EB01843019F5CA +:1011000093E099833B832A839093E9008FEF90913A +:10111000E800815095FD06C095ED9A95F1F7000025 +:101120008111F5CF8091E80085FF0DC040E050E0CF +:1011300063E070E0CE0101960E94D60A8091E8003B +:101140008E778093E8000F900F900F90DF91CF91F2 +:101150000895CF93DF9300D01F92CDB7DEB72091D3 +:10116000EB01243021F522E029839B838A8383E0ED +:101170008093E9008FEF9091E800815095FD06C0C3 +:1011800095ED9A95F1F700008111F5CF8091E80077 +:1011900085FF0DC040E050E063E070E0CE010196B5 +:1011A0000E94D60A8091E8008E778093E8000F9025 +:1011B0000F900F90DF91CF9108952091EB01243093 +:1011C000F1F422E02093E9002FEF3091E800215064 +:1011D00035FD06C035ED3A95F1F700002111F5CF48 +:1011E0002091E80025FF0BC040E050E065E070E092 +:1011F0000E94D60A8091E8008E778093E8000895D7 +:10120000CF93DF93EC019091EB01943009F046C04D +:1012100080910C018823D9F080910D018823B9F0C9 +:101220009093E9008FEF9091E800815095FD06C002 +:1012300095E19A95F1F700008111F5CF8091E800D2 +:1012400085FF2CC040E050E060E170E017C081E015 +:101250008093E9008FEF9091E800815095FD06C0E2 +:1012600095ED9A95F1F700008111F5CF8091E80096 +:1012700085FF14C040E050E068E070E0CE010E94BD +:10128000D60A8091E8008E778093E80080E1FE0125 +:10129000A5E5B1E001900D928A95E1F7DF91CF913C +:1012A00008958091EA01811109C00E946B0C0E948F +:1012B000C80C8091E20084608093E200089510924F +:1012C000EA010895089508950C94071C42E061EC2A +:1012D00081E00E94E50B42E061EC82E00E94E50BB8 +:1012E00042E061EC83E00E94E50B42E161EC84E0C6 +:1012F0000C94E50B8091ED01833009F455C030F476 +:10130000813071F0823009F48EC008958A3009F47A +:101310007AC08B3009F460C0893009F09CC020C0CD +:101320008091EC01813A09F096C08091E800877FB6 +:101330008093E8008091F0019091F101892B21F4D4 +:1013400060E185E591E003C060E080E090E070E05E +:101350000E94210B8091E8008B778093E80008952C +:101360008091EC01813209F076C08091F00190917A +:10137000F101009719F0039709F06DC08091E80022 +:10138000877F8093E8008091E80082FD05C080910E +:10139000EB018111F8CF5FC08091F100809365016E +:1013A0008091E8008B7753C08091EC01813A09F07D +:1013B00052C08091F0019091F101892B09F04BC04E +:1013C0008091E800877F8093E8008091E80080FFAB +:1013D000FCCF80910C0136C08091EC018132D9F5AF +:1013E0008091F0019091F101892BA9F58091E8009D +:1013F000877F8093E8000E941A0C8091EE01809311 +:101400000C010C9484148091EC01813221F58091BF +:10141000E800877F8093E8000E941A0C8091EF011A +:101420008093660108958091EC01813AA1F4809146 +:10143000E800877F8093E8008091E80080FFFCCF80 +:10144000809166018093F1008091E8008E7780930F +:10145000E8000C941A0C089584B7877F84BF88E154 +:101460000FB6F89480936000109260000FBE90E079 +:1014700080E80FB6F89480936100909361000FBEEE +:101480000E94BD0F0E946B0C0E94C80C8091E2006C +:1014900084608093E20078940E944E0F0E94BF0FF8 +:1014A00082E091E00E94690F8091EB01853069F440 +:1014B0000E94C81B8091E9018823B1F30E94F31BAD +:1014C000882391F30E94C00AEFCF0E94C50FECCF92 +:1014D000292F332723303105C9F064F42130310539 +:1014E00081F02230310509F043C08DE690E02AE416 +:1014F00033E042C021323105F1F02232310541F1B1 +:1015000037C082E190E027EB33E036C09927813085 +:10151000910541F08230910541F0892B49F5E6E4CF +:10152000F3E005C0EEE2F3E002C0E6E1F3E084910F +:1015300090E09F0121C06430D8F4E62FF0E0EE0F78 +:10154000FF1FEE5DFE4F2081318189E090E014C0E5 +:10155000643070F470E0FB01EE0FFF1FE65EFE4F9B +:1015600020813181FB01EA5EFE4F808190E004C062 +:1015700080E090E020E030E0FA013183208308959C +:1015800080E189BD82E189BD09B400FEFDCF809173 +:10159000D8008F7D8093D8008091E0008260809396 +:1015A000E0008091E00081FDFCCF0895CF92DF92B2 +:1015B000EF92FF920F931F93CF93DF93EC018B0178 +:1015C0006A010E94390C811133C0C114D10439F071 +:1015D000F60180819181081B190BC80FD91FE12CDE +:1015E000F12C0115110519F18091E80085FD16C057 +:1015F0008091E8008E778093E800C114D10449F00F +:10160000F60180819181E80EF91EF182E08285E089 +:101610000FC00E94390C882321F30AC0899180935E +:10162000F10001501109FFEFEF1AFF0ADACF80E055 +:10163000DF91CF911F910F91FF90EF90DF90CF90AE +:1016400008952091F2013091F3012617370748F0F1 +:101650006115710539F42091E8002E772093E80098 +:1016600001C0B90140E061157105A9F12091EB01BC +:10167000222309F443C0253009F442C02091E80038 +:1016800023FD40C02091E80022FD32C02091E800F7 +:1016900020FFE9CF4091F3002091F20030E0342B9D +:1016A000FC01CF016115710559F02830310540F476 +:1016B00081918093F100615071092F5F3F4FF1CF0D +:1016C00041E02830310509F040E02091E8002E7714 +:1016D0002093E800C8CF4111C9CF0AC08091EB0127 +:1016E000882361F0853061F08091E80083FD0AC0B5 +:1016F0008091E80082FFF2CF80E0089582E00895B3 +:1017000083E0089581E008952091F2013091F30182 +:101710002617370748F06115710539F42091E80064 +:101720002E772093E80001C0B901FC0120E061158B +:10173000710591F18091EB01882309F440C0853057 +:1017400009F43FC08091E80083FD3DC08091E8002E +:1017500082FD2FC08091E80080FFE9CF2091F30047 +:101760008091F20090E0922B6115710559F088305C +:10177000910540F424912093F10031966150710954 +:101780000196F2CF21E0089709F020E08091E8006F +:101790008E778093E800CBCF2111CCCF0AC0809107 +:1017A000EB01882361F0853061F08091E80083FDD2 +:1017B0000AC08091E80082FFF2CF80E0089582E0C5 +:1017C000089583E0089581E00895982F973058F5A3 +:1017D0009093E900981739F07091EC002091ED009A +:1017E0005091F00003C0242F762F50E021FF19C044 +:1017F0003091EB003E7F3093EB003091ED003D7F68 +:101800003093ED003091EB0031603093EB0070933A +:10181000EC002093ED005093F0002091EE0027FFA4 +:1018200007C09F5FD3CF8F708093E90081E0089558 +:1018300080E008958091EC0187FF11C08091E8005D +:1018400082FD05C08091EB018111F8CF11C080911C +:10185000E8008B770BC08091EB01882349F08091E1 +:10186000E80080FFF8CF8091E8008E778093E80051 +:1018700008952091E4003091E50095E64091EC0058 +:10188000842F817040FF22C08091E80080FD1CC041 +:101890008091EB01882391F0853091F08091EB00ED +:1018A00085FD10C04091E4005091E50042175307B8 +:1018B00029F39A01915011F784E0089582E0089588 +:1018C00083E0089581E0089580E008954091E80064 +:1018D00042FFDECF08950E94D90C0E94E10CE0EE99 +:1018E000F0E0808181608083E8EDF0E080818F7797 +:1018F000808319BCA7EDB0E08C918E7F8C938081A2 +:101900008F7E80831092EA0108950F931F93CF93E7 +:10191000DF930E94D90C0E94E10CC8EDD0E08881D1 +:101920008F77888388818068888388818F7D88838A +:1019300019BC1092EB011092E7011092E90110928C +:10194000E80100EE10E0F80180818B7F80838881C0 +:101950008160888342E060E080E00E94E50BE1EE78 +:10196000F0E080818E7F8083E2EEF0E08081816014 +:101970008083808188608083F80180818E7F80836E +:10198000888180618883DF91CF911F910F910895A5 +:10199000E8EDF0E080818F7E8083E7EDF0E08081EC +:1019A0008160808384E082BF81E08093EA010C94AF +:1019B000850CE8EDF0E080818E7F80831092E2005C +:1019C00008951092DA001092E10008951F920F928C +:1019D0000FB60F9211242F933F934F935F936F9302 +:1019E0007F938F939F93AF93BF93EF93FF938091D8 +:1019F000E10082FF0BC08091E20082FF07C080916E +:101A0000E1008B7F8093E1000E944D0F8091DA000E +:101A100080FF1FC08091D80080FF1BC08091DA003A +:101A20008E7F8093DA008091D90080FF0DC080E125 +:101A300089BD82E189BD09B400FEFDCF81E08093BC +:101A4000EB010E94510905C019BC1092EB010E94E4 +:101A50005F098091E10080FF19C08091E20080FF62 +:101A600015C08091E2008E7F8093E2008091E200B9 +:101A700080618093E2008091D80080628093D800DA +:101A800019BC85E08093EB010E9463098091E1001D +:101A900084FF30C08091E20084FF2CC080E189BDCA +:101AA00082E189BD09B400FEFDCF8091D8008F7D11 +:101AB0008093D8008091E1008F7E8093E100809137 +:101AC000E2008F7E8093E2008091E200816080934B +:101AD000E2008091E701882311F084E007C0809143 +:101AE000E30087FD02C081E001C083E08093EB0149 +:101AF0000E9464098091E10083FF29C08091E20087 +:101B000083FF25C08091E100877F8093E10082E020 +:101B10008093EB011092E7018091E1008E7F80932A +:101B2000E1008091E2008E7F8093E2008091E200EC +:101B300080618093E20042E060E080E00E94E50B7B +:101B40008091F00088608093F0000E946209FF910C +:101B5000EF91BF91AF919F918F917F916F915F9125 +:101B60004F913F912F910F900FBE0F901F9018959E +:101B70001F920F920FB60F9211242F933F934F9302 +:101B80005F936F937F938F939F93AF93BF93CF9305 +:101B9000DF93EF93FF93C091E900CF708091EC0049 +:101BA000D82FD17080FDD0E81092E9008091F0002C +:101BB000877F8093F00078940E94FC0D1092E900DA +:101BC0008091F00088608093F000CD2BCF70C0939F +:101BD000E900FF91EF91DF91CF91BF91AF919F917C +:101BE0008F917F916F915F914F913F912F910F90C6 +:101BF0000FBE0F901F9018951F93CF93DF93CDB713 +:101C0000DEB7AA970FB6F894DEBF0FBECDBFECEEDD +:101C1000F1E088E08E0F9091F10091938E13FBCF4D +:101C20000E947A098091E80083FF1FC18091EC0136 +:101C30009091ED01492F50E04A30510508F015C14F +:101C4000FA01EA5AFF4F0C94EF23803881F0823872 +:101C500009F00BC18091F0018F708093E9008091B1 +:101C6000EB0085FB882780F91092E90006C080917F +:101C7000E8019091E901911182609091E800977FCD +:101C80009093E8008093F1001092F100C8C0282FD3 +:101C90002D7F09F0EAC0882319F0823061F0E5C099 +:101CA0008091EE01813009F0E0C0933009F080E0CE +:101CB0008093E9012BC08091EE01811127C08091B2 +:101CC000F0018F7009F4D1C08093E9002091EB00FE +:101CD00020FF1CC0933021F48091EB00806214C07F +:101CE0009091EB0090619093EB0021E030E0A9012E +:101CF00002C0440F551F8A95E2F74093EA00109204 +:101D0000EA008091EB0088608093EB001092E9007C +:101D10008091E800877F86C08111A7C01091EE01F5 +:101D20001F778091E3008078812B8093E30080917E +:101D3000E800877F8093E8000E941A0C8091E800F9 +:101D400080FFFCCF8091E30080688093E300111155 +:101D500002C082E001C083E08093EB0186C080581E +:101D6000823008F082C08091EE019091EF018C3DAD +:101D700053E0950779F583E08A838AE289834FB738 +:101D8000F894DE01139620E03EE051E2E32FF0E00C +:101D900050935700E49120FF03C0E295EF703F5F3E +:101DA000EF708E2F90E0EA3010F0C79601C0C09619 +:101DB0008D939D932F5F243149F74FBF8091E800A9 +:101DC000877F8093E8006AE270E0CE0101960E946E +:101DD000210B14C0AE014F5F5F4F6091F0010E9474 +:101DE000680ABC01892B09F440C09091E800977FF4 +:101DF0009093E80089819A810E94840B8091E80089 +:101E00008B778093E80031C0803879F58091E800C5 +:101E1000877F8093E8008091E7018093F1008091B3 +:101E2000E8008E778093E8000E941A0C1EC0811192 +:101E30001CC09091EE019230C0F48091E800877F41 +:101E40008093E8009093E7010E941A0C8091E701CB +:101E5000811106C08091E30087FD02C081E001C0CE +:101E600084E08093EB010E9466098091E80083FF83 +:101E70000AC08091E800877F8093E8008091EB00A2 +:101E800080628093EB00AA960FB6F894DEBF0FBE77 +:10 |