summaryrefslogtreecommitdiffstats
path: root/keyboard/ergodox_ez/keymaps/townk_osx
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard/ergodox_ez/keymaps/townk_osx')
-rw-r--r--keyboard/ergodox_ez/keymaps/townk_osx/keymap.c287
-rw-r--r--keyboard/ergodox_ez/keymaps/townk_osx/townk_osx.hex1166
2 files changed, 1453 insertions, 0 deletions
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
+:101E9000CDBFDF91CF911F9108950895CF93809189
+:101EA000EB018823A1F0C091E900CF709091EC0084
+:101EB000892F817090FD80E8C82B1092E9008091F5
+:101EC000E80083FD0E94FC0DCF70C093E900CF9124
+:101ED000089590936C0180936B010895E0916B01DC
+:101EE000F0916C01309721F00190F081E02D099480
+:101EF00080E00895E0916B01F0916C01309721F042
+:101F00000280F381E02D09940895E0916B01F09136
+:101F10006C01309721F00480F581E02D099408953B
+:101F20002091690130916A018217930771F09093B3
+:101F30006A0180936901E0916B01F0916C01309727
+:101F400021F00680F781E02D099408952091670122
+:101F5000309168018217930771F090936801809324
+:101F60006701E0916B01F0916C01309721F00084E2
+:101F7000F185E02D0994089508950C94BC0F0E94FA
+:101F8000361C0E9488040C94FC1CCF92DF92EF92C6
+:101F9000FF920F931F93CF93DF93CDB7DEB72B97AD
+:101FA0000FB6F894DEBF0FBECDBF0E94A0048EE630
+:101FB000C82E81E0D82E00E010E0E02E802F0E9495
+:101FC0008E05F60141916F01F42EF826B1F40F5FF2
+:101FD0001F4F0E30110589F78FEF89838A831B828B
+:101FE0000E943F1C8160782F9D838C8349815A8198
+:101FF0006B818D810E94681040C09091D60191FF45
+:1020000004C08B870E9494058B8520E030E04F2D23
+:1020100050E0922FBA01022E02C0759567950A947E
+:10202000E2F760FF24C02E83EF8221E030E06901F7
+:1020300002C0CC0CDD1C9A95E2F790E08C219D212A
+:10204000892B09F420E028870E943F1C8160782FAB
+:102050009A8789874E815F8168858A850E9468108A
+:10206000F801E259FE4F8081C826C08206C02F5F6A
+:102070003F4F2630310569F6AACF0E94E31F109129
+:102080006D010E946E0F1817A1F00E946E0F8093D1
+:102090006D012B960FB6F894DEBF0FBECDBFDF915A
+:1020A000CF911F910F91FF90EF90DF90CF900C9404
+:1020B00070082B960FB6F894DEBF0FBECDBFDF9130
+:1020C000CF911F910F91FF90EF90DF90CF900895E7
+:1020D000CF93DF93CDB7DEB72B970FB6F894DEBF63
+:1020E0000FBECDBF4F83588769877A878B87DE0104
+:1020F000119686E0FD0111928A95E9F785E0FE01CF
+:10210000379601900D928A95E1F749815A816B814A
+:102110007C818D819E810E9422172B960FB6F894A8
+:10212000DEBF0FBECDBFDF91CF9108950895CF934D
+:10213000882309F4C2C0C82F823859F40E94