summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md7
-rw-r--r--common.mk4
-rw-r--r--common/matrix.h4
-rw-r--r--keyboard/atomic/extended_keymaps/extended_keymap_default.c2
-rwxr-xr-xkeyboard/atomic/flash-pcb.sh2
-rw-r--r--keyboard/ergodox_ez/Makefile114
-rw-r--r--keyboard/ergodox_ez/README.md1
-rw-r--r--keyboard/ergodox_ez/config.h87
-rw-r--r--keyboard/ergodox_ez/ergodox_ez.c123
-rw-r--r--keyboard/ergodox_ez/ergodox_ez.h145
-rw-r--r--keyboard/ergodox_ez/i2cmaster.h178
-rw-r--r--keyboard/ergodox_ez/keymaps/keymap_default.c133
-rw-r--r--keyboard/ergodox_ez/keymaps/keymap_ergodox_ez.c211
-rw-r--r--keyboard/ergodox_ez/matrix.c348
-rw-r--r--keyboard/ergodox_ez/twimaster.c208
-rw-r--r--keyboard/planck/Makefile21
-rw-r--r--keyboard/planck/Makefile.pjrc116
-rw-r--r--keyboard/planck/config.h5
-rw-r--r--keyboard/planck/config_definitions.h50
-rw-r--r--keyboard/planck/keymaps/keymap_default.c88
-rw-r--r--keyboard/planck/keymaps/keymap_joe.c32
-rw-r--r--keyboard/planck/keymaps/keymap_lock.c41
-rw-r--r--keyboard/planck/keymaps/keymap_monkey.c76
-rw-r--r--keyboard/planck/planck.c31
-rw-r--r--keyboard/planck/planck.h38
-rw-r--r--keyboard/planck/planck_pcb.hex3113
-rwxr-xr-xkeyboard/planck/planck_with_bootloader.hex1796
-rw-r--r--keyboard/preonic/Makefile3
-rw-r--r--keyboard/preonic/beeps.c386
-rw-r--r--keyboard/preonic/beeps.h5
-rw-r--r--keyboard/preonic/extended_keymaps/extended_keymap_lock.c2
-rw-r--r--keyboard/preonic/keymap_midi.c82
-rw-r--r--keyboard/preonic/keymap_midi.h6
-rw-r--r--protocol/bluefruit.mk2
-rw-r--r--protocol/bluefruit/bluefruit.c15
-rw-r--r--protocol/bluefruit/bluefruit.h5
-rw-r--r--protocol/bluefruit/main.c100
-rw-r--r--protocol/lufa.mk5
-rw-r--r--protocol/lufa/bluetooth.c37
-rw-r--r--protocol/lufa/bluetooth.h63
-rw-r--r--protocol/lufa/descriptor.c2
-rw-r--r--protocol/lufa/lufa.c59
-rw-r--r--protocol/lufa/lufa.h2
-rw-r--r--quantum.mk30
-rw-r--r--quantum/analog.c (renamed from keyboard/planck/analog.c)0
-rw-r--r--quantum/analog.h (renamed from keyboard/planck/analog.h)0
-rw-r--r--quantum/beeps.c (renamed from keyboard/planck/beeps.c)62
-rw-r--r--quantum/beeps.h (renamed from keyboard/planck/beeps.h)0
-rw-r--r--quantum/config_common.h116
-rw-r--r--quantum/keymap_common.c (renamed from keyboard/planck/keymap_common.c)49
-rw-r--r--quantum/keymap_common.h (renamed from keyboard/planck/keymap_common.h)141
-rw-r--r--quantum/keymap_extras/keymap_colemak.h74
-rw-r--r--quantum/keymap_extras/keymap_dvorak.h72
-rw-r--r--quantum/keymap_extras/keymap_french.h83
-rw-r--r--quantum/keymap_extras/keymap_nordic.h59
-rw-r--r--quantum/keymap_extras/keymap_spanish.h62
-rw-r--r--quantum/keymap_extras/keymap_uk.h36
-rw-r--r--quantum/keymap_midi.c (renamed from keyboard/planck/keymap_midi.c)10
-rw-r--r--quantum/keymap_midi.h (renamed from keyboard/planck/keymap_midi.h)0
-rw-r--r--quantum/keymap_unicode.c59
-rw-r--r--quantum/led.c (renamed from keyboard/planck/led.c)0
-rw-r--r--quantum/matrix.c (renamed from keyboard/planck/matrix.c)89
62 files changed, 6490 insertions, 2200 deletions
diff --git a/README.md b/README.md
index 79f170ea66..403faaa40a 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,6 @@
-TMK Keyboard Firmware Collection
+Quantum Mechanical Keyboard Firmware
================================
-This is a keyboard firmware with some useful features for Atmel AVR controller.
-
-Source code is available here: <http://github.com/tmk/tmk_keyboard>
-
+This is a keyboard firmware with some useful features for Atmel AVR controller, based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard)
Features
--------
diff --git a/common.mk b/common.mk
index e61ae69e5e..3237e539a6 100644
--- a/common.mk
+++ b/common.mk
@@ -68,6 +68,10 @@ ifdef BACKLIGHT_ENABLE
OPT_DEFS += -DBACKLIGHT_ENABLE
endif
+ifdef BLUETOOTH_ENABLE
+ OPT_DEFS += -DBLUETOOTH_ENABLE
+endif
+
ifdef KEYMAP_SECTION_ENABLE
OPT_DEFS += -DKEYMAP_SECTION_ENABLE
EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
diff --git a/common/matrix.h b/common/matrix.h
index 107ee72653..7c133f142a 100644
--- a/common/matrix.h
+++ b/common/matrix.h
@@ -61,6 +61,10 @@ void matrix_print(void);
void matrix_power_up(void);
void matrix_power_down(void);
+void *matrix_init_kb(void);
+void *matrix_scan_kb(void);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/keyboard/atomic/extended_keymaps/extended_keymap_default.c b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
index e662c91889..ab08bb6d25 100644
--- a/keyboard/atomic/extended_keymaps/extended_keymap_default.c
+++ b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ┌─ 2u ────────────┐
// │ X │
// └─────────────────┘
- { KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, KC_LCTL, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
+ { BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, KC_RGUI, KC_RALT, KC_RCTL, BL_STEP, KC_LEFT, KC_DOWN, KC_RGHT },
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
diff --git a/keyboard/atomic/flash-pcb.sh b/keyboard/atomic/flash-pcb.sh
index 2ae15458c0..46abc6982a 100755
--- a/keyboard/atomic/flash-pcb.sh
+++ b/keyboard/atomic/flash-pcb.sh
@@ -1,3 +1,3 @@
dfu-programmer atmega32u4 erase --force
-dfu-programmer atmega32u4 flash planck_pcb.hex
+dfu-programmer atmega32u4 flash atomic_pcb.hex
dfu-programmer atmega32u4 reset \ No newline at end of file
diff --git a/keyboard/ergodox_ez/Makefile b/keyboard/ergodox_ez/Makefile
new file mode 100644
index 0000000000..e0d303c9df
--- /dev/null
+++ b/keyboard/ergodox_ez/Makefile
@@ -0,0 +1,114 @@
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make = Make software.
+#
+# make clean = Clean out built project files.
+#
+# That's pretty much all you need. To compile, always go make clean,
+# followed by make.
+#
+# For advanced users only:
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = ergodox_ez
+
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# # project specific files
+SRC = ergodox_ez.c \
+ twimaster.c
+
+ifdef KEYMAP
+ SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
+else
+ SRC := keymaps/keymap_default.c $(SRC)
+endif
+
+CONFIG_H = config.h
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+# Teensy halfKay 512
+# Teensy++ halfKay 1024
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+# USBaspLoader 2048
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
+# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+# MIDI_ENABLE = YES # MIDI controls
+# UNICODE_ENABLE = YES # Unicode
+# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+
+
+# Optimize size but this may cause error "relocation truncated to fit"
+#EXTRALDFLAGS = -Wl,--relax
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/quantum.mk
+
diff --git a/keyboard/ergodox_ez/README.md b/keyboard/ergodox_ez/README.md
new file mode 100644
index 0000000000..f750d8dbec
--- /dev/null
+++ b/keyboard/ergodox_ez/README.md
@@ -0,0 +1 @@
+// TODO: Make up a proper readme for the ErgoDox EZ.
diff --git a/keyboard/ergodox_ez/config.h b/keyboard/ergodox_ez/config.h
new file mode 100644
index 0000000000..850d245791
--- /dev/null
+++ b/keyboard/ergodox_ez/config.h
@@ -0,0 +1,87 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x1307
+#define DEVICE_VER 0x0001
+#define MANUFACTURER ErgoDox EZ
+#define PRODUCT ErgoDox EZ
+#define DESCRIPTION t.m.k. keyboard firmware for Ergodox
+
+/* key matrix size */
+#define MATRIX_ROWS 14
+#define MATRIX_COLS 6
+
+#define MOUSEKEY_DELAY 100
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_MAX_SPEED 3
+#define MOUSEKEY_TIME_TO_MAX 10
+
+#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
+#define ROWS (int []){ D0, D5, B5, B6 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 2
+#define TAPPING_TERM 100
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
+ keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
+)
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+// #define NO_DEBUG
+
+/* disable print */
+// #define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+//#define DEBUG_MATRIX_SCAN_RATE
+
+#endif
diff --git a/keyboard/ergodox_ez/ergodox_ez.c b/keyboard/ergodox_ez/ergodox_ez.c
new file mode 100644
index 0000000000..f7e156b319
--- /dev/null
+++ b/keyboard/ergodox_ez/ergodox_ez.c
@@ -0,0 +1,123 @@
+#include "ergodox_ez.h"
+#include "i2cmaster.h"
+
+bool i2c_initialized = 0;
+uint8_t mcp23018_status = 0x20;
+
+bool ergodox_left_led_1 = 0; // left top
+bool ergodox_left_led_2 = 0; // left middle
+bool ergodox_left_led_3 = 0; // left bottom
+
+__attribute__ ((weak))
+void * matrix_init_user(void) {
+
+};
+
+__attribute__ ((weak))
+void * matrix_scan_user(void) {
+
+};
+
+void * matrix_init_kb(void) {
+ // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
+ TCCR1A = 0b10101001; // set and configure fast PWM
+ TCCR1B = 0b00001001; // set and configure fast PWM
+
+ // (tied to Vcc for hardware convenience)
+ DDRB &= ~(1<<4); // set B(4) as input
+ PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
+
+ // unused pins - C7, D4, D5, D7, E6
+ // set as input with internal pull-ip enabled
+ DDRC &= ~(1<<7);
+ DDRD &= ~(1<<7 | 1<<5 | 1<<4);
+ DDRE &= ~(1<<6);
+ PORTC |= (1<<7);
+ PORTD |= (1<<7 | 1<<5 | 1<<4);
+ PORTE |= (1<<6);
+
+ ergodox_blink_all_leds();
+
+ if (matrix_init_user) {
+ (*matrix_init_user)();
+ }
+};
+
+void * matrix_scan_kb(void) {
+
+ if (matrix_scan_user) {
+ (*matrix_scan_user)();
+ }
+};
+
+
+void ergodox_blink_all_leds(void)
+{
+ ergodox_led_all_off();
+ ergodox_led_all_set(LED_BRIGHTNESS_HI);
+ ergodox_led_all_on();
+ _delay_ms(333);
+ ergodox_led_all_off();
+}
+
+uint8_t init_mcp23018(void) {
+ mcp23018_status = 0x20;
+
+ // I2C subsystem
+ if (i2c_initialized == 0) {
+ i2c_init(); // on pins D(1,0)
+ i2c_initialized++;
+ _delay_ms(1000);
+ }
+
+ // set pin direction
+ // - unused : input : 1
+ // - input : input : 1
+ // - driving : output : 0
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
+ i2c_stop();
+
+ // set pull-up
+ // - unused : on : 1
+ // - input : on : 1
+ // - driving : off : 0
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
+
+out:
+ i2c_stop();
+
+ if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
+
+ return mcp23018_status;
+}
+
+uint8_t ergodox_left_leds_update(void) {
+ if (mcp23018_status) { // if there was an error
+ return mcp23018_status;
+ }
+
+ // set logical value (doesn't matter on inputs)
+ // - unused : hi-Z : 1
+ // - input : hi-Z : 1
+ // - driving : hi-Z : 1
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(OLATA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b11111111
+ & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+ ); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b11111111
+ & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
+ & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
+ ); if (mcp23018_status) goto out;
+
+out:
+ i2c_stop();
+ return mcp23018_status;
+}
+
diff --git a/keyboard/ergodox_ez/ergodox_ez.h b/keyboard/ergodox_ez/ergodox_ez.h
new file mode 100644
index 0000000000..9d0691dfe2
--- /dev/null
+++ b/keyboard/ergodox_ez/ergodox_ez.h
@@ -0,0 +1,145 @@
+#ifndef PLANCK_H
+#define PLANCK_H
+
+#include "matrix.h"
+#include "keymap_common.h"
+#include "backlight.h"
+#include <stddef.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include "i2cmaster.h"
+#include <util/delay.h>
+
+#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
+#define CPU_16MHz 0x00
+
+// I2C aliases and register addresses (see "mcp23018.md")
+#define I2C_ADDR 0b0100000
+#define I2C_ADDR_WRITE ( (I2C_ADDR<<1) | I2C_WRITE )
+#define I2C_ADDR_READ ( (I2C_ADDR<<1) | I2C_READ )
+#define IODIRA 0x00 // i/o direction register
+#define IODIRB 0x01
+#define GPPUA 0x0C // GPIO pull-up resistor register
+#define GPPUB 0x0D
+#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
+#define GPIOB 0x13
+#define OLATA 0x14 // output latch register
+#define OLATB 0x15
+
+extern uint8_t mcp23018_status;
+
+void init_ergodox(void);
+void ergodox_blink_all_leds(void);
+uint8_t init_mcp23018(void);
+uint8_t ergodox_left_leds_update(void);
+
+#define LED_BRIGHTNESS_LO 31
+#define LED_BRIGHTNESS_HI 255
+
+#define LEFT_LED_1_SHIFT 7 // in MCP23018 port B
+#define LEFT_LED_2_SHIFT 6 // in MCP23018 port B
+#define LEFT_LED_3_SHIFT 7 // in MCP23018 port A
+
+extern bool ergodox_left_led_1; // left top
+extern bool ergodox_left_led_2; // left middle
+extern bool ergodox_left_led_3; // left bottom
+
+inline void ergodox_board_led_on(void) { DDRD |= (1<<6); PORTD |= (1<<6); }
+inline void ergodox_right_led_1_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); }
+inline void ergodox_right_led_2_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); }
+inline void ergodox_right_led_3_on(void) { DDRB |= (1<<7); PORTB |= (1<<7); }
+inline void ergodox_left_led_1_on(void) { ergodox_left_led_1 = 1; }
+inline void ergodox_left_led_2_on(void) { ergodox_left_led_2 = 1; }
+inline void ergodox_left_led_3_on(void) { ergodox_left_led_3 = 1; }
+
+inline void ergodox_board_led_off(void) { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
+inline void ergodox_right_led_1_off(void) { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
+inline void ergodox_right_led_2_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
+inline void ergodox_right_led_3_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
+inline void ergodox_left_led_1_off(void) { ergodox_left_led_1 = 0; }
+inline void ergodox_left_led_2_off(void) { ergodox_left_led_2 = 0; }
+inline void ergodox_left_led_3_off(void) { ergodox_left_led_3 = 0; }
+
+inline void ergodox_led_all_on(void)
+{
+ ergodox_board_led_on();
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ ergodox_left_led_1_on();
+ ergodox_left_led_2_on();
+ ergodox_left_led_3_on();
+ ergodox_left_leds_update();
+}
+
+inline void ergodox_led_all_off(void)
+{
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ ergodox_left_led_1_off();
+ ergodox_left_led_2_off();
+ ergodox_left_led_3_off();
+ ergodox_left_leds_update();
+}
+
+inline void ergodox_right_led_1_set(uint8_t n) { OCR1A = n; }
+inline void ergodox_right_led_2_set(uint8_t n) { OCR1B = n; }
+inline void ergodox_right_led_3_set(uint8_t n) { OCR1C = n; }
+
+inline void ergodox_led_all_set(uint8_t n)
+{
+ ergodox_right_led_1_set(n);
+ ergodox_right_led_2_set(n);
+ ergodox_right_led_3_set(n);
+}
+
+#define KEYMAP( \
+ \
+ /* left hand, spatial positions */ \
+ k00,k01,k02,k03,k04,k05,k06, \
+ k10,k11,k12,k13,k14,k15,k16, \
+ k20,k21,k22,k23,k24,k25, \
+ k30,k31,k32,k33,k34,k35,k36, \
+ k40,k41,k42,k43,k44, \
+ k55,k56, \
+ k54, \
+ k53,k52,k51, \
+ \
+ /* right hand, spatial positions */ \
+ k07,k08,k09,k0A,k0B,k0C,k0D, \
+ k17,k18,k19,k1A,k1B,k1C,k1D, \
+ k28,k29,k2A,k2B,k2C,k2D, \
+ k37,k38,k39,k3A,k3B,k3C,k3D, \
+ k49,k4A,k4B,k4C,k4D, \
+ k57,k58, \
+ k59, \
+ k5C,k5B,k5A ) \
+ \
+ /* matrix positions */ \
+ { \
+ { k00, k10, k20, k30, k40, KC_NO }, \
+ { k01, k11, k21, k31, k41, k51 }, \
+ { k02, k12, k22, k32, k42, k52 }, \
+ { k03, k13, k23, k33, k43, k53 }, \
+ { k04, k14, k24, k34, k44, k54 }, \
+ { k05, k15, k25, k35, KC_NO, k55 }, \
+ { k06, k16, KC_NO, k36, KC_NO, k56 }, \
+ \
+ { k07, k17, KC_NO, k37,KC_NO, k57 }, \
+ { k08, k18, k28, k38,KC_NO, k58 }, \
+ { k09, k19, k29, k39, k49, k59 }, \
+ { k0A, k1A, k2A, k3A, k4A, k5A }, \
+ { k0B, k1B, k2B, k3B, k4B, k5B }, \
+ { k0C, k1C, k2C, k3C, k4C, k5C }, \
+ { k0D, k1D, k2D, k3D, k4D, KC_NO } \
+ }
+
+void * matrix_init_user(void);
+void * matrix_scan_user(void);
+
+
+
+#endif \ No newline at end of file
diff --git a/keyboard/ergodox_ez/i2cmaster.h b/keyboard/ergodox_ez/i2cmaster.h
new file mode 100644
index 0000000000..3917b9e6c0
--- /dev/null
+++ b/keyboard/ergodox_ez/i2cmaster.h
@@ -0,0 +1,178 @@
+#ifndef _I2CMASTER_H
+#define _I2CMASTER_H 1
+/*************************************************************************
+* Title: C include file for the I2C master interface
+* (i2cmaster.S or twimaster.c)
+* Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
+* File: $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $
+* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
+* Target: any AVR device
+* Usage: see Doxygen manual
+**************************************************************************/
+
+#ifdef DOXYGEN
+/**
+ @defgroup pfleury_ic2master I2C Master library
+ @code #include <i2cmaster.h> @endcode
+
+ @brief I2C (TWI) Master Software Library
+
+ Basic routines for communicating with I2C slave devices. This single master
+ implementation is limited to one bus master on the I2C bus.
+
+ This I2c library is implemented as a compact assembler software implementation of the I2C protocol
+ which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
+ Since the API for these two implementations is exactly the same, an application can be linked either against the
+ software I2C implementation or the hardware I2C implementation.
+
+ Use 4.7k pull-up resistor on the SDA and SCL pin.
+
+ Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module
+ i2cmaster.S to your target when using the software I2C implementation !
+
+ Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
+
+ @note
+ The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted
+ to GNU assembler and AVR-GCC C call interface.
+ Replaced the incorrect quarter period delays found in AVR300 with
+ half period delays.
+
+ @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury
+
+ @par API Usage Example
+ The following code shows typical usage of this library, see example test_i2cmaster.c
+
+ @code
+
+ #include <i2cmaster.h>
+
+
+ #define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet
+
+ int main(void)
+ {
+ unsigned char ret;
+
+ i2c_init(); // initialize I2C library
+
+ // write 0x75 to EEPROM address 5 (Byte Write)
+ i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
+ i2c_write(0x05); // write address = 5
+ i2c_write(0x75); // write value 0x75 to EEPROM
+ i2c_stop(); // set stop conditon = release bus
+
+
+ // read previously written value back from EEPROM address 5
+ i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
+
+ i2c_write(0x05); // write address = 5
+ i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
+
+ ret = i2c_readNak(); // read one byte from EEPROM
+ i2c_stop();
+
+ for(;;);
+ }
+ @endcode
+
+*/
+#endif /* DOXYGEN */
+
+/**@{*/
+
+#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
+#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
+#endif
+
+#include <avr/io.h>
+
+/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_READ 1
+
+/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_WRITE 0
+
+
+/**
+ @brief initialize the I2C master interace. Need to be called only once
+ @param void
+ @return none
+ */
+extern void i2c_init(void);
+
+
+/**
+ @brief Terminates the data transfer and releases the I2C bus
+ @param void
+ @return none
+ */
+extern void i2c_stop(void);
+
+
+/**
+ @brief Issues a start condition and sends address and transfer direction
+
+ @param addr address and transfer direction of I2C device
+ @retval 0 device accessible
+ @retval 1 failed to access device
+ */
+extern unsigned char i2c_start(unsigned char addr);
+
+
+/**
+ @brief Issues a repeated start condition and sends address and transfer direction
+
+ @param addr address and transfer direction of I2C device
+ @retval 0 device accessible
+ @retval 1 failed to access device
+ */
+extern unsigned char i2c_rep_start(unsigned char addr);
+
+
+/**
+ @brief Issues a start condition and sends address and transfer direction
+
+ If device is busy, use ack polling to wait until device ready
+ @param addr address and transfer direction of I2C device
+ @return none
+ */
+extern void i2c_start_wait(unsigned char addr);
+
+
+/**
+ @brief Send one byte to I2C device
+ @param data byte to be transfered
+ @retval 0 write successful
+ @retval 1 write failed
+ */
+extern unsigned char i2c_write(unsigned char data);
+
+
+/**
+ @brief read one byte from the I2C device, request more data from device
+ @return byte read from I2C device
+ */
+extern unsigned char i2c_readAck(void);
+
+/**
+ @brief read one byte from the I2C device, read is followed by a stop condition
+ @return byte read from I2C device
+ */
+extern unsigned char i2c_readNak(void);
+
+/**
+ @brief read one byte from the I2C device
+
+ Implemented as a macro, which calls either i2c_readAck or i2c_readNak
+
+ @param ack 1 send ack, request more data from device<br>
+ 0 send nak, read is followed by a stop condition
+ @return byte read from I2C device
+ */
+extern unsigned char i2c_read(unsigned char ack);
+#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
+
+
+/**@}*/
+#endif
diff --git a/keyboard/ergodox_ez/keymaps/keymap_default.c b/keyboard/ergodox_ez/keymaps/keymap_default.c
new file mode 100644
index 0000000000..98cc9c5a6f
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/keymap_default.c
@@ -0,0 +1,133 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+
+// TODO: Define layer names that make sense for the ErgoDox EZ.
+#define DEFAULT_LAYER 0
+#define COLEMAK_LAYER 1
+#define DVORAK_LAYER 2
+#define LOWER_LAYER 1
+#define RAISE_LAYER 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[DEFAULT_LAYER] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
+ KC_BSLS,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_FN2,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_FN1,
+ KC_LGUI,KC_GRV, KC_BSLS,KC_LEFT,KC_RGHT,
+ KC_LCTL,KC_LALT,
+ KC_HOME,
+ KC_BSPC,KC_DEL, KC_END,
+ // right hand
+ KC_FN3, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_LBRC,KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
+ KC_FN1, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,
+ KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_RGUI,
+ KC_RALT,KC_RCTL,
+ KC_PGUP,
+ KC_PGDN,KC_ENT, KC_SPC
+ ),
+[LOWER_LAYER] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_EQL, KC_1, KC_2, KC_3, LALT(KC_TAB), KC_5, KC_ESC,
+ KC_BSLS,KC_Q, S(KC_W), KC_E, KC_R, KC_T, KC_FN2,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_FN1,
+ KC_LGUI,KC_GRV, KC_BSLS,KC_LEFT,KC_RGHT,
+ KC_LCTL,KC_LALT,
+ KC_HOME,
+ KC_BSPC,KC_DEL, KC_END,
+ // right hand
+ KC_FN3, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_LBRC,KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
+ KC_FN1, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,
+ KC_LEFT,KC_DOWN,KC_UP, KC_RGHT,KC_RGUI,
+ KC_RALT,KC_RCTL,
+ KC_PGUP,
+ KC_PGDN,KC_ENT, KC_SPC
+ )
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+ [1] = ACTION_LAYER_MOMENTARY(LOWER_LAYER), // to RAISE
+ [2] = ACTION_LAYER_MOMENTARY(LOWER_LAYER), // to LOWER
+
+ [3] = ACTION_DEFAULT_LAYER_SET(DEFAULT_LAYER),
+ [4] = ACTION_DEFAULT_LAYER_SET(COLEMAK_LAYER),
+ [5] = ACTION_DEFAULT_LAYER_SET(DVORAK_LAYER),
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void * matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void * matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_left_led_1_off();
+ ergodox_left_led_2_off();
+ ergodox_left_led_3_off();
+ switch (layer) {
+ // TODO: Make this relevant to the ErgoDox EZ.
+ case 1:
+ // all
+ ergodox_left_led_1_on();
+ ergodox_left_led_2_on();
+ ergodox_left_led_3_on();
+ break;
+ case 2:
+ // blue
+ ergodox_left_led_2_on();
+ break;
+ case 8:
+ // blue and green
+ ergodox_left_led_2_on();
+ // break missed intentionally
+ case 3:
+ // green
+ ergodox_left_led_3_on();
+ break;
+ case 6:
+ ergodox_board_led_on();
+ // break missed intentionally
+ case 4:
+ case 5:
+ case 7:
+ // white
+ ergodox_left_led_1_on();
+ break;
+ case 9:
+ // white+green
+ ergodox_left_led_1_on();
+ ergodox_left_led_3_on();
+ break;
+ default:
+ // none
+ break;
+ }
+
+ mcp23018_status = ergodox_left_leds_update();
+};
diff --git a/keyboard/ergodox_ez/keymaps/keymap_ergodox_ez.c b/keyboard/ergodox_ez/keymaps/keymap_ergodox_ez.c
new file mode 100644
index 0000000000..bab16ece53
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/keymap_ergodox_ez.c
@@ -0,0 +1,211 @@
+// TODO: Move all of this stuff into the default keymap, and then get rid of this file.
+#include "action_util.h"
+#include "action_layer.h"
+#define KC_SW0 KC_FN0
+#define DEBUG_ACTION
+
+static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Del | Q | W | E | R | T | Up | | Up | Y | U | I | O | P | \ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ' |
+ * |--------+------+------+------+------+------| L1 | | L1 |------+------+------+------+------+--------|
+ * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |Grv/L1| ~L1 | TAB | Left | Right| | Up | Down | [ | ] | ~L1 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | Rclk | LGui | | Alt |Ctrl/Esc|
+ * ,------|------|------| |------+--------+------.
+ * | | | Home | | PgUp | | |
+ * | Space| Enter|------| |------| Tab |Enter |
+ * | | | End | | PgDn | | |
+ * `--------------------' `----------------------'
+ */
+
+
+ // Basic layer
+
+ KEYMAP(
+ EQL, 1, 2, 3, 4, 5, LEFT,
+ DEL, Q, W, E, R, T, UP,
+ BSPC, A, S, D, F, G,
+ LSFT, FN29, X, C, V, B, FN1,
+ FN30, FN4, TAB, LEFT, RIGHT,
+
+ BTN2,LGUI,
+ HOME,
+ SPC, ENT, END,
+ //RIGHT
+ RIGHT,6, 7, 8, 9, 0, MINS,
+ UP, Y, U, I, O, P, BSLS,
+ H, J, K, L, FN31, QUOT,
+ FN1, N, M, COMM, DOT, FN28, RSFT,
+ UP, DOWN, LBRC, RBRC, FN4,
+ LALT, FN27,
+ PGUP,
+ PGDN, TAB, ENT
+ ),
+
+ /* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | Flash | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | : | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | . | 0 | = | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ // SYMBOLS
+ KEYMAP(
+ FN0, F1, F2, F3, F4, F5, TRNS,
+ TRNS, FN7, FN8, FN23, FN24, FN18, TRNS,
+ FN22, FN9, FN10, FN15, FN16, GRV,
+ TRNS, FN11, FN12, LBRC, RBRC, FN17, TRNS,
+ TRNS, TRNS, TRNS, TRNS, TRNS,
+
+ TRNS, TRNS,
+ TRNS,
+ TRNS, TRNS, TRNS,
+ // right hand
+ TRNS, F6, F7, F8, F9, F10, F11,
+ TRNS, UP, 7, 8, 9, FN14, F12,
+ DOWN, 4, 5, 6, FN26, TRNS,
+ TRNS, FN13, 1, 2, 3, BSLS, TRNS,
+ TRNS,DOT, 0, EQL, TRNS,
+ TRNS, TRNS,
+ TRNS,
+ TRNS, TRNS, TRNS
+ ),
+ /* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | MsUp | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | |MsLeft|MsDown|MsRght| | |------| |------| | | | Play | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | Prev | Next | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | Lclk | Rclk | |VolUp |VolDn | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+ // MEDIA AND MOUSE
+ KEYMAP(
+ TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+ TRNS, TRNS, MS_U, TRNS, TRNS, TRNS, TRNS,
+ TRNS, MS_L, MS_D, MS_R, TRNS, TRNS,
+ TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+ TRNS, TRNS, TRNS, BTN3, BTN2,
+
+ TRNS, TRNS,
+ TRNS,
+ TRNS, TRNS, TRNS,
+ // right hand
+ TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+ TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
+ TRNS, TRNS, TRNS, MPLY, TRNS, TRNS,
+ TRNS, TRNS, TRNS, MPRV, MNXT, TRNS, TRNS,
+ VOLU, VOLD, TRNS, TRNS, TRNS,
+ TRNS, TRNS,
+ TRNS,
+ TRNS, TRNS, WBAK
+ ),
+};
+
+/* id for user defined functions */
+enum function_id {
+ TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+static const uint16_t PROGMEM fn_actions[] = {
+ [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
+ [1] = ACTION_LAYER_INVERT(1, ON_RELEASE), // FN1 - Toggle 1
+ [2] = ACTION_LAYER_TOGGLE(2), // FN2 - Toggle 2
+ [3] = ACTION_LAYER_TOGGLE(3), // FN3 - Toggle 3
+ [4] = ACTION_LAYER_TAP_TOGGLE(1), // FN4 - Momentary Layer 1
+ [5] = ACTION_LAYER_MOMENTARY(2), // FN5 - Momentary L2
+
+ // SYMBOLS
+ ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), // FN6 - "
+ ACTION_MODS_KEY(MOD_LSFT, KC_1), // FN7 - !
+ ACTION_MODS_KEY(MOD_LSFT, KC_2), // FN8 - @
+ ACTION_MODS_KEY(MOD_LSFT, KC_3), // FN9 - #
+ ACTION_MODS_KEY(MOD_LSFT, KC_4), // FN10 - $
+ ACTION_MODS_KEY(MOD_LSFT, KC_5), // FN11 - %
+ ACTION_MODS_KEY(MOD_LSFT, KC_6), // FN12 - ^
+ ACTION_MODS_KEY(MOD_LSFT, KC_7), // FN13 - &
+ ACTION_MODS_KEY(MOD_LSFT, KC_8), // FN14 - *
+ ACTION_MODS_KEY(MOD_LSFT, KC_9), // FN15 - (
+ ACTION_MODS_KEY(MOD_LSFT, KC_0), // FN16 - )
+ ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // FN17 - ~
+ ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN18 - |
+ ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN19 - _
+ ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN20 - <
+ ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN21 - >
+ ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), // FN22 - :
+ ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // FN23 - {
+ ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // FN24 - }
+ ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN25 - ?
+ ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // FN26 - +
+
+ ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), // FN27 - Control/esc on tap
+ ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SLSH), // FN28 - slash becomes Ctrl when held (right pinky)
+ ACTION_MODS_TAP_KEY(MOD_LCTL, KC_Z), // FN29 - z becomes Ctrl when held (left pinky)
+
+ // Fancy tapping/toggling
+ ACTION_LAYER_TAP_KEY(1, KC_GRV), // FN30 - Layer 1 when holding backtick key
+ ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN31 - Layer 2 when holding semicolon key
+
+
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+ print("action_function called\n");
+ print("id = "); phex(id); print("\n");
+ print("opt = "); phex(opt); print("\n");
+ if (id == TEENSY_KEY) {
+ clear_keyboard();
+ print("\n\nJump to bootloader... ");
+ _delay_ms(250);
+ bootloader_jump(); // should not return
+ print("not supported.\n");
+ }
+}
+
+void * matrix_init_user(void) {
+
+};
+
+void * matrix_scan_user(void) {
+
+};
diff --git a/keyboard/ergodox_ez/matrix.c b/keyboard/ergodox_ez/matrix.c
new file mode 100644
index 0000000000..09380d3083
--- /dev/null
+++ b/keyboard/ergodox_ez/matrix.c
@@ -0,0 +1,348 @@
+/*
+
+Note for ErgoDox EZ customizers: Here be dragons!
+This is not a file you want to be messing with.
+All of the interesting stuff for you is under keymaps/ :)
+Love, Erez
+
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+#include "action_layer.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "ergodox_ez.h"
+#include "i2cmaster.h"
+#ifdef DEBUG_MATRIX_SCAN_RATE
+#include "timer.h"
+#endif
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+static uint8_t debouncing = DEBOUNCE;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static matrix_row_t read_cols(uint8_t row);
+static void init_cols(void);
+static void unselect_rows();
+static void select_row(uint8_t row);
+
+static uint8_t mcp23018_reset_loop;
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+uint32_t matrix_timer;
+uint32_t matrix_scan_count;
+#endif
+
+
+__attribute__ ((weak))
+void * matrix_init_kb(void) {
+};
+
+__attribute__ ((weak))
+void * matrix_scan_kb(void) {
+};
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+ // initialize row and col
+
+ mcp23018_status = init_mcp23018();
+
+
+ unselect_rows();
+ init_cols();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+ matrix_timer = timer_read32();
+ matrix_scan_count = 0;
+#endif
+
+ if (matrix_init_kb) {
+ (*matrix_init_kb)();
+ }
+
+}
+
+uint8_t matrix_scan(void)
+{
+ if (mcp23018_status) { // if there was an error
+ if (++mcp23018_reset_loop == 0) {
+ // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
+ // this will be approx bit more frequent than once per second
+ print("trying to reset mcp23018\n");
+ mcp23018_status = init_mcp23018();
+ if (mcp23018_status) {
+ print("left side not responding\n");
+ } else {
+ print("left side attached\n");
+ ergodox_blink_all_leds();
+ }
+ }
+ }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+ matrix_scan_count++;
+
+ uint32_t timer_now = timer_read32();
+ if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) {
+ print("matrix scan frequency: ");
+ pdec(matrix_scan_count);
+ print("\n");
+
+ matrix_timer = timer_now;
+ matrix_scan_count = 0;
+ }
+#endif
+
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ select_row(i);
+ matrix_row_t cols = read_cols(i);
+ if (matrix_debouncing[i] != cols) {
+ matrix_debouncing[i] = cols;
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); debug("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ unselect_rows();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ _delay_ms(1);
+ } else {
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ matrix[i] = matrix_debouncing[i];
+ }
+ }
+ }
+
+
+ if (matrix_scan_kb) {
+ (*matrix_scan_kb)();
+ }
+
+ return 1;
+}
+
+bool matrix_is_modified(void)
+{
+ if (debouncing) return false;
+ return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+ return matrix[row];
+}
+
+void matrix_print(void)
+{
+ print("\nr/c 0123456789ABCDEF\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ phex(row); print(": ");
+ pbin_reverse16(matrix_get_row(row));
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += bitpop16(matrix[i]);
+ }
+ return count;
+}
+
+/* Column pin configuration
+ *
+ * Teensy
+ * col: 0 1 2 3 4 5
+ * pin: F0 F1 F4 F5 F6 F7
+ *
+ * MCP23018
+ * col: 0 1 2 3 4 5
+ * pin: B5 B4 B3 B2 B1 B0
+ */
+static void init_cols(void)
+{
+ // init on mcp23018
+ // not needed, already done as part of init_mcp23018()
+
+ // init on teensy
+ // Input with pull-up(DDR:0, PORT:1)
+ DDRF &= ~(1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
+ PORTF |= (1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
+}
+
+static matrix_row_t read_cols(uint8_t row)
+{
+ if (row < 7) {
+ if (mcp23018_status) { // if there was an error
+ return 0;
+ } else {
+ uint8_t data = 0;
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out;
+ data = i2c_readNak();
+ data = ~data;
+ out:
+ i2c_stop();
+ return data;
+ }
+ } else {
+ _delay_us(30); // without this wait read unstable value.
+ // read from teensy
+ return
+ (PINF&(1<<0) ? 0 : (1<<0)) |
+ (PINF&(1<<1) ? 0 : (1<<1)) |
+ (PINF&(1<<4) ? 0 : (1<<2)) |
+ (PINF&(1<<5) ? 0 : (1<<3)) |
+ (PINF&(1<<6) ? 0 : (1<<4)) |
+ (PINF&(1<<7) ? 0 : (1<<5)) ;
+ }
+}
+
+/* Row pin configuration
+ *
+ * Teensy
+ * row: 7 8 9 10 11 12 13
+ * pin: B0 B1 B2 B3 D2 D3 C6
+ *
+ * MCP23018
+ * row: 0 1 2 3 4 5 6
+ * pin: A0 A1 A2 A3 A4 A5 A6
+ */
+static void unselect_rows(void)
+{
+ // unselect on mcp23018
+ if (mcp23018_status) { // if there was an error
+ // do nothing
+ } else {
+ // set all rows hi-Z : 1
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write( 0xFF
+ & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+ ); if (mcp23018_status) goto out;
+ out:
+ i2c_stop();
+ }
+
+ // unselect on teensy
+ // Hi-Z(DDR:0, PORT:0) to unselect
+ DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
+ PORTB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
+ DDRD &= ~(1<<2 | 1<<3);
+ PORTD &= ~(1<<2 | 1<<3);
+ DDRC &= ~(1<<6);
+ PORTC &= ~(1<<6);
+}
+
+static void select_row(uint8_t row)
+{
+ if (row < 7) {
+ // select on mcp23018
+ if (mcp23018_status) { // if there was an error
+ // do nothing
+ } else {
+ // set active row low : 0
+ // set other rows hi-Z : 1
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write( 0xFF & ~(1<<row)
+ & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+ ); if (mcp23018_status) goto out;
+ out:
+ i2c_stop();
+ }
+ } else {
+ // select on teensy
+ // Output low(DDR:1, PORT:0) to select
+ switch (row) {
+ case 7:
+ DDRB |= (1<<0);
+ PORTB &= ~(1<<0);
+ break;
+ case 8:
+ DDRB |= (1<<1);
+ PORTB &= ~(1<<1);
+ break;
+ case 9:
+ DDRB |= (1<<2);
+ PORTB &= ~(1<<2);
+ break;
+ case 10:
+ DDRB |= (1<<3);
+ PORTB &= ~(1<<3);
+ break;
+ case 11:
+ DDRD |= (1<<2);
+ PORTD &= ~(1<<3);
+ break;
+ case 12:
+ DDRD |= (1<<3);
+ PORTD &= ~(1<<3);
+ break;
+ case 13:
+ DDRC |= (1<<6);
+ PORTC &= ~(1<<6);
+ break;
+ }
+ }
+}
+
diff --git a/keyboard/ergodox_ez/twimaster.c b/keyboard/ergodox_ez/twimaster.c
new file mode 100644
index 0000000000..f91c08e6e4
--- /dev/null
+++ b/keyboard/ergodox_ez/twimaster.c
@@ -0,0 +1,208 @@
+/*************************************************************************
+* Title: I2C master library using hardware TWI interface
+* Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
+* File: $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $
+* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
+* Target: any AVR device with hardware TWI
+* Usage: API compatible with I2C Software Library i2cmaster.h
+**************************************************************************/
+#include <inttypes.h>
+#include <compat/twi.h>
+
+#include <i2cmaster.h>
+
+
+/* define CPU frequency in Mhz here if not defined in Makefile */
+#ifndef F_CPU
+#define F_CPU 16000000UL
+#endif
+
+/* I2C clock in Hz */
+#define SCL_CLOCK 400000L
+
+
+/*************************************************************************
+ Initialization of the I2C bus interface. Need to be called only once
+*************************************************************************/
+void i2c_init(void)
+{
+ /* initialize TWI clock
+ * minimal values in Bit Rate Register (TWBR) and minimal Prescaler
+ * bits in the TWI Status Register should give us maximal possible
+ * I2C bus speed - about 444 kHz
+ *
+ * for more details, see 20.5.2 in ATmega16/32 secification
+ */
+
+ TWSR = 0; /* no prescaler */
+ TWBR = 10; /* must be >= 10 for stable operation */
+
+}/* i2c_init */
+
+
+/*************************************************************************
+ Issues a start condition and sends address and transfer direction.
+ return 0 = device accessible, 1= failed to access device
+*************************************************************************/
+unsigned char i2c_start(unsigned char address)
+{
+ uint8_t twst;
+
+ // send START condition
+ TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+
+ // wait until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
+
+ // send device address
+ TWDR = address;
+ TWCR = (1<<TWINT) | (1<<TWEN);
+
+ // wail until transmission completed and ACK/NACK has been received
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
+
+ return 0;
+
+}/* i2c_start */
+
+
+/*************************************************************************
+ Issues a start condition and sends address and transfer direction.
+ If device is busy, use ack polling to wait until device is ready
+
+ Input: address and transfer direction of I2C device
+*************************************************************************/
+void i2c_start_wait(unsigned char address)
+{
+ uint8_t twst;
+
+
+ while ( 1 )
+ {
+ // send START condition
+ TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+
+ // wait until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
+
+ // send device address
+ TWDR = address;
+ TWCR = (1<<TWINT) | (1<<TWEN);
+
+ // wail until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
+ {
+ /* device busy, send stop condition to terminate write operation */
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+
+ // wait until stop condition is executed and bus released
+ while(TWCR & (1<<TWSTO));
+
+ continue;
+ }
+ //if( twst != TW_MT_SLA_ACK) return 1;
+ break;
+ }
+
+}/* i2c_start_wait */
+
+
+/*************************************************************************
+ Issues a repeated start condition and sends address and transfer direction
+
+ Input: address and transfer direction of I2C device
+
+ Return: 0 device accessible
+ 1 failed to access device
+*************************************************************************/
+unsigned char i2c_rep_start(unsigned char address)
+{
+ return i2c_start( address );
+
+}/* i2c_rep_start */
+
+
+/*************************************************************************
+ Terminates the data transfer and releases the I2C bus
+*************************************************************************/
+void i2c_stop(void)
+{
+ /* send stop condition */
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+
+ // wait until stop condition is executed and bus released
+ while(TWCR & (1<<TWSTO));
+
+}/* i2c_stop */
+
+
+/*************************************************************************
+ Send one byte to I2C device
+
+ Input: byte to be transfered
+ Return: 0 write successful
+ 1 write failed
+*************************************************************************/
+unsigned char i2c_write( unsigned char data )
+{
+ uint8_t twst;
+
+ // send data to the previously addressed device
+ TWDR = data;
+ TWCR = (1<<TWINT) | (1<<TWEN);
+
+ // wait until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits
+ twst = TW_STATUS & 0xF8;
+ if( twst != TW_MT_DATA_ACK) return 1;
+ return 0;
+
+}/* i2c_write */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, request more data from device
+
+ Return: byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readAck(void)
+{
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
+ while(!(TWCR & (1<<TWINT)));
+
+ return TWDR;
+
+}/* i2c_readAck */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, read is followed by a stop condition
+
+ Return: byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readNak(void)
+{
+ TWCR = (1<<TWINT) | (1<<TWEN);
+ while(!(TWCR & (1<<TWINT)));
+
+ return TWDR;
+
+}/* i2c_readNak */
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile
index ad0c824375..643646155f 100644
--- a/keyboard/planck/Makefile
+++ b/keyboard/planck/Makefile
@@ -39,7 +39,7 @@
#----------------------------------------------------------------------------
# Target file name (without extension).
-TARGET = planck_lufa
+TARGET = planck
# Directory common source filess exist
@@ -49,11 +49,8 @@ TOP_DIR = ../..
TARGET_DIR = .
# # project specific files
-SRC = keymap_common.c \
- matrix.c \
- led.c \
- backlight.c \
- beeps.c
+SRC = planck.c \
+ backlight.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
@@ -122,15 +119,13 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = YES # MIDI controls
-BACKLIGHT_ENABLE = yes
+# UNICODE_ENABLE = YES # Unicode
+BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
-ifdef MIDI_ENABLE
- SRC += keymap_midi.c
-endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
@@ -139,7 +134,5 @@ endif
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
-include $(TOP_DIR)/protocol/lufa.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
+include $(TOP_DIR)/quantum.mk
diff --git a/keyboard/planck/Makefile.pjrc b/keyboard/planck/Makefile.pjrc
deleted file mode 100644
index be83ba18b1..0000000000
--- a/keyboard/planck/Makefile.pjrc
+++ /dev/null
@@ -1,116 +0,0 @@
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF.
-#
-# make extcoff = Convert ELF to AVR Extended COFF.
-#
-# make program = Download the hex file to the device.
-# Please customize your programmer settings(PROGRAM_CMD)
-#
-# make teensy = Download the hex file to the device, using teensy_loader_cli.
-# (must have teensy_loader_cli installed).
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-# have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-# have Atmel FLIP installed).
-#
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
-# (must have dfu-programmer installed).
-#
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
-# (must have Atmel FLIP installed).
-#
-# make debug = Start either simulavr or avarice as specified for debugging,
-# with avr-gdb or avr-insight as the front end for debugging.
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-# bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
-# Target file name (without extension).
-TARGET = gh60_pjrc
-
-# Directory common source filess exist
-TOP_DIR = ../..
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# project specific files
-SRC = keymap_common.c \
- matrix.c \
- led.c
-
-ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
-else
- SRC := keymap_jack.c $(SRC)
-endif
-
-CONFIG_H = config.h
-
-
-# MCU name, you MUST set this to match the board you are using
-# type "make clean" after changing this, so all files will be rebuilt
-MCU = atmega32u4
-#MCU = at90usb1286
-
-
-# Processor frequency.
-# Normally the first thing your program should do is set the clock prescaler,
-# so your program will run at the correct speed. You should also set this
-# variable to same clock speed. The _delay_ms() macro uses this, and many
-# examples use this variable to calculate timings. Do not add a "UL" here.
-F_CPU = 16000000
-
-
-# Boot Section Size in *bytes*
-# Teensy halfKay 512
-# Atmel DFU loader 4096
-# LUFA bootloader 4096
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-# comment out to disable the options.
-#
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
-EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover(+500)
-#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
-
-
-# Search Path
-VPATH += $(TARGET_DIR)
-VPATH += $(TOP_DIR)
-
-include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
-
-plain: OPT_DEFS += -DKEYMAP_PLAIN
-plain: all
-
-poker: OPT_DEFS += -DKEYMAP_POKER
-poker: all
-
-poker_set: OPT_DEFS += -DKEYMAP_POKER_SET
-poker_set: all
-
-poker_bit: OPT_DEFS += -DKEYMAP_POKER_BIT
-poker_bit: all
diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h
index 47cf39a903..a4c711db82 100644
--- a/keyboard/planck/config.h
+++ b/keyboard/planck/config.h
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_H
#define CONFIG_H
-#include "config_definitions.h"
+#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
@@ -36,6 +36,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
#define ROWS (int []){ D0, D5, B5, B6 }
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
diff --git a/keyboard/planck/config_definitions.h b/keyboard/planck/config_definitions.h
deleted file mode 100644
index fd138b8841..0000000000
--- a/keyboard/planck/config_definitions.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef CONFIG_DEFINITIONS_H
-#define CONFIG_DEFINITIONS_H
-
-#define B0 0x20
-#define B1 0x21
-#define B2 0x22
-#define B3 0x23
-#define B4 0x24
-#define B5 0x25
-#define B6 0x26
-#define B7 0x27
-#define C0 0x30
-#define C1 0x31
-#define C2 0x32
-#define C3 0x33
-#define C4 0x34
-#define C5 0x35
-#define C6 0x36
-#define C7 0x37
-#define D0 0x40
-#define D1 0x41
-#define D2 0x42
-#define D3 0x43
-#define D4 0x44
-#define D5 0x45
-#define D6 0x46
-#define D7 0x47
-#define E0 0x50
-#define E1 0x51
-#define E2 0x52
-#define E3 0x53
-#define E4 0x54
-#define E5 0x55
-#define E6 0x56
-#define E7 0x57
-#define F0 0x60
-#define F1 0x61
-#define F2 0x62
-#define F3 0x63
-#define F4 0x64
-#define F5 0x65
-#define F6 0x66
-#define F7 0x67
-
-
-
-
-
-#endif
-
diff --git a/keyboard/planck/keymaps/keymap_default.c b/keyboard/planck/keymaps/keymap_default.c
index f34cd9721f..49670dafd3 100644
--- a/keyboard/planck/keymaps/keymap_default.c
+++ b/keyboard/planck/keymaps/keymap_default.c
@@ -1,62 +1,68 @@
-#include "keymap_common.h"
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
#include "backlight.h"
-#include "debug.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
- // Space is repeated to accommadate for both spacebar wiring positions
+[_QW] = { /* Qwerty */
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
-[1] = { /* Colemak */
+[_CM] = { /* Colemak */
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
- {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
- {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
-[2] = { /* RAISE */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TRNS, FUNC(3), FUNC(4), RESET, DEBUG, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
- {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+[_DV] = { /* Dvorak */
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
-[3] = { /* LOWER */
- {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC},
- {KC_TRNS, FUNC(3), FUNC(4), RESET, DEBUG, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
-[4] = { /* TENKEY */
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT},
- {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+[_LW] = { /* LOWER */
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE
- [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER
-
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
};
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
- case 0:
- if (record->event.pressed) {
- register_code(KC_RSFT);
- backlight_step();
- } else {
- unregister_code(KC_RSFT);
- }
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ backlight_step();
+ } else {
+ unregister_code(KC_RSFT);
+ }
break;
- }
+ }
return MACRO_NONE;
};
diff --git a/keyboard/planck/keymaps/keymap_joe.c b/keyboard/planck/keymaps/keymap_joe.c
index 157f940869..5b7bbe2bbb 100644
--- a/keyboard/planck/keymaps/keymap_joe.c
+++ b/keyboard/planck/keymaps/keymap_joe.c
@@ -4,38 +4,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Joe colemak */
{F(3), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS},
{KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT },
- {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT},
- {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT},
+ {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
},
[1] = { /* Joe soft Colemak */
{F(3), CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_MINS},
{KC_BSPC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_ENT },
- {F(15), CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT},
- {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {F(15), CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT},
+ {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
},
[2] = { /* Joe NUMPAD */
- {F(3), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LSFT(KC_9), LSFT(KC_0), KC_P7, KC_P8, KC_P9, KC_PSLS},
- {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LSFT(KC_5), KC_PEQL, KC_P4, KC_P5, KC_P6, KC_PAST},
- {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PCMM, KC_P1, KC_P2, KC_P3, KC_PMNS},
- {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_TRNS, KC_TRNS, F(2), KC_P0, KC_PDOT, KC_PENT, KC_PPLS}
+ {F(3), KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, LSFT(KC_9), LSFT(KC_0), KC_PSLS, KC_P7, KC_P8, KC_P9 },
+ {KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, LSFT(KC_5), KC_PEQL, KC_PAST, KC_P4, KC_P5, KC_P6 },
+ {F(15), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PCMM, KC_PMNS, KC_P1, KC_P2, KC_P3 },
+ {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_TRNS, KC_TRNS, F(2), KC_PPLS, KC_P0, KC_PDOT, KC_PENT}
},
[3] = { /* Joe 1337 haxOr5*/
{F(3), KC_Q, KC_W, KC_F, KC_P, KC_6, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS},
{KC_BSPC, KC_4, KC_R, KC_5, KC_7, KC_D, KC_H, KC_N, KC_3, KC_1, KC_0, KC_ENT },
- {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT},
- {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT},
+ {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
},
[4] = { /* Joe LOWER fn1 */
{KC_GRV, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(3), M(2), M(1), M(0) },
{KC_BSPC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS},
- {KC_BSLS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_EQL },
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_TRNS, KC_TRNS, F(2), KC_HOME, KC_PGDN, KC_PGUP, KC_END }
+ {KC_BSLS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_PGUP, KC_EQL },
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_TRNS, KC_TRNS, F(2), KC_NO, KC_HOME, KC_PGDN, KC_END }
},
[5] = { /* Joe UPPER fn2 */
- {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 },
- {KC_DEL, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_BTN4, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO },
- {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_L, KC_WH_D, KC_WH_R, KC_NO, KC_NO, KC_NO, LCTL(KC_PGUP), LCTL(KC_PGDN) },
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_NO, KC_NO, F(2), LCTL(LALT(KC_LEFT)), LCTL(LALT(KC_DOWN)), LCTL(LALT(KC_UP)), LCTL(LALT(KC_RGHT))}
+ {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 },
+ {KC_DEL, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_BTN4, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO },
+ {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_L, KC_WH_D, KC_WH_R, KC_NO, KC_NO, LCTL(KC_PGUP), LCTL(LALT(KC_UP)), LCTL(KC_PGDN) },
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_NO, KC_NO, F(2), KC_NO, LCTL(LALT(KC_LEFT)), LCTL(LALT(KC_DOWN)), LCTL(LALT(KC_RGHT))}
},
[6] = { /* Joe SPECIAL fn3 */
{KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO },
diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c
index 4fe2e0a2bf..cc9be55f64 100644
--- a/keyboard/planck/keymaps/keymap_lock.c
+++ b/keyboard/planck/keymaps/keymap_lock.c
@@ -2,7 +2,7 @@
#include "backlight.h"
#include "action_layer.h"
#include "keymap_midi.h"
-#include "beeps.h"
+#include <avr/boot.h>
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Qwerty */
@@ -53,6 +53,16 @@ const uint16_t PROGMEM fn_actions[] = {
};
+uint16_t hextokeycode(int hex) {
+ if (hex == 0x0) {
+ return KC_0;
+ } else if (hex < 0xA) {
+ return KC_1 + (hex - 0x1);
+ } else {
+ return KC_A + (hex - 0xA);
+ }
+}
+
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
@@ -64,6 +74,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
backlight_set(BACKLIGHT_LEVELS);
default_layer_and(0);
default_layer_or((1<<5));
+
+ // uint8_t low = boot_lock_fuse_bits_get(0x0000);
+ // uint8_t high = boot_lock_fuse_bits_get(0x0003);
+ // uint8_t ext = boot_lock_fuse_bits_get(0x0002);
+ // uint8_t lock = boot_lock_fuse_bits_get(0x0001);
+
+ // register_code(hextokeycode((low & 0xF0) >> 4));
+ // unregister_code(hextokeycode((low & 0xF0) >> 4));
+ // register_code(hextokeycode((low & 0x0F)));
+ // unregister_code(hextokeycode((low & 0x0F)));
+
+
+ // register_code(hextokeycode((high & 0xF0) >> 4));
+ // unregister_code(hextokeycode((high & 0xF0) >> 4));
+ // register_code(hextokeycode((high & 0x0F)));
+ // unregister_code(hextokeycode((high & 0x0F)));
+
+
+ // register_code(hextokeycode((ext & 0xF0) >> 4));
+ // unregister_code(hextokeycode((ext & 0xF0) >> 4));
+ // register_code(hextokeycode((ext & 0x0F)));
+ // unregister_code(hextokeycode((ext & 0x0F)));
+
+
+ // register_code(hextokeycode((lock & 0xF0) >> 4));
+ // unregister_code(hextokeycode((lock & 0xF0) >> 4));
+ // register_code(hextokeycode((lock & 0x0F)));
+ // unregister_code(hextokeycode((lock & 0x0F)));
+
// note(0+12, 20);
// note(0+24, 20);
} else {
diff --git a/keyboard/planck/keymaps/keymap_monkey.c b/keyboard/planck/keymaps/keymap_monkey.c
new file mode 100644
index 0000000000..21a2c146ab
--- /dev/null
+++ b/keyboard/planck/keymaps/keymap_monkey.c
@@ -0,0 +1,76 @@
+#include "keymap_common.h"
+#include "backlight.h"
+#include "debug.h"
+
+#define COLEMAK_LAYER 0
+#define QWERTY_LAYER 1
+#define LOWER_LAYER 2
+#define UPPER_LAYER 3
+#define SPACEFN_LAYER 4
+#define TENKEY_LAYER 5
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[COLEMAK_LAYER] = { /* Colemak */
+ {KC_TAB, UNI(0x1961), KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
+ {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[QWERTY_LAYER] = { /* Qwerty */
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
+ {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[LOWER_LAYER] = { /* LOWER */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELETE},
+ {KC_TRNS, FUNC(3), FUNC(4), RESET, DEBUG, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
+},
+[UPPER_LAYER] = { /* RAISE */
+ {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_DELETE},
+ {KC_CALC, FUNC(3), FUNC(4), RESET, DEBUG, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[SPACEFN_LAYER] = { /* SpaceFN */
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_TRNS},
+ {KC_TRNS, FUNC(3), FUNC(4), KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS},
+ {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+},
+[TENKEY_LAYER] = { /* TENKEY */
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_BSPC},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_NLCK},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_PDOT, KC_ENT},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_LAYER_TAP_KEY(LOWER_LAYER, KC_BSPC), // Tap for backspace, hold for LOWER
+ [2] = ACTION_LAYER_TAP_KEY(UPPER_LAYER, KC_ENT), // Tap for enter, hold for RAISE
+
+ [3] = ACTION_DEFAULT_LAYER_SET(COLEMAK_LAYER),
+ [4] = ACTION_DEFAULT_LAYER_SET(QWERTY_LAYER),
+ [5] = ACTION_LAYER_TOGGLE(TENKEY_LAYER),
+
+ [6] = ACTION_LAYER_TAP_KEY(SPACEFN_LAYER, KC_SPC), // Tap for space, hold for SpaceFN
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ backlight_step();
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+}; \ No newline at end of file
diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c
new file mode 100644
index 0000000000..b62862af04
--- /dev/null
+++ b/keyboard/planck/planck.c
@@ -0,0 +1,31 @@
+#include "planck.h"
+
+__attribute__ ((weak))
+void * matrix_init_user(void) {
+
+};
+
+__attribute__ ((weak))
+void * matrix_scan_user(void) {
+
+};
+
+void * matrix_init_kb(void) {
+ #ifdef BACKLIGHT_ENABLE
+ backlight_init_ports();
+ #endif
+
+ // Turn status LED on
+ DDRE |= (1<<6);
+ PORTE |= (1<<6);
+
+ if (matrix_init_user) {
+ (*matrix_init_user)();
+ }
+};
+
+void * matrix_scan_kb(void) {
+ if (matrix_scan_user) {
+ (*matrix_scan_user)();
+ }
+}; \ No newline at end of file
diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h
new file mode 100644
index 0000000000..4e59aef566
--- /dev/null
+++ b/keyboard/planck/planck.h
@@ -0,0 +1,38 @@
+#ifndef PLANCK_H
+#define PLANCK_H
+
+#include "matrix.h"
+#include "keymap_common.h"
+#include "backlight.h"
+#include <stddef.h>
+
+#define PLANCK_MIT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k37, k38, k39, k3a, k3b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b } \
+}
+
+#define PLANCK_GRID( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b } \
+}
+
+void * matrix_init_user(void);
+void * matrix_scan_user(void);
+
+#endif \ No newline at end of file
diff --git a/keyboard/planck/planck_pcb.hex b/keyboard/planck/planck_pcb.hex
index a7bcce9dc6..11f523c058 100644
--- a/keyboard/planck/planck_pcb.hex
+++ b/keyboard/planck/planck_pcb.hex
@@ -1,1571 +1,1544 @@
-:100000000C94A9080C94ED080C94ED080C94ED08E0
-:100010000C94ED080C94ED080C94ED080C94ED088C
-:100020000C94ED080C94ED080C948E120C94601353
-:100030000C9480220C94ED080C94ED080C94ED08BF
-:100040000C94ED080C94ED080C94ED080C94ED085C
-:100050000C94ED080C94ED220C94ED080C94ED0832
-:100060000C94ED080C94ED080C94ED080C94ED083C
-:100070000C94ED080C94ED080C94ED080C94ED082C
-:100080000C94ED080C94ED080C94ED080C94ED081C
-:100090000C94ED080C94ED080C94ED080C94ED080C
-:1000A0000C94ED080C94ED080C94ED08002C282C11
-:1000B000292A062D062DB52B062D062D522C062D90
-:1000C000652CD32C062D062D062D062DA82C8F2C45
-:1000D000062D782C062D382C062D062D002D002DF2
-:1000E000002D002D002D002D002D002D002DFE2CAB
-:1000F000062DFE2C062D062D062D062D062D062D71
-:10010000062D062D062D062D062DFE2C062D062D60
-:10011000B52B962B022D022D022D022D022D022D24
-:10012000022D022D022D022D022D022DE32C062D73
-:10013000142C626F756E6365213A200025303258A9
-:10014000000A000A722F63203031323334353637DB
-:1001500038394142434445460A0025303258003A76
-:1001600020002530313662000A000000F1A2F1A320
-:10017000018C028C2B0014001A00080015001700D7
-:100180001C0018000C00120013002A0029000400B3
-:100190001600070009000A000B000D000E000F00FA
-:1001A00033003400E1001D001B00060019000500AB
-:1001B0001100100036003700380028001340E0001E
-:1001C000E200E30002202C002C000120500051002E
-:1001D00052004F002B0014001A00090013000A00FF
-:1001E0000D000F0018001C0033002A002900040035
-:1001F00015001600170007000B00110008000C0086
-:1002000012003400E1001D001B000600190005006B
-:100210000E0010003600370038002800C300E00050
-:10022000E200E30002202C002C00012050005100CD
-:1002300052004F0035001E001F0020002100220048
-:10024000230024002500260027002A0001000320A7
-:10025000042048120100010001002D002E002F0093
-:1002600030003100010044004500680069006A0068
-:100270006B006C006D006E006F000100010001005A
-:10028000010001000100010001000120AB00AA00F3
-:10029000A900AE0035021E021F0220022102220226
-:1002A000230224022502260227022A00010003203D
-:1002B000042048120712010001002D022E022F0215
-:1002C0003002310201003A003B003C003D003E009C
-:1002D0003F004000410042004300010001000100D6
-:1002E000010001000220010001000100AB00AA0092
-:1002F000A900AE0001090209005B435D005B445D9B
-:10030000005B525D005B535D005B575D00555342DF
-:1003100020636F6E666967757265642E0A004B65AF
-:1003200079626F6172642073746172742E0A005B6B
-:10033000735D000E0350006C0061006E0063006B83
-:100340000000002C034F007200740068006F006C06
-:100350000069006E0065006100720020004B0065BE
-:1003600000790062006F0061007200640073000099
-:10037000000403090409028D00050100A0320904EC
-:1003800000000103010100092111010001223F00C9
-:100390000705810308000A090401000103010200A6
-:1003A000092111010001224D000705820308000AFE
-:1003B00009040200010300000009211101000122CB
-:1003C00036000705830308000A090403000203003E
-:1003D00000000921110100012220000705840320EB
-:1003E00000010705040320000109040400010300C3
-:1003F00000000921110100012239000705850310C1
-:1004000000011201100100000008EDFE6060010013
-:100410000102000105010906A101050719E029E70C
-:1004200015002501950875018102050819012905A6
-:100430009505750191029501750391010507190054
-:10044000297715002501957875018102C00631FFD5
-:100450000974A1010975150025FF95207508810211
-:100460000976150025FF952075089102C005010940
-:1004700080A101850216010026B7001A01002AB7E3
-:1004800000751095018100C0050C0901A1018503CB
-:10049000160100269C021A01002A9C027510950183
-:1004A0008100C005010902A1010901A10005091986
-:1004B0000129051500250195057501810295017534
-:1004C0000381010501093009311581257F950275E8
-:1004D00008810609381581257F9501750881060573
-:1004E0000C0A38021581257F950175088106C0C068
-:1004F00005010906A101050719E029E715002501F5
-:100500009508750181029501750881010508190199
-:10051000290595057501910295017503910105075E
-:10052000190029FF150025FF950675088100C06B8D
-:100530006579626F6172645F7265706F72743A2080
-:10054000002530325820000A006B6579626F6172B5
-:10055000645F7365745F6C65643A200025303258BF
-:10056000000A006164645F6B65795F6269743A20B8
-:1005700063616E2774206164643A20253032580A22
-:100580000064656C5F6B65795F6269743A206361D2
-:100590006E27742064656C3A20253032580A006258
-:1005A0006F6F676D61676963207363616E3A202EB8
-:1005B0002E2E2000646F6E652E0A006D6F757365B8
-:1005C0006B6579205B62746E7C7820792076206878
-:1005D0005D287265702F61636C293A205B002530BD
-:1005E0003258007C0025640020002564002000258E
-:1005F000640020002564005D28002575002F00257B
-:100600007500290A006565636F6E6669673A0A00BE
-:100610004C6F636B65642E0A00556E6C6F636B657F
-:10062000642E0A000A456E74657220436F6E736F04
-:100630006C65204D6F64650A00433E20000A0A4A3B
-:10064000756D7020746F20626F6F746C6F6164657C
-:10065000722E2E2E20006E6F7420737570706F7264
-:100660007465642E0A000A44454255473A2064697D
-:100670007361626C65642E0A000A44454255473A2C
-:1006800020656E61626C65642E0A000A444542551D
-:10069000473A206D617472697820656E61626C659D
-:1006A000642E0A000A44454255473A206D6174722F
-:1006B00069782064697361626C65642E0A000A447B
-:1006C000454255473A206B6579626F6172642065D7
-:1006D0006E61626C65642E0A000A44454255473AD1
-:1006E000206B6579626F6172642064697361626C0A
-:1006F00065642E0A000A44454255473A206D6F75DD
-:10070000736520656E61626C65642E0A000A44455B
-:100710004255473A206D6F75736520646973616255
-:100720006C65642E0A000A0A2D2D2D2D2D2056658C
-:100730007273696F6E202D2D2D2D2D0A00444553A7
-:10074000433A204120636F6D70616374206F72744F
-:10075000686F6C696E656172206B6579626F61723A
-:10076000640A005649443A20307846454544284FAB
-:100770007274686F6C696E656172204B6579626F27
-:100780006172647329205049443A203078363036FB
-:100790003028506C616E636B29205645523A2030E8
-:1007A00078303030310A004255494C443A203037D5
-:1007B00064303930642D6469727479202830303A9D
-:1007C00032373A3234204A756E20203320323031AD
-:1007D00035290A004F5054494F4E533A204C554644
-:1007E0004120424F4F544D41474943204D4F5553AF
-:1007F000454B45592045585452414B455920434F8C
-:100800004E534F4C4520434F4D4D414E44204E4B8F
-:10081000524F20343039360A004743433A20342EB1
-:10082000372E32204156522D4C4942433A20312E28
-:10083000382E30204156525F415243483A2061766B
-:1008400072350A0074696D65725F636F756E743A14
-:10085000202530346C580A000A0A2D2D2D2D2D200C
-:10086000537461747573202D2D2D2D2D0A00686F22
-:1008700073745F6B6579626F6172645F6C656473DA
-:1008800028293A2025580A006B6579626F617264E5
-:100890005F70726F746F636F6C3A2025580A006B3B
-:1008A0006579626F6172645F69646C653A2025588E
-:1008B0000A004E4B524F3A20656E61626C65640AC5
-:1008C000004E4B524F3A2064697361626C65640A52
-:1008D000003F0064656661756C745F6C6179657278
-:1008E0003A20002575000A0064656275675F636FD2
-:1008F0006E6669672E7261773A20002530325800A3
-:100900000A002E656E61626C653A20002575000A4A
-:10091000002E6D61747269783A20002575000A0016
-:100920002E6B6579626F6172643A20002575000A4A
-:10093000002E6D6F7573653A20002575000A006BF7
-:1009400065796D61705F636F6E6669672E7261773E
-:100950003A200025303258000A002E737761705F0C
-:10096000636F6E74726F6C5F636170736C6F636BD7
-:100970003A20002575000A002E636170736C6F6366
-:100980006B5F746F5F636F6E74726F6C3A200025DB
-:1009900075000A002E737761705F6C616C745F6C18
-:1009A0006775693A20002575000A002E737761701B
-:1009B0005F72616C745F726775693A20002575001B
-:1009C0000A002E6E6F5F6775693A20002575000A70
-:1009D000002E737761705F67726176655F65736320
-:1009E0003A20002575000A002E737761705F6261FE
-:1009F000636B736C6173685F6261636B7370616377
-:100A0000653A20002575000A002E6E6B726F3A2041
-:100A1000002575000A006261636B6C696768745F2A
-:100A2000636F6E6669672E7261773A2000253032F7
-:100A300058000A002E656E61626C653A20002575CB
-:100A4000000A002E6C6576656C3A20002575000A58
-:100A5000000A0A2D2D2D2D2D20436F6D6D616E64C2
-:100A60002048656C70202D2D2D2D2D0A00633A092C
-:100A7000656E74657220636F6E736F6C65206D6F49
-:100A800064650A00643A09746F67676C6520646581
-:100A900062756720656E61626C650A00783A097458
-:100AA0006F67676C65206D61747269782064656238
-:100AB00075670A006B3A09746F67676C65206B6530
-:100AC00079626F6172642064656275670A006D3ACD
-:100AD00009746F67676C65206D6F75736520646559
-:100AE0006275670A00763A097072696E74206465EF
-:100AF000766963652076657273696F6E202620695A
-:100B00006E666F0A00743A097072696E74207469B7
-:100B10006D657220636F756E740A00733A097072A6
-:100B2000696E74207374617475730A00653A097094
-:100B300072696E7420656570726F6D20636F6E668A
-:100B400069670A006E3A09746F67676C65204E4BDF
-:100B5000524F0A00302F4631303A09737769746377
-:100B60006820746F204C6179657230200A00312F43
-:100B700046313A0973776974636820746F204C6159
-:100B800079657231200A00322F46323A097377694B
-:100B900074636820746F204C6179657232200A009A
-:100BA000332F46333A0973776974636820746F2072
-:100BB0004C6179657233200A00342F46343A097348
-:100BC000776974636820746F204C61796572342092
-:100BD0000A00505363723A09706F77657220646F30
-:100BE000776E2F72656D6F74652077616B652D75FB
-:100BF000700A00436170733A094C6F636B204B6558
-:100C000079626F617264284368696C642050726F06
-:100C10006F66290A00506175733A096A756D702014
-:100C2000746F20626F6F746C6F616465720A000A82
-:100C30000A2D2D2D2D2D20436F6E736F6C6520486E
-:100C4000656C70202D2D2D2D2D0A004553432F71DD
-:100C50003A09717569740A006D3A096D6F757365AB
-:100C60006B65790A007377697463685F64656661B0
-:100C7000756C745F6C617965723A2000257500208F
-:100C8000746F20002575000A00433E20000A51754C
-:100C9000697420436F6E736F6C65204D6F64650AD5
-:100CA000000A456E746572204D6F7573656B6579CA
-:100CB00020436F6E736F6C650A004D303E003F003D
-:100CC0000A0A2D2D2D2D2D204D6F7573656B6579BD
-:100CD00020506172616D65746572732048656C7037
-:100CE000202D2D2D2D2D0A004553432F713A0971CA
-:100CF0007569740A00313A0973656C656374206D17
-:100D00006B5F64656C6179282A31306D73290A0044
-:100D1000323A0973656C656374206D6B5F696E743C
-:100D2000657276616C286D73290A00333A09736520
-:100D30006C656374206D6B5F6D61785F7370656562
-:100D4000640A00343A0973656C656374206D6B5FE7
-:100D500074696D655F746F5F6D61780A00353A097B
-:100D600073656C656374206D6B5F776865656C5F38
-:100D70006D61785F73706565640A00363A09736562
-:100D80006C656374206D6B5F776865656C5F746913
-:100D90006D655F746F5F6D61780A00703A097072FB
-:100DA000696E7420706172616D65746572730A009A
-:100DB000643A097365742064656661756C742076A5
-:100DC000616C7565730A0075703A09696E637265C6
-:100DD00061736520706172616D6574657273282B33
-:100DE00031290A00646F776E3A0964656372656140
-:100DF000736520706172616D6574657273282D3141
-:100E0000290A00706775703A09696E6372656173CB
-:100E10006520706172616D6574657273282B313065
-:100E2000290A007067646F776E3A096465637265BA
-:100E300061736520706172616D6574657273282DD0
-:100E40003130290A000A7370656564203D206465AD
-:100E50006C7461202A206D61785F73706565642011
-:100E60002A2028726570656174202F2074696D6571
-:100E70005F746F5F6D6178290A007768657265201D
-:100E800064656C74613A20637572736F723D0025FE
-:100E900075002C20776865656C3D002575000A009B
-:100EA00053656520687474703A2F2F656E2E7769CC
-:100EB0006B6970656469612E6F72672F77696B6902
-:100EC0002F4D6F7573655F6B6579730A000A5175F5
-:100ED0006974204D6F7573656B657920436F6E7310
-:100EE0006F6C650A00433E200073656C6563746532
-:100EF0006420706172616D657465723A20002575B9
-:100F0000000A007365742064656661756C742076F0
-:100F1000616C7565732E0A003F004D002575003E1B
-:100F200020000A0A2D2D2D2D2D204D6F7573656B18
-:100F3000657920506172616D6574657273202D2D25
-:100F40002D2D2D0A00313A206D6B5F64656C61793F
-:100F5000282A31306D73293A20002575000A0032A5
-:100F60003A206D6B5F696E74657276616C286D7383
-:100F7000293A20002575000A00333A206D6B5F6D19
-:100F800061785F73706565643A20002575000A001A
-:100F9000343A206D6B5F74696D655F746F5F6D616E
-:100FA000783A20002575000A00353A206D6B5F778E
-:100FB0006865656C5F6D61785F73706565643A2024
-:100FC000002575000A00363A206D6B5F776865650D
-:100FD0006C5F74696D655F746F5F6D61783A200056
-:100FE0002575000A006D6B5F64656C6179203D209A
-:100FF000002575000A006D6B5F696E74657276611D
-:101000006C203D20002575000A006D6B5F6D6178D6
-:101010005F7370656564203D20002575000A006DD2
-:101020006B5F74696D655F746F5F6D6178203D20E3
-:10103000002575000A006D6B5F776865656C5F6DF4
-:1010400061785F7370656564203D20002575000A36
-:10105000006D6B5F776865656C5F74696D655F7463
-:101060006F5F6D6178203D20002575000A006D6B73
-:101070005F64656C6179203D20002575000A006D74
-:101080006B5F696E74657276616C203D200025751A
-:10109000000A006D6B5F6D61785F73706565642039
-:1010A0003D20002575000A006D6B5F74696D655FFA
-:1010B000746F5F6D6178203D20002575000A006D1A
-:1010C0006B5F776865656C5F6D61785F7370656590
-:1010D00064203D20002575000A006D6B5F77686510
-:1010E000656C5F74696D655F746F5F6D6178203DDD
-:1010F00020002575000A006261636B6C6967687483
-:1011000020696E6372656173653A2025750A006215
-:1011100061636B6C69676874206465637265617391
-:10112000653A2025750A006261636B6C69676874B3
-:1011300020746F67676C653A2025750A00626163E9
-:101140006B6C6967687420737465703A2025750A42
-:10115000000011241FBECFEFDAE0DEBFCDBF04B622
-:1011600003FE24C08091E4019091E501A091E60185
-:10117000B091E7018730904BA740B04BB9F4109283
-:10118000E4011092E5011092E6011092E70114BE0D
-:1011900084B7877F84BF88E10FB6F894809360009E
-:1011A000109260000FBEE0E0F8E3099511E0A0E0C6
-:1011B000B1E0EAEDF1E602C005900D92AA33B10765
-:1011C000D9F711E0AAE3B1E001C01D92A43EB10736
-:1011D000E1F70E94B50F0C94EB300C940000FF93E4
-:1011E000EF93E091C101F091C201309709F00995A8
-:1011F000EF91FF910895FC018591803011F0EFDFB0
-:10120000FBCF0895FF27E0E230E247FF0CC0419595
-:1012100097FF09C0EDE26095709580959095611DEE
-:10122000711D811D911D27FF02C0219530E350E201
-:10123000AA27660F771F881F991FAA1FA41710F0EF
-:10124000A41B63955A95A9F7AA3008F0A95FA05D81
-:10125000AF93F395611571058105910541F7ED3265
-:1012600011F4EF93F395F21718F43F93F395FBCF36
-:101270008F91B5DFFA95E1F70895E991F99185919C
-:10128000803021F0853219F0AADFF9CF089520E0EF
-:10129000E89455915532C1F3503311F46894559147
-:1012A0005A3348F4505390F3220F022E220F220F8C
-:1012B000200D250FF4CF0EF4219589919991533685
-:1012C00019F3533729F1533559F1BC018827992770
-:1012D000E8945C3621F4899199916894559154363B
-:1012E00039F446EF7EF077FF0DC08FEF9FEF0AC015
-:1012F00055374AE039F0583540E121F0523642E0A6
-:1013000009F00895FF93EF937DDFEF91FF91B7CF41
-:10131000FF93EF93FC0181918030B9F360DFFBCF45
-:10132000FF93EF9368DFF1CFDF93CF93CDB7DEB7B5
-:101330002596A3DFCF91DF91089584B18F7984B989
-:1013400085B1806685B98AB18E7D8AB98BB181629B
-:101350008BB9089585B7806885BF85B7806885BFDC
-:101360000E94280D6E9A769A0E949D0984B18E7E05
-:1013700084B985B1816185B93F98479A8AB18F72E6
-:101380008AB98BB1806D8BB980B38C7080BB81B30F
-:10139000836F81BB10923B0110923A01109243017E
-:1013A0001092420110923D0110923C0110924501B1
-:1013B0001092440110923F0110923E011092470199
-:1013C0001092460110924101109240011092490181
-:1013D000109248010895BF92CF92DF92EF92FF9250
-:1013E0000F931F93CF93DF93C2E4D1E0D12CCC2491
-:1013F000C394A5E0BA2EBCE3EB2EB1E0FB2E82E055
-:10140000D81661F093E0D91661F081E0D81619F092
-:10141000509A589808C0559A5D9805C0259A2D98FD
-:1014200002C0269A2E9890EA9A95F1F78FB1869588
-:101430008C25082F017010E0789B03C020E030E07D
-:1014400002C022E030E0202B312B189B03C080E04B
-:1014500090E002C084E090E0282B392B86B19927D8
-:1014600087FD9095809590958827990F881F9927DB
-:10147000F3E0880F991FFA95E1F7282B392B7C9B15
-:1014800003C080E090E002C080E190E0282B392B7F
-:101490007D9B03C080E090E002C080E290E0282BBA
-:1014A000392B7E9B03C080E090E002C080E490E096
-:1014B000282B392B8FB1992787FD90958095909592
-:1014C0008827990F881F99279695982F8827979591
-:1014D0008795282B392B4C9B03C080E090E002C0FD
-:1014E00080E091E0282B392B4E9B03C080E090E0F8
-:1014F00002C080E092E0282B392B1C9B03C080E0C7
-:1015000090E002C080E094E0282B392B89B1992724
-:1015100087FD9095809590958827990F881F99272A
-:10152000982F8827990F990F990F282B392B88818D
-:1015300099818217930741F13983288380910001B3
-:10154000882301F18091BF0180FF04C082E391E014
-:101550000E94FB088091BF0180FF0CC080910001B8
-:101560001F928F93FF92EF920E9494090F900F9019
-:101570000F900F908091BF0180FF04C081E491E043
-:101580000E94FB08B09200010E949D09D39422960C
-:1015900084E0D81234CF80910001882361F181501A
-:1015A00080930001811121C08091420190914301FB
-:1015B00090933B0180933A018091440190914501C1
-:1015C00090933D0180933C018091460190914701A9
-:1015D00090933F0180933E01809148019091490191
-:1015E000909341018093400106C08FE99FE00197ED
-:1015F000F1F700C0000081E0DF91CF911F910F91C2
-:10160000FF90EF90DF90CF90BF900895E82FF0E02B
-:10161000EE0FFF1FE65CFE4F808191810895CF920F
-:10162000DF92EF92FF920F931F93CF93DF9383E4A8
-:1016300091E00E94FB082AE3E22E21E0F22EC0E0B6
-:10164000D0E03AE5C32E31E0D32E02E611E0DF937D
-:10165000CF93DF92CF920E9494098FE591E00E9490
-:10166000FB08F701819191917F010E942A229F93AB
-:101670008F931F930F930E94940988E691E00E9434
-:10168000FB0821968DB79EB708960FB6F8949EBFBB
-:101690000FBE8DBFC430D105D1F6DF91CF911F9120
-:1016A0000F91FF90EF90DF90CF90089508950895E7
-:1016B000611107C0FC018281882319F024EF32E018
-:1016C00002C020E030E0C90108958B3B910568F429
-:1016D000883A910530F5853A9105C0F4843091053A
-:1016E00098F4019709F06FC071C0803E910508F42D
-:1016F0006AC0883E910540F09C01205F310920318D
-:10170000310508F060C05CC09C01A1C0853A91051C
-:1017100009F45FC0863A910509F45EC023E830E41D
-:1017200096C0883A910509F45AC0893A910509F49E
-:1017300059C08A3A910509F458C08B3A910509F4C9
-:1017400057C08C3A910509F456C08D3A910509F4B9
-:1017500055C0803B910509F454C08E3A910509F4B7
-:1017600053C08F3A910509F452C0813B910509F4A9
-:1017700051C0823B910509F450C0833B910509F4A7
-:101780004FC0843B910509F44EC0853B910509F497
-:101790004DC0863B910509F44CC0873B910509F487
-:1017A0004BC0883B910509F44AC0893B910509F477
-:1017B00049C08A3B910509F048C02AE236E447C097
-:1017C0009C01306544C020E030E041C021E030E0C1
-:1017D0003EC021E830E43BC022E830E438C022EECD
-:1017E00034E435C029EE34E432C02AEE34E42FC0AC
-:1017F00025EB34E42CC026EB34E429C027EB34E499
-:1018000026C02CEC34E423C02DEC34E420C023E8C3
-:1018100035E41DC02AE835E41AC022E935E417C0D2
-:1018200024E935E414C021E236E411C023E236E4B1
-:101830000EC024E236E40BC025E236E408C026E2FE
-:1018400036E405C027E236E402C020E034E4C901F2
-:10185000089508959CE0799FF001112490E3899FF9
-:10186000E00DF11D1124E60FF11DEE0FFF1FEC58E6
-:10187000FE4F25913491C9010895880F991F865113
-:101880009040FC0125913491C9010895880F991F5A
-:1018900086599E4FFC0125913491C90108950E94FB
-:1018A0002A0C9C013A9521153F4108F4CDC09C01BA
-:1018B00030522115304120F49F700E94460CC4C064
-:1018C0009C0130532115304120F49C013327306CAA
-:1018D000BCC09C0130542031310528F49C012F708C
-:1018E0003327346DB2C0803120E4920719F420E030
-:1018F00031EDABC0813140E4940719F420E030EDC4
-:10190000A4C0823120E4920719F420E032ED9DC09A
-:10191000833140E4940719F420E033ED96C081153B
-:1019200020E5920711F40C941223803E9105E0F417
-:10193000803C910568F58133910509F474C048F441
-:101940008932910509F46AC08A32910509F07AC09A
-:1019500074C089339105F9F082389105E1F085333F
-:10196000910509F06FC050C0833E9105A9F140F484
-:10197000803E9105C9F0823E910509F063C01BC00D
-:10198000863E910571F1873E910509F05BC037C035
-:101990000E943D0C59C02091D40120FD02C021FFBE
-:1019A00051C080EE90E04EC08091D40180FFF9CF0D
-:1019B00089E390E047C08091D40182FF0AC0809102
-:1019C000D40184FF03C080E090E03CC083EE90E04F
-:1019D00039C082EE90E036C08091D40182FFEFCF13
-:1019E000F8CF8091D40183FF07C08091D40184FD9A
-:1019F000EACF87EE90E026C086EE90E023C080918B
-:101A0000D40183FFF2CFF8CF8091D40185FF03C0CA
-:101A100089E290E017C085E390E014C08091D40182
-:101A200085FDF9CFF5CF8091D40186FF03C08AE20E
-:101A300090E008C081E390E005C08091D40186FD6C
-:101A4000F9CFF5CF0E94650B9C01C9010895089557
-:101A5000279A2F988FEF9FEF9093870080938600AF
-:101A60008AE08093800089E1809381000C94872E26
-:101A700081110AC080918000877F8093800010923E
-:101A80008D0010928C000895909180009860909342
-:101A9000800021E030E002C0220F331F8A95E2F778
-:101AA0002150310930938D0020938C00089580914E
-:101AB0005B0108959091DA01943009F04DC0909146
-:101AC000E9009F702091EC0020FF02C020E801C0D7
-:101AD00020E0292B94E09093E9009091EB0090FF97
-:101AE00038C09091EE0097FF34C090915C0199232B
-:101AF00021F09091E80095FF2CC010925C0196E0D7
-:101B000014C03091DA01343021F53091EB0035FD0D
-:101B100020C0915021F481E080935C011AC0EFE96C
-:101B2000FFE03197F1F700C000003091E80035FF89
-:101B3000E8CF8093F1008091E80085FD05C0809199
-:101B4000E8008E778093E8002F702093E90080E012
-:101B500008952F702093E9008FEF0895CF93DF93BE
-:101B600000D01F92CDB7DEB72091DA01243021F5E5
-:101B700023E029839B838A832093E9008FEF06C0AB
-:101B800095ED9A95F1F70000882329F09091E800EF
-:101B9000815095FFF5CF8091E80085FF0DC040E0B2
-:101BA00050E063E070E0CE0101960E947B108091CE
-:101BB000E8008E778093E8000F900F900F90DF91F0
-:101BC000CF910895CF93DF9300D01F92CDB7DEB7AA
-:101BD0002091DA01243029F522E029839B838A832E
-:101BE00083E08093E9008FEF06C095ED9A95F1F7B9
-:101BF0000000882329F09091E800815095FFF5CFEF
-:101C00008091E80085FF0DC040E050E063E070E0A7
-:101C1000CE0101960E947B108091E8008E77809320
-:101C2000E8000F900F900F90DF91CF9108952091D1
-:101C3000DA012430F9F422E02093E9002FEF06C006
-:101C400035ED3A95F1F70000222329F03091E800B4
-:101C5000215035FFF5CF2091E80025FF0BC040E073
-:101C600050E065E070E00E947B108091E8008E7784
-:101C70008093E8000895CF93DF93EC018091DA011F
-:101C8000843009F045C080910D018823C9F085E0BA
-:101C90008093E9008FEF06C095E19A95F1F7000077
-:101CA000882329F09091E800815095FFF5CF80912D
-:101CB000E80085FF2DC040E050E060E170E018C012
-:101CC00081E08093E9008FEF06C095ED9A95F1F7DA
-:101CD0000000882329F09091E800815095FFF5CF0E
-:101CE0008091E80085FF14C040E050E068E070E0BB
-:101CF000CE010E947B108091E8008E778093E800EF
-:101D000080E1FE01ABE4B1E001900D928A95E1F72C
-:101D1000DF91CF91089589EF92E00E94FB088091B6
-:101D2000D901811109C00E9413120E947012809182
-:101D3000E20084608093E20008958DEF92E00E94BB
-:101D4000FB081092D901089581E093E00C94FB0800
-:101D500085E093E00E94FB080C94570B89E093E028
-:101D60000E94FB080C947C228091DA01843049F5B2
-:101D70008091E9008F709091EC0090FF02C090E894
-:101D800001C090E0982B84E08093E9008091EB0003
-:101D900080FF14C08091EE0087FD03C00FC0109239
-:101DA000F1008091E80085FDFACF8091E80080FF86
-:101DB00005C08091E8008E778093E8009F70909333
-:101DC000E900089542E061EC81E00E94891142E05F
-:101DD00061EC82E00E94891142E061EC83E00E94A4
-:101DE000891146E261EC84E00E94891142E161ECD4
-:101DF00085E00C9489118091DC01833009F456C090
-:101E000030F4813071F0823009F0AEC095C08A3074
-:101E100009F482C08B3009F461C0893009F0A4C094
-:101E200020C08091DB01813A09F09EC08091E800DA
-:101E3000877F8093E8008091DF019091E001892BFA
-:101E400021F060E080E090E003C060E18BE491E08D
-:101E500070E00E94CA108091E8008B778093E800C0
-:101E600008958091DB01813209F07EC08091DF010D
-:101E70009091E001009719F0049709F075C08091E6
-:101E8000E800877F8093E80005C08091DA0188230D
-:101E900009F46AC08091E80082FFF7CF8091F100D9
-:101EA00080935B018091E8008B775AC08091DB01C1
-:101EB000813A09F059C08091DF019091E001892BAE
-:101EC00009F052C08091E800877F8093E8008091FC
-:101ED000E80080FFFCCF80910C013DC08091DB01C8
-:101EE000813209F041C08091DF019091E001892B9E
-:101EF000D9F58091E800877F8093E8000E94C011A7
-:101F00009091DD0181E0911101C080E080930C018E
-:101F100080930D010C94A51B8091DB01813221F58A
-:101F20008091E800877F8093E8000E94C011809133
-:101F3000DE0180934A0108958091DB01813AA1F48A
-:101F40008091E800877F8093E8008091E80080FF1F
-:101F5000FCCF80914A018093F1008091E8008E7758
-:101F60008093E8000C94C011089584B7877F84BFE4
-:101F700088E10FB6F89480936000109260000FBE65
-:101F800090E080E80FB6F894809361009093610030
-:101F90000FBE0E9413120E9470128091E2008460B2
-:101FA0008093E2008AE59DE00E94C02178948091B0
-:101FB000DA018430E1F78DE093E00E94FB080E9493
-:101FC0009F1582E091E00E940D158EE193E00E9442
-:101FD000FB080FC08FE293E00E94FB080E944122A1
-:101FE0008091D801882329F00E94672281110E94E4
-:101FF00065108091DA01853069F30E94CF15F9CF21
-:10200000292F332723303105B1F04CF4213031052D
-:1020100009F44DC02230310509F04EC007C021320D
-:10202000310541F12232310591F146C0EDE8F0E091
-:1020300085E793E045C099278130910569F08230AA
-:10204000910589F0892B09F037C0E1E7F3E0E491CD
-:10205000F0E081E793E034C0E3E4F3E0E491F0E002
-:1020600083E493E02DC0E3E3F3E0E491F0E083E365
-:1020700093E026C0653000F5E62FF0E0EE0FFF1F7D
-:10208000EA5EFE4F80819181E9E0F0E019C06530A1
-:1020900098F4E62FF0E0DF01AA0FBB1FA05EBE4F51
-:1020A0008D919C91E65DFE4FE081F0E009C0E2E198
-:1020B000F0E082E094E004C0E0E0F0E080E090E056
-:1020C000DA018D939C93CF01089580E189BD82E16F
-:1020D00089BD09B400FEFDCF8091D8008F7D80932B
-:1020E000D8008091E00082608093E0008091E00061
-:1020F00081FDFCCF0895BF92CF92DF92EF92FF92C5
-:102100000F931F93CF93DF937C018B01EA010E9411
-:10211000E111B82E811133C0209731F02881398127
-:10212000021B130BE20EF31EC12CD12C23C0809195
-:10213000E80085FD15C08091E8008E778093E80067
-:10214000209749F0888199818C0D9D1D9983888302
-:1021500025E0B22E14C00E94E111882359F00EC070
-:10216000F70181917F018093F10001501109FFEF88
-:10217000CF1ADF0A01151105D1F601C0B82E8B2D3B
-:10218000DF91CF911F910F91FF90EF90DF90CF9053
-:10219000BF9008954091E1015091E2014617570721
-:1021A00048F06115710539F44091E8004E7740938D
-:1021B000E80001C0BA01FC0140E033C08091DA01BF
-:1021C000882309F442C0853009F441C08091E800B9
-:1021D00083FD39C08091E80082FD2FC08091E80026
-:1021E00080FF1FC09091F3008091F200392F20E012
-:1021F000A901482BCA0106C041914093F1006150EA
-:10220000710901966115710519F088309105A0F3E7
-:1022100041E0089709F040E08091E8008E778093D4
-:10222000E8006115710551F64111C8CF06C08091D3
-:10223000DA01882351F0853051F08091E80082FF67
-:10224000F6CF80E0089581E0089582E0089583E06C
-:1022500008954091E1015091E2014617570748F077
-:102260006115710539F44091E8004E774093E8001C
-:1022700001C0BA01FC0140E034C08091DA0188233A
-:1022800009F443C0853009F442C08091E80083FD21
-:102290003AC08091E80082FD30C08091E80080FF64
-:1022A00020C09091F3008091F200392F20E0A90125
-:1022B000482BCA0107C044914093F1003196615008
-:1022C000710901966115710519F08830910598F32F
-:1022D00041E0089709F040E08091E8008E77809314
-:1022E000E8006115710549F64111C7CF06C080911C
-:1022F000DA01882351F0853051F08091E80082FFA7
-:10230000F6CF80E0089581E0089582E0089583E0AB
-:102310000895982F2CC09093E900981739F0709188
-:10232000EC002091ED005091F00003C0242F762F97
-:1023300050E021FD02C09F5F1AC03091EB003E7F4C
-:102340003093EB003091ED003D7F3093ED00309104
-:10235000EB0031603093EB007093EC002093ED00C4
-:102360005093F0002091EE0027FDE5CF07C0973095
-:1023700090F28F708093E90081E0089580E00895E5
-:102380008091DB0187FD05C08091E80080FF0EC0D1
-:1023900012C08091E80082FD05C08091DA018111B0
-:1023A000F8CF08958091E8008B7708C08091DA011A
-:1023B0008111EACF08958091E8008E778093E8003C
-:1023C00008958091E4009091E50045E62091EC00AD
-:1023D00020FD1FC023C02091DA01222391F0253077
-:1023E00091F02091EB0025FD10C02091E400309188
-:1023F000E5002817390751F34150C90139F784E046
-:10240000089582E0089583E0089581E0089580E0D2
-:1024100008952091E80020FFDECFF9CF2091E80059
-:1024200022FFD9CFF4CF0E9481120E948912E0EEE0
-:10243000F0E0808181608083E8EDF0E080818F773B
-:10244000808319BCA7EDB0E08C918E7F8C93808146
-:102450008F7E80831092D90108950F931F93CF939D
-:10246000DF930E9481120E948912C8EDD0E088811A
-:102470008F77888388818068888388818F7D88832F
-:1024800019BC1092DA011092D6011092D801109264
-:10249000D70100EE10E0F80180818B7F8083888176
-:1024A0008160888342E060E080E00E948911E1EE73
-:1024B000F0E080818E7F8083E2EEF0E080818160B9
-:1024C0008083808188608083F80180818E7F808313
-:1024D000888180618883DF91CF911F910F9108954A
-:1024E000E8EDF0E080818F7E8083E7EDF0E0808191
-:1024F0008160808384E082BF81E08093D9010C9465
-:102500002D12E8EDF0E080818E7F80831092E20052
-:1025100008951092DA001092E10008951F920F9230
-:102520000FB60F9211242F933F934F935F936F93A6
-:102530007F938F939F93AF93BF93EF93FF9380917C
-:10254000E10082FF0BC08091E20082FF07C0809112
-:10255000E1008B7F8093E1000E94B40E8091DA004D
-:1025600080FF1FC08091D80080FF1BC08091DA00DF
-:102570008E7F8093DA008091D90080FF0DC080E1CA
-:1025800089BD82E189BD09B400FEFDCF81E0809361
-:10259000DA010E948B0E05C019BC1092DA010E946C
-:1025A0009D0E8091E10080FF19C08091E20080FFC4
-:1025B00015C08091E2008E7F8093E2008091E2005E
-:1025C00080618093E2008091D80080628093D8007F
-:1025D00019BC85E08093DA010E94A80E8091E10089
-:1025E00084FF30C08091E20084FF2CC080E189BD6F
-:1025F00082E189BD09B400FEFDCF8091D8008F7DB6
-:102600008093D8008091E1008F7E8093E1008091DB
-:10261000E2008F7E8093E2008091E20081608093EF
-:10262000E2008091D601882311F084E007C08091F8
-:10263000E30087FF02C083E001C081E08093DA01FC
-:102640000E94AE0E8091E10083FF29C08091E200DC
-:1026500083FF25C08091E100877F8093E10082E0C5
-:102660008093DA011092D6018091E1008E7F8093F1
-:10267000E1008091E2008E7F8093E2008091E20091
-:1026800080618093E20042E060E080E00E94891176
-:102690008091F00088608093F0000E94A40EFF916A
-:1026A000EF91BF91AF919F918F917F916F915F91CA
-:1026B0004F913F912F910F900FBE0F901F90189543
-:1026C0001F920F920FB60F9211242F933F934F93A7
-:1026D0005F936F937F938F939F93AF93BF93CF93AA
-:1026E000EF93FF938091E9008F709091EC0090FF41
-:1026F00002C090E801C090E0C92FC82B1092E900F9
-:102700008091F000877F8093F00078940E94A4135A
-:102710001092E9008091F00088608093F000CF7003
-:10272000C093E900FF91EF91CF91BF91AF919F913D
-:102730008F917F916F915F914F913F912F910F906A
-:102740000FBE0F901F9018951F93CF93DF93CDB7B7
-:10275000DEB7AC970FB6F894DEBF0FBECDBFEBED82
-:10276000F1E08091F100819321E0E33EF207C9F7A7
-:102770000E94FB0E8091E80083FF37C18091DB014E
-:102780009091DC01953009F488C038F49130B1F1B2
-:1027900070F0933009F029C131C0983009F4F8C0C5
-:1027A000993009F404C1963009F01FC19DC08038EA
-:1027B00021F0823809F019C108C08091D7019091A9
-:1027C000D801992389F082600FC08091DF01909138
-:1027D000E0018F7099278093E9008091EB0085FBE1
-:1027E000882780F91092E9009091E800977F9093F4
-:1027F000E8008093F1001092F100D5C0882319F011
-:10280000823009F0F2C08F7121F0823009F0EDC002
-:102810000BC08091DD01813009F0E7C0933009F0F1
-:1028200080E08093D8012FC08091DD0181112BC001
-:102830008091DF019091E0018F709927009709F452
-:10284000D4C08093E9002091EB0020FF1CC02091B0
-:10285000DC01233021F48091EB00806212C0909162
-:10286000EB0090619093EB0021E030E001C0220F7B
-:102870008A95EAF72093EA001092EA008091EB0033
-:1028800088608093EB001092E9008091E800877FD8
-:102890008093E8000E94C011A8C08111A6C0809159
-:1028A000DD019091DE018F779927182F9091E30039
-:1028B0009078982B9093E3008091E800877F809335
-:1028C000E8000E94C0118091E80080FFFCCF809159
-:1028D000E30080688093E300112311F083E001C0DE
-:1028E00082E08093DA0181C08058823008F07DC098
-:1028F0008091DD019091DE018C3D23E0920779F516
-:1029000083E08A838AE289834FB7F894DE011396C5
-:1029100020E03EE051E2E32FF0E050935700E491D5
-:1029200020FF03C0E295EF703F5FEF708E2F90E0C5
-:10293000EA3010F0C79601C0C0968D939D932F5F2B
-:10294000243149F74FBF8091E800877F8093E800EA
-:102950006AE270E0CE0101960E94CA1013C0AE0177
-:10296000455D5F4F6091DF010E9400100097E9F123
-:102970002091E800277F2093E800BC018BA59CA54F
-:102980000E9429118091E8008B778093E8002DC088
-:10299000803859F58091E800877F8093E800809126
-:1029A000D6018093F1008091E8008E7771CF81117C
-:1029B0001CC09091DD019230C0F48091E800877FC7
-:1029C0008093E8009093D6010E94C0118091D601B7
-:1029D000811104C08091E30087FF02C084E001C040
-:1029E00081E08093DA010E94E20E8091E80083FF8B
-:1029F0000AC08091E800877F8093E8008091EB0017
-:102A000080628093EB00AC960FB6F894DEBF0FBEE9
-:102A1000CDBFDF91CF911F91089590935E01809378
-:102A20005D01089580915D0190915E010895E091AE
-:102A30005D01F0915E01309721F00190F081E02D71
-:102A4000099480E00895FF920F931F93CF93DF9333
-:102A50008C01E0915D01F0915E01309799F1028067
-:102A6000F381E02D09958091BF0182FF2BC080FF8B
-:102A700004C08FE295E00E94FB08E80180E1F82E97
-:102A800001E415E08091BF0180FF0BC088811F9297
-:102A90008F931F930F930E9494090F900F900F90A4
-:102AA0000F90FA942196F110EDCF8091BF0180FF35
-:102AB00009C087E495E0DF91CF911F910F91FF90BE
-:102AC0000C94FB08DF91CF911F910F91FF90089517
-:102AD000E0915D01F0915E01309721F00480F58175
-:102AE000E02D0994089520915F01309160018217D3
-:102AF000930771F09093600180935F01E0915D0115
-:102B0000F0915E01309721F00680F781E02D099465
-:102B1000089520916101309162018217930771F04D
-:102B20009093620180936101E0915D01F0915E01FB
-:102B3000309721F00084F185E02D099408950E94DA
-:102B4000A9220E94AA090E947D230C94872ECF936C
-:102B5000C82F8091BF0182FF1EC080FF04C089E49E
-:102B600095E00E94FB088091BF0180FF0CC01F927E
-:102B7000CF932CE535E03F932F930E9494090F905B
-:102B80000F900F900F908091BF0180FF04C081E6ED
-:102B900095E00E94FB088C2FCF910C94270D5F923B
-:102BA0006F927F928F929F92AF92BF92CF92DF925D
-:102BB000EF92FF920F931F93CF93DF93CDB7DEB7C2
-:102BC0002A970FB6F894DEBF0FBECDBF0E94EB0967
-:102BD00093E6C92E91E0D92E00E010E0AA24A39438
-:102BE000B12C502E802F0E94060B3C01F601E19083
-:102BF000F1906F01E826F926E114F10431F40F5F3A
-:102C00001F4F0430110569F73AC08091BF0181FD63
-:102C10000E940F0B20E030E04501022E02C0880C1C
-:102C2000991C0A94E2F7C4018E219F21892B09F196
-:102C30002E835F826820792081E0672809F480E094
-:102C400088870E94B2228160782F9A8789874E8177
-:102C50005F8168858A850E948816F801EE0FFF1F44
-:102C6000ED59FE4F8081918188259925918380833C
-:102C700016C02F5F3F4F2C30310571F6C0CF8FEF5C
-:102C800089838A831B820E94B2228160782F9D8370
-:102C90008C8349815A816B818D810E9488160E94A4
-:102CA000FB2610916B010E9417151817D9F00E948E
-:102CB000171580936B012A960FB6F894DEBF0FBEEE
-:102CC000CDBFDF91CF911F910F91FF90EF90DF90DB
-:102CD000CF90BF90AF909F908F907F906F905F90BC
-:102CE0000C94A7152A960FB6F894DEBF0FBECDBF81
-:102CF000DF91CF911F910F91FF90EF90DF90CF90D8
-:102D0000BF90AF909F908F907F906F905F9008954D
-:102D1000CF93DF93CDB7DEB72B970FB6F894DEBF16
-:102D20000FBECDBF4F83588769877A878B87DE01B7
-:102D3000119686E0FD0111928A95E9F785E0FE0182
-:102D4000379601900D928A95E1F749815A816B81FE
-:102D50007C818D819E810E94601E2B960FB6F89417
-:102D6000DEBF0FBECDBFDF91CF910895CF93C82FA7
-:102D7000882309F4C1C0823859F40E94171581FDD7
-:102D8000BBC089E30E94C5200E949A2189E30CC040
-:102D9000833879F40E94171580FDAEC083E50E9448
-:102DA000C5200E949A2183E50E941321CF910C94A3
-:102DB0009A21843859F40E94171582FD9DC087E43A
-:102DC0000E94C5200E949A2187E4EECF8450813A68
-:102DD00048F48C2F0E94112D81118EC08C2F0E94DF
-:102DE000C520E4CF8C2F805E883050F4C77081E01E
-:102DF00090E001C0880FCA95EAF70E946121D6CF02
-:102E00008C2F855A833078F4C53A29F0C63A31F4CC
-:102E100082E890E005C081E890E002C083E890E09D
-:102E2000CF910C9473158C2F885A833108F064C0AD
-:102E3000C83A39F1C93A41F1CA3A49F1CB3A51F1AC
-:102E4000CC3A59F1CD3A61F1C03B69F1CE3A71F11A
-:102E5000CF3A79F1C13B81F1C23B89F1C33B91F19A
-:102E6000C43B99F1C53BA1F1C63BA9F1C73BB1F108
-:102E7000C83BB9F1C93BC1F1CA3BC9F58AE292E04E
-:102E800038C082EE90E035C089EE90E032C08AEE24
-:102E900090E02FC085EB90E02CC086EB90E029C03D
-:102EA00087EB90E026C08CEC90E023C08DEC90E0A6
-:102EB00020C083E891E01DC08AE891E01AC082E951
-:102EC00091E017C084E991E014C081E292E011C062
-:102ED00083E292E00EC084E292E00BC085E292E0D1
-:102EE00008C086E292E005C087E292E002C080E07E
-:102EF00090E0CF910C948915CF910895882309F41F
-:102F00004DC0823859F40E94171581FF47C089E3EC
-:102F10000E94C5200E949A2189E30CC0833871F475
-:102F20000E94171580FF3AC083E50E94C5200E94C9
-:102F30009A2183E50E9413210C949A21843859F434
-:102F40000E94171582FF2AC087E40E94C5200E94B4
-:102F50009A2187E4EFCF982F9450913A08F4EACF62
-:102F6000982F905E983058F4282F277081E090E0D9
-:102F700001C0880F2A95EAF70E946721DDCF982FBC
-:102F8000955A933020F480E090E00C947315885AA1
-:102F9000833120F480E090E00C9489150895882313
-:102FA00021F00E9461210C949A210895882321F038
-:102FB0000E9467210C949A210895BF92CF92DF92CC
-:102FC000EF92FF920F931F93CF93DF93CDB7DEB7AE
-:102FD00027970FB6F894DEBF0FBECDBF8C0185E0FA
-:102FE000F801DE01119601900D928A95E1F7F80142
-:102FF00030812181F280558152955F708381948167
-:10300000892B39F02F3F41F481E090E03F3F31F0D0
-:1030100003C081E090E002C080E090E080FD73C3D7
-:1030200039832A8389819A815E830E948220B92E06
-:103030008F830E9481200E94A91F2B2D22952F7023
-:1030400030E05E816F812530310509F4E6C06CF413
-:10305000243031050CF0A2C04B2D407F8B2D8F709A
-:10306000223031050CF045C017C02C3031054CF42E
-:103070002A3031050CF0E7C12830310509F043C38F
-:10308000E5C02D30310509F4BAC20CF4A2C22F30CC
-:10309000310509F038C323C3182F411101C002C004
-:1030A0001295107FFF2059F0112309F46BC2812F74
-:1030B0006F830E9471210E949A216F8163C2862FC3
-:1030C0000E947E17112309F41EC3812F0E947721CD
-:1030D00027960FB6F894DEBF0FBECDBFDF91CF911C
-:1030E0001F910F91FF90EF90DF90CF90BF900C94C5
-:1030F0009A21403211F08295807F662319F0613069
-:1031000071F523C0FF20B1F0511101C032C0513020
-:1031100081F527960FB6F894DEBF0FBECDBFDF91C5
-:10312000CF911F910F91FF90EF90DF90CF90BF90C4
-:103130000C948121511101C003C0513009F4E3C244
-:103140008E830E9484218E819AC1FF2021F0563007
-:1031500008F0D9C20EC0553008F0D5C290C1FF208A
-:10316000C9F0552331F0F801958190FF0BC29F7093
-:10317000958327960FB6F894DEBF0FBECDBFDF91C3
-:10318000CF911F910F91FF90EF90DF90CF90BF9064
-:103190000C94CF17552309F472C109C22B2D269523
-:1031A0002695237030E02115310529F021303105B5
-:1031B00009F0A9C219C0FF2021F0862F9B2D937022
-:1031C00002C080E090E027960FB6F894DEBF0FBEF5
-:1031D000CDBFDF91CF911F910F91FF90EF90DF90C6
-:1031E000CF90BF900C947315FF2021F0862F9B2D5C
-:1031F000937002C080E090E027960FB6F894DEBF8F
-:103200000FBECDBFDF91CF911F910F91FF90EF9037
-:10321000DF90CF90BF900C948915862FFF2019F076
-:103220000E947F2502C00E94E72527960FB6F894DA
-:10323000DEBF0FBECDBFDF91CF911F910F91FF90E9
-:10324000EF90DF90CF90BF900C946E268B2D837003
-:1032500009F079C0F11057C2262F229526952770C4
-:10326000220F220F862F8F70C82ED12CE12CF12C2B
-:10327000022E04C0CC0CDD1CEE1CFF1C0A94D2F7FD
-:1032800064FF10C06FE070E080E090E004C0660F63
-:10329000771F881F991F2A95D2F7609570958095A2
-:1032A000909503C060E070E0CB012B2D269526950C
-:1032B0002370422F50E042305105D9F04330510580
-:1032C00069F16C297D298E299F294130510551F1E1
-:1032D00027960FB6F894DEBF0FBECDBFDF91CF911A
-:1032E0001F910F91FF90EF90DF90CF90BF900C94C3
-:1032F000BE1F6C297D298E299F2927960FB6F89429
-:10330000DEBF0FBECDBFDF91CF911F910F91FF9018
-:10331000EF90DF90CF90BF900C94D01F0E94BE1F03
-:10332000C701B60127960FB6F894DEBF0FBECDBF1A
-:10333000DF91CF911F910F91FF90EF90DF90CF9091
-:10334000BF900C94AC1FFF2019F08B2D817001C031
-:103350008695882309F4D7C1262F229526952770B4
-:10336000220F220F862F8F70C82ED12CE12CF12C2A
-:10337000022E04C0CC0CDD1CEE1CFF1C0A94D2F7FC
-:1033800064FF10C06FE070E080E090E004C0660F62
-:10339000771F881F991F2A95D2F7609570958095A1
-:1033A000909503C060E070E0CB012B2D269526950B
-:1033B0002370422F50E042305105D9F0433051057F
-:1033C00069F16C297D298E299F294130510551F1E0
-:1033D00027960FB6F894DEBF0FBECDBFDF91CF9119
-:1033E0001F910F91FF90EF90DF90CF90BF900C94C2
-:1033F0005D206C297D298E299F2927960FB6F89488
-:10340000DEBF0FBECDBFDF91CF911F910F91FF9017
-:10341000EF90DF90CF90BF900C946F200E945D20C2
-:10342000C701B60127960FB6F894DEBF0FBECDBF19
-:10343000DF91CF911F910F91FF90EF90DF90CF9090
-:10344000BF900C944B20603F59F120F4603E08F48B
-:1034500094C008C0623F09F467C0F0F1633F09F00F
-:103460008CC065C0162F1F708B2D8F71FF2021F02F
-:103470000E94F61F812F7DCE0E941120812F27965A
-:103480000FB6F894DEBF0FBECDBFDF91CF911F9175
-:103490000F91FF90EF90DF90CF90BF900C94D617D4
-:1034A000FF20B1F0553008F02EC18B2D8F7127967B
-:1034B0000FB6F894DEBF0FBECDBFDF91CF911F9145
-:1034C0000F91FF90EF90DF90CF90BF900C94302041
-:1034D000563008F018C1E9CFFF2099F08B2D8F717D
-:1034E00027960FB6F894DEBF0FBECDBFDF91CF9108
-:1034F0001F910F91FF90EF90DF90CF90BF900C94B1
-:10350000F61F8B2D8F7127960FB6F894DEBF0FBE76
-:10351000CDBFDF91CF911F910F91FF90EF90DF9082
-:10352000CF90BF900C941120F110EBCFD7CFFF209C
-:1035300099F08B2D8F7127960FB6F894DEBF0FBED2
-:10354000CDBFDF91CF911F910F91FF90EF90DF9052
-:10355000CF90BF900C94E71F27960FB6F894DEBF6C
-:103560000FBECDBFDF91CF911F910F91FF90EF90D4
-:10357000DF90CF90BF900C94E21FFF20A9F055235D
-:1035800009F4ACCF862F27960FB6F894DEBF0FBE96
-:10359000CDBFDF91CF911F910F91FF90EF90DF9002
-:1035A000CF90BF900C94B616552309F4AACF862F5E
-:1035B00027960FB6F894DEBF0FBECDBFDF91CF9137
-:1035C0001F910F91FF90EF90DF90CF90BF900C94E0
-:1035D0007E174B2D4F70C8010E94580B27960FB6CF
-:1035E000F894DEBF0FBECDBFDF91CF911F910F9139
-:1035F000FF90EF90DF90CF90BF900C94161FF110CA
-:1036000082C09B2D9F70492F50E04230510599F1A7
-:1036100044F44115510569F04130510509F073C07A
-:1036200019C043305105C1F14430510509F06BC058
-:1036300044C027960FB6F894DEBF0FBECDBFDF9112
-:10364000CF911F910F91FF90EF90DF90CF90BF909F
-:103650000C94982E27960FB6F894DEBF0FBECDBF00
-:10366000DF91CF911F910F91FF90EF90DF90CF905E
-:10367000BF900C94C22E27960FB6F894DEBF0FBEF3
-:10368000CDBFDF91CF911F910F91FF90EF90DF9011
-:10369000CF90BF900C94F12E27960FB6F894DEBF12
-:1036A0000FBECDBFDF91CF911F910F91FF90EF9093
-:1036B000DF90CF90BF900C94172F862F27960FB6D0
-:1036C000F894DEBF0FBECDBFDF91CF911F910F9158
-:1036D000FF90EF90DF90CF90BF900C944E2F4B2D2A
-:1036E0004F70C80127960FB6F894DEBF0FBECDBF4E
-:1036F000DF91CF911F910F91FF90EF90DF90CF90CE
-:10370000BF900C94290C27960FB6F894DEBF0FBE1D
-:10371000CDBFDF91CF911F910F91FF90EF90DF9080
-:10372000CF90BF9008950E947E210E9453210E9455
-:103730009A210E949C270E946E2680E090E00E94C1
-:10374000731580E090E00C9489150E946E210C9412
-:10375000931B0E948220292F22952F7030E02C305D
-:1037600031054CF42A3031056CF4225031092230F5
-:10377000310570F407C02C30310531F02F303105A0
-:1037800039F402C081E0089593FB882780F90895F9
-:1037900080E00895CF93DF9300D000D01F92CDB783
-:1037A000DEB70F900F900F900F900F90DF91CF9199
-:1037B0000895CF93DF9300D000D000D0CDB7DEB70F
-:1037C00026960FB6F894DEBF0FBECDBFDF91CF9126
-:1037D00008951F93CF93DF93C091A20116E012C00A
-:1037E000D0E01C9FF0011D9FF00D1124EE58FE4FFC
-:1037F0004081518162817381848195810E94D91BAE
-:103800002196C7708091A301C813EACFDF91CF91B1
-:103810001F91089540916C0150916D0160916E016E
-:1038200070916F0180917001909171010C94D91B7E
-:103830000F931F93CF93DF938091710182958F70C7
-:1038400009F069C080916E01882309F464C0A091D9
-:10385000A201D091A301B0916C01C0916D01809142
-:103860006F019091700121E030E0BF3F11F020E046
-:1038700030E0122FBC016095709506E04AC00097B9
-:1038800021F0CF3F29F4212F05C021E030E002C014
-:1038900020E030E020FD3BC04A2F50E0049FF001C3
-:1038A000059FF00D1124EE58FE4F2181C2132FC049
-:1038B0002081B2132CC02281211129C0238134819F
-:1038C0002817390718F0281B390B02C0260F371F9D
-:1038D000283C3105E0F4809171018F708061809304
-:1038E000710186E0849FF001859FF00D1124E95855
-:1038F000FE4F80818F70806180838CE691E00E9412
-:10390000DD17DF91CF911F910F910C94E91BAF5FF1
-:10391000A770AD13B4CFDF91CF911F910F91089590
-:10392000EF92FF920F931F93CF93DF93CDB7DEB744
-:1039300062970FB6F894DEBF0FBECDBF8C0185E055
-:10394000F801DE011D9601900D928A95E1F7D801EC
-:103950004C9111965C91119712966C911297139657
-:10396000ED90FC90149770916C01E0916D01809145
-:103970006F0190917001009739F0EF3F41F421E021
-:1039800030E07F3F31F003C021E030E002C020E0B2
-:1039900030E020FD5CC120916E01222309F4F1C0CA
-:1039A000E816F90628F09701281B390BC90104C055
-:1039B000809590958E0D9F1D883C910508F098C0CC
-:1039C00080917101982F907F09F064C0E51314C0B5
-:1039D000741312C0611110C08F70806180937101E7
-:1039E0000E940A1C8CE691E00E94DD178091710113
-:1039F000D80115968C9343C1EF2839F05F3F41F40D
-:103A000081E090E04F3F31F003C081E090E002C0E0
-:103A100080E090E080FD03C081E0862702C080E066
-:103A200090E080FF2EC08091A2012091A30136E09A
-:103A300013C090E0389FF001399FF00D1124EE582B
-:103A4000FE4F7181571306C07081471303C0728106
-:103A5000671317C0019687708213EBCF12C19F7056
-:103A600059F0882309F40BC107C09F7029F0F801B1
-:103A70009581907F09F403C1805E883008F4FFC00F
-:103A8000D2C0662309F4FBC08091710181608093EC
-:103A90007101F5C0E51308C0741306C0611104C0BC
-:103AA000D80115968C939DC04D875E878D859E8528
-:103AB0006A8B0E94A91B6A89882309F4B4C0662313
-:103AC00009F4B1C020917101822F82958F7090E02E
-:103AD00002970CF4C6C080916C0190916D0198879B
-:103AE0008F831986FB86EA862C87CE01079646C00F
-:103AF00080917101982F907F59F47E2DF98AE88A80
-:103B000089890E94CA1B8CE691E00E94DD1795C04E
-:103B1000E51311C074130FC061110DC0F801858346
-:103B2000C8010E94DD17ECE6F1E086E0DF011D929E
-:103B30008A95E9F7A2C04D875E878D859E856A8B41
-:103B40000E94A91B6A89882309F46DC0662309F4C1
-:103B50006AC020917101822F82958F7090E0029748
-:103B60000CF47FC080916C0190916D019A838983E0
-:103B70001B82FD82EC822E83CE0101960E94DD170E
-:103B800070C0E816F90628F09701281B390BC90107
-:103B900004C0809590958E0D9F1D883C910508F07E
-:103BA00046C0662309F43FC0E51330C074132EC02D
-:103BB0002091710120FD21C0322F32953F70832F5B
-:103BC00090E00097D1F0D80115962C9315970F9798
-:103BD00041F0832F8F5F8295807F2F70282B159661
-:103BE0002C93C8010E94DD1786E0F801ACE6B1E035
-:103BF00001900D928A95E1F73EC086E0F801ACE6AF
-:103C0000B1E001900D928A95E1F737C04D875E874C
-:103C10008D859E850E94A91B811123C08091710111
-:103C2000816080937101C8010E94DD1726C07E2D3E
-:103C3000F98AE88A89890E94CA1BECE6F1E086E0ED
-:103C4000DF011D928A95E9F70E940A1C18C06623BD
-:103C500051F34D875E878D859E850E94A91B882321
-:103C600011F386E0F801ACE6B1E001900D928A957F
-:103C7000E1F70E94181C0E940A1C81E014C080E039
-:103C800012C04D875E878D859E850E948220292FD8
-:103C900022952F7030E0223031050CF4E0CE243034
-:103CA00031050CF6E2CE62960FB6F894DEBF0FBE79
-:103CB000CDBFDF91CF911F910F91FF90EF900895AD
-:103CC0001F93CF93DF93CDB7DEB72C970FB6F89441
-:103CD000DEBF0FBECDBF4F83588769877A878B873A
-:103CE0009C87CE0107960E94901C8823D9F02F81D3
-:103CF00038858A859B85892B39F03F3F19F080E014
-:103D000090E004C02F3FD9F781E090E0892B09F0C3
-:103D10006DC04F81588569857A858B859C850E9409
-:103D2000D91B64C086E0FE013796DE011196019032
-:103D30000D928A95E1F7FF81E8854A855B854115FB
-:103D4000510539F0EF3F41F481E090E0FF3F31F061
-:103D500003C081E090E002C080E090E080FD46C0BA
-:103D60002091A30130E0C9010196877099276091E5
-:103D7000A20170E08617970709F440C0F983EA832F
-:103D80005D834C8396E0929FD001939FB00D1124E8
-:103D9000AE58BE4FFE01319601900D929A95E1F713
-:103DA0008093A3010E94E91B21C0189FC001112428
-:103DB0008E589E4F0E94901C882371F1E091A201C1
-:103DC0001E9FF0011124EE58FE4F40815181628107
-:103DD0007381848195810E94D91B8091A20190E01A
-:103DE0000196877099278093A20101C016E0809107
-:103DF000A2019091A3018913D8CF0EC00E94A51BE8
-:103E00001092A3011092A201ECE6F1E086E0DF013E
-:103E10001D928A95E9F7EACF2C960FB6F894DEBF8B
-:103E20000FBECDBFDF91CF911F910895DF92EF922A
-:103E3000FF920F931F93CF93DF93EC01009709F448
-:103E40006CC0D12CEE24E394F12C8E010F5F1F4F38
-:103E5000FE018491843748F4843008F04AC08130F0
-:103E600071F0823009F059C01EC0853709F43DC099
-:103E700070F1982F9458903708F04FC03DC02296AB
-:103E8000F8018491982F905E983050F48770FE2D41
-:103E900001C0FF0F8A95EAF78F2F0E94712130C071
-:103EA0000E94B6162DC02296F8018491982F905E3C
-:103EB000983050F48770FE2D01C0FF0F8A95EAF705
-:103EC0008F2F0E9477211CC00E947E1719C0229656
-:103ED000F801049107C08FE99FE00197F1F700C056
-:103EE000000001500111F7CF0BC02296F801D490C9
-:103EF00007C00E94B61603C08F770E947E17E801A4
-:103F00008D2D07C08150EFE9FFE03197F1F700C038
-:103F10000000882309F499CFF5CFDF91CF911F914D
-:103F20000F91FF90EF90DF9008956093A801709338
-:103F3000A9018093AA019093AB010C94931B609309
-:103F4000A4017093A5018093A6019093A7010C94FE
-:103F5000931B08950C94951F0F931F930091A80134
-:103F60001091A9012091AA013091AB01602B712B16
-:103F7000822B932B1F910F910C94951F0F931F93DE
-:103F80000091A8011091A9012091AA013091AB01E3
-:103F900060237123822393231F910F910C94951F0B
-:103FA0000F931F930091A8011091A9012091AA01DC
-:103FB0003091AB0160277127822793271F910F91C2
-:103FC0000C94951F60E070E0CB010C949F1F41E0C2
-:103FD00050E060E070E004C0440F551F661F771F7B
-:103FE0008A95D2F7CB01BA010C949F1F41E050E0B3
-:103FF00060E070E004C0440F551F661F771F8A956C
-:10400000D2F78091A4019091A501A091A601B09151
-:10401000A701482B592B6A2B7B2BCB01BA010C949F
-:104020009F1F41E050E060E070E004C0440F551F66
-:10403000661F771F8A95D2F74095509560957095C9
-:104040008091A4019091A501A091A601B091A70132
-:10405000482359236A237B23CB01BA010C949F1F69
-:1040600041E050E060E070E004C0440F551F661F5F
-:10407000771F8A95D2F78091A4019091A501A09114
-:10408000A601B091A701482759276A277B27CB01B2
-:10409000BA010C949F1F0F931F930091A4011091DC
-:1040A000A5012091A6013091A701602B712B822BD5
-:1040B000932B1F910F910C949F1F0F931F930091AF
-:1040C000A4011091A5012091A6013091A7016023C0
-:1040D0007123822393231F910F910C949F1F0F93A1
-:1040E0001F930091A4011091A5012091A601309188
-:1040F000A70160277127822793271F910F910C94A6
-:104100009F1F0895CF92DF92EF92FF920F931F931C
-:10411000CF93DF93EC01C090A801D090A901E0906B
-:10412000AA01F090AB018091A4019091A501A0910A
-:10413000A601B091A701C82AD92AEA2AFB2A0FE1D1
-:1041400010E0B701A601002E04C07695679557953B
-:1041500047950A94D2F740FF08C0BE01802F0E9405
-:104160004F0C8130910509F007C00150110948F743
-:10417000BE0180E00E944F0CDF91CF911F910F9103
-:10418000FF90EF90DF90CF90089590910D019923CB
-:1041900041F1982F9695969596959F3088F4E091E9
-:1041A0000E01F0910F01E90FF11D877021E030E061
-:1041B00001C0220F8A95EAF78181822B81830895BD
-:1041C0009091BF0190FF2EC01F928F9383E695E0E0
-:1041D0009F938F930E9494090F900F900F900F90D0
-:1041E000089540910E0150910F0120E030E09FEFC3
-:1041F000FA01E20FF31F62816817A1F09F3F19F4E3
-:10420000611101C0922F2F5F3F4F2E30310581F792
-:1042100007C0FA01E90FF11D97FDFA958283089511
-:104220009F3FB9F7089590910D01992349F1982F77
-:104230009695969596959F3090F4E0910E01F091A9
-:104240000F01E90FF11D877021E030E001C0220F5E
-:104250008A95EAF7209581812823218308959091FA
-:10426000BF0190FF1FC01F928F9381E895E09F933D
-:104270008F930E9494090F900F900F900F900895C4
-:1042800040910E0150910F0120E030E0FA01E20F61
-:10429000F31F9281981301C012822F5F3F4F2E307F
-:1042A0003105A1F7089581E090E0E0910E01F091D1
-:1042B0000F01E80FF91F1082019680319105A9F7CF
-:1042C00008959091AC01982B9093AC01089580953E
-:1042D0009091AC0198239093AC0108951092AC0199
-:1042E00008959091AD01982B9093AD01089580951C
-:1042F0009091AD0198239093AD0108951092AD0176
-:1043000008958093AE0108951092AE0108954091F2
-:104310000E0150910F0120E030E080E0FA01E20F41
-:10432000F31F918191118F5F2F5F3F4F2F30310528
-:10433000A9F70895E0910E01F0910F018091AC0171
-:104340008083E0910E01F0910F0180819091AD0189
-:10435000892B80839091AE01992361F0E0910E0149
-:10436000F0910F018081892B80830E948721811128
-:104370000E94842180910E0190910F010C942315CD
-:104380009093C2018093C1010895CF92DF92EF9282
-:10439000FF920F931F936C01EE24FF24C114D104EC
-:1043A000E104F10421F46B017C0180E001C080E1B3
-:1043B00033272F2D1E2D0D2D01151105210531053A
-:1043C00019F0885F6801790197018601A4E03695AC
-:1043D000279517950795AA95D1F701151105210580
-:1043E000310519F08C5F6801790197018601F2E0CF
-:1043F0003695279517950795FA95D1F7011511056B
-:104400002105310519F08E5F68017901B701A60118
-:104410007695679557954795452B462B472B09F081
-:104420008F5F1F910F91FF90EF90DF90CF900895D5
-:104430008295982F9C7C96959695837344E0849FF3
-:1044400090011124922B892F8A7A86959575990F60
-:10445000892B08951F93CF93DF931F92CDB7DEB7BB
-:1044600099830E941822182F9981892F0E9418225F
-:10447000312F20E0282BC9010F90DF91CF911F91A0
-:1044800008958091DA01843009F11092C00120E48E
-:1044900088E190E00FB6F894A895809360000FBE75
-:1044A0002093600083B7817F846083BF83B781607E
-:1044B00083BF7894889583B78E7F83BF88E10FB6DA
-:1044C000F89480936000109260000FBE0895CF931F
-:1044D0000E94560B0E94EB090E94570BC0E08C2FE4
-:1044E0000E94060B892B29F4CF5FC430C1F780E00E
-:1044F00001C081E0CF9108950E94A51B0C94872EE6
-:104500001F920F920FB60F9211248F939F93AF9328
-:10451000BF938091C001811113C08091C30190911C
-:10452000C401A091C501B091C6014196A11DB11D64
-:104530008093C3019093C401A093C501B093C601B9
-:10454000BF91AF919F918F910F900FBE0F901F90D1
-:10455000189582E084BD93E095BD9AEF97BD809356
-:104560006E0008958FB7F8944091C3015091C40133
-:104570006091C5017091C6018FBFCA010895CF92A5
-:10458000DF92EF92FF920F931F932FB7F894409111
-:10459000C3015091C4016091C5017091C6012FBF44
-:1045A0006A017B01EE24FF248C0120E030E0C0167C
-:1045B000D106E206F30620F09A01281B390B05C04C
-:1045C0009C0120953095240F351FC9011F910F9133
-:1045D000FF90EF90DF90CF9008951F920F920FB64B
-:1045E0000F9211248F939F93AF93BF938091C30138
-:1045F0009091C401A091C501B091C6010196A11D81
-:10460000B11D8093C3019093C401A093C501B093E1
-:10461000C601BF91AF919F918F910F900FBE0F90E8
-:104620001F9018950E941312F8942FEF87EA91E6D5
-:10463000215080409040E1F700C0000087E090EBFF
-:10464000DC018093E4019093E501A093E601B0932F
-:10465000E7012CE088E190E00FB6F894A8958093EC
-:1046600060000FBE20936000FFCFCF92DF92EF92E9
-:10467000FF920F931F93CF93DF93C82ED12C01E0AD
-:1046800010E08D2D0E94060B7C01C0E0D0E0980167
-:104690000C2E02C0220F331F0A94E2F72E213F2175
-:1046A000232B29F42196CC30D10589F708C06C2F33
-:1046B0007D2D80E00E942A0CC812F4CF06C0D3944E
-:1046C00084E0D812DECF80E001C081E0DF91CF919D
-:1046D0001F910F91FF90EF90DF90CF900895CF93AF
-:1046E000C82F8CE20E943523882321F08C2FCF9194
-:1046F0000C94352380E0CF910895CF930E94CF246E
-:10470000811102C00E94B0248FE995E00E94FB084D
-:10471000C5E608C00E94EB098FE39CE90197F1F719
-:1047200000C00000C150B1F784EB95E00E94FB0887
-:1047300089E20E946F23811111C18AE20E946F23D6
-:1047400081110E94B02485E00E946F2381110E9494
-:1047500012230E94DA248093BF0187E00E946F2316
-:10476000882399F18BE10E946F23882351F0909167
-:10477000BF0191FB882780F921E0822780FB91F916
-:1047800022C08EE00E946F23882351F09091BF01D8
-:1047900092FB882780F921E0822780FB92F913C0E1
-:1047A00080E10E946F239091BF01882341F093FB29
-:1047B000882780F921E0822780FB93F904C0892FA4
-:1047C000809580FB90F99093BF018091BF010E947A
-:1047D000DE240E94EC248093D40180EE0E946F239B
-:1047E000882341F08091D401982F909590FB80F917
-:1047F0008093D40189E30E946F23882359F090911C
-:10480000D40191FB882780F921E0822780FB91F970
-:104810009093D40182EE0E946F23882359F09091E7
-:10482000D40192FB882780F921E0822780FB92F94E
-:104830009093D40186EE0E946F23882359F09091C3
-:10484000D40193FB882780F921E0822780FB93F92C
-:104850009093D40183EE0E946F23882359F09091A6
-:10486000D40194FB882780F921E0822780FB94F90A
-:104870009093D40185E30E946F23882359F090918F
-:10488000D40195FB882780F921E0822780FB95F9E8
-:104890009093D40181E30E946F23882359F0909173
-:1048A000D40196FB882780F921E0822780FB96F9C6
-:1048B0009093D40181E10E946F23882359F0909155
-:1048C000D40197FB882780F921E0822780FB97F9A4
-:1048D0009093D4018091D4010E94F0248091D4015E
-:1048E00087FB882780F980930D0187E20E946F2360
-:1048F000C82F8EE10E946F238111C2608FE10E9458
-:104900006F238111C46080E20E946F238111C8600F
-:1049100081E20E946F238111C06182E20E946F23B5
-:104920008111C06283E20E946F238111C06484E21E
-:104930000E946F23882311F0C06802C0CC2329F0A5
-:104940008C2F0E94E7246C2F03C00E94E324682F61
-:1049500070E080E090E0CF910C94AA1FCF91089571
-:104960006DEE7EEF80E090E00E94D63060E082E065
-:1049700090E00E94C83060E083E090E00E94C83080
-:1049800060E084E090E00E94C83060E085E090E064
-:104990000E94C83060E086E090E00C94C83080E06F
-:1049A00090E00E94C23021E08D3E9E4F09F020E051
-:1049B000822F089582E090E00C94BA30682F82E054
-:1049C00090E00C94C83083E090E00C94BA30682FEB
-:1049D00083E090E00C94C83084E090E00C94BA300E
-:1049E000682F84E090E00C94C83086E090E00C944E
-:1049F000BA30682F86E090E00C94C8308091CF01E7
-:104A000080FF0BC06091130185E0689FB001112405
-:104A100075956795759567952AC081FF09C0609166
-:104A2000130185E0689FB0011124759567951FC03B
-:104A300082FF07C06091130185E0689FB0011124D7
-:104A400016C04091C9014423C9F060911201461774
-:104A500088F72091130185E0289F90011124429F3F
-:104A6000C001439F900D112470E00E948C3060388B
-:104A7000710540F46115710539F002C065E070E020
-:104A8000862F08958FE7089581E008958091CF01E2
-:104A900080FF08C06091110170E07595679575956C
-:104AA000679521C081FF06C06091110170E0759586
-:104AB000679519C082FF04C06091110170E010C0B9
-:104AC0008091C9018823C1F0609110018617A0F779
-:104AD00090911101989FC001112470E00E948C30C8
-:104AE0006038710528F46115710521F0862F08954D
-:104AF0008FE7089581E0089561E070E0F4CF803F92
-:104B000021F40E94FE24819504C0813F29F40E9473
-:104B1000FE248093CC010895823F21F40E94FE245C
-:104B2000819504C0833F29F40E94FE248093CB0129
-:104B30000895893F19F40E94462505C08A3F31F443
-:104B40000E94462581958093CD0108958B3F21F4E5
-:104B50000E944625819504C08C3F29F40E94462579
-:104B60008093CE010895843F21F48091CA01816031
-:104B700017C0853F21F48091CA01826011C0863F31
-:104B800021F48091CA0184600BC0873F21F4809199
-:104B9000CA01886005C0883F31F48091CA018061F4
-:104BA0008093CA0108958D3F21F48091CF018160E7
-:104BB0000BC08E3F21F48091CF01826005C08F3FF2
-:104BC00029F48091CF0184608093CF010895803FC4
-:104BD00029F48091CC0187FF6EC007C0813F41F46A
-:104BE0008091CC0118160CF066C01092CC0163C005
-:104BF0009091CB01823F19F497FF5DC005C0833FC0
-:104C000031F419160CF057C01092CB0154C0893FF3
-:104C100031F48091CD0118160CF04DC006C08A3FCA
-:104C200039F48091CD0187FF46C01092CD0143C079
-:104C30008B3F29F48091CE0187FF3DC006C08C3F99
-:104C400039F48091CE011816B4F51092CE0133C01C
-:104C5000843F21F48091CA018E7F05C0853F31F4E5
-:104C60008091CA018D7F8093CA0125C0863F21F4BF
-:104C70008091CA018B7FF7CF873F21F48091CA01D1
-:104C8000877FF1CF883F21F48091CA018F7EEBCFDF
-:104C90008D3F21F48091CF018E7F0BC08E3F21F498
-:104CA0008091CF018D7F05C08F3F29F48091CF0186
-:104CB0008B7F8093CF018091CB0181110EC08091B9
-:104CC000CC0181110AC08091CD01811106C0809173
-:104CD000CE01811102C01092C90108958091BF01D7
-:104CE00083FF7EC08BEB95E00E94FB088091CA0198
-:104CF0001F928F938EED95E09F938F930E9494095E
-:104D000083EE95E00E94FB082091CB01822F99272A
-:104D100087FD90959F932F9385EE95E09F938F93BA
-:104D20000E94940988EE95E00E94FB082091CC0136
-:104D3000822F992787FD90959F932F938AEE95E078
-:104D40009F938F930E9494098DEE95E00E94FB083B
-:104D50002091CD01822F992787FD90959F932F93C6
-:104D60008FEE95E09F938F930E94940982EF95E0D8
-:104D70000E94FB082091CE01822F992787FD9095F4
-:104D80009F932F9384EF95E09F938F930E949409B4
-:104D900087EF95E00E94FB088091C9011F928F93D5
-:104DA0008AEF95E09F938F930E9494098DEF95E091
-:104DB0000E94FB088091CF011F928F938FEF95E0A7
-:104DC0009F938F930E94940982E096E00E94FB08D3
-:104DD0008DB79EB74C960FB6F8949EBF0FBE8DBF91
-:104DE0008AEC91E00E9468150E94B2229093C8015B
-:104DF0008093C7010895CF938091C7019091C80116
-:104E00000E94BF224091C901442321F02091140146
-:104E100030E006C0209115015AE0259F9001112431
-:104E20008217930708F486C08091CB0181110DC0D1
-:104E30009091CC01911109C09091CD01911105C0C3
-:104E40009091CE01992309F475C04F3F19F04F5F3F
-:104E50004093C901181624F40E94FE248093CB01CC
-:104E60008091CB0187FF05C00E94FE24819580932D
-:104E7000CB018091CC01181624F40E94FE2480936B
-:104E8000CC018091CC0187FF05C00E94FE24819552
-:104E90008093CC016091CB01662339F1C091CC01A4
-:104EA000CC2319F1772767FD7095872F972F0E94E4
-:104EB0009D2F23E333E343E35FE30E9401300E942D
-:104EC0006A2F6093CB016C2F772767FD7095872F32
-:104ED000972F0E949D2F23E333E343E35FE30E9478
-:104EE00001300E946A2F6093CC018091CD01181689
-:104EF00024F40E9446258093CD018091CD0187FF47
-:104F000005C00E94462581958093CD018091CE01F8
-:104F1000181624F40E9446258093CE018091CE017C
-:104F200087FF05C00E94462581958093CE01CF91D1
-:104F30000C946E26CF910895EAECF1E085E0DF0154
-:104F40001D928A95E9F71092C9011092CF01089538
-:104F50008FE29CE00E94FB088BE49CE00E94FB082F
-:104F600088E59CE00C94FB0880EC9CE00E94FB0828
-:104F700088EE9CE00E94FB0885EF9CE00E94FB0805
-:104F800080E19DE00E94FB088BE29DE00E94FB080F
-:104F900083E49DE00E94FB088DE59DE00E94FB08F4
-:104FA0008BE79DE00E94FB088BE99DE00E94FB08D7
-:104FB00080EB9DE00E94FB0887EC9DE00E94FB08CF
-:104FC00084EE9DE00E94FB0883E09EE00E94FB08C7
-:104FD00083E29EE00E94FB0885E49EE00E94FB08BD
-:104FE0008AE79EE00E94FB081F9285E08F938FE87E
-:104FF0009EE09F938F930E94940982E99EE00E9415
-:10500000FB081F9281E08F938BE99EE09F938F9323
-:105010000E9494098EE99EE00E94FB088DB79EB71E
-:1050200008960FB6F8949EBF0FBE8DBF80EA9EE033
-:105030000C94FB08833009F45AC030F4813069F0D5
-:10504000823009F0E9C02EC0853009F49AC008F416
-:1050500073C0863009F0E0C0B9C020911501862FD9
-:1050600090E0820F911D8F3F910520F4620F6093B5
-:10507000150103C08FEF8093150185EE9FE00E941C
-:10508000FB08809115011F928F9381EF9FE09F9302
-:105090008F930E9494090F900F900F900F9084EFC0
-:1050A0009FE0B8C020911401862F90E0820F911DDF
-:1050B0008F3F910520F4620F6093140103C08FEFBE
-:1050C0008093140186EF9FE00E94FB0880911401F9
-:1050D0001F928F9385E090E19F938F930E94940994
-:1050E0000F900F900F900F9088E090E193C0209167
-:1050F0001301862F90E0820F911D8F3F910520F4C0
-:10510000620F6093130103C08FEF809313018AE055
-:1051100090E10E94FB08809113011F928F938AE116
-:1051200090E19F938F930E9494090F900F900F909E
-:105130000F908DE190E16EC020911201862F90E0DA
-:10514000820F911D8F3F910520F4620F6093120131
-:1051500003C08FEF809312018FE190E10E94FB0862
-:10516000809112011F928F9381E390E19F938F931F
-:105170000E9494090F900F900F900F9084E390E19C
-:1051800049C020911101862F90E0820F911D8F3F21
-:10519000910520F4620F6093110103C08FEF80939B
-:1051A000110186E390E10E94FB08809111011F929A
-:1051B0008F938CE490E19F938F930E9494090F90BA
-:1051C0000F900F900F908FE490E124C02091100178
-:1051D000862F90E0820F911D8F3F910520F4620F82
-:1051E0006093100103C08FEF8093100181E590E17F
-:1051F0000E94FB08809110011F928F9389E690E135
-:105200009F938F930E9494090F900F900F900F908F
-:105210008CE690E10C94FB080895833009F44EC0AD
-:1052200030F4813069F0823009F0C5C028C0853083
-:1052300009F482C008F461C0863009F0BCC09BC08C
-:1052400080911501681720F4861B8093150102C018
-:10525000109215018EE690E10E94FB0880911501E5
-:105260001F928F938AE790E19F938F930E949409F6
-:105270000F900F900F900F908DE790E19AC0809162
-:105280001401681720F4861B8093140102C0109249
-:1052900014018FE790E10E94FB08809114011F9296
-:1052A0008F938EE890E19F938F930E9494090F90C3
-:1052B0000F900F900F9081E990E17BC080911301D6
-:1052C000681720F4861B8093130102C0109213010B
-:1052D00083E990E10E94FB08809113011F928F9354
-:1052E00083EA90E19F938F930E9494090F900F900F
-:1052F0000F900F9086EA90E15CC0809112016817D0
-:1053000020F4861B8093120102C01092120188EAD9
-:1053100090E10E94FB08809112011F928F938AEB0B
-:1053200090E19F938F930E9494090F900F900F909C
-:105330000F908DEB90E13DC080911101681720F432
-:10534000861B8093110102C0109211018FEB90E136
-:105350000E94FB08809111011F928F9385ED90E1CF
-:105360009F938F930E9494090F900F900F900F902E
-:1053700088ED90E11EC080911001681720F4861B13
-:105380008093100102C0109210018AED90E10E94FA
-:10539000FB08809110011F928F9382EF90E19F9301
-:1053A0008F930E9494090F900F900F900F9085EFAC
-:1053B00090E10C94FB080895CF93C82F85E69CE0FC
-:1053C0000E94FB086091A8017091A9018091AA0137
-:1053D0009091AB010E94C5211F928F932CE73CE076
-:1053E0003F932F930E9494098FE79CE00E94FB0853
-:1053F0001F92CF9324E83CE03F932F930E9494099F
-:1054000087E89CE00E94FB0861E070E080E090E0AB
-:1054100004C0660F771F881F991FCA95D2F70E9494
-:10542000AA1F8DB79EB708960FB6F8949EBF0FBE01
-:105430008DBFCF910C94A51BCF93482F50E0FA015C
-:105440003697E334F10508F0E1C2EA5AFF4F0C94B5
-:10545000A03085E096E00E94FB0883ED98E00E9472
-:10546000FB080E94E3241F928F9383EE98E09F93A2
-:105470008F930E94940986EE98E00E94FB080E9498
-:10548000DA24C82F88EE98E00E94FB081F92CF9381
-:105490002BEF38E03F932F930E94940980E099E02E
-:1054A0000E94FB0882E099E00E94FB088C2F81702B
-:1054B0001F928F932CE039E03F932F930E94940921
-:1054C0008FE099E00E94FB0881E199E00E94FB08CF
-:1054D000C1FB882780F91F928F932BE139E03F931E
-:1054E0002F930E9494098EE199E00E94FB0880E2CC
-:1054F00099E00E94FB08C2FB882780F91F928F93D6
-:105500002CE239E03F932F930E9494098FE299E0B7
-:105510000E94FB0881E399E00E94FB08C3FBCC27B3
-:10552000C0F91F92CF938AE399E09F938F930E94D3
-:1055300094098DE399E00E94FB080E94EC24C82F97
-:105540008FE399E00E94FB081F92CF9323E539E097
-:105550003F932F930E94940988E599E00E94FB08ED
-:105560008AE599E00E94FB088C2F81701F928F932F
-:1055700023E739E03F932F930E9494098DB79EB79C
-:1055800080960FB6F8949EBF0FBE8DBF86E799E058
-:105590000E94FB0888E799E00E94FB08C1FB88276E
-:1055A00080F91F928F932FE839E03F932F930E9449
-:1055B000940982E999E00E94FB0884E999E00E943D
-:1055C000FB08C2FB882780F91F928F9326EA39E0F7
-:1055D0003F932F930E94940989EA99E00E94FB0867
-:1055E0008BEA99E00E94FB08C3FB882780F91F9291
-:1055F0008F932DEB39E03F932F930E94940980EC19
-:1056000099E00E94FB0882EC99E00E94FB08C4FB31
-:10561000882780F91F928F932CEC39E03F932F93CA
-:105620000E9494098FEC99E00E94FB0881ED99E0BB
-:105630000E94FB08C5FB882780F91F928F9323EEF9
-:1056400039E03F932F930E94940986EE99E00E94DF
-:10565000FB0888EE99E00E94FB08C6FB882780F9CA
-:105660001F928F9324E03AE03F932F930E94940976
-:1056700087E09AE00E94FB0889E09AE00E94FB081C
-:10568000C7FBCC27C0F91F92CF9381E19AE09F938B
-:105690008F930E94940984E19AE00E94FB080E9483
-:1056A000F524C82F86E19AE00E94FB081F92CF9351
-:1056B0002DE23AE03F932F930E9494098DB79EB755
-:1056C00080960FB6F8949EBF0FBE8DBF82E39AE01E
-:1056D0000E94FB0884E39AE00E94FB088C2F8170F3
-:1056E0001F928F932EE33AE03F932F930E949409E9
-:1056F00081E49AE00E94FB0883E49AE00E94FB08A0
-:10570000C6951F92CF938CE49AE09F938F930E944B
-:1057100094098FE49AE00E94FB088DB79EB7089623
-:105720000FB6F8949EBF0FBE8DBF1DC00E9412150C
-:10573000892B79F00E9412159093D2018093D101A8
-:105740000E94A51B80E090E00E940D1580E196E08C
-:1057500008C08091D1019091D2010E940D1589E17C
-:1057600096E00E94FB0881E056C181E59AE00E9424
-:10577000FB088DE69AE00E94FB0884E89AE00E940C
-:10578000FB088CE99AE00E94FB0884EB9AE00E94F7
-:10579000FB088EEC9AE00E94FB0885EE9AE00E94DE
-:1057A000FB0885E09BE00E94FB088BE19BE00E94E8
-:1057B000FB088CE29BE00E94FB0884E49BE00E94D3
-:1057C000FB0884E59BE00E94FB088EE69BE00E94BC
-:1057D000FB0887E89BE00E94FB0880EA9BE00E94B0
-:1057E000FB0889EB9BE00E94FB0882ED9BE00E9496
-:1057F000FB0883EF9BE00E94FB0885E19CE0B1CFB2
-:105800008091BF01817F8E7F8093BF010E94A82776
-:1058100084E296E00E94FB0889E396E00E94FB0880
-:1058200081E08093D001F7C00E94A51B8DE396E034
-:105830000E94FB089FEF23ED80E3915020408040C1
-:10584000E1F700C000000E94122386E596E089CFB0
-:105850008091BF0180FF09C086E696E00E94FB08A8
-:105860008091BF01817F8E7F17C089E796E00FC0CE
-:105870009091BF0191FB882780F921E0822780FB6E
-:1058800091F99093BF01882351F08BE896E00E9434
-:10589000FB088091BF0181608093BF0164CF84EADF
-:1058A00096E05FCF9091BF0192FB882780F921E0BD
-:1058B000822780FB92F99093BF01882319F08EEB29
-:1058C00096E0E5CF89ED96E04CCF9091BF0193FB38
-:1058D000882780F921E0822780FB93F99093BF010C
-:1058E000882319F085EF96E0D2CF8DE097E039CF8D
-:1058F00086E297E00E94FB088DE397E00E94FB0898
-:1059000083E697E00E94FB0887EA97E00E94FB0885
-:1059100084ED97E00E94FB0889E198E022CF809116
-:10592000C3019091C401A091C501B091C601BF937C
-:10593000AF939F938F9384E498E09F938F930E94FB
-:1059400094090F900F900F900F900F900F900BCF26
-:1059500088E598E00E94FB080E9417151F928F931C
-:105960008EE698E09F938F930E94940980910C019A
-:105970001F928F9388E898E09F938F930E949409D9
-:1059800080914A011F928F938FE998E09F938F93A4
-:105990000E9494098DB79EB70C960FB6F8949EBFDF
-:1059A0000FBE8DBFE0CE0E94A51B80910D0191E03E
-:1059B000892780930D01882319F082EB98E0D1CEDE
-:1059C00081EC98E0CECE81E890E00E9473159FEFC5
-:1059D00021EE84E0915020408040E1F700C00000BB
-:1059E00080E090E00E9473159FEF29E688E19150D6
-:1059F00020408040E1F700C00000B5CE80E003C049
-:105A00008D5101C089530E94DC29ADCE81ED98E013
-:105A10000E94FB0880E0CF91089580E0089580E027
-:105A20000895CF93C82F8091D001813071F020F07C
-:105A3000823009F063C14FC0A0910E01B0910F01F7
-:105A40008C91823209F05CC107C0A0910E01B09127
-:105A50000F018C91823249F48C2F0E940D2D8111FF
-:105A600036C08C2F0E941C2A34C08C2F0E940F2D10
-:105A700081112DC0C43189F028F4CB3039F0C03108
-:105A800009F512C0C93249F0C833E1F40E94A827D1
-:105A900089E89CE00E94FB081AC08DE89CE00E9407
-:105AA000FB081092D0012EC10E94B42781EA9CE02D
-:105AB0000E94FB088AEB9CE00E94FB0882E0809336
-:105AC000D00105C08EEB9CE00E94FB081BC181E069
-:105AD00090E081701AC1C83280F4CE3108F0ABC0BA
-:105AE000CB30F9F020F4C73009F0EBC0D3C0C3319C
-:105AF00049F1C43109F0E5C017C0CB3409F4BEC088
-:105B000030F4C93289F0C83309F0DBC00AC0C135AE
-:105B100009F4B2C0C23509F4ADC0CE3409F0D1C029
-:105B2000B3C00E94B427D2C01092D3018DEC9EE086
-:105B30000E94FB0885EE9EE00E94FB0881E08093B6
-:105B4000D001E3C082E29FE00E94FB0885E49FE071
-:105B50000E94FB08809115011F928F938AE59FE0B8
-:105B60009F938F930E9494098DE59FE00E94FB080C
-:105B70008FE59FE00E94FB08809114011F928F9394
-:105B800084E79FE09F938F930E94940987E79FE0AB
-:105B90000E94FB0889E79FE00E94FB0880911301A7
-:105BA0001F928F938BE89FE09F938F930E9494099D
-:105BB0008EE89FE00E94FB0880E99FE00E94FB08BE
-:105BC000809112011F928F9384EA9FE09F938F939D
-:105BD0000E94940987EA9FE00E94FB0889EA9FE0FF
-:105BE0000E94FB08809111011F928F9381EC9FE02E
-:105BF0009F938F930E94940984EC9FE00E94FB087E
-:105C000086EC9FE00E94FB08809110011F928F9309
-:105C100080EE9FE09F938F930E94940983EE9FE014
-:105C20000E94FB088DB79EB748960FB6F8949EBFAA
-:105C30000FBE8DBF4BC0CE51EC2FF0E0E15DFE4FAB
-:105C400080818093D30189EE9EE00E94FB088091C1
-:105C5000D3011F928F938EEF9EE09F938F930E94AC
-:105C6000940981E09FE00E94FB080F900F900F9035
-:105C70000F902CC061E003C061E007C06AE0809132
-:105C8000D3010E941A2822C06AE08091D3010E94A9
-:105C90000D291CC08EE18093150182E380931401CD
-:105CA0008AE08093130184E18093120188E080935D
-:105CB000110188E28093100183E09FE00E94FB08BD
-:105CC00005C088E19FE00E94FB0816C08AE19FE0C2
-:105CD0000E94FB088091D3011F928F938CE19FE07B
-:105CE0009F938F930E9494098FE19FE00E94FB088D
-:105CF0000F900F900F900F9081E007C01092D0018D
-:105D000080E003C080E090E0E4CECF9108950E944F
-:105D1000CF24811102C00E94B0240E94F5248093F8
-:105D2000E30180FF02C0869501C080E00C94380D2D
-:105D30008091E301982F9695292F30E02F3031057F
-:105D40004CF49F5F990F8170892B81608093E301F0
-:105D50000E94F9248091BF0180FF0FC08091E30170
-:105D600086951F928F9387EF90E19F938F930E9468
-:105D700094090F900F900F900F908091E3018695FA
-:105D80000C94380D8091E301982F969591F09158DD
-:105D9000990F8170892B8093E3018E7F91E009F444
-:105DA00090E08091E30190FB80F98093E3010E94F1
-:105DB000F9248091BF0180FF0FC08091E301869597
-:105DC0001F928F938FE091E19F938F930E9494098C
-:105DD0000F900F900F900F908091E30186950C9497
-:105DE000380D8091E301982F909590FB80F9809376
-:105DF000E3010E94F9248091BF0180FF0FC08091D0
-:105E0000E30181701F928F9387E291E19F938F93BB
-:105E10000E9494090F900F900F900F908091E301D2
-:105E200080FF02C0869501C080E00C94380D30914F
-:105E3000E301232F26952F5F2F77822F90E031707B
-:105E400040972CF4220F232B2093E30102C03093C0
-:105E5000E3018091E301282F2E7F91E009F490E087
-:105E600090FB80F98093E3010E94F9248091BF01A7
-:105E700080FF0FC08091E30186951F928F938DE381
-:105E800091E19F938F930E9494090F900F900F9030
-:105E90000F908091E30186950C94380D2091E301D9
-:105EA000922F96959827990F822F8170892B809336
-:105EB000E3018E7F91E009F490E08091E30190FB93
-:105EC00080F98093E3010E94F9248091E301869593
-:105ED0000C94380D04D06894B1118DC0089570D021
-:105EE00088F09F5790F0B92F9927B751A0F0D1F0C3
-:105EF000660F771F881F991F1AF0BA95C9F712C04D
-:105F0000B13081F077D0B1E0089574C0672F782F59
-:105F10008827B85F39F0B93FCCF3869577956795B8
-:105F2000B395D9F73EF490958095709561957F4F24
-:105F30008F4F9F4F0895E89409C097FB3EF49095CA
-:105F40008095709561957F4F8F4F9F4F9923A9F052
-:105F5000F92F96E9BB279395F695879577956795E1
-:105F6000B795F111F8CFFAF4BB0F11F460FF1BC025
-:105F70006F5F7F4F8F4F9F4F16C0882311F096E9B8
-:105F800011C0772321F09EE8872F762F05C0662366
-:105F900071F096E8862F70E060E02AF09A95660F1F
-:105FA000771F881FDAF7880F9695879597F90895D8
-:105FB00057FD9058440F551F59F05F3F71F04795BA
-:105FC000880F97FB991F61F09F3F79F0879508959F
-:105FD000121613061406551FF2CF4695F1DF08C0BE
-:105FE000161617061806991FF1CF869571056105DB
-:105FF00008940895E894BB2766277727CB0197F983
-:1060000008950BD078C069D028F06ED018F0952391
-:1060100009F05AC05FC01124EECFCADFA0F3959FEC
-:10602000D1F3950F50E0551F629FF001729FBB277F
-:10603000F00DB11D639FAA27F00DB11DAA1F649F2B
-:106040006627B00DA11D661F829F2227B00DA11DDE
-:10605000621F739FB00DA11D621F839FA00D611D64
-:10606000221F749F3327A00D611D231F849F600D85
-:10607000211D822F762F6A2F11249F5750408AF0BE
-:10608000E1F088234AF0EE0FFF1FBB1F661F771F4A
-:10609000881F91505040A9F79E3F510570F014C0E1
-:1060A000AACF5F3FECF3983EDCF386957795679532
-:1060B000B795F795E7959F5FC1F7FE2B880F911D68
-:1060C0009695879597F9089597F99F6780E870E00E
-:1060D00060E008959FEF80EC089500240A9416165E
-:1060E000170618060906089500240A9412161306C6
-:1060F000140605060895092E0394000C11F4882354
-:1061000052F0BB0F40F4BF2B11F460FF04C06F5F6F
-:106110007F4F8F4F9F4F089597FB072E16F40094E3
-:1061200007D077FD09D00E94A63007FC05D03EF4C9
-:10613000909581959F4F0895709561957F4F089533
-:10614000EE0FFF1F0590F491E02D0994AA1BBB1BD5
-:1061500051E107C0AA1FBB1FA617B70710F0A61B67
-:10616000B70B881F991F5A95A9F780959095BC0188
-:10617000CD010895F999FECF92BD81BDF89A992776
-:1061800080B50895A8E1B0E042E050E00C94DD3025
-:10619000262FF999FECF1FBA92BD81BD20BD0FB643
-:1061A000F894FA9AF99A0FBE019608950E94C830A1
-:1061B000272F0C94C930DC01CB01FC01F999FECFEB
-:1061C00006C0F2BDE1BDF89A319600B40D9241507F
-:0A61D0005040B8F70895F894FFCF8F
-:1061DA000540570D3B0E170EE20DAE0D0101AF0142
-:1061EA002808140A321E8703A003B903D203F20354
-:1061FA00F004A3046D044D0414043F4D3620390104
-:0A620A00020304050607080900005E
+:100000000C949D020C94E1020C94E1020C94E10228
+:100010000C94E1020C94E1020C94E1020C94E102D4
+:100020000C94E1020C94E1020C941C120C94EE125C
+:100030000C948D240C94E1020C94E1020C94E102E6
+:100040000C94E1020C94E1020C94E1020C94E102A4
+:100050000C94E1020C94FA240C94E1020C94E10259
+:100060000C94E1020C94E1020C94E1020C94E10284
+:100070000C94E1020C94E1020C94E1020C94E10274
+:100080000C94860A0C94E1020C94E1020C94E102B7
+:100090000C94E1020C94E1020C94E1020C94E10254
+:1000A0000C94E1020C94E1020C94E10207634236E5
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
+:1000D0000000803F08000000BE922449123EABAAF7
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
+:1000F000AA3E00000000BF000000803F000000009A
+:1001000000084178D3BB4387D1133D190E3CC3BDD2
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
+:1001200080EFFFBE01C4FF7F3F0000000000000021
+:10013000F1A4F1A3018C028C048C2B0014001A0092
+:100140000800150017001C0018000C001200130016
+:100150002A00290004001600070009000A000B000D
+:100160000D000E000F0033003400E1001D001B00E5
+:100170000600190005001100100036003700380095
+:1001800028000030E000E200E30002202C002C00F8
+:1001900001205000510052004F002B0014001A00A3
+:1001A000090013000A000D000F0018001C003300A6
+:1001B0002A002900040015001600170007000B0094
+:1001C000110008000C0012003400E1001D001B00AB
+:1001D0000600190005000E00100036003700380038
+:1001E00028000030E000E200E30002202C002C0098
+:1001F00001205000510052004F002B003400360007
+:10020000370013001C0009000A00060015000F004B
+:100210002A00290004001200080018000C00070042
+:100220000B001700110016003800E1003300140025
+:100230000D000E001B00050010001A0019001D0023
+:1002400028000030E000E200E30002202C002C0037
+:1002500001205000510052004F0035021E021F02C3
+:100260002002210222022302240225022602270262
+:100270002A0001003A003B003C003D003E003F00E8
+:100280002D022E022F0230023102010040004100F7
+:100290004200430044004500032004200520005094
+:1002A0000100010001000100010002200100010025
+:1002B0000100AB00AA00A900AE0035001E001F001F
+:1002C0002000210022002300240025002600270012
+:1002D0002A0001003A003B003C003D003E003F0088
+:1002E0002D002E002F0030003100010040004100A1
+:1002F0004200430044004500032004200520005034
+:1003000001000100010001000100010001000100E5
+:100310000120AB00AA00A900AE0028035400680029
+:100320006500200050006C0061006E0063006B00EF
+:1003300020004B006500790062006F0061007200D0
+:10034000640000002C034F007200740068006F000E
+:100350006C0069006E0065006100720020004B00B7
+:100360006500790062006F00610072006400730034
+:100370000000040309040902D000060100A03209AC
+:100380000400000103010100092111010001223FC5
+:10039000000705810308000A0904010001030102A6
+:1003A00000092111010001224D0007058203080008
+:1003B0000A090402000103000000092111010001E3
+:1003C0002236000705830308000A0904030002031C
+:1003D000000000092111010001222000070584030B
+:1003E00020000107050403200001090404000001A6
+:1003F00001000009240100010900010509040500AC
+:10040000020103000007240100014100062402014B
+:100410000100062402020200092403010301020173
+:10042000000924030204010101000905060240003D
+:1004300005000005250101010905850240000500B0
+:100440000005250101031201100100000008EDFE66
+:1004500060600100010200010631FF0974A1010979
+:1004600075150025FF952075088102097615002570
+:10047000FF952075089102C005010980A101850240
+:1004800016010026B7001A01002AB7007510950161
+:100490008100C0050C0901A1018503160100269CFD
+:1004A000021A01002A9C02751095018100C0050105
+:1004B0000902A1010901A100050919012905150079
+:1004C00025019505750181029501750381010501DD
+:1004D000093009311581257F950275088106093893
+:1004E0001581257F950175088106050C0A380215CE
+:1004F00081257F950175088106C0C005010906A107
+:1005000001050719E029E715002501950875018106
+:1005100002950175088101050819012905950575E0
+:100520000191029501750391010507190029FF1535
+:100530000025FF950675088100C011241FBECFEF6E
+:10054000DAE0DEBFCDBF04B603FE24C0809178039D
+:1005500090917903A0917A03B0917B038730904BFF
+:10056000A740B04BB9F4109278031092790310921F
+:100570007A0310927B0314BE84B7877F84BF88E11F
+:100580000FB6F89480936000109260000FBEE0E018
+:10059000F8E3099511E0A0E0B1E0E2EAFFE502C06E
+:1005A00005900D92A63BB107D9F713E0A6EBB1E099
+:1005B00001C01D92A837B107E1F70E94F90E0C9413
+:1005C000CF2F0C9400000895089561110DC0FC0117
+:1005D0008281882331F085EE0E949D190E94B62BFE
+:1005E00003C085EE0E94651A80E090E008958B3B81
+:1005F000910568F4883A910530F5853A9105C0F483
+:100600008430910598F4019709F06FC071C0803E65
+:10061000910508F46AC0883E910540F09C01205F76
+:1006200031092031310508F060C05CC09C01A1C0D7
+:10063000853A910509F45FC0863A910509F45EC0D8
+:1006400023E830E496C0883A910509F45AC0893A03
+:10065000910509F459C08A3A910509F458C08B3ABA
+:10066000910509F457C08C3A910509F456C08D3AAA
+:10067000910509F455C0803B910509F454C08E3AA8
+:10068000910509F453C08F3A910509F452C0813B9A
+:10069000910509F451C0823B910509F450C0833B98
+:1006A000910509F44FC0843B910509F44EC0853B88
+:1006B000910509F44DC0863B910509F44CC0873B78
+:1006C000910509F44BC0883B910509F44AC0893B68
+:1006D000910509F449C08A3B910509F048C02AE216
+:1006E00036E447C09C01306544C020E030E041C0A2
+:1006F00021E030E03EC021E830E43BC022E830E4B5
+:1007000038C022EE34E435C029EE34E432C02AEE9B
+:1007100034E42FC025EB34E42CC026EB34E429C0AC
+:1007200027EB34E426C02CEC34E423C02DEC34E475
+:1007300020C023E835E41DC02AE835E41AC022E9C8
+:1007400035E417C024E935E414C021E236E411C0D1
+:1007500023E236E40EC024E236E40BC025E236E4A0
+:1007600008C026E236E405C027E236E402C020E0F5
+:1007700034E4C90108959CE0799FF001112490E3CD
+:10078000899FE00DF11D1124E60FF11DEE0FFF1FF3
+:10079000E65CFE4F25913491C9010895880F991F99
+:1007A00082559040FC0125913491C9010895880F2C
+:1007B000991F825D9E4FFC0125913491C9010895D6
+:1007C0000E94BB039C013A9521153F4108F4DFC00C
+:1007D0009C0130522115304120F49F700E94D703B4
+:1007E00008959C0130532115304118F49927906CDD
+:1007F00008959C0130542031310520F48F709927E1
+:10080000946D0895803120E4920719F480E091ED11
+:100810000895813140E4940719F480E090ED089543
+:10082000823120E4920719F480E092ED089583313B
+:1008300040E4940719F480E093ED0895811520E5D4
+:10084000920711F40C941F25813040E5940731F490
+:100850008091680281608093680208959C013056FF
+:100860002115304108F402C097FF02C0906F08952F
+:10087000803E9105E0F4803C910568F58133910557
+:1008800009F474C048F48932910509F46AC08A32C7
+:10089000910509F07AC074C089339105F9F0823866
+:1008A0009105E1F08533910509F06FC050C0833E9A
+:1008B0009105A9F140F4803E9105C9F0823E910571
+:1008C00009F063C01BC0863E910571F1873E91051A
+:1008D00009F05BC037C00E94CE03089520917B02CF
+:1008E00020FD02C021FF51C080EE90E04EC08091FB
+:1008F0007B0280FFF9CF89E390E047C080917B02C3
+:1009000082FF0AC080917B0284FF03C080E090E0F8
+:100910003CC083EE90E039C082EE90E036C080911A
+:100920007B0282FFEFCFF8CF80917B0283FF07C06D
+:1009300080917B0284FDEACF87EE90E026C086EEB0
+:1009400090E023C080917B0283FFF2CFF8CF8091AB
+:100950007B0285FF03C089E290E017C085E390E049
+:1009600014C080917B0285FDF9CFF5CF80917B0289
+:1009700086FF03C08AE290E008C081E390E005C0F2
+:1009800080917B0286FDF9CFF5CF0E94F702089592
+:100990005F926F927F928F929F92AF92BF92CF920F
+:1009A000DF92EF92FF920F931F93CF93DF93CDB718
+:1009B000DEB728970FB6F894DEBF0FBECDBF9E01FD
+:1009C0002F5F3F4F4E0189E0880E911C60E070E080
+:1009D00000E010E0E12CF12CC12CD12CA12CB12C89
+:1009E00088E0782E622E532E41E050E0E3E2F1E001
+:1009F000A62DB52D872D01900D928A95E1F7F9016D
+:100A0000819191919F01FC01E07FFF27E032F10588
+:100A100059F48F709927FA0102C0EE0FFF1F8A95D3
+:100A2000E2F7AE2ABF2A37C0E033F10559F48F70E0
+:100A30009927FA0102C0EE0FFF1F8A95E2F7CE2A2E
+:100A4000DF2A29C0E034F10559F48F709927FA01A3
+:100A500002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0A5
+:100A6000E035F10559F48F709927FA0102C0EE0FB5
+:100A7000FF1F8A95E2F70E2B1F2B0DC0E036F10504
+:100A800051F48F709927FA0102C0EE0FFF1F8A956B
+:100A9000E2F76E2B7F2B2815390509F0A7CF94B10B
+:100AA0008A2D8095892384B985B18A2985B997B122
+:100AB0008C2D8095892387B988B18C2988B99AB102
+:100AC0008E2D809589238AB98BB18E298BB99DB1E2
+:100AD000802F809589238DB98EB1802B8EB990B3EC
+:100AE000862F8095892380BB81B3862B81BB289676
+:100AF0000FB6F894DEBF0FBECDBFDF91CF911F912F
+:100B00000F91FF90EF90DF90CF90BF90AF909F90AC
+:100B10008F907F906F905F9008955F926F927F9219
+:100B20008F929F92AF92BF92CF92DF92EF92FF92FD
+:100B30000F931F93CF93DF93CDB7DEB768970FB6B0
+:100B4000F894DEBF0FBECDBF85B7806885BF85B77F
+:100B5000806885BF0E94CF076E9A769A0E94C8046B
+:100B60009E012F5F3F4F4E0189E1880E911C60E08E
+:100B700070E000E010E0E12CF12CC12CD12CA12C74
+:100B8000B12C98E1792E622E532E41E050E0EBE239
+:100B9000F1E0A62DB52D872D01900D928A95E1F7F4
+:100BA000F901819191919F01FC01E07FFF27E032E3
+:100BB000F10559F48F709927FA0102C0EE0FFF1F5B
+:100BC0008A95E2F7AE2ABF2A37C0E033F10559F41F
+:100BD0008F709927FA0102C0EE0FFF1F8A95E2F786
+:100BE000CE2ADF2A29C0E034F10559F48F70992705
+:100BF000FA0102C0EE0FFF1F8A95E2F7EE2AFF2AE4
+:100C00001BC0E035F10559F48F709927FA0102C035
+:100C1000EE0FFF1F8A95E2F70E2B1F2B0DC0E0365B
+:100C2000F10551F48F709927FA0102C0EE0FFF1FF2
+:100C30008A95E2F76E2B7F2B2815390509F0A7CF8F
+:100C400094B18A2D8095892384B985B18A2985B983
+:100C500097B18C2D8095892387B988B18C2988B963
+:100C60009AB18E2D809589238AB98BB18E298BB943
+:100C70009DB1802F809589238DB98EB1802B8EB93F
+:100C800090B3862F8095892380BB81B3862B81BB4F
+:100C90001092B7011092B6011092BF011092BE01DE
+:100CA0001092B9011092B8011092C1011092C001C6
+:100CB0001092BB011092BA011092C3011092C201AE
+:100CC0001092BD011092BC011092C5011092C40196
+:100CD00068960FB6F894DEBF0FBECDBFDF91CF91FF
+:100CE0001F910F91FF90EF90DF90CF90BF90AF904A
+:100CF0009F908F907F906F905F9008955F926F921A
+:100D00007F928F929F92AF92BF92CF92DF92EF929B
+:100D1000FF920F931F93CF93DF93CDB7DEB7A097CA
+:100D20000FB6F894DEBF0FBECDBF7E0149E1E40EE1
+:100D3000F11C2EEBC22E21E0D22E5E0151E2A50E57
+:100D4000B11C38E0532E470101E010E048E1642E69
+:100D500055E0752EE3E2F1E0D401852D01900D926E
+:100D60008A95E1F7F701819191917F019C01207FA4
+:100D700033272032310589F424B18F709927A801D7
+:100D800002C0440F551F8A95E2F7CA01242B24B9EB
+:100D900095B18095892385B94FC02033310589F4F9
+:100DA00027B18F709927F80102C0EE0FFF1F8A95B7
+:100DB000E2F7CF012E2B27B998B18095892388B906
+:100DC0003BC02034310589F42AB18F709927A801DE
+:100DD00002C0440F551F8A95E2F7CA01242B2AB995
+:100DE0009BB1809589238BB927C02035310589F4C3
+:100DF0002DB18F709927F80102C0EE0FFF1F8A9561
+:100E0000E2F7CF012E2B2DB99EB1809589238EB9A3
+:100E100013C02036310581F420B38F709927A801C3
+:100E200002C0440F551F8A95E2F7CA01242B20BB4C
+:100E300091B38095892381BB50EA5A95F1F7BE01A1
+:100E40006F5F7F4F80E090E020E030E0EBE2F1E088
+:100E5000DE011196462D01900D924A95E1F7FB01B6
+:100E600041915191BF01FA01E07FFF27E032F10586
+:100E700011F4E3B113C0E033F10511F4E6B10EC093
+:100E8000E034F10511F4E9B109C0E035F10511F4E0
+:100E9000ECB104C0E036F105B9F4EFB1F0E04F7009
+:100EA000552702C0F595E7954A95E2F7E0FD08C0A1
+:100EB000A801022E02C0440F551F0A94E2F702C097
+:100EC00040E050E0842B952B2F5F3F4F2C303105B5
+:100ED00009F0BCCFF601208131812817390721F0B4
+:100EE00091838083709200010E94C804F2E0CF0ECB
+:100EF000D11CEA14FB0409F02DCF80910001882356
+:100F000061F1815080930001811121C08091BE0167
+:100F10009091BF019093B7018093B6018091C00179
+:100F20009091C1019093B9018093B8018091C20161
+:100F30009091C3019093BB018093BA018091C40149
+:100F40009091C5019093BD018093BC0106C08FE9CB
+:100F50009FE00197F1F700C0000081E0A0960FB676
+:100F6000F894DEBF0FBECDBFDF91CF911F910F91DF
+:100F7000FF90EF90DF90CF90BF90AF909F908F90B9
+:100F80007F906F905F900895E82FF0E0EE0FFF1FC5
+:100F9000EA54FE4F80819181089508950895279A1B
+:100FA0002F988FEF9FEF90938700809386008AE0C1
+:100FB0008093800089E1809381000C945F2B8111E4
+:100FC0000BC080918000877F8093800010928D00FD
+:100FD00010928C002F9808952F98833041F48091BF
+:100FE00080008860809380008FEF9FEF12C0909107
+:100FF000800098609093800023E030E0281B310946
+:10100000220F331F8FEF9FEF02C0969587952A9589
+:10101000E2F790938D0080938C0008950F931F93B7
+:10102000CF93DF93CDB7DEB7CC58D1090FB6F89484
+:10103000DEBF0FBECDBF8C01862F642F882379F0D1
+:10104000F80192812FE7482F992329F08DE792E04C
+:101050000E94F81404C08DE792E00E940815F80180
+:1010600080818B3061F49181933009F068C0828176
+:10107000882309F4CDC0809103018F5F0EC08A30B0
+:10108000E1F5F8019181933009F059C082818823FC
+:1010900009F4BEC08091030181508093030120E0D8
+:1010A0004BE760E08DE792E00E94E81420E04BE718
+:1010B00061E08DE792E00E94E81420E04BE762E0F7
+:1010C0008DE792E00E94E81420E04BE763E08DE7B3
+:1010D00092E00E94E81420E04BE764E08DE792E0A4
+:1010E000C457DF4F0FB6F894DEBF0FBECDBFDF9100
+:1010F000CF911F910F910C94E814893069F4F80195
+:1011000091819330E1F492819923C9F0809101019A
+:101110009091020101960EC0883089F4F801918106
+:10112000933069F49281992351F08091010190915B
+:10113000020101979093020180930101B0CFF80161
+:10114000928140910301992391F196E4E3E4F1E067
+:10115000DE01A95BBF4F01900D929A95E1F7405DCA
+:10116000F8019181FCE09F9F40191124E091010159
+:10117000F0910201E80FF11DEE0FFF1F87E490E0F0
+:101180008C0F9D1FE80FF91F8081480F2FE760E04B
+:101190008DE792E0C457DF4F0FB6F894DEBF0FBE65
+:1011A000CDBFDF91CF911F910F910C94F81496E46D
+:1011B000E3E4F1E0DE01119601900D929A95E1F7DA
+:1011C000405DF8019181FCE09F9F40191124E0915E
+:1011D0000101F0910201E80FF11DEE0FFF1F81E008
+:1011E00090E08C0F9D1FE80FF91F8081480F2FE7BB
+:1011F00060E08DE792E0C457DF4F0FB6F894DEBF92
+:101200000FBECDBFDF91CF911F910F910C940815A8
+:10121000C457DF4F0FB6F894DEBF0FBECDBFDF91CE
+:10122000CF911F910F910895CF93DF93EA019B0116
+:10123000AC0160E074E284E79BE40E945F2C0E94B2
+:10124000C72C709397006093960020E130E02C1B30
+:101250003D0B02C0759567952A95E2F7709399004A
+:1012600060939800DF91CF9108951092020210923E
+:10127000010210929000109291001092FD011092C4
+:10128000FE011092FF01109200021092FC011092D8
+:10129000FB01E9EDF1E0A9ECB1E01192119211929C
+:1012A00011921D921D9281E0E93FF807B1F7089570
+:1012B000AF92BF92CF92DF92EF92FF920F931F9364
+:1012C000CF93DF936B017C0109EF11E047EDA42E72
+:1012D00041E0B42EC7E0D0E0A7019601F801929159
+:1012E0008291729162918F010E945B2C882349F058
+:1012F0002197F2E0AF1AB108CF3F8FEFD80761F71F
+:1013000034C0F8011082118212821382F501118219
+:101310001082FE01EE0FFF1FEE0FFF1FE752FE4F80
+:10132000DE01AA0FBB1FA753BE4FCE011AC0019604
+:1013300044815581668177814083518362837383C1
+:10134000148215821682178212962D913C91139762
+:1013500011963C932E9313961C921E9212973496DC
+:1013600012968730910519F7C3CF809101029091B1
+:101370000202019797FD05C090930202809301023B
+:1013800004C01092020210920102E0910102F09159
+:101390000202309789F410929000109291001092FE
+:1013A000FD011092FE011092FF01109200021092B6
+:1013B000FC011092FB019EC03197DF01AA0FBB1FF9
+:1013C000AA0FBB1FA752BE4FCD90DD90ED90FC90B1
+:1013D000EE0FFF1FE753FE4FC081D181A090FD01AA
+:1013E000B090FE010091FF0110910002A70196014B
+:1013F0006A2D7B2D802F912F0E945B2C87FF2FC0A1
+:1014000081E08093C801AE016A2D7B2D802F912F42
+:101410000E9414092091FD013091FE014091FF01CD
+:1014200050910002C701B6010E94F62B20E030E087
+:101430004AEF53E40E945F2C9B01AC016A2D7B2D87
+:10144000802F912F0E94F72B5B018C01A701960141
+:101450007B2D912F0E945B2C1816ACF638C0A7018B
+:1014600096016A2D7B2D802F912F0E94AA2D181690
+:1014700084F581E08093C801AE016A2D7B2D802F19
+:10148000912F0E941409A70196016091FD017091AE
+:10149000FE018091FF01909100020E94F62B20E056
+:1014A00030E04AEF53E40E945F2C9B01AC016A2DAF
+:1014B0007B2D802F912F0E94F62B5B018C01A701C1
+:1014C00096017B2D912F0E94AA2D87FFD5CF1092D8
+:1014D000C801AE01C701B6010E941409C092FD0106
+:1014E000D092FE01E092FF01F0920002D093FC0145
+:1014F000C093FB01DF91CF911F910F91FF90EF906F
+:10150000DF90CF90BF90AF90089508951F920F92F3
+:101510000FB60F9211242F933F934F935F936F93C6
+:101520007F938F939F93AF93BF93EF93FF9380919C
+:10153000960090919700892B09F455C08091C801BD
+:10154000811151C08091F9019091FA01813091058A
+:1015500071F082309105C1F0892BC1F52091FD0118
+:101560003091FE014091FF01509100021DC0609139
+:10157000FD017091FE018091FF01909100029B019D
+:10158000AC010E94F72B0EC020E030E040E450E4B4
+:101590006091FD017091FE018091FF019091000228
+:1015A0000E94AE2D9B01AC0160E074E284E79BE4F5
+:1015B0000E945F2C0E94C72C709397006093960046
+:1015C0007595679570939900609398008091F901E3
+:1015D0009091FA01019663E070E00E948A2F909347
+:1015E000FA018093F901FF91EF91BF91AF919F9123
+:1015F0008F917F916F915F914F913F912F910F90BC
+:101600000FBE0F901F901895AF92BF92CF92DF92AE
+:10161000EF92FF920F931F93CF93DF936B017C01A7
+:10162000EA0120E030E0A9010E94AA2D18160CF072
+:10163000B4C03E9A82E8809390008AE18093910042
+:10164000A090FD01B090FE010091FF0110910002F9
+:1016500020E030E0A9016A2D7B2D802F912F0E9480
+:101660005B2C81112DC0AE01C701B6010E94140987
+:10167000C092FD01D092FE01E092FF01F0920002C3
+:10168000D093FC01C093FB01809101029091020272
+:10169000FC01EE0FFF1FEE0FFF1FE752FE4FC0824F
+:1016A000D182E282F382FC01EE0FFF1FE753FE4F6F
+:1016B000D183C083019690930202809301026DC092
+:1016C000A70196016A2D7B2D802F912F0E945B2C04
+:1016D00087FF2CC0AE016A2D7B2D802F912F0E9499
+:1016E00014092091FD013091FE014091FF015091BC
+:1016F0000002C701B6010E94F62B20E030E04AEF5D
+:1017000053E40E945F2C9B01AC016A2D7B2D802F3E
+:10171000912F0E94F72B5B018C01A70196017B2D75
+:10172000912F0E945B2C1816ACF69DCFA701960155
+:101730006A2D7B2D802F912F0E94AA2D18160CF058
+:1017400092CFAE016A2D7B2D802F912F0E9414091C
+:10175000A70196016091FD017091FE018091FF014A
+:10176000909100020E94F62B20E030E04AEF53E413
+:101770000E945F2C9B01AC016A2D7B2D802F912F45
+:101780000E94F62B5B018C01A70196017B2D912F06
+:101790000E94AA2D87FFD5CF66CFDF91CF911F91F1
+:1017A0000F91FF90EF90DF90CF90BF90AF90089592
+:1017B00080910C020895CF93DF9300D01F92CDB794
+:1017C000DEB720916E03243021F523E029839B832B
+:1017D0008A832093E9008FEF06C095ED9A95F1F783
+:1017E0000000882329F09091E800815095FFF5CF03
+:1017F0008091E80085FF0DC040E050E063E070E0BC
+:10180000CE0101960E94BA0F8091E8008E778093F6
+:10181000E8000F900F900F90DF91CF910895CF9334
+:10182000DF9300D01F92CDB7DEB720916E03243036
+:1018300029F522E029839B838A8383E08093E90052
+:101840008FEF06C095ED9A95F1F70000882329F0F7
+:101850009091E800815095FFF5CF8091E80085FFD9
+:101860000DC040E050E063E070E0CE0101960E94C0
+:10187000BA0F8091E8008E778093E8000F900F9068
+:101880000F90DF91CF91089520916E032430F9F4E9
+:1018900022E02093E9002FEF06C035ED3A95F1F7ED
+:1018A0000000222329F03091E800215035FFF5CFC8
+:1018B0002091E80025FF0BC040E050E065E070E0BB
+:1018C0000E94BA0F8091E8008E778093E800089517
+:1018D000CF93DF93EC0180916E03843041F581E07A
+:1018E0008093E9008FEF06C095ED9A95F1F700001F
+:1018F000882329F09091E800815095FFF5CF8091E1
+:10190000E80085FF14C040E050E068E070E0CE01E0
+:101910000E94BA0F8091E8008E778093E80088E0FB
+:10192000FE01A4E0B2E001900D928A95E1F7DF910B
+:10193000CF910895BF92CF92DF92EF92FF920F93D3
+:101940001F93CF93DF937C01B62EE90100E010E0F6
+:10195000C42ED12C0BC04991202F2B0D2F774F7700
+:101960006FE0C7010E94E8140F5F1F4F0C151D05A3
+:1019700094F3DF91CF911F910F91FF90EF90DF9043
+:10198000CF90BF90089570E06F5F7F4F6F707727A3
+:101990000C94E8140F931F93CF93C42F63307105F9
+:1019A00009F04AC0842F807F803849F1803909F0DE
+:1019B00043C0622F6F7770E080E090E00E94FA2CC5
+:1019C00020E030E040E451E40E945F2C9B01AC0138
+:1019D00060E070E080E090E40E94112E0F7710E04C
+:1019E00023E0159507952A95E1F72DEC3CEC42E0B4
+:1019F00053E40E94AE2DA8010E94040B1DC0622F6B
+:101A00006F7770E080E090E00E94FA2C20E030E0F8
+:101A100040E451E40E945F2C9B01AC0160E070E067
+:101A200080E090E40E94112E2DEC3CEC42E053E467
+:101A30000E94AE2D0E945809CC3F29F4CF911F91EE
+:101A40000F910C943509CF911F910F9108950F9329
+:101A50001F93CF93DF93CDB7DEB727970FB6F894D8
+:101A6000DEBF0FBECDBF8C0114C08A810E94C2149C
+:101A70009A819D839B819E839C819F8381111EC03F
+:101A800089818430B1F08730A1F08630A1F08530B3
+:101A9000A1F0BE016F5F7F4F84E091E00E942F189C
+:101AA0008111E3CF84E091E00E9420180E949B14F2
+:101AB0000DC083E003C082E001C081E0AE014B5F56
+:101AC0005F4F682FC8010E945515E3CF27960FB6C8
+:101AD000F894DEBF0FBECDBFDF91CF911F910F9164
+:101AE0000895EF92FF920F93CF93DF9300D000D031
+:101AF00000D0CDB7DEB77B014A832B830C83842FC4
+:101B00002E834D830E94C2142E814D8181111BC0F2
+:101B100082E0E816F10479F083E0E816F10421F0A0
+:101B2000EA94EF2821F50BC0073F11F487E001C0CC
+:101B300084E089830BC0273FD9F786E0FACF473F7F
+:101B4000B9F785E0F6CF42954F704983BE016F5FCC
+:101B50007F4F84E091E00E94E51784E091E00E94CD
+:101B6000031884E091E00E9420180E949B1426969E
+:101B70000FB6F894DEBF0FBECDBFDF91CF910F91AE
+:101B8000FF90EF90089580916D03811109C00E942C
+:101B9000A1110E94FE118091E20084608093E20016
+:101BA000089510926D03089508950C94E4020C9426
+:101BB000892480916E03843049F58091E9008F700B
+:101BC0009091EC0090FF02C090E801C090E0982B4B
+:101BD00084E08093E9008091EB0080FF14C0809145
+:101BE000EE0087FD03C00FC01092F1008091E80065
+:101BF00085FDFACF8091E80080FF05C08091E80064
+:101C00008E778093E8009F709093E900089542E0FA
+:101C100061EC81E00E94171142E061EC82E00E94D9
+:101C2000171142E061EC83E00E94171146E261EC7B
+:101C300084E00E94171142E361E885E00E941711D9
+:101C400042E360E886E00C941711809170038330C2
+:101C500009F454C030F4813071F0823009F0AAC028
+:101C600091C08A3009F47EC08B3009F45FC089309E
+:101C700009F0A0C020C080916F03813A09F09AC09A
+:101C80008091E800877F8093E800809173039091B2
+:101C90007403892B21F060E080E090E003C068E0ED
+:101CA00084E092E070E00E9458108091E8008B7709
+:101CB0008093E800089580916F03813209F07AC023
+:101CC0008091730390917403892B09F073C0809104
+:101CD000E800877F8093E80005C080916E03882329
+:101CE00009F468C08091E80082FFF7CF8091F1008D
+:101CF00080930C028091E8008B7758C080916F032D
+:101D0000813A09F057C08091730390917403892B35
+:101D100009F050C08091E800877F8093E8008091AF
+:101D2000E80080FFFCCF80911A013BC080916F03D7
+:101D3000813209F03FC08091730390917403892B25
+:101D4000C9F58091E800877F8093E8000E944E11DA
+:101D50009091710381E0911101C080E080931A019C
+:101D60000C948C1E80916F03813221F58091E800E4
+:101D7000877F8093E8000E944E11809172038093C8
+:101D80000302089580916F03813AA1F48091E800E5
+:101D9000877F8093E8008091E80080FFFCCF8091EE
+:101DA00003028093F1008091E8008E778093E80031
+:101DB0000C944E11089584B7877F84BF88E10FB6D5
+:101DC000F89480936000109260000FBE90E080E86D
+:101DD0000FB6F89480936100909361000FBE0E944B
+:101DE000A1110E94FE11E2EEF0E080818460808308
+:101DF00008958DE792E00E94241561E77DE08DE76C
+:101E000092E00E947A1567E27DE08DE792E00E9401
+:101E10007E150E94DB0E78946AEC7CE08DE792E000
+:101E20000E94201563EC7CE08DE792E00E9418157B
+:101E30006AE97CE08DE792E00E941C150E94850A09
+:101E40000E949B140E94AC1880E191E00E945418FB
+:101E50000BC00E944E2480916C03882329F00E94BD
+:101E6000742481110E94A40F80916E03853089F340
+:101E70008DE792E00E942D170E94B618F5CF292F0A
+:101E8000332723303105B1F04CF42130310509F40A
+:101E90004DC02230310509F04EC007C02132310556
+:101EA00041F12232310591F146C0E0EDF0E086E7E4
+:101EB00093E045C099278130910569F08230910502
+:101EC00089F0892B09F037C0E2E7F3E0E491F0E014
+:101ED00082E793E034C0E4E4F3E0E491F0E084E4EA
+:101EE00093E02DC0EAE1F3E0E491F0E08AE193E0D1
+:101EF00026C0643000F5E62FF0E0EE0FFF1FE75735
+:101F0000FE4F80819181E9E0F0E019C0643098F4DF
+:101F1000E62FF0E0DF01AA0FBB1FAF56BE4F8D9139
+:101F20009C91E756FE4FE081F0E009C0E2E1F0E06D
+:101F300086E494E004C0E0E0F0E080E090E0DA01C4
+:101F40008D939C93CF01089580E189BD82E189BD85
+:101F500009B400FEFDCF8091D8008F7D8093D8001A
+:101F60008091E00082608093E0008091E00081FD3C
+:101F7000FCCF0895BF92CF92DF92EF92FF920F9322
+:101F80001F93CF93DF937C018B01EA010E946F11B5
+:101F9000B82E811133C0209731F028813981021B7E
+:101FA000130BE20EF31EC12CD12C23C08091E8004C
+:101FB00085FD15C08091E8008E778093E80020971A
+:101FC00049F0888199818C0D9D1D9983888325E036
+:101FD000B22E14C00E946F11882359F00EC0F70171
+:101FE00081917F018093F10001501109FFEFCF1A19
+:101FF000DF0A01151105D1F601C0B82E8B2DDF9136
+:10200000CF911F910F91FF90EF90DF90CF90BF90F5
+:102010000895BF92CF92DF92EF92FF920F931F939A
+:10202000CF93DF937C018B01EA010E946F11B82EE0
+:10203000811133C0209731F028813981021B130BA5
+:10204000E20EF31EC12CD12C23C08091E80085FD47
+:1020500015C08091E8008B778093E800209749F0C5
+:10206000888199818C0D9D1D9983888345E0B42ECC
+:1020700014C00E946F11882359F00EC08091F100A6
+:10208000F70181937F0101501109FFEFCF1ADF0A99
+:1020900001151105D1F601C0B82E8B2DDF91CF911E
+:1020A0001F910F91FF90EF90DF90CF90BF90089518
+:1020B00040917503509176034617570748F0611514
+:1020C000710539F44091E8004E774093E80001C073
+:1020D000BA01FC0140E033C080916E03882309F40B
+:1020E00042C0853009F441C08091E80083FD39C0C9
+:1020F0008091E80082FD2FC08091E80080FF1FC022
+:102100009091F3008091F200392F20E0A901482B33
+:10211000CA0106C041914093F100615071090196D6
+:102120006115710519F088309105A0F341E0089719
+:1021300009F040E08091E8008E778093E800611517
+:10214000710551F64111C8CF06C080916E038823F6
+:1021500051F0853051F08091E80082FFF6CF80E0A9
+:10216000089581E0089582E0089583E00895409104
+:102170007503509176034617570748F061157105AE
+:1021800039F44091E8004E774093E80001C0BA016D
+:10219000FC0140E034C080916E03882309F443C001
+:1021A000853009F442C08091E80083FD3AC08091F7
+:1021B000E80082FD30C08091E80080FF20C090914F
+:1021C000F3008091F200392F20E0A901482BCA01C9
+:1021D00007C044914093F100319661507109019616
+:1021E0006115710519F08830910598F341E0089761
+:1021F00009F040E08091E8008E778093E800611557
+:10220000710549F64111C7CF06C080916E0388233E
+:1022100051F0853051F08091E80082FFF6CF80E0E8
+:10222000089581E0089582E0089583E00895982F4D
+:102230002CC09093E900981739F07091EC00209130
+:10224000ED005091F00003C0242F762F50E021FDC7
+:1022500002C09F5F1AC03091EB003E7F3093EB00CD
+:102260003091ED003D7F3093ED003091EB00316017
+:102270003093EB007093EC002093ED005093F0004E
+:102280002091EE0027FDE5CF07C0973090F28F70C8
+:102290008093E90081E0089580E0089580916F03C4
+:1022A00087FD05C08091E80080FF0EC012C08091BC
+:1022B000E80082FD05C080916E038111F8CF08957A
+:1022C0008091E8008B7708C080916E038111EACF7E
+:1022D00008958091E8008E778093E80008958091BA
+:1022E000E4009091E50045E62091EC0020FD1FC040
+:1022F00023C020916E03222391F0253091F020918C
+:10230000EB0025FD10C02091E4003091E500281776
+:10231000390751F34150C90139F784E0089582E04B
+:10232000089583E0089581E0089580E00895209164
+:10233000E80020FFDECFF9CF2091E80022FFD9CFBF
+:10234000F4CF0E940F120E941712E0EEF0E080819D
+:1023500081608083E8EDF0E080818F77808319BC15
+:10236000A7EDB0E08C918E7F8C9380818F7E8083EF
+:1023700010926D0308950F931F93CF93DF930E94E4
+:102380000F120E941712C8EDD0E088818F778883E2
+:1023900088818068888388818F7D888319BC1092AA
+:1023A0006E0310926A0310926C0310926B0300EE9E
+:1023B00010E0F80180818B7F808388818160888331
+:1023C00042E060E080E00E941711E1EEF0E08081E1
+:1023D0008E7F8083E2EEF0E0808181608083808167
+:1023E00088608083F80180818E7F8083888180610E
+:1023F0008883DF91CF911F910F910895E8EDF0E070
+:1024000080818F7E8083E7EDF0E080818160808332
+:1024100084E082BF81E080936D030C94BB11E8EDF2
+:10242000F0E080818E7F80831092E2000895109208
+:10243000DA001092E10008951F920F920FB60F92EA
+:1024400011242F933F934F935F936F937F938F93B9
+:102450009F93AF93BF93EF93FF938091E10082FF2F
+:102460000BC08091E20082FF07C08091E1008B7F6A
+:102470008093E1000E94D90D8091DA0080FF1FC097
+:102480008091D80080FF1BC08091DA008E7F8093FE
+:10249000DA008091D90080FF0DC080E189BD82E122
+:1024A00089BD09B400FEFDCF81E080936E030E94D8
+:1024B000C30D05C019BC10926E030E94D10D80910E
+:1024C000E10080FF19C08091E20080FF15C080917B
+:1024D000E2008E7F8093E2008091E2008061809331
+:1024E000E2008091D80080628093D80019BC85E01A
+:1024F00080936E030E94D50D8091E10084FF30C06F
+:102500008091E20084FF2CC080E189BD82E189BD19
+:1025100009B400FEFDCF8091D8008F7D8093D80054
+:102520008091E1008F7E8093E1008091E2008F7EB8
+:102530008093E2008091E20081608093E2008091CC
+:102540006A03882311F084E007C08091E30087FFCD
+:1025500002C083E001C081E080936E030E94D70D2A
+:102560008091E10083FF29C08091E20083FF25C0B4
+:102570008091E100877F8093E10082E080936E0389
+:1025800010926A038091E1008E7F8093E100809138
+:10259000E2008E7F8093E2008091E2008061809370
+:1025A000E20042E060E080E00E9417118091F000BC
+:1025B00088608093F0000E94D40DFF91EF91BF914D
+:1025C000AF919F918F917F916F915F914F913F91CB
+:1025D0002F910F900FBE0F901F9018951F920F9282
+:1025E0000FB60F9211242F933F934F935F936F93E6
+:1025F0007F938F939F93AF93BF93CF93EF93FF936B
+:102600008091E9008F709091EC0090FF02C090E8FB
+:1026100001C090E0C92FC82B1092E9008091F00012
+:10262000877F8093F00078940E9432131092E90023
+:102630008091F00088608093F000CF70C093E90033
+:10264000FF91EF91CF91BF91AF919F918F917F912A
+:102650006F915F914F913F912F910F900FBE0F900F
+:102660001F9018951F93CF93DF93CDB7DEB7AC972C
+:102670000FB6F894DEBF0FBECDBFEFE6F3E080915A
+:10268000F100819323E0E737F207C9F70E94250E96
+:102690008091E80083FF37C180916F0390917003B0
+:1026A000953009F488C038F49130B1F170F093306E
+:1026B00009F029C131C0983009F4F8C0993009F403
+:1026C00004C1963009F01FC19DC0803821F08238C6
+:1026D00009F019C108C080916B0390916C03992394
+:1026E00089F082600FC080917303909174038F70A2
+:1026F00099278093E9008091EB0085FB882780F97A
+:102700001092E9009091E800977F9093E800809301
+:10271000F1001092F100D5C0882319F0823009F041
+:10272000F2C08F7121F0823009F0EDC00BC08091B2
+:102730007103813009F0E7C0933009F080E08093A5
+:102740006C032FC08091710381112BC080917303A2
+:10275000909174038F709927009709F4D4C08093E7
+:10276000E9002091EB0020FF1CC020917003233072
+:1027700021F48091EB00806212C09091EB00906197
+:102780009093EB0021E030E001C0220F8A95EAF738
+:102790002093EA001092EA008091EB008860809319
+:1027A000EB001092E9008091E800877F8093E800B9
+:1027B0000E944E11A8C08111A6C080917103909112
+:1027C00072038F779927182F9091E3009078982BB8
+:1027D0009093E3008091E800877F8093E8000E9457
+:1027E0004E118091E80080FFFCCF8091E30080686B
+:1027F0008093E300112311F083E001C082E0809315
+:102800006E0381C08058823008F07DC080917103D2
+:10281000909172038C3D23E0920779F583E08A83DF
+:102820008AE289834FB7F894DE01139620E03EE0F8
+:1028300051E2E32FF0E050935700E49120FF03C0F2
+:10284000E295EF703F5FEF708E2F90E0EA3010F06E
+:10285000C79601C0C0968D939D932F5F243149F791
+:102860004FBF8091E800877F8093E8006AE270E0C4
+:10287000CE0101960E94581013C0AE01455D5F4F16
+:10288000609173030E943F0F0097E9F12091E800E7
+:10289000277F2093E800BC018BA59CA50E94B71060
+:1028A0008091E8008B778093E8002DC0803859F53F
+:1028B0008091E800877F8093E80080916A0380938D
+:1028C000F1008091E8008E7771CF81111CC090914A
+:1028D00071039230C0F48091E800877F8093E80014
+:1028E00090936A030E944E1180916A03811104C083
+:1028F0008091E30087FF02C084E001C081E0809303
+:102900006E030E94070E8091E80083FF0AC0809149
+:10291000E800877F8093E8008091EB0080628093DD
+:10292000EB00AC960FB6F894DEBF0FBECDBFDF91C3
+:10293000CF911F910895CF9380916E038823B1F0BA
+:102940008091E9008F709091EC0090FF02C090E8B8
+:1029500001C090E0C92FC82B1092E9008091E800D7
+:1029600083FD0E943213CF70C093E900CF91089588
+:10297000881F8827881F089591E0883F08F490E019
+:10298000892F0895982F907F903B99F038F49039D3
+:1029900081F0903A71F09038C9F40BC0903DA1F0ED
+:1029A00018F4903C99F410C0903E19F0903F71F4E7
+:1029B00002C083E00895E82FE15FEF3038F4F0E0E3
+:1029C000E356FE4F8081089582E0089580E00895E7
+:1029D0000F932F774F776F70606BDC01ED91FC9157
+:1029E000022F242F462F63E070E009950F91089580
+:1029F0000F932F774F776F706069DC01ED91FC9139
+:102A0000022F242F462F63E070E009950F9108955F
+:102A10000F932F774F776F706068DC01ED91FC9119
+:102A2000022F242F462F63E070E009950F9108953F
+:102A3000FC01738362830895FC01738F628F089594
+:102A4000FC01758F648F0895CF93DF93EC011DA275
+:102A50001FA21EA2BC01685D7F4F40EC88519F4FB2
+:102A60000E9461171B821A821D821C821F821E8295
+:102A7000198618861B861A861D861C861F861E864A
+:102A8000198A188A1B8A1A8A1D8A1C8A1F8A1E8A1A
+:102A9000198E188E1B8E1A8E1D8E1C8E1F8E1E8EEA
+:102AA00019A218A2DF91CF910895CF92DF92FF92E1
+:102AB0000F931F93CF93DF931F92CDB7DEB7F62E00
+:102AC0006A018C0108511F4F08C0F60161916F0126
+:102AD000C80149830E94681749818C2D841B8F157A
+:102AE000A0F30F90DF91CF911F910F91FF90DF9096
+:102AF000CF900895FC01718360830895FC0171A358
+:102B000060A30895AF92BF92CF92DF92EF92FF92AF
+:102B10000F931F93CF93DF9300D01F92CDB7DEB7F3
+:102B20007C016B01142FB22EA02EDC0195968C91A6
+:102B300095978430F1F45A96ED91FC915B9730971C
+:102B400009F4D8C0CB01019763E070E00E94762FB2
+:102B5000DB01AA0FBB1FA60FB71F49832A830B8374
+:102B60004C2D4A1B9E012F5F3F4FBD01C7010995A8
+:102B7000B1C06230710509F453C06330710529F0AA
+:102B80006130710509F09CC083C0842F807F803A3A
+:102B900001F130F48038B9F0803909F0ABC00DC0D4
+:102BA000803EE9F0803F09F1803B09F0A3C0D701E6
+:102BB0001296ED91FC91139723C0D7011496ED91D5
+:102BC000FC9115971DC0D7011696ED91FC911797B2
+:102BD00017C0D7011896ED91FC91199711C0D70134
+:102BE0001A96ED91FC911B970BC0423F09F082C0F1
+:102BF000D7011C96ED91FC911D97309731F47AC066
+:102C0000309709F477C0123F21F42A2D4B2D62EF43
+:102C100004C0612F6F702A2D4B2DC70109955AC032
+:102C2000842F807F803D59F0803F79F0803C09F00F
+:102C300061C0D7011E96ED91FC911F9719C0D70175
+:102C40005096ED91FC91519713C0433F31F4D70159
+:102C50005296ED91FC91539708C0413F09F04AC04C
+:102C6000D7015496ED91FC915597309741F442C0AD
+:102C7000309709F43FC0133F11F0113F19F44B2D69
+:102C8000612F03C0612F6F704B2DC701099522C0C2
+:102C9000842F0E94BC14882331F0D7015696ED9101
+:102CA000FC91579707C0163F29F5D7015896ED912B
+:102CB000FC9159973097F1F0612FC70109950AC02F
+:102CC00064307105A8F416C00A2D2B2D412FB601D2
+:102CD000C7010995D7015E96ED91FC915F973097FA
+:102CE00089F00A2D2B2D412FB601C70109950AC085
+:102CF000C12CD12CD7015C96ED91FC915D9730975A
+:102D000019F7E8CF0F900F900F90DF91CF911F919F
+:102D10000F91FF90EF90DF90CF90BF90AF9008950C
+:102D2000EF92FF920F931F93CF93DF93EC01162F37
+:102D3000862F0E94BC14882369F0FDA081E08DA33A
+:102D400000E020E0412F61E070E0CE010E9482159A
+:102D5000FDA27CC0812F0E94B8144DA1882309F4E4
+:102D600040C0443029F01AA321E030E03FA32EA355
+:102D7000812F0E94C214813031F070F0823051F006
+:102D8000833059F507C08DA300E020E0412F61E0BA
+:102D900070E01EC08DA35AC0103F19F0173FE9F430
+:102DA00004C084E08DA31AA33FC02EA13FA1C90196
+:102DB00063E070E00E94762F8C0F9D1FFC0112A330
+:102DC000B9016F5F7F4F7FA36EA30CA12BA14AA116
+:102DD000CE010E9482151DA239C01DA21FA21EA2F3
+:102DE00035C0442399F12EA13FA1C90163E070E0F1
+:102DF0000E94762F7C01FE01E80FF91F12A3B90192
+:102E00006F5F7F4F7FA36EA38130910591F082E0C9
+:102E1000E816F104D9F40CA12BA14AA1CE010E941D
+:102E200082158DA1843091F081E090E09FA38EA364
+:102E30000DC0423059F400E02BA14AA1CE010E94FE
+:102E400082158DA1843011F0FFA2EEA2DF91CF9107
+:102E50001F910F91FF90EF900895CF92DF92EF9224
+:102E6000FF920F931F93CF93DF93EC01E8A1F9A199
+:102E7000309709F009958E0108511F4FC8010E9433
+:102E80009A17E12CF12CC82ED12C0FC060E0C8019C
+:102E90000E94AE17682FCE010E94901661E0C80113
+:102EA0000E94BF178FEFE81AF80AEC14FD0470F3C4
+:102EB000DF91CF911F910F91FF90EF90DF90CF9016
+:102EC0000895FC0142837483638311821082089504
+:102ED0000F931F93CF93DF93EC01062F0E94E0170F
+:102EE000182F298130E0C90101966A8170E00E94A3
+:102EF0008A2F488150E08417950729F4812F0E947A
+:102F0000E31780E012C0EB81FC81E20FF31F008326
+:102F10002981822F90E001966A8170E00E948A2FB9
+:102F20008983812F0E94E31781E0DF91CF911F9168
+:102F30000F910895CF93DF93EC010E94E017298150
+:102F40009881291710F0C22F02C0CA81C20FC91B75
+:102F50000E94E3178C2FDF91CF910895FC0120810F
+:102F6000862F90E0820F911D628170E00E948A2F6F
+:102F70000380F481E02DE80FF91F808108950F93FD
+:102F80001F93CF93DF931F92CDB7DEB78C01698378
+:102F90000E94E017482FF80180816981262F30E0D8
+:102FA000280F311D6281C90170E00E948A2F808341
+:102FB000842F0F90DF91CF911F910F910C94E31705
+:102FC0008FB7F89408958FBF0895FC01CB0120912D
+:102FD0006E032430B1F421812F702093E90040E08A
+:102FE00050E064E070E00E94BA0F81110BC0909134
+:102FF000E80095FD07C09091E8009E779093E80067
+:10300000089582E0089520916E032430A9F4FC0114
+:1030100081818F708093E9003091F3002091F2005C
+:10302000932F80E0822B892B49F08091E8008E77E6
+:103030008093E8000C946F1182E0089580E0089579
+:1030400020916E03243051F4FC0121812F702093D4
+:10305000E9002091E80020FD0C9403180895FC017C
+:10306000CB0120916E03243011F080E00895268179
+:103070002F702093E9002091E80022FFF6CF2091E5
+:10308000E80025FFF2CF40E050E064E070E00E94ED
+:1030900009108091E80085FD05C08091E8008B77DC
+:1030A0008093E80081E0089590930F0280930E02D0
+:1030B000089580910E0290910F020895E0910E0202
+:1030C000F0910F02309721F00190F081E02D0994EA
+:1030D00080E00895E0910E02F0910F02309721F008
+:1030E0000280F381E02D09940895E0910E02F091A1
+:1030F0000F02309721F00480F581E02D09940895A6
+:1031000020911002309111028217930771F0909371
+:10311000110280931002E0910E02F0910F0230979D
+:1031200021F00680F781E02D099408952091120284
+:10313000309113028217930771F0909313028093DA
+:103140001202E0910E02F0910F02309721F00084FC
+:10315000F185E02D099408950E94B6240E948D0502
+:103160000E948A250C945F2B0C94CE075F926F927D
+:103170007F928F929F92AF92BF92CF92DF92EF9207
+:10318000FF920F931F93CF93DF93CDB7DEB72A97AC
+:103190000FB6F894DEBF0FBECDBF0E947E0694E14D
+:1031A000C92E92E0D92E00E010E0AA24A394B12CFD
+:1031B000502E802F0E94C4073C01F601E190F1904F
+:1031C0006F01E826F926E114F10431F40F5F1F4F77
+:1031D0000430110569F73AC08091680281FD0E94B0
+:1031E000CD0720E030E04501022E02C0880C991C7A
+:1031F0000A94E2F7C4018E219F21892B09F12E83C5
+:103200005F826820792081E0672809F480E0888760
+:103210000E94BF248160782F9A8789874E815F81C1
+:1032200068858A850E946F19F801EE0FFF1FEC5E1A
+:10323000FD4F80819181882599259183808316C0D7
+:103240002F5F3F4F2C30310571F6C0CF8FEF898350
+:103250008A831B820E94BF248160782F9D838C8388
+:1032600049815A816B818D810E946F190E94772854
+:1032700010911C020E945E181817D9F00E945E1867
+:1032800080931C022A960FB6F894DEBF0FBECDBF06
+:10329000DF91CF911F910F91FF90EF90DF90CF9032
+:1032A000BF90AF909F908F907F906F905F900C94A5
+:1032B000B4182A960FB6F894DEBF0FBECDBFDF91CB
+:1032C000CF911F910F91FF90EF90DF90CF90BF9023
+:1032D000AF909F908F907F906F905F900895CF9365
+:1032E000DF93CDB7DEB72B970FB6F894DEBF0FBED6
+:1032F000CDBF4F83588769877A878B87DE01119608
+:1033000086E0FD0111928A95E9F785E0FE01379686
+:1033100001900D928A95E1F749815A816B817C81F8
+:103320008D819E810E9447212B960FB6F894DEBFB7
+:103330000FBECDBFDF91CF910895CF93C82F8823C3
+:1033400009F4C1C0823859F40E945E1881FDBBC0E7
+:1033500089E30E94AC230E94282489E30CC08338AF
+:1033600079F40E945E1880FDAEC083E50E94AC2314
+:103370000E94282483E50E94CE23CF910C94282418
+:10338000843859F40E945E1882FD9DC087E40E9433
+:10339000AC230E94282487E4EECF8450813A48F47D
+:1033A0008C2F0E94C72A81118EC08C2F0E94AC23C3
+:1033B000E4CF8C2F805E883050F4C77081E090E0BD
+:1033C00001C0880FCA95EAF70E94EF23D6CF8C2F51
+:1033D000855A833078F4C53A29F0C63A31F482E848
+:1033E00090E005C081E890E002C083E890E0CF91D2
+:1033F0000C9480188C2F885A833108F064C0C83A26
+:1034000039F1C93A41F1CA3A49F1CB3A51F1CC3AD2
+:1034100059F1CD3A61F1C03B69F1CE3A71F1CF3A41
+:1034200079F1C13B81F1C23B89F1C33B91F1C43BCE
+:1034300099F1C53BA1F1C63BA9F1C73BB1F1C83B2E
+:10344000B9F1C93BC1F1CA3BC9F58AE292E038C083
+:1034500082EE90E035C089EE90E032C08AEE90E0D6
+:103460002FC085EB90E02CC086EB90E029C087EB65
+:1034700090E026C08CEC90E023C08DEC90E020C062
+:1034800083E891E01DC08AE891E01AC082E991E0EA
+:1034900017C084E991E014C081E292E011C083E298
+:1034A00092E00EC084E292E00BC085E292E008C098
+:1034B00086E292E005C087E292E002C080E090E000
+:1034C000CF910C949618CF910895882309F44DC09C
+:1034D000823859F40E945E1881FF47C089E30E9438
+:1034E000AC230E94282489E30CC0833871F40E9425
+:1034F0005E1880FF3AC083E50E94AC230E94282416
+:1035000083E50E94CE230C942824843859F40E9429
+:103510005E1882FF2AC087E40E94AC230E94282400
+:1035200087E4EFCF982F9450913A08F4EACF982F80
+:10353000905E983058F4282F277081E090E001C009
+:10354000880F2A95EAF70E94F523DDCF982F955A28
+:10355000933020F480E090E00C948018885A8331F6
+:1035600020F480E090E00C9496180895882321F0D0
+:103570000E94EF230C9428240895882321F00E94B0
+:10358000F5230C9428240895BF92CF92DF92EF92F6
+:10359000FF920F931F93CF93DF93CDB7DEB727979B
+:1035A0000FB6F894DEBF0FBECDBF8C0185E0F801E9
+:1035B000DE01119601900D928A95E1F7F8013081B4
+:1035C0002181F280558152955F7083819481892B8E
+:1035D00039F02F3F41F481E090E03F3F31F003C0EC
+:1035E00081E090E002C080E090E080FD73C3398309
+:1035F0002A8389819A815E830E946923B92E8F83F1
+:103600000E9468230E9490222B2D22952F7030E07B
+:103610005E816F812530310509F4E6C06CF42430F9
+:1036200031050CF0A2C04B2D407F8B2D8F702230C6
+:1036300031050CF045C017C02C3031054CF42A3050
+:1036400031050CF0E7C12830310509F043C3E5C06E
+:103650002D30310509F4BAC20CF4A2C22F30310565
+:1036600009F038C323C3182F411101C002C01295BD
+:10367000107FFF2059F0112309F46BC2812F6F8353
+:103680000E94FF230E9428246F8163C2862F0E941C
+:10369000651A112309F41EC3812F0E940524279661
+:1036A0000FB6F894DEBF0FBECDBFDF91CF911F9153
+:1036B0000F91FF90EF90DF90CF90BF900C94282453
+:1036C000403211F08295807F662319F0613071F5E8
+:1036D00023C0FF20B1F0511101C032C0513081F53B
+:1036E00027960FB6F894DEBF0FBECDBFDF91CF9106
+:1036F0001F910F91FF90EF90DF90CF90BF900C94AF
+:103700000F24511101C003C0513009F4E3C28E836C
+:103710000E9412248E819AC1FF2021F0563008F0B9
+:10372000D9C20EC0553008F0D5C290C1FF20C9F0F3
+:10373000552331F0F801958190FF0BC29F7095835E
+:1037400027960FB6F894DEBF0FBECDBFDF91CF91A5
+:103750001F910F91FF90EF90DF90CF90BF900C944E
+:10376000B61A552309F472C109C22B2D2695269548
+:10377000237030E02115310529F02130310509F0A1
+:10378000A9C219C0FF2021F0862F9B2D937002C083
+:1037900080E090E027960FB6F894DEBF0FBECDBF55
+:1037A000DF91CF911F910F91FF90EF90DF90CF901D
+:1037B000BF900C948018FF2021F0862F9B2D9370D2
+:1037C00002C080E090E027960FB6F894DEBF0FBEEF
+:1037D000CDBFDF91CF911F910F91FF90EF90DF90C0
+:1037E000CF90BF900C949618862FFF2019F00E945E
+:1037F0007D2702C00E94E52727960FB6F894DEBF0A
+:103800000FBECDBFDF91CF911F910F91FF90EF9031
+:10381000DF90CF90BF900C946C288B2D837009F0B3
+:1038200079C0F11057C2262F229526952770220FB6
+:10383000220F862F8F70C82ED12CE12CF12C022E56
+:1038400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF4
+:1038500010C06FE070E080E090E004C0660F771F5A
+:10386000881F991F2A95D2F760957095809590953D
+:1038700003C060E070E0CB012B2D269526952370C8
+:10388000422F50E042305105D9F04330510569F1E3
+:103890006C297D298E299F294130510551F12796A8
+:1038A0000FB6F894DEBF0FBECDBFDF91CF911F9151
+:1038B0000F91FF90EF90DF90CF90BF900C94A522D6
+:1038C0006C297D298E299F2927960FB6F894DEBF93
+:1038D0000FBECDBFDF91CF911F910F91FF90EF9061
+:1038E000DF90CF90BF900C94B7220E94A522C70111
+:1038F000B60127960FB6F894DEBF0FBECDBFDF919D
+:10390000CF911F910F91FF90EF90DF90CF90BF90DC
+:103910000C949322FF2019F08B2D817001C08695A5
+:10392000882309F4D7C1262F229526952770220FC8
+:10393000220F862F8F70C82ED12CE12CF12C022E55
+:1039400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF3
+:1039500010C06FE070E080E090E004C0660F771F59
+:10396000881F991F2A95D2F760957095809590953C
+:1039700003C060E070E0CB012B2D269526952370C7
+:10398000422F50E042305105D9F04330510569F1E2
+:103990006C297D298E299F294130510551F12796A7
+:1039A0000FB6F894DEBF0FBECDBFDF91CF911F9150
+:1039B0000F91FF90EF90DF90CF90BF900C94442335
+:1039C0006C297D298E299F2927960FB6F894DEBF92
+:1039D0000FBECDBFDF91CF911F910F91FF90EF9060
+:1039E000DF90CF90BF900C9456230E944423C701D0
+:1039F000B60127960FB6F894DEBF0FBECDBFDF919C
+:103A0000CF911F910F91FF90EF90DF90CF90BF90DB
+:103A10000C943223603F59F120F4603E08F494C0C6
+:103A200008C0623F09F467C0F0F1633F09F08CC041
+:103A300065C0162F1F708B2D8F71FF2021F00E9403
+:103A4000DD22812F7DCE0E94F822812F27960FB68E
+:103A5000F894DEBF0FBECDBFDF91CF911F910F91C4
+:103A6000FF90EF90DF90CF90BF900C94BD1AFF2095
+:103A7000B1F0553008F02EC18B2D8F7127960FB6FF
+:103A8000F894DEBF0FBECDBFDF91CF911F910F9194
+:103A9000FF90EF90DF90CF90BF900C94172356309B
+:103AA00008F018C1E9CFFF2099F08B2D8F71279670
+:103AB0000FB6F894DEBF0FBECDBFDF91CF911F913F
+:103AC0000F91FF90EF90DF90CF90BF900C94DD228C
+:103AD0008B2D8F7127960FB6F894DEBF0FBECDBF2A
+:103AE000DF91CF911F910F91FF90EF90DF90CF90DA
+:103AF000BF900C94F822F110EBCFD7CFFF2099F0B4
+:103B00008B2D8F7127960FB6F894DEBF0FBECDBFF9
+:103B1000DF91CF911F910F91FF90EF90DF90CF90A9
+:103B2000BF900C94CE2227960FB6F894DEBF0FBE3E
+:103B3000CDBFDF91CF911F910F91FF90EF90DF905C
+:103B4000CF90BF900C94C922FF20A9F0552309F40F
+:103B5000ACCF862F27960FB6F894DEBF0FBECDBF31
+:103B6000DF91CF911F910F91FF90EF90DF90CF9059
+:103B7000BF900C949D19552309F4AACF862F279640
+:103B80000FB6F894DEBF0FBECDBFDF91CF911F916E
+:103B90000F91FF90EF90DF90CF90BF900C94651A3B
+:103BA0004B2D4F70C8010E94E50227960FB6F8947E
+:103BB000DEBF0FBECDBFDF91CF911F910F91FF9060
+:103BC000EF90DF90CF90BF900C94FD21F11082C058
+:103BD0009B2D9F70492F50E04230510599F144F4DC
+:103BE0004115510569F04130510509F073C019C004
+:103BF00043305105C1F14430510509F06BC044C058
+:103C000027960FB6F894DEBF0FBECDBFDF91CF91E0
+:103C10001F910F91FF90EF90DF90CF90BF900C9489
+:103C2000702B27960FB6F894DEBF0FBECDBFDF9185
+:103C3000CF911F910F91FF90EF90DF90CF90BF90A9
+:103C40000C94872B27960FB6F894DEBF0FBECDBF1E
+:103C5000DF91CF911F910F91FF90EF90DF90CF9068
+:103C6000BF900C94A32B27960FB6F894DEBF0FBE1F
+:103C7000CDBFDF91CF911F910F91FF90EF90DF901B
+:103C8000CF90BF900C94B62B862F27960FB6F89442
+:103C9000DEBF0FBECDBFDF91CF911F910F91FF907F
+:103CA000EF90DF90CF90BF900C94DA2B4B2D4F709C
+:103CB000C80127960FB6F894DEBF0FBECDBFDF91C7
+:103CC000CF911F910F91FF90EF90DF90CF90BF9019
+:103CD0000C940E0827960FB6F894DEBF0FBECDBF2A
+:103CE000DF91CF911F910F91FF90EF90DF90CF90D8
+:103CF000BF9008950E940C240E94E1230E94282472
+:103D00000E9418290E946C2880E090E00E94801890
+:103D100080E090E00C9496180E94FC230C947A1E8C
+:103D20000E946923292F22952F7030E02C30310515
+:103D30004CF42A3031056CF422503109223031051F
+:103D400070F407C02C30310531F02F30310539F4D3
+:103D500002C081E0089593FB882780F9089580E0F0
+:103D60000895CF93DF9300D000D01F92CDB7DEB778
+:103D70000F900F900F900F900F90DF91CF910895BB
+:103D8000CF93DF9300D000D000D0CDB7DEB726961A
+:103D90000FB6F894DEBF0FBECDBFDF91CF9108956F
+:103DA0001F93CF93DF93C091530216E012C0D0E06F
+:103DB0001C9FF0011D9FF00D1124ED5DFD4F408112
+:103DC000518162817381848195810E94C01E2196F8
+:103DD000C77080915402C813EACFDF91CF911F9131
+:103DE000089540911D0250911E0260911F02709132
+:103DF000200280912102909122020C94C01E0F9308
+:103E00001F93CF93DF938091220282958F7009F0E8
+:103E100069C080911F02882309F464C0A0915302F5
+:103E2000D0915402B0911D02C0911E0280912002D7
+:103E30009091210221E030E0BF3F11F020E030E01E
+:103E4000122FBC016095709506E04AC0009721F0E2
+:103E5000CF3F29F4212F05C021E030E002C020E04F
+:103E600030E020FD3BC04A2F50E0049FF001059F49
+:103E7000F00D1124ED5DFD4F2181C2132FC0208173
+:103E8000B2132CC02281211129C02381348128172B
+:103E9000390718F0281B390B02C0260F371F283CA2
+:103EA0003105E0F4809122028F70806180932202BC
+:103EB00086E0849FF001859FF00D1124E85DFD4FA1
+:103EC00080818F70806180838DE192E00E94C41AAE
+:103ED000DF91CF911F910F910C94D01EAF5FA7700F
+:103EE000AD13B4CFDF91CF911F910F910895EF9251
+:103EF000FF920F931F93CF93DF93CDB7DEB76297F7
+:103F00000FB6F894DEBF0FBECDBF8C0185E0F8017F
+:103F1000DE011D9601900D928A95E1F7D8014C9132
+:103F200011965C91119712966C9112971396ED90E1
+:103F3000FC90149770911D02E0911E028091200266
+:103F400090912102009739F0EF3F41F421E030E0F9
+:103F50007F3F31F003C021E030E002C020E030E0DC
+:103F600020FD5CC120911F02222309F4F1C0E81654
+:103F7000F90628F09701281B390BC90104C0809568
+:103F800090958E0D9F1D883C910508F098C08091FA
+:103F90002202982F907F09F064C0E51314C07413B7
+:103FA00012C0611110C08F708061809322020E9444
+:103FB000F11E8DE192E00E94C41A80912202D80184
+:103FC00015968C9343C1EF2839F05F3F41F481E0AF
+:103FD00090E04F3F31F003C081E090E002C080E00C
+:103FE00090E080FD03C081E0862702C080E090E081
+:103FF00080FF2EC0809153022091540236E013C0FE
+:1040000090E0389FF001399FF00D1124ED5DFD4FD8
+:104010007181571306C07081471303C07281671303
+:1040200017C0019687708213EBCF12C19F7059F0B1
+:10403000882309F40BC107C09F7029F0F80195810E
+:10404000907F09F403C1805E883008F4FFC0D2C0BD
+:10405000662309F4FBC080912202816080932202D2
+:10406000F5C0E51308C0741306C0611104C0D8017F
+:1040700015968C939DC04D875E878D859E856A8B36
+:104080000E94901E6A89882309F4B4C0662309F44B
+:10409000B1C020912202822F82958F7090E002970A
+:1040A0000CF4C6C080911D0290911E0298878F83E8
+:1040B0001986FB86EA862C87CE01079646C080913A
+:1040C0002202982F907F59F47E2DF98AE88A8989F7
+:1040D0000E94B11E8DE192E00E94C41A95C0E513C2
+:1040E00011C074130FC061110DC0F8018583C801A0
+:1040F0000E94C41AEDE1F2E086E0DF011D928A958C
+:10410000E9F7A2C04D875E878D859E856A8B0E94E8
+:10411000901E6A89882309F46DC0662309F46AC079
+:1041200020912202822F82958F7090E002970CF4EA
+:104130007FC080911D0290911E029A8389831B8209
+:10414000FD82EC822E83CE0101960E94C41A70C0BB
+:10415000E816F90628F09701281B390BC90104C09D
+:10416000809590958E0D9F1D883C910508F046C066
+:10417000662309F43FC0E51330C074132EC02091AC
+:10418000220220FD21C0322F32953F70832F90E014
+:104190000097D1F0D80115962C9315970F9741F001
+:1041A000832F8F5F8295807F2F70282B15962C93FD
+:1041B000C8010E94C41A86E0F801ADE1B2E00190A6
+:1041C0000D928A95E1F73EC086E0F801ADE1B2E0DC
+:1041D00001900D928A95E1F737C04D875E878D85F6
+:1041E0009E850E94901E811123C0809122028160D1
+:1041F00080932202C8010E94C41A26C07E2DF98A2B
+:10420000E88A89890E94B11EEDE1F2E086E0DF01D3
+:104210001D928A95E9F70E94F11E18C0662351F39A
+:104220004D875E878D859E850E94901E882311F3A1
+:1042300086E0F801ADE1B2E001900D928A95E1F7D8
+:104240000E94FF1E0E94F11E81E014C080E012C097
+:104250004D875E878D859E850E946923292F229533
+:104260002F7030E0223031050CF4E0CE24303105DF
+:104270000CF6E2CE62960FB6F894DEBF0FBECDBF4D
+:10428000DF91CF911F910F91FF90EF9008951F93B1
+:10429000CF93DF93CDB7DEB72C970FB6F894DEBF80
+:1042A0000FBECDBF4F83588769877A878B879C87DE
+:1042B000CE0107960E94771F8823D9F02F81388579
+:1042C0008A859B85892B39F03F3F19F080E090E08B
+:1042D00004C02F3FD9F781E090E0892B09F06DC031
+:1042E0004F81588569857A858B859C850E94C01E83
+:1042F00064C086E0FE013796DE01119601900D92B2
+:104300008A95E1F7FF81E8854A855B85411551056E
+:1043100039F0EF3F41F481E090E0FF3F31F003C01E
+:1043200081E090E002C080E090E080FD46C02091F6
+:10433000540230E0C90101968770992760915302B9
+:1043400070E08617970709F440C0F983EA835D831C
+:104350004C8396E0929FD001939FB00D1124AD5DE8
+:10436000BD4FFE01319601900D929A95E1F7809331
+:1043700054020E94D01E21C0189FC00111248D5DDF
+:104380009D4F0E94771F882371F1E09153021E9F79
+:10439000F0011124ED5DFD4F4081518162817381F7
+:1043A000848195810E94C01E8091530290E0019605
+:1043B000877099278093530201C016E080915302C1
+:1043C000909154028913D8CF0EC00E948C1E109277
+:1043D000540210925302EDE1F2E086E0DF011D92FB
+:1043E0008A95E9F7EACF2C960FB6F894DEBF0FBE98
+:1043F000CDBFDF91CF911F910895DF92EF92FF9291
+:104400000F931F93CF93DF93EC01009709F46CC0D7
+:10441000D12CEE24E394F12C8E010F5F1F4FFE018F
+:104420008491843748F4843008F04AC0813071F0B8
+:10443000823009F059C01EC0853709F43DC070F1C3
+:10444000982F9458903708F04FC03DC02296F8013D
+:104450008491982F905E983050F48770FE2D01C0A3
+:10446000FF0F8A95EAF78F2F0E94FF2330C00E942A
+:104470009D192DC02296F8018491982F905E983056
+:1044800050F48770FE2D01C0FF0F8A95EAF78F2F39
+:104490000E9405241CC00E94651A19C02296F801CA
+:1044A000049107C08FE99FE00197F1F700C0000079
+:1044B00001500111F7CF0BC02296F801D49007C02C
+:1044C0000E949D1903C08F770E94651AE8018D2D07
+:1044D00007C08150EFE9FFE03197F1F700C000001D
+:1044E000882309F499CFF5CFDF91CF911F910F91D8
+:1044F000FF90EF90DF9008956093590270935A02F5
+:1045000080935B0290935C020C947A1E6093550238
+:104510007093560280935702909358020C947A1E1F
+:1045200008950C947C220F931F93009159021091CF
+:104530005A0220915B0230915C02602B712B822B1E
+:10454000932B1F910F910C947C220F931F9300913A
+:10455000590210915A0220915B0230915C02602353
+:104560007123822393231F910F910C947C220F932C
+:104570001F930091590210915A0220915B023091D1
+:104580005C0260277127822793271F910F910C945B
+:104590007C2260E070E0CB010C94862241E050E088
+:1045A00060E070E004C0440F551F661F771F8A95B6
+:1045B000D2F7CB01BA010C94862241E050E060E0D2
+:1045C00070E004C0440F551F661F771F8A95D2F70D
+:1045D0008091550290915602A0915702B0915802D5
+:1045E000482B592B6A2B7B2BCB01BA010C948622CA
+:1045F00041E050E060E070E004C0440F551F661FCA
+:10460000771F8A95D2F74095509560957095809167
+:10461000550290915602A0915702B091580248233A
+:1046200059236A237B23CB01BA010C94862241E0F3
+:1046300050E060E070E004C0440F551F661F771F14
+:104640008A95D2F78091550290915602A091570217
+:10465000B0915802482759276A277B27CB01BA0116
+:104660000C9486220F931F930091550210915602CD
+:104670002091570230915802602B712B822B932B83
+:104680001F910F910C9486220F931F930091550256
+:1046900010915602209157023091580260237123E5
+:1046A000822393231F910F910C9486220F931F93C3
+:1046B00000915502109156022091570230915802F4
+:1046C00060277127822793271F910F910C948622D0
+:1046D0000895CF92DF92EF92FF920F931F93CF93A3
+:1046E000DF93EC01C0905902D0905A02E0905B0237
+:1046F000F0905C028091550290915602A091570271
+:10470000B0915802C82AD92AEA2AFB2A0FE110E000
+:10471000B701A601002E04C0769567955795479579
+:104720000A94D2F740FF08C0BE01802F0E94E00328
+:104730008130910509F007C00150110948F7BE0109
+:1047400080E00E94E003DF91CF911F910F91FF90D5
+:10475000EF90DF90CF90089540911B0150911C0184
+:1047600020E030E09FEFFA01E20FF31F628168174B
+:10477000A1F09F3F19F4611101C0922F2F5F3F4FAD
+:104780002630310581F707C0FA01E90FF11D97FDC9
+:10479000FA95828308959F3FB9F7089540911B01D0
+:1047A00050911C0120E030E0FA01E20FF31F9281EA
+:1047B000981301C012822F5F3F4F26303105A1F7B9
+:1047C000089581E090E0E0911B01F0911C01E80F59
+:1047D000F91F1082019688309105A9F708959091EC
+:1047E0005D02982B90935D020895809590915D02F3
+:1047F000982390935D02089510925D020895909120
+:104800005E02982B90935E020895809590915E02CF
+:10481000982390935E02089510925E02089580930B
+:104820005F02089510925F02089540911B0150911C
+:104830001C0120E030E080E0FA01E20FF31F9181DB
+:1048400091118F5F2F5F3F4F27303105A9F70895F2
+:10485000E0911B01F0911C0180915D028083E09149
+:104860001B01F0911C01808190915E02892B808355
+:1048700090915F02992361F0E0911B01F0911C017E
+:104880008081892B80830E94152481110E9412242B
+:1048900080911B0190911C010C946A1880916E0309
+:1048A000843009F11092690220E488E190E00FB6AB
+:1048B000F894A895809360000FBE2093600083B7A2
+:1048C000817F846083BF83B7816083BF789488953C
+:1048D00083B78E7F83BF88E10FB6F8948093600022
+:1048E000109260000FBE0895CF930E94E3020E94D1
+:1048F0007E060E94E402C0E08C2F0E94C407892B30
+:1049000029F4CF5FC430C1F780E001C081E0CF91CE
+:1049100008950E948C1E0C945F2B1F920F920FB66D
+:104920000F9211248F939F93AF93BF93809169024D
+:10493000811113C080916A0290916B02A0916C0268
+:10494000B0916D024196A11DB11D80936A029093B2
+:104950006B02A0936C02B0936D02BF91AF919F91D7
+:104960008F910F900FBE0F901F90189582E084BD1D
+:1049700093E095BD9AEF97BD80936E0008958FB731
+:10498000F89440916A0250916B0260916C027091B0
+:104990006D028FBFCA010895CF92DF92EF92FF920E
+:1049A0000F931F932FB7F89440916A0250916B02B6
+:1049B00060916C0270916D022FBF6A017B01EE2441
+:1049C000FF248C0120E030E0C016D106E206F30699
+:1049D00020F09A01281B390B05C09C0120953095C9
+:1049E000240F351FC9011F910F91FF90EF90DF90A9
+:1049F000CF9008951F920F920FB60F9211248F93AC
+:104A00009F93AF93BF9380916A0290916B02A091A4
+:104A10006C02B0916D020196A11DB11D80936A02D6
+:104A200090936B02A0936C02B0936D02BF91AF9113
+:104A30009F918F910F900FBE0F901F9018950E941D
+:104A4000A111F8942FEF87EA91E621508040904021
+:104A5000E1F700C0000087E090EBDC018093780371
+:104A600090937903A0937A03B0937B032CE088E1C1
+:104A700090E00FB6F894A895809360000FBE209345
+:104A80006000FFCFCF92DF92EF92FF920F931F93C0
+:104A9000CF93DF93C82ED12C01E010E08D2D0E9422
+:104AA000C4077C01C0E0D0E098010C2E02C0220FA8
+:104AB000331F0A94E2F72E213F21232B29F421965C
+:104AC000CC30D10589F708C06C2F7D2D80E00E9485
+:104AD000BB03C812F4CF06C0D39484E0D812DECF53
+:104AE00080E001C081E0DF91CF911F910F91FF9095
+:104AF000EF90DF90CF900895CF93C82F8CE20E9463
+:104B00004225882321F08C2FCF910C94422580E000
+:104B1000CF910895CF930E94CD26811102C00E94AB
+:104B2000AE26C5E608C00E947E068FE39CE9019789
+:104B3000F1F700C00000C150B1F789E20E947C2566
+:104B400081110AC18AE20E947C2581110E94AE2651
+:104B500085E00E947C2581110E941F250E94D82695
+:104B60008093680287E00E947C25882399F18BE17D
+:104B70000E947C25882351F09091680291FB882740
+:104B800080F921E0822780FB91F922C08EE00E940B
+:104B90007C25882351F09091680292FB882780F948
+:104BA00021E0822780FB92F913C080E10E947C25DE
+:104BB00090916802882341F093FB882780F921E0D7
+:104BC000822780FB93F904C0892F809580FB90F9A0
+:104BD00090936802809168020E94DC260E94EA2677
+:104BE00080937B0280EE0E947C25882341F0809197
+:104BF0007B02982F909590FB80F980937B0289E34C
+:104C00000E947C25882359F090917B0291FB882794
+:104C100080F921E0822780FB91F990937B0282EE5C
+:104C20000E947C25882359F090917B0292FB882773
+:104C300080F921E0822780FB92F990937B0286EE37
+:104C40000E947C25882359F090917B0293FB882752
+:104C500080F921E0822780FB93F990937B0283EE19
+:104C60000E947C25882359F090917B0294FB882731
+:104C700080F921E0822780FB94F990937B0285E301
+:104C80000E947C25882359F090917B0295FB882710
+:104C900080F921E0822780FB95F990937B0281E3E4
+:104CA0000E947C25882359F090917B0296FB8827EF
+:104CB00080F921E0822780FB96F990937B0281E1C5
+:104CC0000E947C25882359F090917B0297FB8827CE
+:104CD00080F921E0822780FB97F990937B028091F5
+:104CE0007B020E94EE2687E20E947C25C82F8EE17F
+:104CF0000E947C258111C2608FE10E947C25811178
+:104D0000C46080E20E947C258111C86081E20E941B
+:104D10007C258111C06182E20E947C258111C062E4
+:104D200083E20E947C258111C06484E20E947C257C
+:104D3000882311F0C06802C0CC2329F08C2F0E9478
+:104D4000E5266C2F03C00E94E126682F70E080E00A
+:104D500090E0CF910C949122CF9108956DEE7EEF6B
+:104D600080E090E00E94BA2F60E082E090E00E9434
+:104D7000AC2F60E083E090E00E94AC2F60E084E024
+:104D800090E00E94AC2F60E085E090E00E94AC2FA4
+:104D900060E086E090E00C94AC2F80E090E00E9410
+:104DA000A62F21E08D3E9E4F09F020E0822F08952E
+:104DB00082E090E00C949E2F682F82E090E00C94AB
+:104DC000AC2F83E090E00C949E2F682F83E090E05E
+:104DD0000C94AC2F84E090E00C949E2F682F84E01C
+:104DE00090E00C94AC2F86E090E00C949E2F682FFE
+:104DF00086E090E00C94AC2F8091760280FF0BC08F
+:104E00006091200185E0689FB00111247595679538
+:104E1000759567952AC081FF09C06091200185E0E2
+:104E2000689FB0011124759567951FC082FF07C068
+:104E30006091200185E0689FB001112416C0409167
+:104E400070024423C9F060911F01461788F7209132
+:104E5000200185E0289F90011124429FC001439FBB
+:104E6000900D112470E00E948A2F6038710540F483
+:104E70006115710539F002C065E070E0862F089574
+:104E80008FE7089581E008958091760280FF08C041
+:104E900060911E0170E0759567957595679521C0C5
+:104EA00081FF06C060911E0170E07595679519C07D
+:104EB00082FF04C060911E0170E010C080917002FA
+:104EC0008823C1F060911D018617A0F790911E0103
+:104ED000989FC001112470E00E948A2F60387105EC
+:104EE00028F46115710521F0862F08958FE7089544
+:104EF00081E0089561E070E0F4CF803F21F40E94EA
+:104F0000FC26819504C0813F29F40E94FC268093F1
+:104F100073020895823F21F40E94FC26819504C00B
+:104F2000833F29F40E94FC26809372020895893FF2
+:104F300019F40E94442705C08A3F31F40E94442797
+:104F400081958093740208958B3F21F40E94442739
+:104F5000819504C08C3F29F40E94442780937502F8
+:104F60000895843F21F480917102816017C0853FCC
+:104F700021F480917102826011C0863F21F48091FA
+:104F8000710284600BC0873F21F4809171028860B8
+:104F900005C0883F31F48091710280618093710275
+:104FA00008958D3F21F48091760281600BC08E3F81
+:104FB00021F480917602826005C08F3F29F48091B0
+:104FC00076028460809376020895803F29F4809170
+:104FD000730287FF6EC007C0813F41F48091730266
+:104FE00018160CF066C01092730263C090917202A2
+:104FF000823F19F497FF5DC005C0833F31F4191655
+:105000000CF057C01092720254C0893F31F4809165
+:10501000740218160CF04DC006C08A3F39F4809116
+:10502000740287FF46C01092740243C08B3F29F47C
+:105030008091750287FF3DC006C08C3F39F4809196
+:1050400075021816B4F51092750233C0843F21F42E
+:10505000809171028E7F05C0853F31F4809171028D
+:105060008D7F8093710225C0863F21F4809171026B
+:105070008B7FF7CF873F21F480917102877FF1CF3B
+:10508000883F21F4809171028F7EEBCF8D3F21F418
+:10509000809176028E7F0BC08E3F21F48091760244
+:1050A0008D7F05C08F3F29F4809176028B7F80939E
+:1050B00076028091720281110EC08091730281117B
+:1050C0000AC080917402811106C08091750281111D
+:1050D00002C010927002089581E792E00E94751854
+:1050E0000E94BF2490936F0280936E020895CF9325
+:1050F00080916E0290916F020E94CC2440917002C8
+:10510000442321F02091210130E006C020912201AA
+:105110005AE0259F900111248217930708F486C056
+:105120008091720281110DC090917302911109C09A
+:1051300090917402911105C090917502992309F420
+:1051400075C04F3F19F04F5F40937002181624F45A
+:105150000E94FC26809372028091720287FF05C034
+:105160000E94FC268195809372028091730218162A
+:1051700024F40E94FC26809373028091730287FFBF
+:1051800005C00E94FC268195809373026091720293
+:10519000662339F1C0917302CC2319F1772767FD9B
+:1051A0007095872F972F0E94FA2C23E333E343E374
+:1051B0005FE30E94AE2D0E94C72C609372026C2F99
+:1051C000772767FD7095872F972F0E94FA2C23E38E
+:1051D00033E343E35FE30E94AE2D0E94C72C60934C
+:1051E000730280917402181624F40E94442780935D
+:1051F00074028091740287FF05C00E944427819544
+:105200008093740280917502181624F40E9444273A
+:10521000809375028091750287FF05C00E94442724
+:10522000819580937502CF910C946C28CF9108954D
+:10523000E1E7F2E085E0DF011D928A95E9F710923F
+:105240007002109276020895833089F130F4813033
+:1052500061F0823009F06EC019C0853009F449C090
+:10526000B8F1863009F066C055C020912201862F22
+:1052700090E0820F911D8F3F910520F4620F6093A3
+:10528000220108958FEF809322010895209121013A
+:10529000862F90E0820F911D8F3F910520F4620FC1
+:1052A0006093210108958FEF80932101089520914B
+:1052B0002001862F90E0820F911D8F3F910520F4F1
+:1052C000620F6093200108958FEF8093200108956D
+:1052D00020911F01862F90E0820F911D8F3F910535
+:1052E00020F4620F60931F0108958FEF80931F01D8
+:1052F000089520911E01862F90E0820F911D8F3F0F
+:10530000910520F4620F60931E0108958FEF809342
+:105310001E01089520911D01862F90E0820F911D9E
+:105320008F3F910520F4620F60931D0108958FEF68
+:1053300080931D010895833021F130F4813059F0BC
+:10534000823009F049C012C0853089F128F18630D9
+:1053500009F042C037C080912201681720F4861BF3
+:1053600080932201089510922201089580912101D5
+:10537000681720F4861B8093210108951092210163
+:10538000089580912001681720F4861B80932001E6
+:10539000089510922001089580911F01681720F44C
+:1053A000861B80931F01089510921F01089580911C
+:1053B0001E01681720F4861B80931E010895109229
+:1053C0001E01089580911D01681720F4861B8093AB
+:1053D0001D01089510921D01089541E050E060E024
+:1053E00070E004C0440F551F661F771F8A95D2F7DF
+:1053F000CB01BA010E9491220C948C1E873208F5D1
+:105400008E3108F0B9C08E3009F47EC060F4873068
+:1054100009F465C018F4863059F549C0883051F157
+:105420008B3031F5AEC0883130F4863108F0A9C038
+:105430008031F1F473C0893109F4A3C08B31C1F418
+:1054400059C08933F1F068F4893209F493C018F433
+:10545000873271F48FC0853309F48CC0883341F4EE
+:1054600090C0863409F46BC008F488C0883449F1D0
+:1054700080E008950E94D8260E94EA260E94F32622
+:1054800080C00E945918892B59F00E945918909396
+:105490007902809378020E948C1E80E090E004C024
+:1054A00080917802909179020E9454186AC080918C
+:1054B0006802817F8E7F8093680281E0809377020B
+:1054C00008950E948C1E2FEF83ED90E321508040C1
+:1054D0009040E1F700C000000E941F2552C080915B
+:1054E000680280FF03C0817F8E7F01C0816080934E
+:1054F000680247C09091680291FB882780F921E0FB
+:10550000822780FB91F913C09091680292FB882753
+:1055100080F921E0822780FB92F909C0909168020E
+:1055200093FB882780F921E0822780FB93F99093F1
+:105530006802882331F191609093680222C081E86B
+:1055400090E00E9480182FEF81EE94E0215080407F
+:105550009040E1F700C0000080E090E00E948018D9
+:105560002FEF89E698E1215080409040E1F700C09C
+:10557000000007C080E003C08D5101C089530E9424
+:10558000ED2981E0089580E0089580E00895CF93AB
+:10559000C82F80917702813071F020F0823009F0BD
+:1055A00083C037C0A0911B01B0911C018C91823245
+:1055B00009F07CC007C0A0911B01B0911C018C9127
+:1055C000823249F48C2F0E94C32A81111EC08C2F75
+:1055D0000E94FE291CC08C2F0E94C52A811115C073
+:1055E000C43169F030F4CB3081F0C03109F062C0D1
+:1055F00009C0C93221F0C83309F05CC006C010925E
+:10560000770258C082E08093770281E090E0817059
+:1056100054C0C932C1F060F4C431A9F020F4C730DD
+:1056200009F046C02EC0CE51CA3008F041C011C0AA
+:10563000CE3409F118F4CB34D9F517C0C13599F03F
+:10564000C235B1F50EC010927A0281E080937702E4
+:1056500034C0EC2FF0E0E455FE4F808180937A0255
+:1056600027C061E003C061E007C06AE080917A0270
+:105670000E9424291DC06AE080917A020E949B2921
+:1056800017C08EE18093220182E3809321018AE09A
+:105690008093200184E180931F0188E080931E01A4
+:1056A00088E280931D0104C01092770280E005C05B
+:1056B00081E003C080E090E0AACFCF9108950E94DE
+:1056C000CD26811102C00E94AE260E94F32680934F
+:1056D000770380FF02C0869501C080E00C94DF074D
+:1056E00080917703982F9695292F30E0233031054C
+:1056F0004CF49F5F990F8170892B816080937703B1
+:105700000E94F7268091770386950C94DF0780919D
+:105710007703982F969591F09158990F8170892B66
+:10572000809377038E7F91E009F490E08091770376
+:1057300090FB80F9809377030E94F726809177038E
+:1057400086950C94DF0780917703982F909590FBB6
+:1057500080F9809377030E94F7268091770380FF7A
+:1057600002C0869501C080E00C94DF07309177037A
+:10577000232F26952F5F2F77822F90E0317004978B
+:105780002CF4220F232B2093770302C0309377034E
+:1057900080917703282F2E7F91E009F490E090FB11
+:1057A00080F9809377030E94F7268091770386958E
+:1057B0000C94DF0720917703922F96959827990FE5
+:1057C000822F8170892B809377038E7F91E009F47B
+:1057D00090E08091770390FB80F9809377030E949B
+:1057E000F7268091770386950C94DF075058BB27E6
+:1057F000AA270ED075C166D130F06BD120F031F4FC
+:105800009F3F11F41EF45BC10EF4E095E7FB51C11C
+:10581000E92F77D180F3BA176207730784079507DA
+:1058200018F071F49EF58FC10EF4E0950B2EBA2F8F
+:10583000A02D0B01B90190010C01CA01A001112496
+:10584000FF27591B99F0593F50F4503E68F11A1642
+:10585000F040A22F232F342F4427585FF3CF4695D3
+:1058600037952795A795F0405395C9F77EF41F16F5
+:10587000BA0B620B730B840BBAF09150A1F0FF0FBF
+:10588000BB1F661F771F881FC2F70EC0BA0F621FAB
+:10589000731F841F48F4879577956795B795F7959B
+:1058A0009E3F08F0B3CF9395880F08F09927EE0F2D
+:1058B000979587950895D9D008F481E008950CD084
+:1058C0000FC107D140F0FED030F021F45F3F19F056
+:1058D000F0C0511139C1F3C014D198F39923C9F321
+:1058E0005523B1F3951B550BBB27AA2762177307E6
+:1058F000840738F09F5F5F4F220F331F441FAA1F9A
+:10590000A9F333D00E2E3AF0E0E830D09150504059
+:10591000E695001CCAF729D0FE2F27D0660F771F07
+:10592000881FBB1F261737074807AB07B0E809F0E9
+:10593000BB0B802DBF01FF2793585F4F2AF09E3F7E
+:10594000510568F0B6C000C15F3FECF3983EDCF350
+:10595000869577956795B795F7959F5FC9F7880FF7
+:10596000911D9695879597F90895E1E0660F771F49
+:10597000881FBB1F621773078407BA0720F0621BDA
+:10598000730B840BBA0BEE1F88F7E095089504D0D3
+:105990006894B111D9C00895BCD088F09F5790F099
+:1059A000B92F9927B751A0F0D1F0660F771F881F44
+:1059B000991F1AF0BA95C9F712C0B13081F0C3D05F
+:1059C000B1E00895C0C0672F782F8827B85F39F0FD
+:1059D000B93FCCF3869577956795B395D9F73EF4A3
+:1059E00090958095709561957F4F8F4F9F4F08954B
+:1059F000E89409C097FB3EF4909580957095619569
+:105A00007F4F8F4F9F4F9923A9F0F92F96E9BB271E
+:105A10009395F695879577956795B795F111F8CF9A
+:105A2000FAF4BB0F11F460FF1BC06F5F7F4F8F4F05
+:105A30009F4F16C0882311F096E911C0772321F0FB
+:105A40009EE8872F762F05C0662371F096E8862F93
+:105A500070E060E02AF09A95660F771F881FDAF7EA
+:105A6000880F9695879597F90895990F0008550F17
+:105A7000AA0BE0E8FEEF16161706E807F907C0F0D4
+:105A800012161306E407F50798F0621B730B840BDC
+:105A9000950B39F40A2661F0232B242B252B21F4B6
+:105AA00008950A2609F4A140A6958FEF811D811D56
+:105AB000089597F99F6780E870E060E008959FEF90
+:105AC00080EC089500240A94161617061806090695
+:105AD000089500240A941216130614060506089564
+:105AE000092E0394000C11F4882352F0BB0F40F4EC
+:105AF000BF2B11F460FF04C06F5F7F4F8F4F9F4F2C
+:105B0000089557FD9058440F551F59F05F3F71F0AD
+:105B10004795880F97FB991F61F09F3F79F0879514
+:105B20000895121613061406551FF2CF4695F1DF9D
+:105B300008C0161617061806991FF1CF869571052D
+:105B4000610508940895E894BB2766277727CB0161
+:105B500097F908958ADF08F48FEF08950BD0C0CF2E
+:105B6000B1DF28F0B6DF18F0952309F0A2CFA7CF58
+:105B70001124EACFC6DFA0F3959FD1F3950F50E033
+:105B8000551F629FF001729FBB27F00DB11D639FEF
+:105B9000AA27F00DB11DAA1F649F6627B00DA11D95
+:105BA000661F829F2227B00DA11D621F739FB00D3B
+:105BB000A11D621F839FA00D611D221F749F3327AB
+:105BC000A00D611D231F849F600D211D822F762F44
+:105BD0006A2F11249F5750408AF0E1F088234AF041
+:105BE000EE0FFF1FBB1F661F771F881F915050408D
+:105BF000A9F79E3F510570F05CCFA6CF5F3FECF355
+:105C0000983EDCF3869577956795B795F795E79578
+:105C10009F5FC1F7FE2B880F911D9695879597F989
+:105C20000895FA01EE0FFF1F30962105310599F115
+:105C30006115710561F48038BFE39B0749F16894F1
+:105C40009038810561F08038BFEF9B0741F09923C0
+:105C500042F5FF3FE1053105210511F1E894089473
+:105C6000E795D901AA2329F4AB2FBE2FF85FD0F313
+:105C700010C0FF5F70F4A695E0F7F73950F019F007
+:105C8000FF3A38F49F779F930CD00F9007FC905801
+:105C900008953EF014CF60E070E080E89FE308953F
+:105CA0004FE79F775F934F933F932F939ED02F9112
+:105CB0003F914F915F9152DF05C019F40EF0F9CE7C
+:105CC00042CFFDCE26DFC8F39638C0F707F80F9213
+:105CD000E8942BE33AEA48EB5FE74EDF0F920F922E
+:105CE0000F924DB75EB70F92C0D0ECEAF0E016D03D
+:105CF0004F915F91EF91FF91E595EE1FFF1F49F0E6
+:105D0000FE57E0684427EE0F441FFA95E1F74195EE
+:105D1000550B32D00F9007FE26C00895DF93CF9326
+:105D20001F930F93FF92EF92DF927B018C01689497
+:105D300005C0DA2EEF011EDFFE01E894A591259142
+:105D4000359145915591AEF3EF0162DDFE0197016A
+:105D5000A801DA9479F7DF90EF90FF900F911F91EF
+:105D6000CF91DF9108959B01AC0160E070E080E885
+:105D70009FE3A5CD9ECEACC0CCDEE8F39923D9F34A
+:105D8000940F511DBBF39150504094F059F088236B
+:105D900032F0660F771F881F91505040C1F79E3F29
+:105DA000510544F7880F911D9695879597F90895A9
+:105DB0005F3FACF0983E9CF0BB2786957795679542
+:105DC000B79508F4B1609395C1F7BB0F58F711F47C
+:105DD00060FFE8CF6F5F7F4F8F4F9F4FE3CFB4CE11
+:105DE0000EF076C06CCE689464CE93DEC8F399232F
+:105DF000D1F3C6F3DF93CF931F930F93FF92C92F75
+:105E0000DD2788232AF02197660F771F881FDAF78E
+:105E100020E030E040E85FEB9FE3883920F0803EEF
+:105E200030F021968F77E3DCE4EDF0E003C0DFDCB7
+:105E3000E1E0F1E073DF8B01BE01EC01FB2E6F5757
+:105E400071097595771F880B990BD4DD28E132E72E
+:105E500041E35FE38FDEAF2D9801AE01FF900F911C
+:105E60001F91CF91DF91D4DC3BCEFA01DC01AA0F68
+:105E7000BB1F9B01AC01BF5728F4222733274427BF
+:105E800050781FC0B75188F4AB2F00244695379542
+:105E90002795011CA395D2F3002069F0220F331F30
+:105EA000441FB395DAF30DD0A1CC61307105A0E8A1
+:105EB0008A07B94630F49B01AC016627772788270B
+:105EC0009078309621F02083318342835383089564
+:105ED0009F3F31F0915020F4879577956795B7955E
+:105EE000880F911D9695879597F90895AA1BBB1B5E
+:105EF00051E107C0AA1FBB1FA617B70710F0A61BCA
+:105F0000B70B881F991F5A95A9F780959095BC01EA
+:105F1000CD01089597FB072E16F4009407D077FD66
+:105F200009D00E94762F07FC05D03EF4909581950C
+:105F30009F4F0895709561957F4F0895F999FECF11
+:105F400092BD81BDF89A992780B50895A8E1B0E087
+:105F500042E050E00C94C12F262FF999FECF1FBAD2
+:105F600092BD81BD20BD0FB6F894FA9AF99A0FBE82
+:105F7000019608950E94AC2F272F0C94AD2FDC01C1
+:105F8000CB01FC01F999FECF06C0F2BDE1BDF89A44
+:105F9000319600B40D9241505040B8F70895F894EE
+:025FA000FFCF31
+:105FA2000507000C058540000001064000000100C5
+:105FB200D80B680C440C0F0CDB0B01600228081490
+:105FC2000A321E40004500250026006100600020C4
+:105FD2000037006400650066006700440046002444
+:105FE2000047000000020004000500070009000B42
+:105FF200000C000E0010001100130015001700180D
+:10600200001A001C001D001F00210023002400268E
+:1060120000280029002B002D002F00300032003410
+:10602200003500370039003B008803A103BA03D3CF
+:1060320003FB04AE04780458043F4D3620020302E9
+:10604200000001000101010101000101010203043C
+:0660520005060708090025
:00000001FF
diff --git a/keyboard/planck/planck_with_bootloader.hex b/keyboard/planck/planck_with_bootloader.hex
new file mode 100755
index 0000000000..c61dfb743a
--- /dev/null
+++ b/keyboard/planck/planck_with_bootloader.hex
@@ -0,0 +1,1796 @@
+:020000020000FC
+:047000000C948D3E21
+:047028000C94B73DD0
+:10702F0012010002FF010020EB03F42F0000010208
+:10703F00030109021200010100803209040000005F
+:10704F00000000000C03410054004D0045004C00AF
+:10705F001603410054006D00330032005500340018
+:10706F004400460055000C0331002E0030002E0066
+:10707F0030000403090416010C0100000C0000018C
+:02708F006C7F14
+:1070920012BD01BDF89A00B5089501E00895F9996D
+:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929
+:1070B200FECF0C944938F80104910895F8013491F7
+:1070C20031962491890108950091610000930C0189
+:1070D20000E80093610001E00093610005BF02E057
+:1070E20005BF0C9486380091D70001600093D70049
+:1070F200A89507EF04BF0091600000610093600053
+:1071020000E00093600001E008950E94AA3D0E9401
+:10711200B53DFDCF0CD00F7708D0006806D00061D6
+:1071220004D0016028D0789408950093D80000918B
+:10713200D8000895FCDF00621ED04CD009B500FFD4
+:10714200FDCFF5DF0F7D17D00091E0000E7F009399
+:10715200E0000091E000077F0093E0000091E20070
+:1071620001600093E2000091E20008600093E200F7
+:1071720078940C94743B0093D800089500910D010B
+:10718200002359F40091D90000FF07C0D0DF006846
+:10719200F2DF01E000930D01CDDFE0E2F2E00081D9
+:1071A200018100FF0DC0008111811E7F11830083C8
+:1071B20001E00093EA0000E00093EA0000931E025F
+:1071C20000E00093E9000091E80003FF02C00E9482
+:1071D200F23B0895A89539D000E40093600000E0E6
+:1071E200009381000093800010E0009385000093DB
+:1071F200840001E006BB00918100036000938100DE
+:107202000091600007FFFCCF00E80093600010933C
+:107212008100A89507EF04BF18D010936000209159
+:1072220084003091850010938100109380001093A8
+:1072320085001093840001E006BB2D3D354010F01F
+:1072420002E101C002E009BD089500916000006101
+:107252000093600008950E94AD3E239741D100E063
+:1072620000930901B5D104811581012B51F437D165
+:1072720000910701002309F4B9C000E0009307015F
+:10728200B5C058D102FFFDCF37D1068335D1009367
+:107292000F0132D1009310012FD1009311012CD193
+:1072A2000093120129D10093130102852091130149
+:1072B20030911201409111015091100116811A95DD
+:1072C20041F01250A9F01A9599F11A9509F473C078
+:1072D2008BC010910F01113011F411E001C010E0C8
+:1072E200138799D00C3F11F414D17FC077D17DC0A0
+:1072F20092D010910F01112329F01A9549F01A9595
+:10730200A9F073C010E013870C3F09F06EC0ECCFF8
+:1073120056D103C04CD109F468C00D911C9144D1DF
+:107322000F3FC1F305E0009309015FC011E0EBCF0D
+:10733200D2D029F00250E1F10A9541F056C0FDD0B9
+:107342000E94A33F0FEF00930A014FC0552319F08B
+:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE
+:1073620003FFFDCF67D051D04AD008E00093600000
+:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F
+:1073820044D00FEF1FE004C009811A810150104060
+:1073920009831A8309811A81012BB1F700E800934E
+:1073A200610000910C01009361000C940000FFCF7A
+:1073B20001E003871AC08FD019F00A9539F015C081
+:1073C200535098F4BAD002E000870FC0505339F0FE
+:1073D2005A9541F05F52B1F35A95A1F306C002E00B
+:1073E2000883F0CF01E0FCCFA8D079D02396E4E067
+:1073F2000C94BA3E01E005BF00E005BF089500917C
+:10740200D8000F770093D800089509B50D7F09BD04
+:1074120000E009BD08955183408333832283109194
+:10742200E8001B7F1093E8001091E8001F7710938B
+:10743200E80008955DD053D0F8940091E000016017
+:107442000093E000089579D04AC0219749D0009175
+:107452000601035019F00250B9F00BC03CD021F0E4
+:107462000A9559F00A9529F400910A010C3F19F482
+:1074720050D02196089567D0FCCF0091010100936E
+:10748200F100009100010AC01091100124D019F0FE
+:107492000A9549F0EECF135018F400E00093F10082
+:1074A2001ED044D0E6CF105339F01A9539F01F524E
+:1074B20041F01A9541F0F4CF08E5F0CF00E006D094
+:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5
+:1074D20030E00C94113F00910F010023089521C068
+:1074E2000BD008D007D00093040106D00093050109
+:1074F20021D00BC000D008830091F10008950091C3
+:10750200EB0000620093EB0015D0077F0093E800C8
+:107512000895F5DF02E00093080103E000930901FA
+:10752200089559D007D000FFFDCF089503D002FF80
+:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A
+:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD
+:107552002BD00093F1002BD059F43DD0082F092BEA
+:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1
+:10757200042D4394003289F300910B0100230D91F5
+:107582001C9131F311970E945838E3CFD3DF00FFEB
+:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B
+:1075A200CCDFE5E00C94B93E11970C945C380D9158
+:1075B2001C910F5F1F4F1C930E93019708958281B8
+:1075C200938100811181801B910B0196DF01089547
+:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71
+:1075E200F7DF80819181A081B181AF710481158122
+:1075F20000521040048315830AC000910B0100233E
+:1076020031F4A301920103E911E00E943B3F47D00C
+:10761200B8F1662477242C0111C06EDFF301ED5618
+:10762200FE4F008301E0600E00E0701E01960091A3
+:10763200F200002311F033D0B8F47FDF30D0E8F24B
+:10764200F301B096E238F040C0F674DF02FFFDCFDE
+:107652000091F200BDDF24813581201B304024835C
+:107662003583E5CF49DFAA95AA23E1F700910B0103
+:10767200013099F62091F1008C010E945038D6CF4A
+:1076820004811581012B21F055DF02FFFDCF55DF6B
+:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051
+:1076A200F1E0028113810817190708952091EB0078
+:1076B20021602093EB000093EC000091ED0002703A
+:1076C200012B0093ED000091ED0002600093ED00AC
+:1076D2001091EE00012F000F00E0001F0895412FCE
+:1076E2000093E900089500E009D000FD05C000E024
+:1076F200F7DF10E202E0DACF00E00895F1DF009157
+:10770200EB0008950F770132A9F5112369F11A955B
+:1077120059F01A9561F01A9569F01A95F9F01A95CF
+:10772200C1F01A95D9F024C00E942C3920C00E94C1
+:10773200263A1DC029D00091090123D001E01FD0B3
+:1077420020D0009108011BD00E94923A0E94973AE1
+:107752000EC01AD00091080114D007C002E00093B5
+:10776200080100E0009309010FD00E94923A03C081
+:107772000E94803A02C001E0089500E0089501D01D
+:1077820000E00093F10008950091E800077F009364
+:10779200E800089508950350F9F4112339F01A9579
+:1077A20051F01A9581F01A9599F016C004E016D09E
+:1077B20001E810E703C011D003E510E7E7E1F2E0CA
+:1077C20000831183D8CF06E109D00FE510E7F6CF89
+:1077D20004D005E710E7F2CFD0CF0CE000931A02F5
+:1077E200089527D120D100931D02E1D0212F11232A
+:1077F20029F12A95E9F02250F1F0225099F02A95C8
+:1078020049F0225061F02A9581F02A95E1F02A95FB
+:10781200E9F023C0003809F44FC00C94833B0038D0
+:10782200E1F7C8C00023C9F71EC00023B1F72DC07D
+:10783200033098F744C1033080F70BC1003868F376
+:10784200033858F7C9C0013841F77BC1013051F400
+:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA
+:1078620009F41ED008951091E3001078DCD00F7750
+:10787200012B0093E300E9D0ACD000FFFDCF0091D3
+:10788200E30000680093E300089591D0123040F4C1
+:107892000FD010931E02DAD000911E020C94CB3B43
+:1078A2000091EB0001D004C000620093EB00089548
+:1078B2000091E800077FC0C0BA93AA93229700E024
+:1078C2000093190274D0AFD0202F2A9519F02A956F
+:1078D200E9F022C002E100931A020FE210E7E7E1A9
+:1078E200F2E0008311839DD008839DD00983E0DFFD
+:1078F20000911A0210E02881398102171307A8F4B7
+:107902000F7181F401E00093190211C002E10093AA
+:107912001A0201E410E7E3CF0E94CC3B002319F7DF
+:107922008ED040C01093190202C020931A027ED05A
+:10793200A7E1B2E001C08AD000911A02002309F146
+:1079420048D004FD1EC045D000FD03C042D004FF54
+:10795200FACF10E0012F1395003281F0ED91FC91E6
+:107962001197049133D02D913C912F5F3F4F3C935F
+:107972002E93FD0103810A95038361F72AD004FF48
+:10798200DACF00911902013039F423D004FD04C08A
+:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F
+:1079A20018D00B7F49D02296A991B99108951091D0
+:1079B200F10008957DDF00911E0208D047D009D062
+:1079C2000F773AD006D002FFFDCFBFC00093F1007F
+:1079D20008950091E800089524D010911D021058D6
+:1079E20029F01A9589F01A9591F019C061DF00917A
+:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63
+:107A020018D0E7DF0F770CC053DF00E0F2CF51D080
+:107A12000F7710E0F801E55EFD4F0081EACF0FD04D
+:107A22000BC001D000D00091F1000895D2DF0F7E8B
+:107A320003C00091E8000B7F0093E80008950091D5
+:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31
+:107A5200F3CF00911D02002329F00A9509F10A953E
+:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE
+:107A7200B9F4D9DF0F7711F416D01BD00093E900C7
+:107A82001091EB0010FF0BC00ED010E01093E90034
+:107A920021E0F801E55EFD4F20834FD003C042D0C4
+:107AA20045D0CFDFC9CF1091EB0010621093EB00ED
+:107AB20008951091E800177F1093E800089500914F
+:107AC2001D02002311F4AFDF02C0013011F4B7DF51
+:107AD200B3CF023031F52DD019F52091F1002F7777
+:107AE2002093E90023D000FF19C081F01FD000616C
+:107AF200DCDE01E010E0422F0E949F3E0093EA008C
+:107B020000E00093EA0012D00860CFDE0BD030E034
+:107B1200F901E55EFD4F008310D0DACF03D0D7CF55
+:107B2200BFDE089500E00093E90008950091EB00A4
+:107B3200089579DF3CDF00230895BADE4ADF0E7F25
+:107B4200089583DF46DF02FFFDCF73DF42DF0F7749
+:107B520073CF0091D70001600093D7000E948B3849
+:107B620000E000931F0208950C94BF388A93FA93A1
+:107B7200EA933A922A921A920A927A936A935A93BF
+:107B82004A933A932A931A930A938FB70091DA0091
+:107B920000FF24C00091D80000FF20C00EEF009328
+:107BA200DA000091D90000FF11C001E000930D013D
+:107BB200ABD0026096D09AD00860A2D00E949B38C7
+:107BC2000091E0000E7F0093E00008C000E0009307
+:107BD2000D0100931E0298D0046083D07FD002FF73
+:107BE20005C084D002FF02C00BEF75D077D000FF32
+:107BF2001BC07CD000FF18C001E000930E016AD0C8
+:107C020083D000626ED00EEF6FD0006179D06ED05B
+:107C12000F7D76D00091D80000620093D80009B59C
+:107C22000D7F09BD00E009BD59D004FF20C05ED020
+:107C320004FF1DC009B500FD05C00E94EB3809B55F
+:107C420000FFFDCF0091D8000F7D0093D80042D0F5
+:107C520000910E01002359F04CD00FEE45D00F7E5B
+:107C620052D000643ED042D001604AD042D036D0D9
+:107C720005FF0FC03BD005FF0CC000E000930E01D2
+:107C820035D00F7E3DD00FED2FD00F7D3CD0006858
+:107C920028D024D003FF0DC029D003FF0AC000E082
+:107CA20000931F0207EF17D00E94743B2DD0116082
+:107CB20018D08FBF09911991299139914991599100
+:107CC200699179910990199029903990E991F991E6
+:107CD200899118950FEE0093E10008950091E1005B
+:107CE20008951183008308950093E1000091E2005A
+:107CF20008950091E200006203D00091E200086062
+:107D02000093E2000895FCDFE0E2F2E000811181DD
+:107D1200089500008895FECF01E60DBF02E00EBF78
+:107D2200C2EED2E00E947438002311F00E94D33ECA
+:107D32000E9465380E948A3E0C948A3E4A951AF047
+:107D4200000F111FFBCF0895BA92AA929A928A92BB
+:107D52007A926A925A924A92BA93AA939A938A937D
+:107D62000895BB84AA84998488847F806E805D8014
+:107D72004C80BB81AA8199818881F0E00FB6F8948A
+:107D8200CE0FDF1F0FBE089520E006D0E9F7089559
+:107D9200259102D0E9F708952D9301501040202F2C
+:107DA200212B089585E890E7FC0105911491FC01CF
+:107DB2003296A591B491FC01349625913491422FCB
+:107DC200432B19F0F901E4DF01C0DEDF069610E76C
+:107DD2008139910748F308952F930CD02F9101D048
+:107DE20008953CD0F12FE02F45E047BFE89536D00B
+:107DF20012D0089533D0F12FE02F43E047BFE8952A
+:107E02002DD008952BD0F12FE02F43E047BFE89506
+:107E120025D001D0089522D041E147BFE8951EC088
+:107E22001DD0F12FE02F41E247BFC895002D16C0AB
+:107E320015D0F12FE02F49E047BFC895002D0EC0A5
+:107E4200F32FE22F012E102E41E047BFE89506C026
+:107E520005D0002E29E027BFE89500C0022E27B7E3
+:107E620020FDFCCF202D0895022E27B726FDFCCF42
+:107E7200202D08950E94A53E22974801C901DA01EA
+:107E820010C05BD001E0A00E00E0B01E00E4A0161E
+:107E920000E0B00608F440C0830120E030E00E9418
+:107EA200F23E0A2F0B2B09F440C0082F0F7710E087
+:107EB2002C01401A510A320100E4A02E03C00A2FFD
+:107EC2000B2BE1F04816590680F0F40101914F01A5
+:107ED2000983119729F001914F010883119711C06D
+:107EE200F2013196049108830CC0F20104910983D6
+:107EF2003196E817F907A1F7F401EDCF1BD00883FB
+:107F020019839201088119810E94213F16D0AA94F7
+:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE
+:107F220009F4AFCF83011DD0B7CF01E02296ECE078
+:107F32000C94B23E82010C945F3802E0400E00E0E5
+:107F4200501E08959A938A9380E090E08C0109D0A4
+:107F520080589F4F8F3F0FE69007C0F38991999108
+:107F6200089520E030E00C94FB3E00000000000089
+:067F720000000000FC000D
+:107FE4000C94ED3E0C94113F0C94193F0C94213FDA
+:0C7FF4000C94F23E0C94033F0C94293FC7
+:040000030000700089
+:100000000C949D020C94E1020C94E1020C94E10228
+:100010000C94E1020C94E1020C94E1020C94E102D4
+:100020000C94E1020C94E1020C941C120C94EE125C
+:100030000C948D240C94E1020C94E1020C94E102E6
+:100040000C94E1020C94E1020C94E1020C94E102A4
+:100050000C94E1020C94FA240C94E1020C94E10259
+:100060000C94E1020C94E1020C94E1020C94E10284
+:100070000C94E1020C94E1020C94E1020C94E10274
+:100080000C94860A0C94E1020C94E1020C94E102B7
+:100090000C94E1020C94E1020C94E1020C94E10254
+:1000A0000C94E1020C94E1020C94E10207634236E5
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
+:1000D0000000803F08000000BE922449123EABAAF7
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
+:1000F000AA3E00000000BF000000803F000000009A
+:1001000000084178D3BB4387D1133D190E3CC3BDD2
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
+:1001200080EFFFBE01C4FF7F3F0000000000000021
+:10013000F1A4F1A3018C028C048C2B0014001A0092
+:100140000800150017001C0018000C001200130016
+:100150002A00290004001600070009000A000B000D
+:100160000D000E000F0033003400E1001D001B00E5
+:100170000600190005001100100036003700380095
+:1001800028000030E000E200E30002202C002C00F8
+:1001900001205000510052004F002B0014001A00A3
+:1001A000090013000A000D000F0018001C003300A6
+:1001B0002A002900040015001600170007000B0094
+:1001C000110008000C0012003400E1001D001B00AB
+:1001D0000600190005000E00100036003700380038
+:1001E00028000030E000E200E30002202C002C0098
+:1001F00001205000510052004F002B003400360007
+:10020000370013001C0009000A00060015000F004B
+:100210002A00290004001200080018000C00070042
+:100220000B001700110016003800E1003300140025
+:100230000D000E001B00050010001A0019001D0023
+:1002400028000030E000E200E30002202C002C0037
+:1002500001205000510052004F0035021E021F02C3
+:100260002002210222022302240225022602270262
+:100270002A0001003A003B003C003D003E003F00E8
+:100280002D022E022F0230023102010040004100F7
+:100290004200430044004500032004200520005094
+:1002A0000100010001000100010002200100010025
+:1002B0000100AB00AA00A900AE0035001E001F001F
+:1002C0002000210022002300240025002600270012
+:1002D0002A0001003A003B003C003D003E003F0088
+:1002E0002D002E002F0030003100010040004100A1
+:1002F0004200430044004500032004200520005034
+:1003000001000100010001000100010001000100E5
+:100310000120AB00AA00A900AE0028035400680029
+:100320006500200050006C0061006E0063006B00EF
+:1003300020004B006500790062006F0061007200D0
+:10034000640000002C034F007200740068006F000E
+:100350006C0069006E0065006100720020004B00B7
+:100360006500790062006F00610072006400730034
+:100370000000040309040902D000060100A03209AC
+:100380000400000103010100092111010001223FC5
+:10039000000705810308000A0904010001030102A6
+:1003A00000092111010001224D0007058203080008
+:1003B0000A090402000103000000092111010001E3
+:1003C0002236000705830308000A0904030002031C
+:1003D000000000092111010001222000070584030B
+:1003E00020000107050403200001090404000001A6
+:1003F00001000009240100010900010509040500AC
+:10040000020103000007240100014100062402014B
+:100410000100062402020200092403010301020173
+:10042000000924030204010101000905060240003D
+:1004300005000005250101010905850240000500B0
+:100440000005250101031201100100000008EDFE66
+:1004500060600100010200010631FF0974A1010979
+:1004600075150025FF952075088102097615002570
+:10047000FF952075089102C005010980A101850240
+:1004800016010026B7001A01002AB7007510950161
+:100490008100C0050C0901A1018503160100269CFD
+:1004A000021A01002A9C02751095018100C0050105
+:1004B0000902A1010901A100050919012905150079
+:1004C00025019505750181029501750381010501DD
+:1004D000093009311581257F950275088106093893
+:1004E0001581257F950175088106050C0A380215CE
+:1004F00081257F950175088106C0C005010906A107
+:1005000001050719E029E715002501950875018106
+:1005100002950175088101050819012905950575E0
+:100520000191029501750391010507190029FF1535
+:100530000025FF950675088100C011241FBECFEF6E
+:10054000DAE0DEBFCDBF04B603FE24C0809178039D
+:1005500090917903A0917A03B0917B038730904BFF
+:10056000A740B04BB9F4109278031092790310921F
+:100570007A0310927B0314BE84B7877F84BF88E11F
+:100580000FB6F89480936000109260000FBEE0E018
+:10059000F8E3099511E0A0E0B1E0E2EAFFE502C06E
+:1005A00005900D92A63BB107D9F713E0A6EBB1E099
+:1005B00001C01D92A837B107E1F70E94F90E0C9413
+:1005C000CF2F0C9400000895089561110DC0FC0117
+:1005D0008281882331F085EE0E949D190E94B62BFE
+:1005E00003C085EE0E94651A80E090E008958B3B81
+:1005F000910568F4883A910530F5853A9105C0F483
+:100600008430910598F4019709F06FC071C0803E65
+:10061000910508F46AC0883E910540F09C01205F76
+:1006200031092031310508F060C05CC09C01A1C0D7
+:10063000853A910509F45FC0863A910509F45EC0D8
+:1006400023E830E496C0883A910509F45AC0893A03
+:10065000910509F459C08A3A910509F458C08B3ABA
+:10066000910509F457C08C3A910509F456C08D3AAA
+:10067000910509F455C0803B910509F454C08E3AA8
+:10068000910509F453C08F3A910509F452C0813B9A
+:10069000910509F451C0823B910509F450C0833B98
+:1006A000910509F44FC0843B910509F44EC0853B88
+:1006B000910509F44DC0863B910509F44CC0873B78
+:1006C000910509F44BC0883B910509F44AC0893B68
+:1006D000910509F449C08A3B910509F048C02AE216
+:1006E00036E447C09C01306544C020E030E041C0A2
+:1006F00021E030E03EC021E830E43BC022E830E4B5
+:1007000038C022EE34E435C029EE34E432C02AEE9B
+:1007100034E42FC025EB34E42CC026EB34E429C0AC
+:1007200027EB34E426C02CEC34E423C02DEC34E475
+:1007300020C023E835E41DC02AE835E41AC022E9C8
+:1007400035E417C024E935E414C021E236E411C0D1
+:1007500023E236E40EC024E236E40BC025E236E4A0
+:1007600008C026E236E405C027E236E402C020E0F5
+:1007700034E4C90108959CE0799FF001112490E3CD
+:10078000899FE00DF11D1124E60FF11DEE0FFF1FF3
+:10079000E65CFE4F25913491C9010895880F991F99
+:1007A00082559040FC0125913491C9010895880F2C
+:1007B000991F825D9E4FFC0125913491C9010895D6
+:1007C0000E94BB039C013A9521153F4108F4DFC00C
+:1007D0009C0130522115304120F49F700E94D703B4
+:1007E00008959C0130532115304118F49927906CDD
+:1007F00008959C0130542031310520F48F709927E1
+:10080000946D0895803120E4920719F480E091ED11
+:100810000895813140E4940719F480E090ED089543
+:10082000823120E4920719F480E092ED089583313B
+:1008300040E4940719F480E093ED0895811520E5D4
+:10084000920711F40C941F25813040E5940731F490
+:100850008091680281608093680208959C013056FF
+:100860002115304108F402C097FF02C0906F08952F
+:10087000803E9105E0F4803C910568F58133910557
+:1008800009F474C048F48932910509F46AC08A32C7
+:10089000910509F07AC074C089339105F9F0823866
+:1008A0009105E1F08533910509F06FC050C0833E9A
+:1008B0009105A9F140F4803E9105C9F0823E910571
+:1008C00009F063C01BC0863E910571F1873E91051A
+:1008D00009F05BC037C00E94CE03089520917B02CF
+:1008E00020FD02C021FF51C080EE90E04EC08091FB
+:1008F0007B0280FFF9CF89E390E047C080917B02C3
+:1009000082FF0AC080917B0284FF03C080E090E0F8
+:100910003CC083EE90E039C082EE90E036C080911A
+:100920007B0282FFEFCFF8CF80917B0283FF07C06D
+:1009300080917B0284FDEACF87EE90E026C086EEB0
+:1009400090E023C080917B0283FFF2CFF8CF8091AB
+:100950007B0285FF03C089E290E017C085E390E049
+:1009600014C080917B0285FDF9CFF5CF80917B0289
+:1009700086FF03C08AE290E008C081E390E005C0F2
+:1009800080917B0286FDF9CFF5CF0E94F702089592
+:100990005F926F927F928F929F92AF92BF92CF920F
+:1009A000DF92EF92FF920F931F93CF93DF93CDB718
+:1009B000DEB728970FB6F894DEBF0FBECDBF9E01FD
+:1009C0002F5F3F4F4E0189E0880E911C60E070E080
+:1009D00000E010E0E12CF12CC12CD12CA12CB12C89
+:1009E00088E0782E622E532E41E050E0E3E2F1E001
+:1009F000A62DB52D872D01900D928A95E1F7F9016D
+:100A0000819191919F01FC01E07FFF27E032F10588
+:100A100059F48F709927FA0102C0EE0FFF1F8A95D3
+:100A2000E2F7AE2ABF2A37C0E033F10559F48F70E0
+:100A30009927FA0102C0EE0FFF1F8A95E2F7CE2A2E
+:100A4000DF2A29C0E034F10559F48F709927FA01A3
+:100A500002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0A5
+:100A6000E035F10559F48F709927FA0102C0EE0FB5
+:100A7000FF1F8A95E2F70E2B1F2B0DC0E036F10504
+:100A800051F48F709927FA0102C0EE0FFF1F8A956B
+:100A9000E2F76E2B7F2B2815390509F0A7CF94B10B
+:100AA0008A2D8095892384B985B18A2985B997B122
+:100AB0008C2D8095892387B988B18C2988B99AB102
+:100AC0008E2D809589238AB98BB18E298BB99DB1E2
+:100AD000802F809589238DB98EB1802B8EB990B3EC
+:100AE000862F8095892380BB81B3862B81BB289676
+:100AF0000FB6F894DEBF0FBECDBFDF91CF911F912F
+:100B00000F91FF90EF90DF90CF90BF90AF909F90AC
+:100B10008F907F906F905F9008955F926F927F9219
+:100B20008F929F92AF92BF92CF92DF92EF92FF92FD
+:100B30000F931F93CF93DF93CDB7DEB768970FB6B0
+:100B4000F894DEBF0FBECDBF85B7806885BF85B77F
+:100B5000806885BF0E94CF076E9A769A0E94C8046B
+:100B60009E012F5F3F4F4E0189E1880E911C60E08E
+:100B700070E000E010E0E12CF12CC12CD12CA12C74
+:100B8000B12C98E1792E622E532E41E050E0EBE239
+:100B9000F1E0A62DB52D872D01900D928A95E1F7F4
+:100BA000F901819191919F01FC01E07FFF27E032E3
+:100BB000F10559F48F709927FA0102C0EE0FFF1F5B
+:100BC0008A95E2F7AE2ABF2A37C0E033F10559F41F
+:100BD0008F709927FA0102C0EE0FFF1F8A95E2F786
+:100BE000CE2ADF2A29C0E034F10559F48F70992705
+:100BF000FA0102C0EE0FFF1F8A95E2F7EE2AFF2AE4
+:100C00001BC0E035F10559F48F709927FA0102C035
+:100C1000EE0FFF1F8A95E2F70E2B1F2B0DC0E0365B
+:100C2000F10551F48F709927FA0102C0EE0FFF1FF2
+:100C30008A95E2F76E2B7F2B2815390509F0A7CF8F
+:100C400094B18A2D8095892384B985B18A2985B983
+:100C500097B18C2D8095892387B988B18C2988B963
+:100C60009AB18E2D809589238AB98BB18E298BB943
+:100C70009DB1802F809589238DB98EB1802B8EB93F
+:100C800090B3862F8095892380BB81B3862B81BB4F
+:100C90001092B7011092B6011092BF011092BE01DE
+:100CA0001092B9011092B8011092C1011092C001C6
+:100CB0001092BB011092BA011092C3011092C201AE
+:100CC0001092BD011092BC011092C5011092C40196
+:100CD00068960FB6F894DEBF0FBECDBFDF91CF91FF
+:100CE0001F910F91FF90EF90DF90CF90BF90AF904A
+:100CF0009F908F907F906F905F9008955F926F921A
+:100D00007F928F929F92AF92BF92CF92DF92EF929B
+:100D1000FF920F931F93CF93DF93CDB7DEB7A097CA
+:100D20000FB6F894DEBF0FBECDBF7E0149E1E40EE1
+:100D3000F11C2EEBC22E21E0D22E5E0151E2A50E57
+:100D4000B11C38E0532E470101E010E048E1642E69
+:100D500055E0752EE3E2F1E0D401852D01900D926E
+:100D60008A95E1F7F701819191917F019C01207FA4
+:100D700033272032310589F424B18F709927A801D7
+:100D800002C0440F551F8A95E2F7CA01242B24B9EB
+:100D900095B18095892385B94FC02033310589F4F9
+:100DA00027B18F709927F80102C0EE0FFF1F8A95B7
+:100DB000E2F7CF012E2B27B998B18095892388B906
+:100DC0003BC02034310589F42AB18F709927A801DE
+:100DD00002C0440F551F8A95E2F7CA01242B2AB995
+:100DE0009BB1809589238BB927C02035310589F4C3
+:100DF0002DB18F709927F80102C0EE0FFF1F8A9561
+:100E0000E2F7CF012E2B2DB99EB1809589238EB9A3
+:100E100013C02036310581F420B38F709927A801C3
+:100E200002C0440F551F8A95E2F7CA01242B20BB4C
+:100E300091B38095892381BB50EA5A95F1F7BE01A1
+:100E40006F5F7F4F80E090E020E030E0EBE2F1E088
+:100E5000DE011196462D01900D924A95E1F7FB01B6
+:100E600041915191BF01FA01E07FFF27E032F10586
+:100E700011F4E3B113C0E033F10511F4E6B10EC093
+:100E8000E034F10511F4E9B109C0E035F10511F4E0
+:100E9000ECB104C0E036F105B9F4EFB1F0E04F7009
+:100EA000552702C0F595E7954A95E2F7E0FD08C0A1
+:100EB000A801022E02C0440F551F0A94E2F702C097
+:100EC00040E050E0842B952B2F5F3F4F2C303105B5
+:100ED00009F0BCCFF601208131812817390721F0B4
+:100EE00091838083709200010E94C804F2E0CF0ECB
+:100EF000D11CEA14FB0409F02DCF80910001882356
+:100F000061F1815080930001811121C08091BE0167
+:100F10009091BF019093B7018093B6018091C00179
+:100F20009091C1019093B9018093B8018091C20161
+:100F30009091C3019093BB018093BA018091C40149
+:100F40009091C5019093BD018093BC0106C08FE9CB
+:100F50009FE00197F1F700C0000081E0A0960FB676
+:100F6000F894DEBF0FBECDBFDF91CF911F910F91DF
+:100F7000FF90EF90DF90CF90BF90AF909F908F90B9
+:100F80007F906F905F900895E82FF0E0EE0FFF1FC5
+:100F9000EA54FE4F80819181089508950895279A1B
+:100FA0002F988FEF9FEF90938700809386008AE0C1
+:100FB0008093800089E1809381000C945F2B8111E4
+:100FC0000BC080918000877F8093800010928D00FD
+:100FD00010928C002F9808952F98833041F48091BF
+:100FE00080008860809380008FEF9FEF12C0909107
+:100FF000800098609093800023E030E0281B310946
+:10100000220F331F8FEF9FEF02C0969587952A9589
+:10101000E2F790938D0080938C0008950F931F93B7
+:10102000CF93DF93CDB7DEB7CC58D1090FB6F89484
+:10103000DEBF0FBECDBF8C01862F642F882379F0D1
+:10104000F80192812FE7482F992329F08DE792E04C
+:101050000E94F81404C08DE792E00E940815F80180
+:1010600080818B3061F49181933009F068C0828176
+:10107000882309F4CDC0809103018F5F0EC08A30B0
+:10108000E1F5F8019181933009F059C082818823FC
+:1010900009F4BEC08091030181508093030120E0D8
+:1010A0004BE760E08DE792E00E94E81420E04BE718
+:1010B00061E08DE792E00E94E81420E04BE762E0F7
+:1010C0008DE792E00E94E81420E04BE763E08DE7B3
+:1010D00092E00E94E81420E04BE764E08DE792E0A4
+:1010E000C457DF4F0FB6F894DEBF0FBECDBFDF9100
+:1010F000CF911F910F910C94E814893069F4F80195
+:1011000091819330E1F492819923C9F0809101019A
+:101110009091020101960EC0883089F4F801918106
+:10112000933069F49281992351F08091010190915B
+:10113000020101979093020180930101B0CFF80161
+:10114000928140910301992391F196E4E3E4F1E067
+:10115000DE01A95BBF4F01900D929A95E1F7405DCA
+:10116000F8019181FCE09F9F40191124E091010159
+:10117000F0910201E80FF11DEE0FFF1F87E490E0F0
+:101180008C0F9D1FE80FF91F8081480F2FE760E04B
+:101190008DE792E0C457DF4F0FB6F894DEBF0FBE65
+:1011A000CDBFDF91CF911F910F910C94F81496E46D
+:1011B000E3E4F1E0DE01119601900D929A95E1F7DA
+:1011C000405DF8019181FCE09F9F40191124E0915E
+:1011D0000101F0910201E80FF11DEE0FFF1F81E008
+:1011E00090E08C0F9D1FE80FF91F8081480F2FE7BB
+:1011F00060E08DE792E0C457DF4F0FB6F894DEBF92
+:101200000FBECDBFDF91CF911F910F910C940815A8
+:10121000C457DF4F0FB6F894DEBF0FBECDBFDF91CE
+:10122000CF911F910F910895CF93DF93EA019B0116
+:10123000AC0160E074E284E79BE40E945F2C0E94B2
+:10124000C72C709397006093960020E130E02C1B30
+:101250003D0B02C0759567952A95E2F7709399004A
+:1012600060939800DF91CF9108951092020210923E
+:10127000010210929000109291001092FD011092C4
+:10128000FE011092FF01109200021092FC011092D8
+:10129000FB01E9EDF1E0A9ECB1E01192119211929C
+:1012A00011921D921D9281E0E93FF807B1F7089570
+:1012B000AF92BF92CF92DF92EF92FF920F931F9364
+:1012C000CF93DF936B017C0109EF11E047EDA42E72
+:1012D00041E0B42EC7E0D0E0A7019601F801929159
+:1012E0008291729162918F010E945B2C882349F058
+:1012F0002197F2E0AF1AB108CF3F8FEFD80761F71F
+:1013000034C0F8011082118212821382F501118219
+:101310001082FE01EE0FFF1FEE0FFF1FE752FE4F80
+:10132000DE01AA0FBB1FA753BE4FCE011AC0019604
+:1013300044815581668177814083518362837383C1
+:10134000148215821682178212962D913C91139762
+:1013500011963C932E9313961C921E9212973496DC
+:1013600012968730910519F7C3CF809101029091B1
+:101370000202019797FD05C090930202809301023B
+:1013800004C01092020210920102E0910102F09159
+:101390000202309789F410929000109291001092FE
+:1013A000FD011092FE011092FF01109200021092B6
+:1013B000FC011092FB019EC03197DF01AA0FBB1FF9
+:1013C000AA0FBB1FA752BE4FCD90DD90ED90FC90B1
+:1013D000EE0FFF1FE753FE4FC081D181A090FD01AA
+:1013E000B090FE010091FF0110910002A70196014B
+:1013F0006A2D7B2D802F912F0E945B2C87FF2FC0A1
+:1014000081E08093C801AE016A2D7B2D802F912F42
+:101410000E9414092091FD013091FE014091FF01CD
+:1014200050910002C701B6010E94F62B20E030E087
+:101430004AEF53E40E945F2C9B01AC016A2D7B2D87
+:10144000802F912F0E94F72B5B018C01A701960141
+:101450007B2D912F0E945B2C1816ACF638C0A7018B
+:1014600096016A2D7B2D802F912F0E94AA2D181690
+:1014700084F581E08093C801AE016A2D7B2D802F19
+:10148000912F0E941409A70196016091FD017091AE
+:10149000FE018091FF01909100020E94F62B20E056
+:1014A00030E04AEF53E40E945F2C9B01AC016A2DAF
+:1014B0007B2D802F912F0E94F62B5B018C01A701C1
+:1014C00096017B2D912F0E94AA2D87FFD5CF1092D8
+:1014D000C801AE01C701B6010E941409C092FD0106
+:1014E000D092FE01E092FF01F0920002D093FC0145
+:1014F000C093FB01DF91CF911F910F91FF90EF906F
+:10150000DF90CF90BF90AF90089508951F920F92F3
+:101510000FB60F9211242F933F934F935F936F93C6
+:101520007F938F939F93AF93BF93EF93FF9380919C
+:10153000960090919700892B09F455C08091C801BD
+:10154000811151C08091F9019091FA01813091058A
+:1015500071F082309105C1F0892BC1F52091FD0118
+:101560003091FE014091FF01509100021DC0609139
+:10157000FD017091FE018091FF01909100029B019D
+:10158000AC010E94F72B0EC020E030E040E450E4B4
+:101590006091FD017091FE018091FF019091000228
+:1015A0000E94AE2D9B01AC0160E074E284E79BE4F5
+:1015B0000E945F2C0E94C72C709397006093960046
+:1015C0007595679570939900609398008091F901E3
+:1015D0009091FA01019663E070E00E948A2F909347
+:1015E000FA018093F901FF91EF91BF91AF919F9123
+:1015F0008F917F916F915F914F913F912F910F90BC
+:101600000FBE0F901F901895AF92BF92CF92DF92AE
+:10161000EF92FF920F931F93CF93DF936B017C01A7
+:10162000EA0120E030E0A9010E94AA2D18160CF072
+:10163000B4C03E9A82E8809390008AE18093910042
+:10164000A090FD01B090FE010091FF0110910002F9
+:1016500020E030E0A9016A2D7B2D802F912F0E9480
+:101660005B2C81112DC0AE01C701B6010E94140987
+:10167000C092FD01D092FE01E092FF01F0920002C3
+:10168000D093FC01C093FB01809101029091020272
+:10169000FC01EE0FFF1FEE0FFF1FE752FE4FC0824F
+:1016A000D182E282F382FC01EE0FFF1FE753FE4F6F
+:1016B000D183C083019690930202809301026DC092
+:1016C000A70196016A2D7B2D802F912F0E945B2C04
+:1016D00087FF2CC0AE016A2D7B2D802F912F0E9499
+:1016E00014092091FD013091FE014091FF015091BC
+:1016F0000002C701B6010E94F62B20E030E04AEF5D
+:1017000053E40E945F2C9B01AC016A2D7B2D802F3E
+:10171000912F0E94F72B5B018C01A70196017B2D75
+:10172000912F0E945B2C1816ACF69DCFA701960155
+:101730006A2D7B2D802F912F0E94AA2D18160CF058
+:1017400092CFAE016A2D7B2D802F912F0E9414091C
+:10175000A70196016091FD017091FE018091FF014A
+:10176000909100020E94F62B20E030E04AEF53E413
+:101770000E945F2C9B01AC016A2D7B2D802F912F45
+:101780000E94F62B5B018C01A70196017B2D912F06
+:101790000E94AA2D87FFD5CF66CFDF91CF911F91F1
+:1017A0000F91FF90EF90DF90CF90BF90AF90089592
+:1017B00080910C020895CF93DF9300D01F92CDB794
+:1017C000DEB720916E03243021F523E029839B832B
+:1017D0008A832093E9008FEF06C095ED9A95F1F783
+:1017E0000000882329F09091E800815095FFF5CF03
+:1017F0008091E80085FF0DC040E050E063E070E0BC
+:10180000CE0101960E94BA0F8091E8008E778093F6
+:10181000E8000F900F900F90DF91CF910895CF9334
+:10182000DF9300D01F92CDB7DEB720916E03243036
+:1018300029F522E029839B838A8383E08093E90052
+:101840008FEF06C095ED9A95F1F70000882329F0F7
+:101850009091E800815095FFF5CF8091E80085FFD9
+:101860000DC040E050E063E070E0CE0101960E94C0
+:10187000BA0F8091E8008E778093E8000F900F9068
+:101880000F90DF91CF91089520916E032430F9F4E9
+:1018900022E02093E9002FEF06C035ED3A95F1F7ED
+:1018A0000000222329F03091E800215035FFF5CFC8
+:1018B0002091E80025FF0BC040E050E065E070E0BB
+:1018C0000E94BA0F8091E8008E778093E800089517
+:1018D000CF93DF93EC0180916E03843041F581E07A
+:1018E0008093E9008FEF06C095ED9A95F1F700001F
+:1018F000882329F09091E800815095FFF5CF8091E1
+:10190000E80085FF14C040E050E068E070E0CE01E0
+:101910000E94BA0F8091E8008E778093E80088E0FB
+:10192000FE01A4E0B2E001900D928A95E1F7DF910B
+:10193000CF910895BF92CF92DF92EF92FF920F93D3
+:101940001F93CF93DF937C01B62EE90100E010E0F6
+:10195000C42ED12C0BC04991202F2B0D2F774F7700
+:101960006FE0C7010E94E8140F5F1F4F0C151D05A3
+:1019700094F3DF91CF911F910F91FF90EF90DF9043
+:10198000CF90BF90089570E06F5F7F4F6F707727A3
+:101990000C94E8140F931F93CF93C42F63307105F9
+:1019A00009F04AC0842F807F803849F1803909F0DE
+:1019B00043C0622F6F7770E080E090E00E94FA2CC5
+:1019C00020E030E040E451E40E945F2C9B01AC0138
+:1019D00060E070E080E090E40E94112E0F7710E04C
+:1019E00023E0159507952A95E1F72DEC3CEC42E0B4
+:1019F00053E40E94AE2DA8010E94040B1DC0622F6B
+:101A00006F7770E080E090E00E94FA2C20E030E0F8
+:101A100040E451E40E945F2C9B01AC0160E070E067
+:101A200080E090E40E94112E2DEC3CEC42E053E467
+:101A30000E94AE2D0E945809CC3F29F4CF911F91EE
+:101A40000F910C943509CF911F910F9108950F9329
+:101A50001F93CF93DF93CDB7DEB727970FB6F894D8
+:101A6000DEBF0FBECDBF8C0114C08A810E94C2149C
+:101A70009A819D839B819E839C819F8381111EC03F
+:101A800089818430B1F08730A1F08630A1F08530B3
+:101A9000A1F0BE016F5F7F4F84E091E00E942F189C
+:101AA0008111E3CF84E091E00E9420180E949B14F2
+:101AB0000DC083E003C082E001C081E0AE014B5F56
+:101AC0005F4F682FC8010E945515E3CF27960FB6C8
+:101AD000F894DEBF0FBECDBFDF91CF911F910F9164
+:101AE0000895EF92FF920F93CF93DF9300D000D031
+:101AF00000D0CDB7DEB77B014A832B830C83842FC4
+:101B00002E834D830E94C2142E814D8181111BC0F2
+:101B100082E0E816F10479F083E0E816F10421F0A0
+:101B2000EA94EF2821F50BC0073F11F487E001C0CC
+:101B300084E089830BC0273FD9F786E0FACF473F7F
+:101B4000B9F785E0F6CF42954F704983BE016F5FCC
+:101B50007F4F84E091E00E94E51784E091E00E94CD
+:101B6000031884E091E00E9420180E949B1426969E
+:101B70000FB6F894DEBF0FBECDBFDF91CF910F91AE
+:101B8000FF90EF90089580916D03811109C00E942C
+:101B9000A1110E94FE118091E20084608093E20016
+:101BA000089510926D03089508950C94E4020C9426
+:101BB000892480916E03843049F58091E9008F700B
+:101BC0009091EC0090FF02C090E801C090E0982B4B
+:101BD00084E08093E9008091EB0080FF14C0809145
+:101BE000EE0087FD03C00FC01092F1008091E80065
+:101BF00085FDFACF8091E80080FF05C08091E80064
+:101C00008E778093E8009F709093E900089542E0FA
+:101C100061EC81E00E94171142E061EC82E00E94D9
+:101C2000171142E061EC83E00E94171146E261EC7B
+:101C300084E00E94171142E361E885E00E941711D9
+:101C400042E360E886E00C941711809170038330C2
+:101C500009F454C030F4813071F0823009F0AAC028
+:101C600091C08A3009F47EC08B3009F45FC089309E
+:101C700009F0A0C020C080916F03813A09F09AC09A
+:101C80008091E800877F8093E800809173039091B2
+:101C90007403892B21F060E080E090E003C068E0ED
+:101CA00084E092E070E00E9458108091E8008B7709
+:101CB0008093E800089580916F03813209F07AC023
+:101CC0008091730390917403892B09F073C0809104
+:101CD000E800877F8093E80005C080916E03882329
+:101CE00009F468C08091E80082FFF7CF8091F1008D
+:101CF00080930C028091E8008B7758C080916F032D
+:101D0000813A09F057C08091730390917403892B35
+:101D100009F050C08091E800877F8093E8008091AF
+:101D2000E80080FFFCCF80911A013BC080916F03D7
+:101D3000813209F03FC08091730390917403892B25
+:101D4000C9F58091E800877F8093E8000E944E11DA
+:101D50009091710381E0911101C080E080931A019C
+:101D60000C948C1E80916F03813221F58091E800E4
+:101D7000877F8093E8000E944E11809172038093C8
+:101D80000302089580916F03813AA1F48091E800E5
+:101D9000877F8093E8008091E80080FFFCCF8091EE
+:101DA00003028093F1008091E8008E778093E80031
+:101DB0000C944E11089584B7877F84BF88E10FB6D5
+:101DC000F89480936000109260000FBE90E080E86D
+:101DD0000FB6F89480936100909361000FBE0E944B
+:101DE000A1110E94FE11E2EEF0E080818460808308
+:101DF00008958DE792E00E94241561E77DE08DE76C
+:101E000092E00E947A1567E27DE08DE792E00E9401
+:101E10007E150E94DB0E78946AEC7CE08DE792E000
+:101E20000E94201563EC7CE08DE792E00E9418157B
+:101E30006AE97CE08DE792E00E941C150E94850A09
+:101E40000E949B140E94AC1880E191E00E945418FB
+:101E50000BC00E944E2480916C03882329F00E94BD
+:101E6000742481110E94A40F80916E03853089F340
+:101E70008DE792E00E942D170E94B618F5CF292F0A
+:101E8000332723303105B1F04CF42130310509F40A
+:101E90004DC02230310509F04EC007C02132310556
+:101EA00041F12232310591F146C0E0EDF0E086E7E4
+:101EB00093E045C099278130910569F08230910502
+:101EC00089F0892B09F037C0E2E7F3E0E491F0E014
+:101ED00082E793E034C0E4E4F3E0E491F0E084E4EA
+:101EE00093E02DC0EAE1F3E0E491F0E08AE193E0D1
+:101EF00026C0643000F5E62FF0E0EE0FFF1FE75735
+:101F0000FE4F80819181E9E0F0E019C0643098F4DF
+:101F1000E62FF0E0DF01AA0FBB1FAF56BE4F8D9139
+:101F20009C91E756FE4FE081F0E009C0E2E1F0E06D
+:101F300086E494E004C0E0E0F0E080E090E0DA01C4
+:101F40008D939C93CF01089580E189BD82E189BD85
+:101F500009B400FEFDCF8091D8008F7D8093D8001A
+:101F60008091E00082608093E0008091E00081FD3C
+:101F7000FCCF0895BF92CF92DF92EF92FF920F9322
+:101F80001F93CF93DF937C018B01EA010E946F11B5
+:101F9000B82E811133C0209731F028813981021B7E
+:101FA000130BE20EF31EC12CD12C23C08091E8004C
+:101FB00085FD15C08091E8008E778093E80020971A
+:101FC00049F0888199818C0D9D1D9983888325E036
+:101FD000B22E14C00E946F11882359F00EC0F70171
+:101FE00081917F018093F10001501109FFEFCF1A19
+:101FF000DF0A01151105D1F601C0B82E8B2DDF9136
+:10200000CF911F910F91FF90EF90DF90CF90BF90F5
+:102010000895BF92CF92DF92EF92FF920F931F939A
+:10202000CF93DF937C018B01EA010E946F11B82EE0
+:10203000811133C0209731F028813981021B130BA5
+:10204000E20EF31EC12CD12C23C08091E80085FD47
+:1020500015C08091E8008B778093E800209749F0C5
+:10206000888199818C0D9D1D9983888345E0B42ECC
+:1020700014C00E946F11882359F00EC08091F100A6
+:10208000F70181937F0101501109FFEFCF1ADF0A99
+:1020900001151105D1F601C0B82E8B2DDF91CF911E
+:1020A0001F910F91FF90EF90DF90CF90BF90089518
+:1020B00040917503509176034617570748F0611514
+:1020C000710539F44091E8004E774093E80001C073
+:1020D000BA01FC0140E033C080916E03882309F40B
+:1020E00042C0853009F441C08091E80083FD39C0C9
+:1020F0008091E80082FD2FC08091E80080FF1FC022
+:102100009091F3008091F200392F20E0A901482B33
+:10211000CA0106C041914093F100615071090196D6
+:102120006115710519F088309105A0F341E0089719
+:1021300009F040E08091E8008E778093E800611517
+:10214000710551F64111C8CF06C080916E038823F6
+:1021500051F0853051F08091E80082FFF6CF80E0A9
+:10216000089581E0089582E0089583E00895409104
+:102170007503509176034617570748F061157105AE
+:1021800039F44091E8004E774093E80001C0BA016D
+:10219000FC0140E034C080916E03882309F443C001
+:1021A000853009F442C08091E80083FD3AC08091F7
+:1021B000E80082FD30C08091E80080FF20C090914F
+:1021C000F3008091F200392F20E0A901482BCA01C9
+:1021D00007C044914093F100319661507109019616
+:1021E0006115710519F08830910598F341E0089761
+:1021F00009F040E08091E8008E778093E800611557
+:10220000710549F64111C7CF06C080916E0388233E
+:1022100051F0853051F08091E80082FFF6CF80E0E8
+:10222000089581E0089582E0089583E00895982F4D
+:102230002CC09093E900981739F07091EC00209130
+:10224000ED005091F00003C0242F762F50E021FDC7
+:1022500002C09F5F1AC03091EB003E7F3093EB00CD
+:102260003091ED003D7F3093ED003091EB00316017
+:102270003093EB007093EC002093ED005093F0004E
+:102280002091EE0027FDE5CF07C0973090F28F70C8
+:102290008093E90081E0089580E0089580916F03C4
+:1022A00087FD05C08091E80080FF0EC012C08091BC
+:1022B000E80082FD05C080916E038111F8CF08957A
+:1022C0008091E8008B7708C080916E038111EACF7E
+:1022D00008958091E8008E778093E80008958091BA
+:1022E000E4009091E50045E62091EC0020FD1FC040
+:1022F00023C020916E03222391F0253091F020918C
+:10230000EB0025FD10C02091E4003091E500281776
+:10231000390751F34150C90139F784E0089582E04B
+:10232000089583E0089581E0089580E00895209164
+:10233000E80020FFDECFF9CF2091E80022FFD9CFBF
+:10234000F4CF0E940F120E941712E0EEF0E080819D
+:1023500081608083E8EDF0E080818F77808319BC15
+:10236000A7EDB0E08C918E7F8C9380818F7E8083EF
+:1023700010926D0308950F931F93CF93DF930E94E4
+:102380000F120E941712C8EDD0E088818F778883E2
+:1023900088818068888388818F7D888319BC1092AA
+:1023A0006E0310926A0310926C0310926B0300EE9E
+:1023B00010E0F80180818B7F808388818160888331
+:1023C00042E060E080E00E941711E1EEF0E08081E1
+:1023D0008E7F8083E2EEF0E0808181608083808167
+:1023E00088608083F80180818E7F8083888180610E
+:1023F0008883DF91CF911F910F910895E8EDF0E070
+:1024000080818F7E8083E7EDF0E080818160808332
+:1024100084E082BF81E080936D030C94BB11E8EDF2
+:10242000F0E080818E7F80831092E2000895109208
+:10243000DA001092E10008951F920F920FB60F92EA
+:1024400011242F933F934F935F936F937F938F93B9
+:102450009F93AF93BF93EF93FF938091E10082FF2F
+:102460000BC08091E20082FF07C08091E1008B7F6A
+:102470008093E1000E94D90D8091DA0080FF1FC097
+:102480008091D80080FF1BC08091DA008E7F8093FE
+:10249000DA008091D90080FF0DC080E189BD82E122
+:1024A00089BD09B400FEFDCF81E080936E030E94D8
+:1024B000C30D05C019BC10926E030E94D10D80910E
+:1024C000E10080FF19C08091E20080FF15C080917B
+:1024D000E2008E7F8093E2008091E2008061809331
+:1024E000E2008091D80080628093D80019BC85E01A
+:1024F00080936E030E94D50D8091E10084FF30C06F
+:102500008091E20084FF2CC080E189BD82E189BD19
+:1025100009B400FEFDCF8091D8008F7D8093D80054
+:102520008091E1008F7E8093E1008091E2008F7EB8
+:102530008093E2008091E20081608093E2008091CC
+:102540006A03882311F084E007C08091E30087FFCD
+:1025500002C083E001C081E080936E030E94D70D2A
+:102560008091E10083FF29C08091E20083FF25C0B4
+:102570008091E100877F8093E10082E080936E0389
+:1025800010926A038091E1008E7F8093E100809138
+:10259000E2008E7F8093E2008091E2008061809370
+:1025A000E20042E060E080E00E9417118091F000BC
+:1025B00088608093F0000E94D40DFF91EF91BF914D
+:1025C000AF919F918F917F916F915F914F913F91CB
+:1025D0002F910F900FBE0F901F9018951F920F9282
+:1025E0000FB60F9211242F933F934F935F936F93E6
+:1025F0007F938F939F93AF93BF93CF93EF93FF936B
+:102600008091E9008F709091EC0090FF02C090E8FB
+:1026100001C090E0C92FC82B1092E9008091F00012
+:10262000877F8093F00078940E9432131092E90023
+:102630008091F00088608093F000CF70C093E90033
+:10264000FF91EF91CF91BF91AF919F918F917F912A
+:102650006F915F914F913F912F910F900FBE0F900F
+:102660001F9018951F93CF93DF93CDB7DEB7AC972C
+:102670000FB6F894DEBF0FBECDBFEFE6F3E080915A
+:10268000F100819323E0E737F207C9F70E94250E96
+:102690008091E80083FF37C180916F0390917003B0
+:1026A000953009F488C038F49130B1F170F093306E
+:1026B00009F029C131C0983009F4F8C0993009F403
+:1026C00004C1963009F01FC19DC0803821F08238C6
+:1026D00009F019C108C080916B0390916C03992394
+:1026E00089F082600FC080917303909174038F70A2
+:1026F00099278093E9008091EB0085FB882780F97A
+:102700001092E9009091E800977F9093E800809301
+:10271000F1001092F100D5C0882319F0823009F041
+:10272000F2C08F7121F0823009F0EDC00BC08091B2
+:102730007103813009F0E7C0933009F080E08093A5
+:102740006C032FC08091710381112BC080917303A2
+:10275000909174038F709927009709F4D4C08093E7
+:10276000E9002091EB0020FF1CC020917003233072
+:1027700021F48091EB00806212C09091EB00906197
+:102780009093EB0021E030E001C0220F8A95EAF738
+:102790002093EA001092EA008091EB008860809319
+:1027A000EB001092E9008091E800877F8093E800B9
+:1027B0000E944E11A8C08111A6C080917103909112
+:1027C00072038F779927182F9091E3009078982BB8
+:1027D0009093E3008091E800877F8093E8000E9457
+:1027E0004E118091E80080FFFCCF8091E30080686B
+:1027F0008093E300112311F083E001C082E0809315
+:102800006E0381C08058823008F07DC080917103D2
+:10281000909172038C3D23E0920779F583E08A83DF
+:102820008AE289834FB7F894DE01139620E03EE0F8
+:1028300051E2E32FF0E050935700E49120FF03C0F2
+:10284000E295EF703F5FEF708E2F90E0EA3010F06E
+:10285000C79601C0C0968D939D932F5F243149F791
+:102860004FBF8091E800877F8093E8006AE270E0C4
+:10287000CE0101960E94581013C0AE01455D5F4F16
+:10288000609173030E943F0F0097E9F12091E800E7
+:10289000277F2093E800BC018BA59CA50E94B71060
+:1028A0008091E8008B778093E8002DC0803859F53F
+:1028B0008091E800877F8093E80080916A0380938D
+:1028C000F1008091E8008E7771CF81111CC090914A
+:1028D00071039230C0F48091E800877F8093E80014
+:1028E00090936A030E944E1180916A03811104C083
+:1028F0008091E30087FF02C084E001C081E0809303
+:102900006E030E94070E8091E80083FF0AC0809149
+:10291000E800877F8093E8008091EB0080628093DD
+:10292000EB00AC960FB6F894DEBF0FBECDBFDF91C3
+:10293000CF911F910895CF9380916E038823B1F0BA
+:102940008091E9008F709091EC0090FF02C090E8B8
+:1029500001C090E0C92FC82B1092E9008091E800D7
+:1029600083FD0E943213CF70C093E900CF91089588
+:10297000881F8827881F089591E0883F08F490E019
+:10298000892F0895982F907F903B99F038F49039D3
+:1029900081F0903A71F09038C9F40BC0903DA1F0ED
+:1029A00018F4903C99F410C0903E19F0903F71F4E7
+:1029B00002C083E00895E82FE15FEF3038F4F0E0E3
+:1029C000E356FE4F8081089582E0089580E00895E7
+:1029D0000F932F774F776F70606BDC01ED91FC9157
+:1029E000022F242F462F63E070E009950F91089580
+:1029F0000F932F774F776F706069DC01ED91FC9139
+:102A0000022F242F462F63E070E009950F9108955F
+:102A10000F932F774F776F706068DC01ED91FC9119
+:102A2000022F242F462F63E070E009950F9108953F
+:102A3000FC01738362830895FC01738F628F089594
+:102A4000FC01758F648F0895CF93DF93EC011DA275
+:102A50001FA21EA2BC01685D7F4F40EC88519F4FB2
+:102A60000E9461171B821A821D821C821F821E8295
+:102A7000198618861B861A861D861C861F861E864A
+:102A8000198A188A1B8A1A8A1D8A1C8A1F8A1E8A1A
+:102A9000198E188E1B8E1A8E1D8E1C8E1F8E1E8EEA
+:102AA00019A218A2DF91CF910895CF92DF92FF92E1
+:102AB0000F931F93CF93DF931F92CDB7DEB7F62E00
+:102AC0006A018C0108511F4F08C0F60161916F0126
+:102AD000C80149830E94681749818C2D841B8F157A
+:102AE000A0F30F90DF91CF911F910F91FF90DF9096
+:102AF000CF900895FC01718360830895FC0171A358
+:102B000060A30895AF92BF92CF92DF92EF92FF92AF
+:102B10000F931F93CF93DF9300D01F92CDB7DEB7F3
+:102B20007C016B01142FB22EA02EDC0195968C91A6
+:102B300095978430F1F45A96ED91FC915B9730971C
+:102B400009F4D8C0CB01019763E070E00E94762FB2
+:102B5000DB01AA0FBB1FA60FB71F49832A830B8374
+:102B60004C2D4A1B9E012F5F3F4FBD01C7010995A8
+:102B7000B1C06230710509F453C06330710529F0AA
+:102B80006130710509F09CC083C0842F807F803A3A
+:102B900001F130F48038B9F0803909F0ABC00DC0D4
+:102BA000803EE9F0803F09F1803B09F0A3C0D701E6
+:102BB0001296ED91FC91139723C0D7011496ED91D5
+:102BC000FC9115971DC0D7011696ED91FC911797B2
+:102BD00017C0D7011896ED91FC91199711C0D70134
+:102BE0001A96ED91FC911B970BC0423F09F082C0F1
+:102BF000D7011C96ED91FC911D97309731F47AC066
+:102C0000309709F477C0123F21F42A2D4B2D62EF43
+:102C100004C0612F6F702A2D4B2DC70109955AC032
+:102C2000842F807F803D59F0803F79F0803C09F00F
+:102C300061C0D7011E96ED91FC911F9719C0D70175
+:102C40005096ED91FC91519713C0433F31F4D70159
+:102C50005296ED91FC91539708C0413F09F04AC04C
+:102C6000D7015496ED91FC915597309741F442C0AD
+:102C7000309709F43FC0133F11F0113F19F44B2D69
+:102C8000612F03C0612F6F704B2DC701099522C0C2
+:102C9000842F0E94BC14882331F0D7015696ED9101
+:102CA000FC91579707C0163F29F5D7015896ED912B
+:102CB000FC9159973097F1F0612FC70109950AC02F
+:102CC00064307105A8F416C00A2D2B2D412FB601D2
+:102CD000C7010995D7015E96ED91FC915F973097FA
+:102CE00089F00A2D2B2D412FB601C70109950AC085
+:102CF000C12CD12CD7015C96ED91FC915D9730975A
+:102D000019F7E8CF0F900F900F90DF91CF911F919F
+:102D10000F91FF90EF90DF90CF90BF90AF9008950C
+:102D2000EF92FF920F931F93CF93DF93EC01162F37
+:102D3000862F0E94BC14882369F0FDA081E08DA33A
+:102D400000E020E0412F61E070E0CE010E9482159A
+:102D5000FDA27CC0812F0E94B8144DA1882309F4E4
+:102D600040C0443029F01AA321E030E03FA32EA355
+:102D7000812F0E94C214813031F070F0823051F006
+:102D8000833059F507C08DA300E020E0412F61E0BA
+:102D900070E01EC08DA35AC0103F19F0173FE9F430
+:102DA00004C084E08DA31AA33FC02EA13FA1C90196
+:102DB00063E070E00E94762F8C0F9D1FFC0112A330
+:102DC000B9016F5F7F4F7FA36EA30CA12BA14AA116
+:102DD000CE010E9482151DA239C01DA21FA21EA2F3
+:102DE00035C0442399F12EA13FA1C90163E070E0F1
+:102DF0000E94762F7C01FE01E80FF91F12A3B90192
+:102E00006F5F7F4F7FA36EA38130910591F082E0C9
+:102E1000E816F104D9F40CA12BA14AA1CE010E941D
+:102E200082158DA1843091F081E090E09FA38EA364
+:102E30000DC0423059F400E02BA14AA1CE010E94FE
+:102E400082158DA1843011F0FFA2EEA2DF91CF9107
+:102E50001F910F91FF90EF900895CF92DF92EF9224
+:102E6000FF920F931F93CF93DF93EC01E8A1F9A199
+:102E7000309709F009958E0108511F4FC8010E9433
+:102E80009A17E12CF12CC82ED12C0FC060E0C8019C
+:102E90000E94AE17682FCE010E94901661E0C80113
+:102EA0000E94BF178FEFE81AF80AEC14FD0470F3C4
+:102EB000DF91CF911F910F91FF90EF90DF90CF9016
+:102EC0000895FC0142837483638311821082089504
+:102ED0000F931F93CF93DF93EC01062F0E94E0170F
+:102EE000182F298130E0C90101966A8170E00E94A3
+:102EF0008A2F488150E08417950729F4812F0E947A
+:102F0000E31780E012C0EB81FC81E20FF31F008326
+:102F10002981822F90E001966A8170E00E948A2FB9
+:102F20008983812F0E94E31781E0DF91CF911F9168
+:102F30000F910895CF93DF93EC010E94E017298150
+:102F40009881291710F0C22F02C0CA81C20FC91B75
+:102F50000E94E3178C2FDF91CF910895FC0120810F
+:102F6000862F90E0820F911D628170E00E948A2F6F
+:102F70000380F481E02DE80FF91F808108950F93FD
+:102F80001F93CF93DF931F92CDB7DEB78C01698378
+:102F90000E94E017482FF80180816981262F30E0D8
+:102FA000280F311D6281C90170E00E948A2F808341
+:102FB000842F0F90DF91CF911F910F910C94E31705
+:102FC0008FB7F89408958FBF0895FC01CB0120912D
+:102FD0006E032430B1F421812F702093E90040E08A
+:102FE00050E064E070E00E94BA0F81110BC0909134
+:102FF000E80095FD07C09091E8009E779093E80067
+:10300000089582E0089520916E032430A9F4FC0114
+:1030100081818F708093E9003091F3002091F2005C
+:10302000932F80E0822B892B49F08091E8008E77E6
+:103030008093E8000C946F1182E0089580E0089579
+:1030400020916E03243051F4FC0121812F702093D4
+:10305000E9002091E80020FD0C9403180895FC017C
+:10306000CB0120916E03243011F080E00895268179
+:103070002F702093E9002091E80022FFF6CF2091E5
+:10308000E80025FFF2CF40E050E064E070E00E94ED
+:1030900009108091E80085FD05C08091E8008B77DC
+:1030A0008093E80081E0089590930F0280930E02D0
+:1030B000089580910E0290910F020895E0910E0202
+:1030C000F0910F02309721F00190F081E02D0994EA
+:1030D00080E00895E0910E02F0910F02309721F008
+:1030E0000280F381E02D09940895E0910E02F091A1
+:1030F0000F02309721F00480F581E02D09940895A6
+:1031000020911002309111028217930771F0909371
+:10311000110280931002E0910E02F0910F0230979D
+:1031200021F00680F781E02D099408952091120284
+:10313000309113028217930771F0909313028093DA
+:103140001202E0910E02F0910F02309721F00084FC
+:10315000F185E02D099408950E94B6240E948D0502
+:103160000E948A250C945F2B0C94CE075F926F927D
+:103170007F928F929F92AF92BF92CF92DF92EF9207
+:10318000FF920F931F93CF93DF93CDB7DEB72A97AC
+:103190000FB6F894DEBF0FBECDBF0E947E0694E14D
+:1031A000C92E92E0D92E00E010E0AA24A394B12CFD
+:1031B000502E802F0E94C4073C01F601E190F1904F
+:1031C0006F01E826F926E114F10431F40F5F1F4F77
+:1031D0000430110569F73AC08091680281FD0E94B0
+:1031E000CD0720E030E04501022E02C0880C991C7A
+:1031F0000A94E2F7C4018E219F21892B09F12E83C5
+:103200005F826820792081E0672809F480E0888760
+:103210000E94BF248160782F9A8789874E815F81C1
+:1032200068858A850E946F19F801EE0FFF1FEC5E1A
+:10323000FD4F80819181882599259183808316C0D7
+:103240002F5F3F4F2C30310571F6C0CF8FEF898350
+:103250008A831B820E94BF248160782F9D838C8388
+:1032600049815A816B818D810E946F190E94772854
+:1032700010911C020E945E181817D9F00E945E1867
+:1032800080931C022A960FB6F894DEBF0FBECDBF06
+:10329000DF91CF911F910F91FF90EF90DF90CF9032
+:1032A000BF90AF909F908F907F906F905F900C94A5
+:1032B000B4182A960FB6F894DEBF0FBECDBFDF91CB
+:1032C000CF911F910F91FF90EF90DF90CF90BF9023
+:1032D000AF909F908F907F906F905F900895CF9365
+:1032E000DF93CDB7DEB72B970FB6F894DEBF0FBED6
+:1032F000CDBF4F83588769877A878B87DE01119608
+:1033000086E0FD0111928A95E9F785E0FE01379686
+:1033100001900D928A95E1F749815A816B817C81F8
+:103320008D819E810E9447212B960FB6F894DEBFB7
+:103330000FBECDBFDF91CF910895CF93C82F8823C3
+:1033400009F4C1C0823859F40E945E1881FDBBC0E7
+:1033500089E30E94AC230E94282489E30CC08338AF
+:1033600079F40E945E1880FDAEC083E50E94AC2314
+:103370000E94282483E50E94CE23CF910C94282418
+:10338000843859F40E945E1882FD9DC087E40E9433
+:10339000AC230E94282487E4EECF8450813A48F47D
+:1033A0008C2F0E94C72A81118EC08C2F0E94AC23C3
+:1033B000E4CF8C2F805E883050F4C77081E090E0BD
+:1033C00001C0880FCA95EAF70E94EF23D6CF8C2F51
+:1033D000855A833078F4C53A29F0C63A31F482E848
+:1033E00090E005C081E890E002C083E890E0CF91D2
+:1033F0000C9480188C2F885A833108F064C0C83A26
+:1034000039F1C93A41F1CA3A49F1CB3A51F1CC3AD2
+:1034100059F1CD3A61F1C03B69F1CE3A71F1CF3A41
+:1034200079F1C13B81F1C23B89F1C33B91F1C43BCE
+:1034300099F1C53BA1F1C63BA9F1C73BB1F1C83B2E
+:10344000B9F1C93BC1F1CA3BC9F58AE292E038C083
+:1034500082EE90E035C089EE90E032C08AEE90E0D6
+:103460002FC085EB90E02CC086EB90E029C087EB65
+:1034700090E026C08CEC90E023C08DEC90E020C062
+:1034800083E891E01DC08AE891E01AC082E991E0EA
+:1034900017C084E991E014C081E292E011C083E298
+:1034A00092E00EC084E292E00BC085E292E008C098
+:1034B00086E292E005C087E292E002C080E090E000
+:1034C000CF910C949618CF910895882309F44DC09C
+:1034D000823859F40E945E1881FF47C089E30E9438
+:1034E000AC230E94282489E30CC0833871F40E9425
+:1034F0005E1880FF3AC083E50E94AC230E94282416
+:1035000083E50E94CE230C942824843859F40E9429
+:103510005E1882FF2AC087E40E94AC230E94282400
+:1035200087E4EFCF982F9450913A08F4EACF982F80
+:10353000905E983058F4282F277081E090E001C009
+:10354000880F2A95EAF70E94F523DDCF982F955A28
+:10355000933020F480E090E00C948018885A8331F6
+:1035600020F480E090E00C9496180895882321F0D0
+:103570000E94EF230C9428240895882321F00E94B0
+:10358000F5230C9428240895BF92CF92DF92EF92F6
+:10359000FF920F931F93CF93DF93CDB7DEB727979B
+:1035A0000FB6F894DEBF0FBECDBF8C0185E0F801E9
+:1035B000DE01119601900D928A95E1F7F8013081B4
+:1035C0002181F280558152955F7083819481892B8E
+:1035D00039F02F3F41F481E090E03F3F31F003C0EC
+:1035E00081E090E002C080E090E080FD73C3398309
+:1035F0002A8389819A815E830E946923B92E8F83F1
+:103600000E9468230E9490222B2D22952F7030E07B
+:103610005E816F812530310509F4E6C06CF42430F9
+:1036200031050CF0A2C04B2D407F8B2D8F702230C6
+:1036300031050CF045C017C02C3031054CF42A3050
+:1036400031050CF0E7C12830310509F043C3E5C06E
+:103650002D30310509F4BAC20CF4A2C22F30310565
+:1036600009F038C323C3182F411101C002C01295BD
+:10367000107FFF2059F0112309F46BC2812F6F8353
+:103680000E94FF230E9428246F8163C2862F0E941C
+:10369000651A112309F41EC3812F0E940524279661
+:1036A0000FB6F894DEBF0FBECDBFDF91CF911F9153
+:1036B0000F91FF90EF90DF90CF90BF900C94282453
+:1036C000403211F08295807F662319F0613071F5E8
+:1036D00023C0FF20B1F0511101C032C0513081F53B
+:1036E00027960FB6F894DEBF0FBECDBFDF91CF9106
+:1036F0001F910F91FF90EF90DF90CF90BF900C94AF
+:103700000F24511101C003C0513009F4E3C28E836C
+:103710000E9412248E819AC1FF2021F0563008F0B9
+:10372000D9C20EC0553008F0D5C290C1FF20C9F0F3
+:10373000552331F0F801958190FF0BC29F7095835E
+:1037400027960FB6F894DEBF0FBECDBFDF91CF91A5
+:103750001F910F91FF90EF90DF90CF90BF900C944E
+:10376000B61A552309F472C109C22B2D2695269548
+:10377000237030E02115310529F02130310509F0A1
+:10378000A9C219C0FF2021F0862F9B2D937002C083
+:1037900080E090E027960FB6F894DEBF0FBECDBF55
+:1037A000DF91CF911F910F91FF90EF90DF90CF901D
+:1037B000BF900C948018FF2021F0862F9B2D9370D2
+:1037C00002C080E090E027960FB6F894DEBF0FBEEF
+:1037D000CDBFDF91CF911F910F91FF90EF90DF90C0
+:1037E000CF90BF900C949618862FFF2019F00E945E
+:1037F0007D2702C00E94E52727960FB6F894DEBF0A
+:103800000FBECDBFDF91CF911F910F91FF90EF9031
+:10381000DF90CF90BF900C946C288B2D837009F0B3
+:1038200079C0F11057C2262F229526952770220FB6
+:10383000220F862F8F70C82ED12CE12CF12C022E56
+:1038400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF4
+:1038500010C06FE070E080E090E004C0660F771F5A
+:10386000881F991F2A95D2F760957095809590953D
+:1038700003C060E070E0CB012B2D269526952370C8
+:10388000422F50E042305105D9F04330510569F1E3
+:103890006C297D298E299F294130510551F12796A8
+:1038A0000FB6F894DEBF0FBECDBFDF91CF911F9151
+:1038B0000F91FF90EF90DF90CF90BF900C94A522D6
+:1038C0006C297D298E299F2927960FB6F894DEBF93
+:1038D0000FBECDBFDF91CF911F910F91FF90EF9061
+:1038E000DF90CF90BF900C94B7220E94A522C70111
+:1038F000B60127960FB6F894DEBF0FBECDBFDF919D
+:10390000CF911F910F91FF90EF90DF90CF90BF90DC
+:103910000C949322FF2019F08B2D817001C08695A5
+:10392000882309F4D7C1262F229526952770220FC8
+:10393000220F862F8F70C82ED12CE12CF12C022E55
+:1039400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF3
+:1039500010C06FE070E080E090E004C0660F771F59
+:10396000881F991F2A95D2F760957095809590953C
+:1039700003C060E070E0CB012B2D269526952370C7
+:10398000422F50E042305105D9F04330510569F1E2
+:103990006C297D298E299F294130510551F12796A7
+:1039A0000FB6F894DEBF0FBECDBFDF91CF911F9150
+:1039B0000F91FF90EF90DF90CF90BF900C94442335
+:1039C0006C297D298E299F2927960FB6F894DEBF92
+:1039D0000FBECDBFDF91CF911F910F91FF90EF9060
+:1039E000DF90CF90BF900C9456230E944423C701D0
+:1039F000B60127960FB6F894DEBF0FBECDBFDF919C
+:103A0000CF911F910F91FF90EF90DF90CF90BF90DB
+:103A10000C943223603F59F120F4603E08F494C0C6
+:103A200008C0623F09F467C0F0F1633F09F08CC041
+:103A300065C0162F1F708B2D8F71FF2021F00E9403
+:103A4000DD22812F7DCE0E94F822812F27960FB68E
+:103A5000F894DEBF0FBECDBFDF91CF911F910F91C4
+:103A6000FF90EF90DF90CF90BF900C94BD1AFF2095
+:103A7000B1F0553008F02EC18B2D8F7127960FB6FF
+:103A8000F894DEBF0FBECDBFDF91CF911F910F9194
+:103A9000FF90EF90DF90CF90BF900C94172356309B
+:103AA00008F018C1E9CFFF2099F08B2D8F71279670
+:103AB0000FB6F894DEBF0FBECDBFDF91CF911F913F
+:103AC0000F91FF90EF90DF90CF90BF900C94DD228C
+:103AD0008B2D8F7127960FB6F894DEBF0FBECDBF2A
+:103AE000DF91CF911F910F91FF90EF90DF90CF90DA
+:103AF000BF900C94F822F110EBCFD7CFFF2099F0B4
+:103B00008B2D8F7127960FB6F894DEBF0FBECDBFF9
+:103B1000DF91CF911F910F91FF90EF90DF90CF90A9
+:103B2000BF900C94CE2227960FB6F894DEBF0FBE3E
+:103B3000CDBFDF91CF911F910F91FF90EF90DF905C
+:103B4000CF90BF900C94C922FF20A9F0552309F40F
+:103B5000ACCF862F27960FB6F894DEBF0FBECDBF31
+:103B6000DF91CF911F910F91FF90EF90DF90CF9059
+:103B7000BF900C949D19552309F4AACF862F279640
+:103B80000FB6F894DEBF0FBECDBFDF91CF911F916E
+:103B90000F91FF90EF90DF90CF90BF900C94651A3B
+:103BA0004B2D4F70C8010E94E50227960FB6F8947E
+:103BB000DEBF0FBECDBFDF91CF911F910F91FF9060
+:103BC000EF90DF90CF90BF900C94FD21F11082C058
+:103BD0009B2D9F70492F50E04230510599F144F4DC
+:103BE0004115510569F04130510509F073C019C004
+:103BF00043305105C1F14430510509F06BC044C058
+:103C000027960FB6F894DEBF0FBECDBFDF91CF91E0
+:103C10001F910F91FF90EF90DF90CF90BF900C9489
+:103C2000702B27960FB6F894DEBF0FBECDBFDF9185
+:103C3000CF911F910F91FF90EF90DF90CF90BF90A9
+:103C40000C94872B27960FB6F894DEBF0FBECDBF1E
+:103C5000DF91CF911F910F91FF90EF90DF90CF9068
+:103C6000BF900C94A32B27960FB6F894DEBF0FBE1F
+:103C7000CDBFDF91CF911F910F91FF90EF90DF901B
+:103C8000CF90BF900C94B62B862F27960FB6F89442
+:103C9000DEBF0FBECDBFDF91CF911F910F91FF907F
+:103CA000EF90DF90CF90BF900C94DA2B4B2D4F709C
+:103CB000C80127960FB6F894DEBF0FBECDBFDF91C7
+:103CC000CF911F910F91FF90EF90DF90CF90BF9019
+:103CD0000C940E0827960FB6F894DEBF0FBECDBF2A
+:103CE000DF91CF911F910F91FF90EF90DF90CF90D8
+:103CF000BF9008950E940C240E94E1230E94282472
+:103D00000E9418290E946C2880E090E00E94801890
+:103D100080E090E00C9496180E94FC230C947A1E8C
+:103D20000E946923292F22952F7030E02C30310515
+:103D30004CF42A3031056CF422503109223031051F
+:103D400070F407C02C30310531F02F30310539F4D3
+:103D500002C081E0089593FB882780F9089580E0F0
+:103D60000895CF93DF9300D000D01F92CDB7DEB778
+:103D70000F900F900F900F900F90DF91CF910895BB
+:103D8000CF93DF9300D000D000D0CDB7DEB726961A
+:103D90000FB6F894DEBF0FBECDBFDF91CF9108956F
+:103DA0001F93CF93DF93C091530216E012C0D0E06F
+:103DB0001C9FF0011D9FF00D1124ED5DFD4F408112
+:103DC000518162817381848195810E94C01E2196F8
+:103DD000C77080915402C813EACFDF91CF911F9131
+:103DE000089540911D0250911E0260911F02709132
+:103DF000200280912102909122020C94C01E0F9308
+:103E00001F93CF93DF938091220282958F7009F0E8
+:103E100069C080911F02882309F464C0A0915302F5
+:103E2000D0915402B0911D02C0911E0280912002D7
+:103E30009091210221E030E0BF3F11F020E030E01E
+:103E4000122FBC016095709506E04AC0009721F0E2
+:103E5000CF3F29F4212F05C021E030E002C020E04F
+:103E600030E020FD3BC04A2F50E0049FF001059F49
+:103E7000F00D1124ED5DFD4F2181C2132FC0208173
+:103E8000B2132CC02281211129C02381348128172B
+:103E9000390718F0281B390B02C0260F371F283CA2
+:103EA0003105E0F4809122028F70806180932202BC
+:103EB00086E0849FF001859FF00D1124E85DFD4FA1
+:103EC00080818F70806180838DE192E00E94C41AAE
+:103ED000DF91CF911F910F910C94D01EAF5FA7700F
+:103EE000AD13B4CFDF91CF911F910F910895EF9251
+:103EF000FF920F931F93CF93DF93CDB7DEB76297F7
+:103F00000FB6F894DEBF0FBECDBF8C0185E0F8017F
+:103F1000DE011D9601900D928A95E1F7D8014C9132
+:103F200011965C91119712966C9112971396ED90E1
+:103F3000FC90149770911D02E0911E028091200266
+:103F400090912102009739F0EF3F41F421E030E0F9
+:103F50007F3F31F003C021E030E002C020E030E0DC
+:103F600020FD5CC120911F02222309F4F1C0E81654
+:103F7000F90628F09701281B390BC90104C0809568
+:103F800090958E0D9F1D883C910508F098C08091FA
+:103F90002202982F907F09F064C0E51314C07413B7
+:103FA00012C0611110C08F708061809322020E9444
+:103FB000F11E8DE192E00E94C41A80912202D80184
+:103FC00015968C9343C1EF2839F05F3F41F481E0AF
+:103FD00090E04F3F31F003C081E090E002C080E00C
+:103FE00090E080FD03C081E0862702C080E090E081
+:103FF00080FF2EC0809153022091540236E013C0FE
+:1040000090E0389FF001399FF00D1124ED5DFD4FD8
+:104010007181571306C07081471303C07281671303
+:1040200017C0019687708213EBCF12C19F7059F0B1
+:10403000882309F40BC107C09F7029F0F80195810E
+:10404000907F09F403C1805E883008F4FFC0D2C0BD
+:10405000662309F4FBC080912202816080932202D2
+:10406000F5C0E51308C0741306C0611104C0D8017F
+:1040700015968C939DC04D875E878D859E856A8B36
+:104080000E94901E6A89882309F4B4C0662309F44B
+:10409000B1C020912202822F82958F7090E002970A
+:1040A0000CF4C6C080911D0290911E0298878F83E8
+:1040B0001986FB86EA862C87CE01079646C080913A
+:1040C0002202982F907F59F47E2DF98AE88A8989F7
+:1040D0000E94B11E8DE192E00E94C41A95C0E513C2
+:1040E00011C074130FC061110DC0F8018583C801A0
+:1040F0000E94C41AEDE1F2E086E0DF011D928A958C
+:10410000E9F7A2C04D875E878D859E856A8B0E94E8
+:10411000901E6A89882309F46DC0662309F46AC079
+:1041200020912202822F82958F7090E002970CF4EA
+:104130007FC080911D0290911E029A8389831B8209
+:10414000FD82EC822E83CE0101960E94C41A70C0BB
+:10415000E816F90628F09701281B390BC90104C09D
+:10416000809590958E0D9F1D883C910508F046C066
+:10417000662309F43FC0E51330C074132EC02091AC
+:10418000220220FD21C0322F32953F70832F90E014
+:104190000097D1F0D80115962C9315970F9741F001
+:1041A000832F8F5F8295807F2F70282B15962C93FD
+:1041B000C8010E94C41A86E0F801ADE1B2E00190A6
+:1041C0000D928A95E1F73EC086E0F801ADE1B2E0DC
+:1041D00001900D928A95E1F737C04D875E878D85F6
+:1041E0009E850E94901E811123C0809122028160D1
+:1041F00080932202C8010E94C41A26C07E2DF98A2B
+:10420000E88A89890E94B11EEDE1F2E086E0DF01D3
+:104210001D928A95E9F70E94F11E18C0662351F39A
+:104220004D875E878D859E850E94901E882311F3A1
+:1042300086E0F801ADE1B2E001900D928A95E1F7D8
+:104240000E94FF1E0E94F11E81E014C080E012C097
+:104250004D875E878D859E850E946923292F229533
+:104260002F7030E0223031050CF4E0CE24303105DF
+:104270000CF6E2CE62960FB6F894DEBF0FBECDBF4D
+:10428000DF91CF911F910F91FF90EF9008951F93B1
+:10429000CF93DF93CDB7DEB72C970FB6F894DEBF80
+:1042A0000FBECDBF4F83588769877A878B879C87DE
+:1042B000CE0107960E94771F8823D9F02F81388579
+:1042C0008A859B85892B39F03F3F19F080E090E08B
+:1042D00004C02F3FD9F781E090E0892B09F06DC031
+:1042E0004F81588569857A858B859C850E94C01E83
+:1042F00064C086E0FE013796DE01119601900D92B2
+:104300008A95E1F7FF81E8854A855B85411551056E
+:1043100039F0EF3F41F481E090E0FF3F31F003C01E
+:1043200081E090E002C080E090E080FD46C02091F6
+:10433000540230E0C90101968770992760915302B9
+:1043400070E08617970709F440C0F983EA835D831C
+:104350004C8396E0929FD001939FB00D1124AD5DE8
+:10436000BD4FFE01319601900D929A95E1F7809331
+:1043700054020E94D01E21C0189FC00111248D5DDF
+:104380009D4F0E94771F882371F1E09153021E9F79
+:10439000F0011124ED5DFD4F4081518162817381F7
+:1043A000848195810E94C01E8091530290E0019605
+:1043B000877099278093530201C016E080915302C1
+:1043C000909154028913D8CF0EC00E948C1E109277
+:1043D000540210925302EDE1F2E086E0DF011D92FB
+:1043E0008A95E9F7EACF2C960FB6F894DEBF0FBE98
+:1043F000CDBFDF91CF911F910895DF92EF92FF9291
+:104400000F931F93CF93DF93EC01009709F46CC0D7
+:10441000D12CEE24E394F12C8E010F5F1F4FFE018F
+:104420008491843748F4843008F04AC0813071F0B8
+:10443000823009F059C01EC0853709F43DC070F1C3
+:10444000982F9458903708F04FC03DC02296F8013D
+:104450008491982F905E983050F48770FE2D01C0A3
+:10446000FF0F8A95EAF78F2F0E94FF2330C00E942A
+:104470009D192DC02296F8018491982F905E983056
+:1044800050F48770FE2D01C0FF0F8A95EAF78F2F39
+:104490000E9405241CC00E94651A19C02296F801CA
+:1044A000049107C08FE99FE00197F1F700C0000079
+:1044B00001500111F7CF0BC02296F801D49007C02C
+:1044C0000E949D1903C08F770E94651AE8018D2D07
+:1044D00007C08150EFE9FFE03197F1F700C000001D
+:1044E000882309F499CFF5CFDF91CF911F910F91D8
+:1044F000FF90EF90DF9008956093590270935A02F5
+:1045000080935B0290935C020C947A1E6093550238
+:104510007093560280935702909358020C947A1E1F
+:1045200008950C947C220F931F93009159021091CF
+:104530005A0220915B0230915C02602B712B822B1E
+:10454000932B1F910F910C947C220F931F9300913A
+:10455000590210915A0220915B0230915C02602353
+:104560007123822393231F910F910C947C220F932C
+:104570001F930091590210915A0220915B023091D1
+:104580005C0260277127822793271F910F910C945B
+:104590007C2260E070E0CB010C94862241E050E088
+:1045A00060E070E004C0440F551F661F771F8A95B6
+:1045B000D2F7CB01BA010C94862241E050E060E0D2
+:1045C00070E004C0440F551F661F771F8A95D2F70D
+:1045D0008091550290915602A0915702B0915802D5
+:1045E000482B592B6A2B7B2BCB01BA010C948622CA
+:1045F00041E050E060E070E004C0440F551F661FCA
+:10460000771F8A95D2F74095509560957095809167
+:10461000550290915602A0915702B091580248233A
+:1046200059236A237B23CB01BA010C94862241E0F3
+:1046300050E060E070E004C0440F551F661F771F14
+:104640008A95D2F78091550290915602A091570217
+:10465000B0915802482759276A277B27CB01BA0116
+:104660000C9486220F931F930091550210915602CD
+:104670002091570230915802602B712B822B932B83
+:104680001F910F910C9486220F931F930091550256
+:1046900010915602209157023091580260237123E5
+:1046A000822393231F910F910C9486220F931F93C3
+:1046B00000915502109156022091570230915802F4
+:1046C00060277127822793271F910F910C948622D0
+:1046D0000895CF92DF92EF92FF920F931F93CF93A3
+:1046E000DF93EC01C0905902D0905A02E0905B0237
+:1046F000F0905C028091550290915602A091570271
+:10470000B0915802C82AD92AEA2AFB2A0FE110E000
+:10471000B701A601002E04C0769567955795479579
+:104720000A94D2F740FF08C0BE01802F0E94E00328
+:104730008130910509F007C00150110948F7BE0109
+:1047400080E00E94E003DF91CF911F910F91FF90D5
+:10475000EF90DF90CF90089540911B0150911C0184
+:1047600020E030E09FEFFA01E20FF31F628168174B
+:10477000A1F09F3F19F4611101C0922F2F5F3F4FAD
+:104780002630310581F707C0FA01E90FF11D97FDC9
+:10479000FA95828308959F3FB9F7089540911B01D0
+:1047A00050911C0120E030E0FA01E20FF31F9281EA
+:1047B000981301C012822F5F3F4F26303105A1F7B9
+:1047C000089581E090E0E0911B01F0911C01E80F59
+:1047D000F91F1082019688309105A9F708959091EC
+:1047E0005D02982B90935D020895809590915D02F3
+:1047F000982390935D02089510925D020895909120
+:104800005E02982B90935E020895809590915E02CF
+:10481000982390935E02089510925E02089580930B
+:104820005F02089510925F02089540911B0150911C
+:104830001C0120E030E080E0FA01E20FF31F9181DB
+:1048400091118F5F2F5F3F4F27303105A9F70895F2
+:10485000E0911B01F0911C0180915D028083E09149
+:104860001B01F0911C01808190915E02892B808355
+:1048700090915F02992361F0E0911B01F0911C017E
+:104880008081892B80830E94152481110E9412242B
+:1048900080911B0190911C010C946A1880916E0309
+:1048A000843009F11092690220E488E190E00FB6AB
+:1048B000F894A895809360000FBE2093600083B7A2
+:1048C000817F846083BF83B7816083BF789488953C
+:1048D00083B78E7F83BF88E10FB6F8948093600022
+:1048E000109260000FBE0895CF930E94E3020E94D1
+:1048F0007E060E94E402C0E08C2F0E94C407892B30
+:1049000029F4CF5FC430C1F780E001C081E0CF91CE
+:1049100008950E948C1E0C945F2B1F920F920FB66D
+:104920000F9211248F939F93AF93BF93809169024D
+:10493000811113C080916A0290916B02A0916C0268
+:10494000B0916D024196A11DB11D80936A029093B2
+:104950006B02A0936C02B0936D02BF91AF919F91D7
+:104960008F910F900FBE0F901F90189582E084BD1D
+:1049700093E095BD9AEF97BD80936E0008958FB731
+:10498000F89440916A0250916B0260916C027091B0
+:104990006D028FBFCA010895CF92DF92EF92FF920E
+:1049A0000F931F932FB7F89440916A0250916B02B6
+:1049B00060916C0270916D022FBF6A017B01EE2441
+:1049C000FF248C0120E030E0C016D106E206F30699
+:1049D00020F09A01281B390B05C09C0120953095C9
+:1049E000240F351FC9011F910F91FF90EF90DF90A9
+:1049F000CF9008951F920F920FB60F9211248F93AC
+:104A00009F93AF93BF9380916A0290916B02A091A4
+:104A10006C02B0916D020196A11DB11D80936A02D6
+:104A200090936B02A0936C02B0936D02BF91AF9113
+:104A30009F918F910F900FBE0F901F9018950E941D
+:104A4000A111F8942FEF87EA91E621508040904021
+:104A5000E1F700C0000087E090EBDC018093780371
+:104A600090937903A0937A03B0937B032CE088E1C1
+:104A700090E00FB6F894A895809360000FBE209345
+:104A80006000FFCFCF92DF92EF92FF920F931F93C0
+:104A9000CF93DF93C82ED12C01E010E08D2D0E9422
+:104AA000C4077C01C0E0D0E098010C2E02C0220FA8
+:104AB000331F0A94E2F72E213F21232B29F421965C
+:104AC000CC30D10589F708C06C2F7D2D80E00E9485
+:104AD000BB03C812F4CF06C0D39484E0D812DECF53
+:104AE00080E001C081E0DF91CF911F910F91FF9095
+:104AF000EF90DF90CF900895CF93C82F8CE20E9463
+:104B00004225882321F08C2FCF910C94422580E000
+:104B1000CF910895CF930E94CD26811102C00E94AB
+:104B2000AE26C5E608C00E947E068FE39CE9019789
+:104B3000F1F700C00000C150B1F789E20E947C2566
+:104B400081110AC18AE20E947C2581110E94AE2651
+:104B500085E00E947C2581110E941F250E94D82695
+:104B60008093680287E00E947C25882399F18BE17D
+:104B70000E947C25882351F09091680291FB882740
+:104B800080F921E0822780FB91F922C08EE00E940B
+:104B90007C25882351F09091680292FB882780F948
+:104BA00021E0822780FB92F913C080E10E947C25DE
+:104BB00090916802882341F093FB882780F921E0D7
+:104BC000822780FB93F904C0892F809580FB90F9A0
+:104BD00090936802809168020E94DC260E94EA2677
+:104BE00080937B0280EE0E947C25882341F0809197
+:104BF0007B02982F909590FB80F980937B0289E34C
+:104C00000E947C25882359F090917B0291FB882794
+:104C100080F921E0822780FB91F990937B0282EE5C
+:104C20000E947C25882359F090917B0292FB882773
+:104C300080F921E0822780FB92F990937B0286EE37
+:104C40000E947C25882359F090917B0293FB882752
+:104C500080F921E0822780FB93F990937B0283EE19
+:104C60000E947C25882359F090917B0294FB882731
+:104C700080F921E0822780FB94F990937B0285E301
+:104C80000E947C25882359F090917B0295FB882710
+:104C900080F921E0822780FB95F990937B0281E3E4
+:104CA0000E947C25882359F090917B0296FB8827EF
+:104CB00080F921E0822780FB96F990937B0281E1C5
+:104CC0000E947C25882359F090917B0297FB8827CE
+:104CD00080F921E0822780FB97F990937B028091F5
+:104CE0007B020E94EE2687E20E947C25C82F8EE17F
+:104CF0000E947C258111C2608FE10E947C25811178
+:104D0000C46080E20E947C258111C86081E20E941B
+:104D10007C258111C06182E20E947C258111C062E4
+:104D200083E20E947C258111C06484E20E947C257C
+:104D3000882311F0C06802C0CC2329F08C2F0E9478
+:104D4000E5266C2F03C00E94E126682F70E080E00A
+:104D500090E0CF910C949122CF9108956DEE7EEF6B
+:104D600080E090E00E94BA2F60E082E090E00E9434
+:104D7000AC2F60E083E090E00E94AC2F60E084E024
+:104D800090E00E94AC2F60E085E090E00E94AC2FA4
+:104D900060E086E090E00C94AC2F80E090E00E9410
+:104DA000A62F21E08D3E9E4F09F020E0822F08952E
+:104DB00082E090E00C949E2F682F82E090E00C94AB
+:104DC000AC2F83E090E00C949E2F682F83E090E05E
+:104DD0000C94AC2F84E090E00C949E2F682F84E01C
+:104DE00090E00C94AC2F86E090E00C949E2F682FFE
+:104DF00086E090E00C94AC2F8091760280FF0BC08F
+:104E00006091200185E0689FB00111247595679538
+:104E1000759567952AC081FF09C06091200185E0E2
+:104E2000689FB0011124759567951FC082FF07C068
+:104E30006091200185E0689FB001112416C0409167
+:104E400070024423C9F060911F01461788F7209132
+:104E5000200185E0289F90011124429FC001439FBB
+:104E6000900D112470E00E948A2F6038710540F483
+:104E70006115710539F002C065E070E0862F089574
+:104E80008FE7089581E008958091760280FF08C041
+:104E900060911E0170E0759567957595679521C0C5
+:104EA00081FF06C060911E0170E07595679519C07D
+:104EB00082FF04C060911E0170E010C080917002FA
+:104EC0008823C1F060911D018617A0F790911E0103
+:104ED000989FC001112470E00E948A2F60387105EC
+:104EE00028F46115710521F0862F08958FE7089544
+:104EF00081E0089561E070E0F4CF803F21F40E94EA
+:104F0000FC26819504C0813F29F40E94FC268093F1
+:104F100073020895823F21F40E94FC26819504C00B
+:104F2000833F29F40E94FC26809372020895893FF2
+:104F300019F40E94442705C08A3F31F40E94442797
+:104F400081958093740208958B3F21F40E94442739
+:104F5000819504C08C3F29F40E94442780937502F8
+:104F60000895843F21F480917102816017C0853FCC
+:104F700021F480917102826011C0863F21F48091FA
+:104F8000710284600BC0873F21F4809171028860B8
+:104F900005C0883F31F48091710280618093710275
+:104FA00008958D3F21F48091760281600BC08E3F81
+:104FB00021F480917602826005C08F3F29F48091B0
+:104FC00076028460809376020895803F29F4809170
+:104FD000730287FF6EC007C0813F41F48091730266
+:104FE00018160CF066C01092730263C090917202A2
+:104FF000823F19F497FF5DC005C0833F31F4191655
+:105000000CF057C01092720254C0893F31F4809165
+:10501000740218160CF04DC006C08A3F39F4809116
+:10502000740287FF46C01092740243C08B3F29F47C
+:105030008091750287FF3DC006C08C3F39F4809196
+:1050400075021816B4F51092750233C0843F21F42E
+:10505000809171028E7F05C0853F31F4809171028D
+:105060008D7F8093710225C0863F21F4809171026B
+:105070008B7FF7CF873F21F480917102877FF1CF3B
+:10508000883F21F4809171028F7EEBCF8D3F21F418
+:10509000809176028E7F0BC08E3F21F48091760244
+:1050A0008D7F05C08F3F29F4809176028B7F80939E
+:1050B00076028091720281110EC08091730281117B
+:1050C0000AC080917402811106C08091750281111D
+:1050D00002C010927002089581E792E00E94751854
+:1050E0000E94BF2490936F0280936E020895CF9325
+:1050F00080916E0290916F020E94CC2440917002C8
+:10510000442321F02091210130E006C020912201AA
+:105110005AE0259F900111248217930708F486C056
+:105120008091720281110DC090917302911109C09A
+:1051300090917402911105C090917502992309F420
+:1051400075C04F3F19F04F5F40937002181624F45A
+:105150000E94FC26809372028091720287FF05C034
+:105160000E94FC268195809372028091730218162A
+:1051700024F40E94FC26809373028091730287FFBF
+:1051800005C00E94FC268195809373026091720293
+:10519000662339F1C0917302CC2319F1772767FD9B
+:1051A0007095872F972F0E94FA2C23E333E343E374
+:1051B0005FE30E94AE2D0E94C72C609372026C2F99
+:1051C000772767FD7095872F972F0E94FA2C23E38E
+:1051D00033E343E35FE30E94AE2D0E94C72C60934C
+:1051E000730280917402181624F40E94442780935D
+:1051F00074028091740287FF05C00E944427819544
+:105200008093740280917502181624F40E9444273A
+:10521000809375028091750287FF05C00E94442724
+:10522000819580937502CF910C946C28CF9108954D
+:10523000E1E7F2E085E0DF011D928A95E9F710923F
+:105240007002109276020895833089F130F4813033
+:1052500061F0823009F06EC019C0853009F449C090
+:10526000B8F1863009F066C055C020912201862F22
+:1052700090E0820F911D8F3F910520F4620F6093A3
+:10528000220108958FEF809322010895209121013A
+:10529000862F90E0820F911D8F3F910520F4620FC1
+:1052A0006093210108958FEF80932101089520914B
+:1052B0002001862F90E0820F911D8F3F910520F4F1
+:1052C000620F6093200108958FEF8093200108956D
+:1052D00020911F01862F90E0820F911D8F3F910535
+:1052E00020F4620F60931F0108958FEF80931F01D8
+:1052F000089520911E01862F90E0820F911D8F3F0F
+:10530000910520F4620F60931E0108958FEF809342
+:105310001E01089520911D01862F90E0820F911D9E
+:105320008F3F910520F4620F60931D0108958FEF68
+:1053300080931D010895833021F130F4813059F0BC
+:10534000823009F049C012C0853089F128F18630D9
+:1053500009F042C037C080912201681720F4861BF3
+:1053600080932201089510922201089580912101D5
+:10537000681720F4861B8093210108951092210163
+:10538000089580912001681720F4861B80932001E6
+:10539000089510922001089580911F01681720F44C
+:1053A000861B80931F01089510921F01089580911C
+:1053B0001E01681720F4861B80931E010895109229
+:1053C0001E01089580911D01681720F4861B8093AB
+:1053D0001D01089510921D01089541E050E060E024
+:1053E00070E004C0440F551F661F771F8A95D2F7DF
+:1053F000CB01BA010E9491220C948C1E873208F5D1
+:105400008E3108F0B9C08E3009F47EC060F4873068
+:1054100009F465C018F4863059F549C0883051F157
+:105420008B3031F5AEC0883130F4863108F0A9C038
+:105430008031F1F473C0893109F4A3C08B31C1F418
+:1054400059C08933F1F068F4893209F493C018F433
+:10545000873271F48FC0853309F48CC0883341F4EE
+:1054600090C0863409F46BC008F488C0883449F1D0
+:1054700080E008950E94D8260E94EA260E94F32622
+:1054800080C00E945918892B59F00E945918909396
+:105490007902809378020E948C1E80E090E004C024
+:1054A00080917802909179020E9454186AC080918C
+:1054B0006802817F8E7F8093680281E0809377020B
+:1054C00008950E948C1E2FEF83ED90E321508040C1
+:1054D0009040E1F700C000000E941F2552C080915B
+:1054E000680280FF03C0817F8E7F01C0816080934E
+:1054F000680247C09091680291FB882780F921E0FB
+:10550000822780FB91F913C09091680292FB882753
+:1055100080F921E0822780FB92F909C0909168020E
+:1055200093FB882780F921E0822780FB93F99093F1
+:105530006802882331F191609093680222C081E86B
+:1055400090E00E9480182FEF81EE94E0215080407F
+:105550009040E1F700C0000080E090E00E948018D9
+:105560002FEF89E698E1215080409040E1F700C09C
+:10557000000007C080E003C08D5101C089530E9424
+:10558000ED2981E0089580E0089580E00895CF93AB
+:10559000C82F80917702813071F020F0823009F0BD
+:1055A00083C037C0A0911B01B0911C018C91823245
+:1055B00009F07CC007C0A0911B01B0911C018C9127
+:1055C000823249F48C2F0E94C32A81111EC08C2F75
+:1055D0000E94FE291CC08C2F0E94C52A811115C073
+:1055E000C43169F030F4CB3081F0C03109F062C0D1
+:1055F00009C0C93221F0C83309F05CC006C010925E
+:10560000770258C082E08093770281E090E0817059
+:1056100054C0C932C1F060F4C431A9F020F4C730DD
+:1056200009F046C02EC0CE51CA3008F041C011C0AA
+:10563000CE3409F118F4CB34D9F517C0C13599F03F
+:10564000C235B1F50EC010927A0281E080937702E4
+:1056500034C0EC2FF0E0E455FE4F808180937A0255
+:1056600027C061E003C061E007C06AE080917A0270
+:105670000E9424291DC06AE080917A020E949B2921
+:1056800017C08EE18093220182E3809321018AE09A
+:105690008093200184E180931F0188E080931E01A4
+:1056A00088E280931D0104C01092770280E005C05B
+:1056B00081E003C080E090E0AACFCF9108950E94DE
+:1056C000CD26811102C00E94AE260E94F32680934F
+:1056D000770380FF02C0869501C080E00C94DF074D
+:1056E00080917703982F9695292F30E0233031054C
+:1056F0004CF49F5F990F8170892B816080937703B1
+:105700000E94F7268091770386950C94DF0780919D
+:105710007703982F969591F09158990F8170892B66
+:10572000809377038E7F91E009F490E08091770376
+:1057300090FB80F9809377030E94F726809177038E
+:1057400086950C94DF0780917703982F909590FBB6
+:1057500080F9809377030E94F7268091770380FF7A
+:1057600002C0869501C080E00C94DF07309177037A
+:10577000232F26952F5F2F77822F90E0317004978B
+:105780002CF4220F232B2093770302C0309377034E
+:1057900080917703282F2E7F91E009F490E090FB11
+:1057A00080F9809377030E94F7268091770386958E
+:1057B0000C94DF0720917703922F96959827990FE5
+:1057C000822F8170892B809377038E7F91E009F47B
+:1057D00090E08091770390FB80F9809377030E949B
+:1057E000F7268091770386950C94DF075058BB27E6
+:1057F000AA270ED075C166D130F06BD120F031F4FC
+:105800009F3F11F41EF45BC10EF4E095E7FB51C11C
+:10581000E92F77D180F3BA176207730784079507DA
+:1058200018F071F49EF58FC10EF4E0950B2EBA2F8F
+:10583000A02D0B01B90190010C01CA01A001112496
+:10584000FF27591B99F0593F50F4503E68F11A1642
+:10585000F040A22F232F342F4427585FF3CF4695D3
+:1058600037952795A795F0405395C9F77EF41F16F5
+:10587000BA0B620B730B840BBAF09150A1F0FF0FBF
+:10588000BB1F661F771F881FC2F70EC0BA0F621FAB
+:10589000731F841F48F4879577956795B795F7959B
+:1058A0009E3F08F0B3CF9395880F08F09927EE0F2D
+:1058B000979587950895D9D008F481E008950CD084
+:1058C0000FC107D140F0FED030F021F45F3F19F056
+:1058D000F0C0511139C1F3C014D198F39923C9F321
+:1058E0005523B1F3951B550BBB27AA2762177307E6
+:1058F000840738F09F5F5F4F220F331F441FAA1F9A
+:10590000A9F333D00E2E3AF0E0E830D09150504059
+:10591000E695001CCAF729D0FE2F27D0660F771F07
+:10592000881FBB1F261737074807AB07B0E809F0E9
+:10593000BB0B802DBF01FF2793585F4F2AF09E3F7E
+:10594000510568F0B6C000C15F3FECF3983EDCF350
+:10595000869577956795B795F7959F5FC9F7880FF7
+:10596000911D9695879597F90895E1E0660F771F49
+:10597000881FBB1F621773078407BA0720F0621BDA
+:10598000730B840BBA0BEE1F88F7E095089504D0D3
+:105990006894B111D9C00895BCD088F09F5790F099
+:1059A000B92F9927B751A0F0D1F0660F771F881F44
+:1059B000991F1AF0BA95C9F712C0B13081F0C3D05F
+:1059C000B1E00895C0C0672F782F8827B85F39F0FD
+:1059D000B93FCCF3869577956795B395D9F73EF4A3
+:1059E00090958095709561957F4F8F4F9F4F08954B
+:1059F000E89409C097FB3EF4909580957095619569
+:105A00007F4F8F4F9F4F9923A9F0F92F96E9BB271E
+:105A10009395F695879577956795B795F111F8CF9A
+:105A2000FAF4BB0F11F460FF1BC06F5F7F4F8F4F05
+:105A30009F4F16C0882311F096E911C0772321F0FB
+:105A40009EE8872F762F05C0662371F096E8862F93
+:105A500070E060E02AF09A95660F771F881FDAF7EA
+:105A6000880F9695879597F90895990F0008550F17
+:105A7000AA0BE0E8FEEF16161706E807F907C0F0D4
+:105A800012161306E407F50798F0621B730B840BDC
+:105A9000950B39F40A2661F0232B242B252B21F4B6
+:105AA00008950A2609F4A140A6958FEF811D811D56
+:105AB000089597F99F6780E870E060E008959FEF90
+:105AC00080EC089500240A94161617061806090695
+:105AD000089500240A941216130614060506089564
+:105AE000092E0394000C11F4882352F0BB0F40F4EC
+:105AF000BF2B11F460FF04C06F5F7F4F8F4F9F4F2C
+:105B0000089557FD9058440F551F59F05F3F71F0AD
+:105B10004795880F97FB991F61F09F3F79F0879514
+:105B20000895121613061406551FF2CF4695F1DF9D
+:105B300008C0161617061806991FF1CF869571052D
+:105B4000610508940895E894BB2766277727CB0161
+:105B500097F908958ADF08F48FEF08950BD0C0CF2E
+:105B6000B1DF28F0B6DF18F0952309F0A2CFA7CF58
+:105B70001124EACFC6DFA0F3959FD1F3950F50E033
+:105B8000551F629FF001729FBB27F00DB11D639FEF
+:105B9000AA27F00DB11DAA1F649F6627B00DA11D95
+:105BA000661F829F2227B00DA11D621F739FB00D3B
+:105BB000A11D621F839FA00D611D221F749F3327AB
+:105BC000A00D611D231F849F600D211D822F762F44
+:105BD0006A2F11249F5750408AF0E1F088234AF041
+:105BE000EE0FFF1FBB1F661F771F881F915050408D
+:105BF000A9F79E3F510570F05CCFA6CF5F3FECF355
+:105C0000983EDCF3869577956795B795F795E79578
+:105C10009F5FC1F7FE2B880F911D9695879597F989
+:105C20000895FA01EE0FFF1F30962105310599F115
+:105C30006115710561F48038BFE39B0749F16894F1
+:105C40009038810561F08038BFEF9B0741F09923C0
+:105C500042F5FF3FE1053105210511F1E894089473
+:105C6000E795D901AA2329F4AB2FBE2FF85FD0F313
+:105C700010C0FF5F70F4A695E0F7F73950F019F007
+:105C8000FF3A38F49F779F930CD00F9007FC905801
+:105C900008953EF014CF60E070E080E89FE308953F
+:105CA0004FE79F775F934F933F932F939ED02F9112
+:105CB0003F914F915F9152DF05C019F40EF0F9CE7C
+:105CC00042CFFDCE26DFC8F39638C0F707F80F9213
+:105CD000E8942BE33AEA48EB5FE74EDF0F920F922E
+:105CE0000F924DB75EB70F92C0D0ECEAF0E016D03D
+:105CF0004F915F91EF91FF91E595EE1FFF1F49F0E6
+:105D0000FE57E0684427EE0F441FFA95E1F74195EE
+:105D1000550B32D00F9007FE26C00895DF93CF9326
+:105D20001F930F93FF92EF92DF927B018C01689497
+:105D300005C0DA2EEF011EDFFE01E894A591259142
+:105D4000359145915591AEF3EF0162DDFE0197016A
+:105D5000A801DA9479F7DF90EF90FF900F911F91EF
+:105D6000CF91DF9108959B01AC0160E070E080E885
+:105D70009FE3A5CD9ECEACC0CCDEE8F39923D9F34A
+:105D8000940F511DBBF39150504094F059F088236B
+:105D900032F0660F771F881F91505040C1F79E3F29
+:105DA000510544F7880F911D9695879597F90895A9
+:105DB0005F3FACF0983E9CF0BB2786957795679542
+:105DC000B79508F4B1609395C1F7BB0F58F711F47C
+:105DD00060FFE8CF6F5F7F4F8F4F9F4FE3CFB4CE11
+:105DE0000EF076C06CCE689464CE93DEC8F399232F
+:105DF000D1F3C6F3DF93CF931F930F93FF92C92F75
+:105E0000DD2788232AF02197660F771F881FDAF78E
+:105E100020E030E040E85FEB9FE3883920F0803EEF
+:105E200030F021968F77E3DCE4EDF0E003C0DFDCB7
+:105E3000E1E0F1E073DF8B01BE01EC01FB2E6F5757
+:105E400071097595771F880B990BD4DD28E132E72E
+:105E500041E35FE38FDEAF2D9801AE01FF900F911C
+:105E60001F91CF91DF91D4DC3BCEFA01DC01AA0F68
+:105E7000BB1F9B01AC01BF5728F4222733274427BF
+:105E800050781FC0B75188F4AB2F00244695379542
+:105E90002795011CA395D2F3002069F0220F331F30
+:105EA000441FB395DAF30DD0A1CC61307105A0E8A1
+:105EB0008A07B94630F49B01AC016627772788270B
+:105EC0009078309621F02083318342835383089564
+:105ED0009F3F31F0915020F4879577956795B7955E
+:105EE000880F911D9695879597F90895AA1BBB1B5E
+:105EF00051E107C0AA1FBB1FA617B70710F0A61BCA
+:105F0000B70B881F991F5A95A9F780959095BC01EA
+:105F1000CD01089597FB072E16F4009407D077FD66
+:105F200009D00E94762F07FC05D03EF4909581950C
+:105F30009F4F0895709561957F4F0895F999FECF11
+:105F400092BD81BDF89A992780B50895A8E1B0E087
+:105F500042E050E00C94C12F262FF999FECF1FBAD2
+:105F600092BD81BD20BD0FB6F894FA9AF99A0FBE82
+:105F7000019608950E94AC2F272F0C94AD2FDC01C1
+:105F8000CB01FC01F999FECF06C0F2BDE1BDF89A44
+:105F9000319600B40D9241505040B8F70895F894EE
+:025FA000FFCF31
+:105FA2000507000C058540000001064000000100C5
+:105FB200D80B680C440C0F0CDB0B01600228081490
+:105FC2000A321E40004500250026006100600020C4
+:105FD2000037006400650066006700440046002444
+:105FE2000047000000020004000500070009000B42
+:105FF200000C000E0010001100130015001700180D
+:10600200001A001C001D001F00210023002400268E
+:1060120000280029002B002D002F00300032003410
+:10602200003500370039003B008803A103BA03D3CF
+:1060320003FB04AE04780458043F4D3620020302E9
+:10604200000001000101010101000101010203043C
+:0660520005060708090025
+:00000001FF
diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile
index 40bd36aecf..0145e44bc6 100644
--- a/keyboard/preonic/Makefile
+++ b/keyboard/preonic/Makefile
@@ -127,7 +127,8 @@ MIDI_ENABLE = yes # MIDI controls
BACKLIGHT_ENABLE = yes
ifdef MIDI_ENABLE
- SRC += keymap_midi.c
+ SRC += keymap_midi.c \
+ beeps.c
endif
# Optimize size but this may cause error "relocation truncated to fit"
diff --git a/keyboard/preonic/beeps.c b/keyboard/preonic/beeps.c
index 13e46e1daf..8ffd70f417 100644
--- a/keyboard/preonic/beeps.c
+++ b/keyboard/preonic/beeps.c
@@ -5,31 +5,6 @@
#include <avr/io.h>
#define PI 3.14159265
-#define CHANNEL OCR1C
-
-volatile uint16_t sample;
-uint16_t lastSample;
-
-const int sounddata_length=200;
-
-const unsigned char sounddata_data[] PROGMEM = {128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 127, 129, 128, 127, 133,
-117, 109, 125, 121, 116, 132, 140, 126, 114, 114, 116, 120, 114, 93, 73, 66, 76, 116, 142, 129,
-128, 129, 120, 119, 118, 104, 87, 123, 181, 194, 196, 198, 189, 176, 160, 162, 172, 164, 164, 183,
-197, 188, 168, 167, 170, 165, 185, 209, 206, 196, 196, 199, 185, 162, 156, 167, 176, 173, 170, 166,
-151, 142, 140, 134, 130, 127, 113, 86, 67, 66, 69, 75, 73, 75, 86, 90, 91, 84, 65, 48,
-41, 30, 26, 56, 91, 88, 72, 70, 73, 82, 89, 73, 57, 60, 74, 89, 92, 77, 63, 60,
-53, 47, 56, 64, 63, 61, 56, 54, 52, 36, 16, 22, 51, 66, 67, 70, 76, 88, 99, 92,
-77, 74, 85, 100, 106, 97, 83, 85, 96, 108, 133, 160, 164};
void delay_us(int count) {
while(count--) {
@@ -37,202 +12,235 @@ void delay_us(int count) {
}
}
-void beeps() {
- // DDRB |= (1<<7);
- // PORTB &= ~(1<<7);
-
- // // Use full 16-bit resolution.
- // ICR1 = 0xFFFF;
-
- // // I could write a wall of text here to explain... but TL;DW
- // // Go read the ATmega32u4 datasheet.
- // // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
-
- // // Pin PB7 = OCR1C (Timer 1, Channel C)
- // // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
- // // (i.e. start high, go low when counter matches.)
- // // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
- // // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
-
- // TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
- // TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
-
-
- // // Turn off PWM control on PB7, revert to output low.
- // // TCCR1A &= ~(_BV(COM1C1));
- // // CHANNEL = ((1 << level) - 1);
-
- // // Turn on PWM control of PB7
- // TCCR1A |= _BV(COM1C1);
- // // CHANNEL = level << OFFSET | 0x0FFF;
- // // CHANNEL = 0b1010101010101010;
-
- // float x = 12;
- // float y = 24;
- // float length = 50;
- // float scale = 1;
-
- // // int f1 = 1000000/440;
- // // int f2 = 1000000/880;
- // // for (uint32_t i = 0; i < length * 1000; i++) {
- // // // int frequency = 1/((sin(PI*2*i*scale*pow(2, x/12.0))*.5+1 + sin(PI*2*i*scale*pow(2, y/12.0))*.5+1) / 2);
-
- // // ICR1 = f1; // Set max to the period
- // // OCR1C = f1 >> 1; // Set compare to half the period
- // // // _delay_us(10);
- // // }
- // int frequency = 1000000/440;
- // ICR1 = frequency; // Set max to the period
- // OCR1C = frequency >> 1; // Set compare to half the period
- // _delay_us(500000);
-
- // TCCR1A &= ~(_BV(COM1C1));
- // CHANNEL = 0;
-play_notes();
-
-
- // play_note(55*pow(2, 0/12.0), 1);
- // play_note(55*pow(2, 12/12.0), 1);
- // play_note(55*pow(2, 24/12.0), 1);
- // play_note(55*pow(2, 0/12.0), 1);
- // play_note(55*pow(2, 12/12.0), 1);
- // play_note(55*pow(2, 24/12.0), 1);
-
- // play_note(0, 4);
-
- // play_note(55*pow(2, 0/12.0), 8);
- // play_note(55*pow(2, 12/12.0), 4);
- // play_note(55*pow(2, 10/12.0), 4);
- // play_note(55*pow(2, 12/12.0), 8);
- // play_note(55*pow(2, 10/12.0), 4);
- // play_note(55*pow(2, 7/12.0), 2);
- // play_note(55*pow(2, 8/12.0), 2);
- // play_note(55*pow(2, 7/12.0), 16);
- // play_note(0, 4);
- // play_note(55*pow(2, 3/12.0), 8);
- // play_note(55*pow(2, 5/12.0), 4);
- // play_note(55*pow(2, 7/12.0), 4);
- // play_note(55*pow(2, 7/12.0), 8);
- // play_note(55*pow(2, 5/12.0), 4);
- // play_note(55*pow(2, 3/12.0), 4);
- // play_note(55*pow(2, 2/12.0), 16);
+int voices = 0;
+double frequency = 0;
+int volume = 0;
+int position = 0;
+
+double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+bool sliding = false;
+#define RANGE 1000
+volatile int i=0; //elements of the wave
+void beeps() {
+ play_notes();
}
-void play_note(float freq, int length) {
- DDRB |= (1<<7);
- PORTB &= ~(1<<7);
+void send_freq(double freq, int vol) {
+ int duty = (((double)F_CPU) / freq);
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> (0x10 - vol); // Set compare to half the period
+}
- if (freq > 0) {
- int frequency = 1000000/freq;
- ICR1 = frequency; // Set max to the period
- OCR1C = frequency >> 1; // Set compare to half the period
+void stop_all_notes() {
+ voices = 0;
+ TCCR3A = 0;
+ TCCR3B = 0;
+ frequency = 0;
+ volume = 0;
- TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
- TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
+ for (int i = 0; i < 8; i++) {
+ frequencies[i] = 0;
+ volumes[i] = 0;
}
-
- for (int i = 0; i < length; i++) {
- _delay_us(50000);
- }
-
- TCCR1A &= ~(_BV(COM1C1));
}
-// This is called at 8000 Hz to load the next sample.
-ISR(TIMER1_COMPA_vect) {
- if (sample >= sounddata_length) {
- if (sample == sounddata_length + lastSample) {
- TIMSK1 &= ~_BV(OCIE1A);
-
- // Disable the per-sample timer completely.
- TCCR1B &= ~_BV(CS10);
- }
- else {
- OCR1C = sounddata_length + lastSample - sample;
+void stop_note(double freq) {
+ for (int i = 7; i >= 0; i--) {
+ if (frequencies[i] == freq) {
+ frequencies[i] = 0;
+ volumes[i] = 0;
+ for (int j = i; (j < 7); j++) {
+ frequencies[j] = frequencies[j+1];
+ frequencies[j+1] = 0;
+ volumes[j] = volumes[j+1];
+ volumes[j+1] = 0;
+ }
}
}
- else {
- OCR1C = pgm_read_byte(&sounddata_data[sample]);
+ voices--;
+ if (voices < 0)
+ voices = 0;
+ if (voices == 0) {
+ TCCR3A = 0;
+ TCCR3B = 0;
+ frequency = 0;
+ volume = 0;
+ } else {
+ double freq = frequencies[voices - 1];
+ int vol = volumes[voices - 1];
+ if (frequency < freq) {
+ sliding = true;
+ for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
+ send_freq(f, vol);
+ }
+ sliding = false;
+ } else if (frequency > freq) {
+ sliding = true;
+ for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
+ send_freq(f, vol);
+ }
+ sliding = false;
+ }
+ send_freq(freq, vol);
+ frequency = freq;
+ volume = vol;
}
-
- ++sample;
}
-void play_notes() {
+void init_notes() {
+ // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10);
+ // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
+ // DDRC |= (1<<6);
- // Set up Timer 2 to do pulse width modulation on the speaker
- // pin.
+ // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+ // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
- DDRB |= (1<<7);
- PORTB &= ~(1<<7);
+ // ICR3 = 0xFFFF;
+ // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
- // Use internal clock (datasheet p.160)
- // ASSR &= ~(_BV(EXCLK) | _BV(AS2));
- // Set fast PWM mode (p.157)
- TCCR1A |= _BV(WGM21) | _BV(WGM20);
- TCCR1B &= ~_BV(WGM22);
+ // cli();
- // Do non-inverting PWM on pin OC2A (p.155)
- // On the Arduino this is pin 11.
- TCCR1A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0);
- TCCR1A &= ~(_BV(COM2B1) | _BV(COM2B0));
- // No prescaler (p.158)
- TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);
+ // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
+ // this gives a timer interrupt at 15625Hz. */
+ // TIMSK3 = (1 << OCIE3A);
- // Set initial pulse width to the first sample.
- OCR1A = pgm_read_byte(&sounddata_data[0]);
+ // /* clear/reset timer on match */
+ // // TCCR3A = 1<<WGM31 | 0<<WGM30; CTC mode, reset on match
+ // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */
+ // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+ // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
+ // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
+ // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
+ // // SPCR = 0x50;
+ // // SPSR = 0x01;
+ // DDRC |= (1<<6);
+ // // ICR3 = 0xFFFF;
+ // // OCR3A=80;
+ // PORTC |= (1<<6);
- cli();
+ // sei();
+}
+
+// #define highByte(c) ((c >> 8) & 0x00FF)
+// #define lowByte(c) (c & 0x00FF)
+
+ISR(TIMER3_COMPA_vect) {
+
+ if (ICR3 > 0 && !sliding) {
+ switch (position) {
+ case 0: {
+ int duty = (((double)F_CPU) / (frequency));
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> 1; // Set compare to half the period
+ break;
+ }
+ case 1: {
+ int duty = (((double)F_CPU) / (frequency*2));
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> 1; // Set compare to half the period
+ break;
+ }
+ case 2: {
+ int duty = (((double)F_CPU) / (frequency*3));
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> 1; // Set compare to half the period
+ break;
+ }
+ }
+ position = (position + 1) % 3;
+ }
+// /* OCR2A has been cleared, per TCCR2A above */
+// // OCR3A = 127;
+
+// // pos1 += incr1;
+// // pos2 += incr2;
+// // pos3 += incr3;
+
+// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)];
- // Set CTC mode (Clear Timer on Compare Match) (p.133)
- // Have to set OCR1A *after*, otherwise it gets reset to 0!
- TCCR2B = (TCCR2B & ~_BV(WGM13)) | _BV(WGM12);
- TCCR2A = TCCR2A & ~(_BV(WGM11) | _BV(WGM10));
+// // OCR3A = sample;
- // No prescaler (p.134)
- TCCR2B = (TCCR2B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);
- // Set the compare register (OCR1A).
- // OCR1A is a 16-bit register, so we have to do this with
- // interrupts disabled to be safe.
- // OCR2A = F_CPU / SAMPLE_RATE; // 16e6 / 8000 = 2000
- OCR2A = 2000;
+// OCR3A=pgm_read_byte(&sinewave[pos1]);
+// pos1++;
+// // PORTC &= ~(1<<6);
- // Enable interrupt when TCNT1 == OCR1A (p.136)
- TIMSK1 |= _BV(OCIE2A);
+// /* buffered, 1x gain, active mode */
+// // SPDR = highByte(sample) | 0x70;
+// // while (!(SPSR & (1<<SPIF)));
- sample = 0;
- sei();
+// // SPDR = lowByte(sample);
+// // while (!(SPSR & (1<<SPIF)));
+
+// // PORTC |= (1<<6);
}
-void note(int x, float length) {
- DDRB |= (1<<1);
- int t = (int)(440*pow(2,-x/12.0)); // starting note
- for (int y = 0; y < length*1000/t; y++) { // note length
- PORTB |= (1<<1);
- delay_us(t);
- PORTB &= ~(1<<1);
- delay_us(t);
+void play_note(double freq, int vol) {
+
+ if (freq > 0) {
+ DDRC |= (1<<6);
+
+ TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+ TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
+
+ if (frequency != 0) {
+ if (frequency < freq) {
+ for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
+ send_freq(f, vol);
+ }
+ } else if (frequency > freq) {
+ for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
+ send_freq(f, vol);
+ }
+ }
+ }
+ send_freq(freq, vol);
+ frequency = freq;
+ volume = vol;
+
+ frequencies[voices] = frequency;
+ volumes[voices] = volume;
+ voices++;
}
- PORTB &= ~(1<<1);
+ // ICR3 = 0xFFFF;
+ // for (int i = 0; i < 10000; i++) {
+ // OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
+ // // _delay_us(50);
+ // }
+
+ // TCCR3A = 0;
+ // TCCR3B = 0;
}
-void true_note(float x, float y, float length) {
- for (uint32_t i = 0; i < length * 50; i++) {
- uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
- for (int u = 0; u < 8; u++) {
- if (v & (1 << u) && !(PORTB&(1<<1)))
- PORTB |= (1<<1);
- else if (PORTB&(1<<1))
- PORTB &= ~(1<<1);
- }
- }
- PORTB &= ~(1<<1);
-} \ No newline at end of file
+// void note(int x, float length) {
+// DDRC |= (1<<6);
+// int t = (int)(440*pow(2,-x/12.0)); // starting note
+// for (int y = 0; y < length*1000/t; y++) { // note length
+// PORTC |= (1<<6);
+// delay_us(t);
+// PORTC &= ~(1<<6);
+// delay_us(t);
+// }
+// PORTC &= ~(1<<6);
+// }
+
+// void true_note(float x, float y, float length) {
+// for (uint32_t i = 0; i < length * 50; i++) {
+// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
+// for (int u = 0; u < 8; u++) {
+// if (v & (1 << u) && !(PORTC&(1<<6)))
+// PORTC |= (1<<6);
+// else if (PORTC&(1<<6))
+// PORTC &= ~(1<<6);
+// }
+// }
+// PORTC &= ~(1<<6);
+// } \ No newline at end of file
diff --git a/keyboard/preonic/beeps.h b/keyboard/preonic/beeps.h
index 3e3c634ff5..378983c605 100644
--- a/keyboard/preonic/beeps.h
+++ b/keyboard/preonic/beeps.h
@@ -6,4 +6,7 @@
void note(int x, float length);
void beeps();
void true_note(float x, float y, float length);
-void play_note(float freq, int length); \ No newline at end of file
+void play_note(double freq, int vol);
+void stop_note(double freq);
+void stop_all_notes();
+void init_notes(); \ No newline at end of file
diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
index 8edf8a283d..ec7bc776ac 100644
--- a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
+++ b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
@@ -1,8 +1,8 @@
#include "extended_keymap_common.h"
#include "backlight.h"
#include "action_layer.h"
-#include "lufa.h"
#include "keymap_midi.h"
+#include "beeps.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Qwerty */
diff --git a/keyboard/preonic/keymap_midi.c b/keyboard/preonic/keymap_midi.c
index c7937bb9b5..a0fa59990c 100644
--- a/keyboard/preonic/keymap_midi.c
+++ b/keyboard/preonic/keymap_midi.c
@@ -20,37 +20,91 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <lufa.h>
uint8_t starting_note = 0x0C;
+int offset = 7;
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
- if (id != 0) {
- if (record->event.pressed) {
- midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
- } else {
- midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
- }
- }
-
- if (record->event.key.col == 11 && record->event.key.row == 4 && record->event.pressed) {
- starting_note++;
+ if (id != 0) {
+ if (record->event.pressed) {
+ midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
+ } else {
+ midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
+ }
+ }
+
+ if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
+ if (record->event.pressed) {
+ starting_note++;
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ midi_send_cc(&midi_device, 0, 0x7B, 0);
+ midi_send_cc(&midi_device, 1, 0x7B, 0);
+ midi_send_cc(&midi_device, 2, 0x7B, 0);
+ midi_send_cc(&midi_device, 3, 0x7B, 0);
+ midi_send_cc(&midi_device, 4, 0x7B, 0);
+ return;
+ } else {
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
+ stop_all_notes();
+ return;
+ }
+ }
+ if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
+ if (record->event.pressed) {
+ starting_note--;
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ midi_send_cc(&midi_device, 0, 0x7B, 0);
+ midi_send_cc(&midi_device, 1, 0x7B, 0);
+ midi_send_cc(&midi_device, 2, 0x7B, 0);
+ midi_send_cc(&midi_device, 3, 0x7B, 0);
+ midi_send_cc(&midi_device, 4, 0x7B, 0);
+ return;
+ } else {
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
+ stop_all_notes();
+ return;
+ }
+ }
+
+ if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+ offset++;
midi_send_cc(&midi_device, 0, 0x7B, 0);
midi_send_cc(&midi_device, 1, 0x7B, 0);
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
+ stop_all_notes();
+ for (int i = 0; i <= 7; i++) {
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ _delay_us(80000);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
+ _delay_us(8000);
+ }
+ return;
}
- if (record->event.key.col == 8 && record->event.key.row == 4 && record->event.pressed) {
- starting_note--;
+ if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+ offset--;
midi_send_cc(&midi_device, 0, 0x7B, 0);
midi_send_cc(&midi_device, 1, 0x7B, 0);
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
+ stop_all_notes();
+ for (int i = 0; i <= 7; i++) {
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ _delay_us(80000);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
+ _delay_us(8000);
+ }
+ return;
}
if (record->event.pressed) {
- midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
- midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
} \ No newline at end of file
diff --git a/keyboard/preonic/keymap_midi.h b/keyboard/preonic/keymap_midi.h
index 02bf35c243..c5917f884e 100644
--- a/keyboard/preonic/keymap_midi.h
+++ b/keyboard/preonic/keymap_midi.h
@@ -23,7 +23,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define CHNL(note, channel) (note + (channel << 8))
-#define SCALE (int []){ 0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23, 24, 26, 28, 29, 31, 33, 35, 36}
+#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
+ 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
+ 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
+ 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
+ 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
#define N_CN1 (0x600C + (12 * -1) + 0 )
#define N_CN1S (0x600C + (12 * -1) + 1 )
diff --git a/protocol/bluefruit.mk b/protocol/bluefruit.mk
index 7e6328f6cb..85313ba621 100644
--- a/protocol/bluefruit.mk
+++ b/protocol/bluefruit.mk
@@ -3,7 +3,7 @@ PJRC_DIR = protocol/pjrc
SRC += $(BLUEFRUIT_DIR)/main.c \
$(BLUEFRUIT_DIR)/bluefruit.c \
- serial_uart.c \
+ protocol/serial_uart.c \
$(PJRC_DIR)/pjrc.c \
$(PJRC_DIR)/usb_keyboard.c \
$(PJRC_DIR)/usb_debug.c \
diff --git a/protocol/bluefruit/bluefruit.c b/protocol/bluefruit/bluefruit.c
index cf26b83dff..47c63555cd 100644
--- a/protocol/bluefruit/bluefruit.c
+++ b/protocol/bluefruit/bluefruit.c
@@ -2,20 +2,16 @@
Bluefruit Protocol for TMK firmware
Author: Benjamin Gould, 2013
Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
-
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
-
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-
*/
#include <stdint.h>
@@ -76,6 +72,13 @@ static void send_mouse(report_mouse_t *report);
static void send_system(uint16_t data);
static void send_consumer(uint16_t data);
+
+void sendString(char string[], int length) {
+ for(int i = 0; i < length; i++) {
+ serial_send(string[i]);
+ }
+}
+
static host_driver_t driver = {
keyboard_leds,
send_keyboard,
@@ -100,6 +103,7 @@ static void send_keyboard(report_keyboard_t *report)
#endif
bluefruit_serial_send(0xFD);
for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) {
+
bluefruit_serial_send(report->raw[i]);
}
#ifdef BLUEFRUIT_TRACE_SERIAL
@@ -198,5 +202,4 @@ static void send_consumer(uint16_t data)
#ifdef BLUEFRUIT_TRACE_SERIAL
bluefruit_trace_footer();
#endif
-}
-
+} \ No newline at end of file
diff --git a/protocol/bluefruit/bluefruit.h b/protocol/bluefruit/bluefruit.h
index 4f9b58836d..ceacc4a367 100644
--- a/protocol/bluefruit/bluefruit.h
+++ b/protocol/bluefruit/bluefruit.h
@@ -2,17 +2,14 @@
Bluefruit Protocol for TMK firmware
Author: Benjamin Gould, 2013
Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
-
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
-
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -25,4 +22,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
host_driver_t *bluefruit_driver(void);
-#endif
+#endif \ No newline at end of file
diff --git a/protocol/bluefruit/main.c b/protocol/bluefruit/main.c
index 871062ab11..0dbb637e2c 100644
--- a/protocol/bluefruit/main.c
+++ b/protocol/bluefruit/main.c
@@ -22,7 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <util/delay.h>
-#include "serial.h"
+#include "../serial.h"
#include "keyboard.h"
#include "usb.h"
#include "host.h"
@@ -40,23 +40,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define BLUEFRUIT_HOST_DRIVER 1
#define PJRC_HOST_DRIVER 2
+
int main(void)
{
CPU_PRESCALE(0);
- DDRD = _BV(PD5);
- DDRB = _BV(PB0);
+ // DDRD = _BV(PD5);
+ // DDRB = _BV(PB0);
- PORTD = _BV(PD5);
- PORTB = _BV(PB0);
+ // PORTD = _BV(PD5);
+ // PORTB = _BV(PB0);
print_set_sendchar(sendchar);
- usb_init();
- _delay_ms(2000);
+ // usb_init();
+ // _delay_ms(2000);
// while (!usb_configured()) /* wait */
+
+
dprintf("Initializing keyboard...\n");
keyboard_init();
@@ -64,53 +67,72 @@ int main(void)
// is not configured, choose the Bluefruit, otherwise use USB
// Definitely would prefer to have this driven by an input pin and make
// it switch dynamically - BCG
- if (!usb_configured()) {
+ // if (!usb_configured()) {
- // Send power to Bluefruit... Adafruit says it takes 27 mA, I think
- // the pins should provide 40 mA, but just in case I switch the
- // Bluefruit using a transistor - BCG
- DDRB = _BV(PB6);
- PORTB |= _BV(PB6);
+ // // Send power to Bluefruit... Adafruit says it takes 27 mA, I think
+ // // the pins should provide 40 mA, but just in case I switch the
+ // // Bluefruit using a transistor - BCG
+ // DDRB = _BV(PB6);
+ // PORTB |= _BV(PB6);
dprintf("Setting host driver to bluefruit...\n");
host_set_driver(bluefruit_driver());
dprintf("Initializing serial...\n");
serial_init();
-
- // wait an extra second for the PC's operating system
- // to load drivers and do whatever it does to actually
- // be ready for input
- _delay_ms(1000);
- PORTD = ~_BV(PD5);
- dprintf("Starting main loop");
- while (1) {
- keyboard_task();
- }
- } else {
+ // char swpa[] = "+++\r\n";
+ // for (int i = 0; i < 5; i++) {
+ // serial_send(swpa[i]);
+ // }
+
+ // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n";
+ // for (int i = 0; i < 20; i++) {
+ // serial_send(ble_enable[i]);
+ // }
+
+ // char reset[] = "ATZ\r\n";
+ // for (int i = 0; i < 5; i++) {
+ // serial_send(reset[i]);
+ // }
+
+ // for (int i = 0; i < 5; i++) {
+ // serial_send(swpa[i]);
+ // }
- // I'm not smart enough to get this done with LUFA - BCG
- dprintf("Setting host driver to PJRC...\n");
- host_set_driver(pjrc_driver());
-#ifdef SLEEP_LED_ENABLE
- sleep_led_init();
-#endif
// wait an extra second for the PC's operating system
// to load drivers and do whatever it does to actually
// be ready for input
_delay_ms(1000);
- PORTB = ~_BV(PB0);
+ // PORTD = ~_BV(PD5);
dprintf("Starting main loop");
while (1) {
- while (suspend) {
- suspend_power_down();
- if (remote_wakeup && suspend_wakeup_condition()) {
- usb_remote_wakeup();
- }
- }
- keyboard_task();
+ keyboard_task();
}
- }
+
+// } else {
+
+// // I'm not smart enough to get this done with LUFA - BCG
+// dprintf("Setting host driver to PJRC...\n");
+// host_set_driver(pjrc_driver());
+// #ifdef SLEEP_LED_ENABLE
+// sleep_led_init();
+// #endif
+// // wait an extra second for the PC's operating system
+// // to load drivers and do whatever it does to actually
+// // be ready for input
+// _delay_ms(1000);
+// PORTB = ~_BV(PB0);
+// dprintf("Starting main loop");
+// while (1) {
+// while (suspend) {
+// suspend_power_down();
+// if (remote_wakeup && suspend_wakeup_condition()) {
+// usb_remote_wakeup();
+// }
+// }
+// keyboard_task();
+// }
+// }
}
diff --git a/protocol/lufa.mk b/protocol/lufa.mk
index 5dbb74ffc2..958c37516f 100644
--- a/protocol/lufa.mk
+++ b/protocol/lufa.mk
@@ -29,6 +29,11 @@ ifdef MIDI_ENABLE
$(LUFA_SRC_USBCLASS)
endif
+ifdef BLUETOOTH_ENABLE
+ LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
+ $(LUFA_DIR)/../serial_uart.c
+endif
+
SRC += $(LUFA_SRC)
# Search Path
diff --git a/protocol/lufa/bluetooth.c b/protocol/lufa/bluetooth.c
new file mode 100644
index 0000000000..ed66e52c1f
--- /dev/null
+++ b/protocol/lufa/bluetooth.c
@@ -0,0 +1,37 @@
+/*
+Bluefruit Protocol for TMK firmware
+Author: Benjamin Gould, 2013
+ Jack Humbert, 2015
+Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdint.h>
+#include "report.h"
+#include "print.h"
+#include "debug.h"
+#include "../serial.h"
+#include "bluetooth.h"
+
+void bluefruit_keyboard_print_report(report_keyboard_t *report)
+{
+ if (!debug_keyboard) return;
+ dprintf("keys: "); for (int i = 0; i < KEYBOARD_REPORT_KEYS; i++) { debug_hex8(report->keys[i]); dprintf(" "); }
+ dprintf(" mods: "); debug_hex8(report->mods);
+ dprintf(" reserved: "); debug_hex8(report->reserved);
+ dprintf("\n");
+}
+
+void bluefruit_serial_send(uint8_t data)
+{
+ serial_send(data);
+} \ No newline at end of file
diff --git a/protocol/lufa/bluetooth.h b/protocol/lufa/bluetooth.h
new file mode 100644
index 0000000000..01f07e8e67
--- /dev/null
+++ b/protocol/lufa/bluetooth.h
@@ -0,0 +1,63 @@
+/*
+Bluefruit Protocol for TMK firmware
+Author: Benjamin Gould, 2013
+ Jack Humbert, 2015
+Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BLUETOOTH_H
+#define BLUETOOTH_H
+
+void bluefruit_serial_send(uint8_t data);
+
+/*
++-----------------+-------------------+-------+
+| Consumer Key | Bit Map | Hex |
++-----------------+-------------------+-------+
+| Home | 00000001 00000000 | 01 00 |
+| KeyboardLayout | 00000010 00000000 | 02 00 |
+| Search | 00000100 00000000 | 04 00 |
+| Snapshot | 00001000 00000000 | 08 00 |
+| VolumeUp | 00010000 00000000 | 10 00 |
+| VolumeDown | 00100000 00000000 | 20 00 |
+| Play/Pause | 01000000 00000000 | 40 00 |
+| Fast Forward | 10000000 00000000 | 80 00 |
+| Rewind | 00000000 00000001 | 00 01 |
+| Scan Next Track | 00000000 00000010 | 00 02 |
+| Scan Prev Track | 00000000 00000100 | 00 04 |
+| Random Play | 00000000 00001000 | 00 08 |
+| Stop | 00000000 00010000 | 00 10 |
++-------------------------------------+-------+
+*/
+#define CONSUMER2BLUEFRUIT(usage) \
+ (usage == AUDIO_MUTE ? 0x0000 : \
+ (usage == AUDIO_VOL_UP ? 0x1000 : \
+ (usage == AUDIO_VOL_DOWN ? 0x2000 : \
+ (usage == TRANSPORT_NEXT_TRACK ? 0x0002 : \
+ (usage == TRANSPORT_PREV_TRACK ? 0x0004 : \
+ (usage == TRANSPORT_STOP ? 0x0010 : \
+ (usage == TRANSPORT_STOP_EJECT ? 0x0000 : \
+ (usage == TRANSPORT_PLAY_PAUSE ? 0x4000 : \
+ (usage == AL_CC_CONFIG ? 0x0000 : \
+ (usage == AL_EMAIL ? 0x0000 : \
+ (usage == AL_CALCULATOR ? 0x0000 : \
+ (usage == AL_LOCAL_BROWSER ? 0x0000 : \
+ (usage == AC_SEARCH ? 0x0400 : \
+ (usage == AC_HOME ? 0x0100 : \
+ (usage == AC_BACK ? 0x0000 : \
+ (usage == AC_FORWARD ? 0x0000 : \
+ (usage == AC_STOP ? 0x0000 : \
+ (usage == AC_REFRESH ? 0x0000 : \
+ (usage == AC_BOOKMARKS ? 0x0000 : 0)))))))))))))))))))
+
+#endif \ No newline at end of file
diff --git a/protocol/lufa/descriptor.c b/protocol/lufa/descriptor.c
index 5454926b18..b345da27b4 100644
--- a/protocol/lufa/descriptor.c
+++ b/protocol/lufa/descriptor.c
@@ -266,7 +266,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
- .MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
+ .MaxPowerConsumption = USB_CONFIG_POWER_MA(500)
},
/*
diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c
index c6e6e95054..d310d4b807 100644
--- a/protocol/lufa/lufa.c
+++ b/protocol/lufa/lufa.c
@@ -51,7 +51,14 @@
#include "descriptor.h"
#include "lufa.h"
-#include <beeps.h>
+
+#ifdef MIDI_ENABLE
+ #include <beeps.h>
+#endif
+
+#ifdef BLUETOOTH_ENABLE
+ #include "bluetooth.h"
+#endif
// #include <LUFA/Version.h>
// #include <LUFA/Drivers/USB/USB.h>
@@ -87,7 +94,6 @@ host_driver_t lufa_driver = {
usb_get_midi,
midi_usb_init,
#endif
-
};
void SetupHardware(void);
@@ -439,6 +445,14 @@ static uint8_t keyboard_leds(void)
static void send_keyboard(report_keyboard_t *report)
{
+
+#ifdef BLUETOOTH_ENABLE
+ bluefruit_serial_send(0xFD);
+ for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
+ bluefruit_serial_send(report->raw[i]);
+ }
+#endif
+
uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
@@ -475,11 +489,25 @@ static void send_keyboard(report_keyboard_t *report)
Endpoint_ClearIN();
keyboard_report_sent = *report;
+
}
static void send_mouse(report_mouse_t *report)
{
#ifdef MOUSE_ENABLE
+
+#ifdef BLUETOOTH_ENABLE
+ bluefruit_serial_send(0xFD);
+ bluefruit_serial_send(0x00);
+ bluefruit_serial_send(0x03);
+ bluefruit_serial_send(report->buttons);
+ bluefruit_serial_send(report->x);
+ bluefruit_serial_send(report->y);
+ bluefruit_serial_send(report->v); // should try sending the wheel v here
+ bluefruit_serial_send(report->h); // should try sending the wheel h here
+ bluefruit_serial_send(0x00);
+#endif
+
uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
@@ -497,6 +525,7 @@ static void send_mouse(report_mouse_t *report)
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearIN();
+
#endif
}
@@ -523,6 +552,23 @@ static void send_system(uint16_t data)
static void send_consumer(uint16_t data)
{
+
+#ifdef BLUETOOTH_ENABLE
+ static uint16_t last_data = 0;
+ if (data == last_data) return;
+ last_data = data;
+ uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
+ bluefruit_serial_send(0xFD);
+ bluefruit_serial_send(0x00);
+ bluefruit_serial_send(0x02);
+ bluefruit_serial_send((bitmap>>8)&0xFF);
+ bluefruit_serial_send(bitmap&0xFF);
+ bluefruit_serial_send(0x00);
+ bluefruit_serial_send(0x00);
+ bluefruit_serial_send(0x00);
+ bluefruit_serial_send(0x00);
+#endif
+
uint8_t timeout = 255;
if (USB_DeviceState != DEVICE_STATE_Configured)
@@ -540,6 +586,8 @@ static void send_consumer(uint16_t data)
Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
Endpoint_ClearIN();
+
+
}
@@ -836,6 +884,10 @@ int main(void)
// midi_send_noteoff(&midi_device, 0, 64, 127);
#endif
+#ifdef BLUETOOTH_ENABLE
+ serial_init();
+#endif
+
/* wait for USB startup & debug output */
// while (USB_DeviceState != DEVICE_STATE_Configured) {
@@ -856,6 +908,8 @@ int main(void)
print("Keyboard start.\n");
while (1) {
+
+#ifndef BLUETOOTH_ENABLE
while (USB_DeviceState == DEVICE_STATE_Suspended) {
print("[s]");
suspend_power_down();
@@ -863,6 +917,7 @@ int main(void)
USB_Device_SendRemoteWakeup();
}
}
+#endif
#ifdef MIDI_ENABLE
midi_device_process(&midi_device);
diff --git a/protocol/lufa/lufa.h b/protocol/lufa/lufa.h
index 8bcd8503a6..af01bf6b9d 100644
--- a/protocol/lufa/lufa.h
+++ b/protocol/lufa/lufa.h
@@ -49,7 +49,7 @@
#include <LUFA/Drivers/USB/USB.h>
#include "host.h"
#ifdef MIDI_ENABLE
-#include "midi/midi.h"
+ #include "midi/midi.h"
#endif
#ifdef __cplusplus
extern "C" {
diff --git a/quantum.mk b/quantum.mk
new file mode 100644
index 0000000000..5593694139
--- /dev/null
+++ b/quantum.mk
@@ -0,0 +1,30 @@
+QUANTUM_DIR = quantum
+
+# # project specific files
+SRC += $(QUANTUM_DIR)/keymap_common.c \
+ $(QUANTUM_DIR)/led.c
+
+ifndef CUSTOM_MATRIX
+ SRC += $(QUANTUM_DIR)/matrix.c
+endif
+
+ifdef MIDI_ENABLE
+ SRC += $(QUANTUM_DIR)/keymap_midi.c \
+ $(QUANTUM_DIR)/beeps.c
+endif
+
+ifdef UNICODE_ENABLE
+ SRC += $(QUANTUM_DIR)/keymap_unicode.c
+endif
+
+# Optimize size but this may cause error "relocation truncated to fit"
+#EXTRALDFLAGS = -Wl,--relax
+
+# Search Path
+VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
+
+include $(TOP_DIR)/protocol/lufa.mk
+
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
+
diff --git a/keyboard/planck/analog.c b/quantum/analog.c
index 49b84ee0e8..49b84ee0e8 100644
--- a/keyboard/planck/analog.c
+++ b/quantum/analog.c
diff --git a/keyboard/planck/analog.h b/quantum/analog.h
index 9b95a93bef..9b95a93bef 100644
--- a/keyboard/planck/analog.h
+++ b/quantum/analog.h
diff --git a/keyboard/planck/beeps.c b/quantum/beeps.c
index a1e697be40..8d1f81f210 100644
--- a/keyboard/planck/beeps.c
+++ b/quantum/beeps.c
@@ -183,22 +183,6 @@ ISR(TIMER3_COMPA_vect) {
// // PORTC |= (1<<6);
}
-void loop() {
-}
-// ISR(TIMER1_COMPA_vect)
-// {
-// // if (i<(sizeof(wave)/sizeof(int))) //don't exceed ends of vector... sizeof(wave)
-// if (i<pow(2, 10)) //don't exceed ends of vector... sizeof(wave)
-// {
-// OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
-// // int x = 1;
-// // int y = 5;
-// // OCR3A = (int) (round(sin(i*440*pow(2, x/12.0))*.5+.5 + sin(i*440*pow(2, y/12.0))*.5+.5) / 2 * ICR3);
-// i++; //increment
-// }
-// else i=0; //reset
-// }
-
void play_note(double freq, int vol) {
if (freq > 0) {
@@ -236,27 +220,27 @@ void play_note(double freq, int vol) {
// TCCR3B = 0;
}
-void note(int x, float length) {
- DDRC |= (1<<6);
- int t = (int)(440*pow(2,-x/12.0)); // starting note
- for (int y = 0; y < length*1000/t; y++) { // note length
- PORTC |= (1<<6);
- delay_us(t);
- PORTC &= ~(1<<6);
- delay_us(t);
- }
- PORTC &= ~(1<<6);
-}
+// void note(int x, float length) {
+// DDRC |= (1<<6);
+// int t = (int)(440*pow(2,-x/12.0)); // starting note
+// for (int y = 0; y < length*1000/t; y++) { // note length
+// PORTC |= (1<<6);
+// delay_us(t);
+// PORTC &= ~(1<<6);
+// delay_us(t);
+// }
+// PORTC &= ~(1<<6);
+// }
-void true_note(float x, float y, float length) {
- for (uint32_t i = 0; i < length * 50; i++) {
- uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
- for (int u = 0; u < 8; u++) {
- if (v & (1 << u) && !(PORTC&(1<<6)))
- PORTC |= (1<<6);
- else if (PORTC&(1<<6))
- PORTC &= ~(1<<6);
- }
- }
- PORTC &= ~(1<<6);
-} \ No newline at end of file
+// void true_note(float x, float y, float length) {
+// for (uint32_t i = 0; i < length * 50; i++) {
+// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
+// for (int u = 0; u < 8; u++) {
+// if (v & (1 << u) && !(PORTC&(1<<6)))
+// PORTC |= (1<<6);
+// else if (PORTC&(1<<6))
+// PORTC &= ~(1<<6);
+// }
+// }
+// PORTC &= ~(1<<6);
+// } \ No newline at end of file
diff --git a/keyboard/planck/beeps.h b/quantum/beeps.h
index 378983c605..378983c605 100644
--- a/keyboard/planck/beeps.h
+++ b/quantum/beeps.h
diff --git a/quantum/config_common.h b/quantum/config_common.h
new file mode 100644
index 0000000000..da53fce89b
--- /dev/null
+++ b/quantum/config_common.h
@@ -0,0 +1,116 @@
+#ifndef CONFIG_DEFINITIONS_H
+#define CONFIG_DEFINITIONS_H
+
+#define B0 0x20
+#define B1 0x21
+#define B2 0x22
+#define B3 0x23
+#define B4 0x24
+#define B5 0x25
+#define B6 0x26
+#define B7 0x27
+#define C0 0x30
+#define C1 0x31
+#define C2 0x32
+#define C3 0x33
+#define C4 0x34
+#define C5 0x35
+#define C6 0x36
+#define C7 0x37
+#define D0 0x40
+#define D1 0x41
+#define D2 0x42
+#define D3 0x43
+#define D4 0x44
+#define D5 0x45
+#define D6 0x46
+#define D7 0x47
+#define E0 0x50
+#define E1 0x51
+#define E2 0x52
+#define E3 0x53
+#define E4 0x54
+#define E5 0x55
+#define E6 0x56
+#define E7 0x57
+#define F0 0x60
+#define F1 0x61
+#define F2 0x62
+#define F3 0x63
+#define F4 0x64
+#define F5 0x65
+#define F6 0x66
+#define F7 0x67
+
+#define COL2ROW 0x0
+#define ROW2COL 0x1
+
+#ifdef BLUETOOTH_ENABLE
+#ifdef __AVR_ATmega32U4__
+ #define SERIAL_UART_BAUD 9600
+ #define SERIAL_UART_DATA UDR1
+ #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1)
+ #define SERIAL_UART_RXD_VECT USART1_RX_vect
+ #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
+ #define SERIAL_UART_INIT() do { \
+ UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
+ UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8); /* baud rate */ \
+ UCSR1B = (1<<TXEN1); /* TX: enable */ \
+ UCSR1C = (0<<UPM11) | (0<<UPM10) | /* parity: none(00), even(01), odd(11) */ \
+ (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); /* data-8bit(011) */ \
+ sei(); \
+ } while(0)
+#else
+# error "USART configuration is needed."
+#endif
+
+
+// I'm fairly sure these aren't needed, but oh well - Jack
+
+/*
+ * PS/2 Interrupt configuration
+ */
+#ifdef PS2_USE_INT
+/* uses INT1 for clock line(ATMega32U4) */
+#define PS2_CLOCK_PORT PORTD
+#define PS2_CLOCK_PIN PIND
+#define PS2_CLOCK_DDR DDRD
+#define PS2_CLOCK_BIT 1
+
+#define PS2_DATA_PORT PORTD
+#define PS2_DATA_PIN PIND
+#define PS2_DATA_DDR DDRD
+#define PS2_DATA_BIT 0
+
+#define PS2_INT_INIT() do { \
+ EICRA |= ((1<<ISC11) | \
+ (0<<ISC10)); \
+} while (0)
+#define PS2_INT_ON() do { \
+ EIMSK |= (1<<INT1); \
+} while (0)
+#define PS2_INT_OFF() do { \
+ EIMSK &= ~(1<<INT1); \
+} while (0)
+#define PS2_INT_VECT INT1_vect
+#endif
+
+/*
+ * PS/2 Busywait configuration
+ */
+#ifdef PS2_USE_BUSYWAIT
+#define PS2_CLOCK_PORT PORTD
+#define PS2_CLOCK_PIN PIND
+#define PS2_CLOCK_DDR DDRD
+#define PS2_CLOCK_BIT 1
+
+#define PS2_DATA_PORT PORTD
+#define PS2_DATA_PIN PIND
+#define PS2_DATA_DDR DDRD
+#define PS2_DATA_BIT 0
+#endif
+
+#endif
+
+#endif
+
diff --git a/keyboard/planck/keymap_common.c b/quantum/keymap_common.c
index 886bfe23c4..5c00c0afa2 100644
--- a/keyboard/planck/keymap_common.c
+++ b/quantum/keymap_common.c
@@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
static action_t keycode_to_action(uint16_t keycode);
-
/* converts key to action */
action_t action_for_key(uint8_t layer, keypos_t key)
{
@@ -38,15 +37,18 @@ action_t action_for_key(uint8_t layer, keypos_t key)
// Has a modifier
action_t action;
// Split it up
- action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF);
+ action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
return action;
} else if (keycode >= 0x2000 && keycode < 0x3000) {
- // Is a shortcut for function layer, pull last 12bits
+ // Is a shortcut for function layer, pull last 12bits
+ // This means we have 4,096 FN macros at our disposal
return keymap_func_to_action(keycode & 0xFFF);
} else if (keycode >= 0x3000 && keycode < 0x4000) {
+ // When the code starts with 3, it's an action macro.
action_t action;
action.code = ACTION_MACRO(keycode & 0xFF);
return action;
+#ifdef BACKLIGHT_ENABLE
} else if (keycode >= BL_0 & keycode <= BL_15) {
action_t action;
action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
@@ -67,17 +69,54 @@ action_t action_for_key(uint8_t layer, keypos_t key)
action_t action;
action.code = ACTION_BACKLIGHT_STEP();
return action;
- } else if (keycode == RESET) {
+#endif
+ } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
bootloader_jump();
return;
- } else if (keycode == DEBUG) {
+ } else if (keycode == DEBUG) { // DEBUG is 0x5001
+ // TODO: Does this actually work?
print("\nDEBUG: enabled.\n");
debug_enable = true;
return;
+ } else if (keycode >= 0x5000 && keycode < 0x6000) {
+ // Layer movement shortcuts
+ // See .h to see constraints/usage
+ int type = (keycode >> 0x8) & 0xF;
+ if (type == 0x1) {
+ // Layer set "GOTO"
+ int when = (keycode >> 0x4) & 0x3;
+ int layer = keycode & 0xF;
+ action_t action;
+ action.code = ACTION_LAYER_SET(layer, when);
+ return action;
+ } else if (type == 0x2) {
+ // Momentary layer
+ int layer = keycode & 0xFF;
+ action_t action;
+ action.code = ACTION_LAYER_MOMENTARY(layer);
+ return action;
+ } else if (type == 0x3) {
+ // Set default layer
+ int layer = keycode & 0xFF;
+ action_t action;
+ action.code = ACTION_DEFAULT_LAYER_SET(layer);
+ return action;
+ }
+#ifdef MIDI_ENABLE
} else if (keycode >= 0x6000 && keycode < 0x7000) {
action_t action;
action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
return action;
+#endif
+#ifdef UNICODE_ENABLE
+ } else if (keycode >= 0x8000) {
+ action_t action;
+ uint16_t unicode = keycode & ~(0x8000);
+ action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
+ return action;
+#endif
+ } else {
+
}
switch (keycode) {
diff --git a/keyboard/planck/keymap_common.h b/quantum/keymap_common.h
index 7ccfa1b039..b1df4eb0f6 100644
--- a/keyboard/planck/keymap_common.h
+++ b/quantum/keymap_common.h
@@ -71,6 +71,54 @@ extern const uint16_t fn_actions[];
#define RALT(kc) kc | 0x1400
#define RGUI(kc) kc | 0x1800
+// Aliases for shifted symbols
+// Each key has a 4-letter code, and some have longer aliases too.
+// While the long aliases are descriptive, the 4-letter codes
+// make for nicer grid layouts (everything lines up), and are
+// the preferred style for Quantum.
+#define KC_TILD LSFT(KC_GRV) // ~
+#define KC_TILDE KC_TILD
+
+#define KC_EXLM LSFT(KC_1) // !
+#define KC_EXCLAIM KC_EXLM
+
+#define KC_AT LSFT(KC_2) // @
+#define KC_HASH LSFT(KC_3) // #
+
+#define KC_DLR LSFT(KC_4) // $
+#define KC_DOLLAR KC_DLR
+
+#define KC_PERC LSFT(KC_5) // %
+#define KC_PERCENT KC_PERC
+
+#define KC_CIRC LSFT(KC_6) // ^
+#define KC_CIRCUMFLEX KC_CIRC
+
+#define KC_AMPR LSFT(KC_7) // &
+#define KC_AMPERSAND KC_AMPR
+
+#define KC_ASTR LSFT(KC_8) // *
+#define KC_ASTERISK KC_ASTR
+
+#define KC_LPRN LSFT(KC_9) // (
+#define KC_LEFT_PAREN KC_LPRN
+
+#define KC_RPRN LSFT(KC_0) // )
+#define KC_RIGHT_PAREN KC_RPRN
+
+#define KC_UNDS LSFT(KC_MINS) // _
+#define KC_UNDERSCORE KC_UNDS
+
+#define KC_PLUS LSFT(KC_EQL) // +
+
+#define KC_LCBR LSFT(KC_LBRC) // {
+#define KC_LEFT_CURLY_BRACE KC_LCBR
+
+#define KC_RCBR LSFT(KC_RBRC) // }
+#define KC_RIGHT_CURLY_BRACE KC_RCBR
+
+#define KC_PIPE LSFT(KC_SLSH) // |
+
// Alias for function layers than expand past FN31
#define FUNC(kc) kc | 0x2000
@@ -78,78 +126,13 @@ extern const uint16_t fn_actions[];
#define S(kc) LSFT(kc)
#define F(kc) FUNC(kc)
-// For software implementation of colemak
-#define CM_Q KC_Q
-#define CM_W KC_W
-#define CM_F KC_E
-#define CM_P KC_R
-#define CM_G KC_T
-#define CM_J KC_Y
-#define CM_L KC_U
-#define CM_U KC_I
-#define CM_Y KC_O
-#define CM_SCLN KC_P
-
-#define CM_A KC_A
-#define CM_R KC_S
-#define CM_S KC_D
-#define CM_T KC_F
-#define CM_D KC_G
-#define CM_H KC_H
-#define CM_N KC_J
-#define CM_E KC_K
-#define CM_I KC_L
-#define CM_O KC_SCLN
-
-#define CM_Z KC_Z
-#define CM_X KC_X
-#define CM_C KC_C
-#define CM_V KC_V
-#define CM_B KC_B
-#define CM_K KC_N
-#define CM_M KC_M
-#define CM_COMM KC_COMM
-#define CM_DOT KC_DOT
-#define CM_SLSH KC_SLSH
-
-// Make it easy to support these in macros
-#define KC_CM_Q CM_Q
-#define KC_CM_W CM_W
-#define KC_CM_F CM_F
-#define KC_CM_P CM_P
-#define KC_CM_G CM_G
-#define KC_CM_J CM_J
-#define KC_CM_L CM_L
-#define KC_CM_U CM_U
-#define KC_CM_Y CM_Y
-#define KC_CM_SCLN CM_SCLN
-
-#define KC_CM_A CM_A
-#define KC_CM_R CM_R
-#define KC_CM_S CM_S
-#define KC_CM_T CM_T
-#define KC_CM_D CM_D
-#define KC_CM_H CM_H
-#define KC_CM_N CM_N
-#define KC_CM_E CM_E
-#define KC_CM_I CM_I
-#define KC_CM_O CM_O
-
-#define KC_CM_Z CM_Z
-#define KC_CM_X CM_X
-#define KC_CM_C CM_C
-#define KC_CM_V CM_V
-#define KC_CM_B CM_B
-#define KC_CM_K CM_K
-#define KC_CM_M CM_M
-#define KC_CM_COMM CM_COMM
-#define KC_CM_DOT CM_DOT
-#define KC_CM_SLSH CM_SLSH
-
#define M(kc) kc | 0x3000
#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)
+// These affect the backlight (if your keyboard has one).
+// We don't need to comment them out if your keyboard doesn't have a backlight,
+// since they don't take up any space.
#define BL_ON 0x4009
#define BL_OFF 0x4000
#define BL_0 0x4000
@@ -176,6 +159,26 @@ extern const uint16_t fn_actions[];
#define RESET 0x5000
#define DEBUG 0x5001
-#define MIDI(n) n | 0x6000
+// GOTO layer - 16 layers max
+// when:
+// ON_PRESS = 1
+// ON_RELEASE = 2
+// Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default.
+#define TO(layer, when) (layer | 0x5100 | (when << 0x4))
+
+// Momentary switch layer - 256 layer max
+#define MO(layer) (layer | 0x5200)
+
+// Set default layer - 256 layer max
+#define DF(layer) (layer | 0x5300)
+
+#define MIDI(n) (n | 0x6000)
+
+// For sending unicode codes.
+// You may not send codes over 1FFF -- this supports most of UTF8.
+// To have a key that sends out Œ, go UC(0x0152)
+#define UNICODE(n) (n | 0x8000)
+#define UC(n) UNICODE(n)
+
#endif
diff --git a/quantum/keymap_extras/keymap_colemak.h b/quantum/keymap_extras/keymap_colemak.h
new file mode 100644
index 0000000000..c8066ea666
--- /dev/null
+++ b/quantum/keymap_extras/keymap_colemak.h
@@ -0,0 +1,74 @@
+#ifndef KEYMAP_COLEMAK_H
+#define KEYMAP_COLEMAK_H
+
+#include "keymap_common.h"
+// For software implementation of colemak
+#define CM_Q KC_Q
+#define CM_W KC_W
+#define CM_F KC_E
+#define CM_P KC_R
+#define CM_G KC_T
+#define CM_J KC_Y
+#define CM_L KC_U
+#define CM_U KC_I
+#define CM_Y KC_O
+#define CM_SCLN KC_P
+
+#define CM_A KC_A
+#define CM_R KC_S
+#define CM_S KC_D
+#define CM_T KC_F
+#define CM_D KC_G
+#define CM_H KC_H
+#define CM_N KC_J
+#define CM_E KC_K
+#define CM_I KC_L
+#define CM_O KC_SCLN
+
+#define CM_Z KC_Z
+#define CM_X KC_X
+#define CM_C KC_C
+#define CM_V KC_V
+#define CM_B KC_B
+#define CM_K KC_N
+#define CM_M KC_M
+#define CM_COMM KC_COMM
+#define CM_DOT KC_DOT
+#define CM_SLSH KC_SLSH
+
+// Make it easy to support these in macros
+// TODO: change macro implementation so these aren't needed
+#define KC_CM_Q CM_Q
+#define KC_CM_W CM_W
+#define KC_CM_F CM_F
+#define KC_CM_P CM_P
+#define KC_CM_G CM_G
+#define KC_CM_J CM_J
+#define KC_CM_L CM_L
+#define KC_CM_U CM_U
+#define KC_CM_Y CM_Y
+#define KC_CM_SCLN CM_SCLN
+
+#define KC_CM_A CM_A
+#define KC_CM_R CM_R
+#define KC_CM_S CM_S
+#define KC_CM_T CM_T
+#define KC_CM_D CM_D
+#define KC_CM_H CM_H
+#define KC_CM_N CM_N
+#define KC_CM_E CM_E
+#define KC_CM_I CM_I
+#define KC_CM_O CM_O
+
+#define KC_CM_Z CM_Z
+#define KC_CM_X CM_X
+#define KC_CM_C CM_C
+#define KC_CM_V CM_V
+#define KC_CM_B CM_B
+#define KC_CM_K CM_K
+#define KC_CM_M CM_M
+#define KC_CM_COMM CM_COMM
+#define KC_CM_DOT CM_DOT
+#define KC_CM_SLSH CM_SLSH
+
+#endif
diff --git a/quantum/keymap_extras/keymap_dvorak.h b/quantum/keymap_extras/keymap_dvorak.h
new file mode 100644
index 0000000000..d172e0019b
--- /dev/null
+++ b/quantum/keymap_extras/keymap_dvorak.h
@@ -0,0 +1,72 @@
+#ifndef KEYMAP_DVORAK_H
+#define KEYMAP_DVORAK_H
+
+#include "keymap_common.h"
+
+// Normal characters
+#define DV_GRV KC_GRV
+#define DV_1 KC_1
+#define DV_2 KC_2
+#define DV_3 KC_3
+#define DV_4 KC_4
+#define DV_5 KC_5
+#define DV_6 KC_6
+#define DV_7 KC_7
+#define DV_8 KC_8
+#define DV_9 KC_9
+#define DV_0 KC_0
+#define DV_LBRC KC_MINS
+#define DV_RBRC KC_EQL
+
+#define DV_QUOT KC_Q
+#define DV_COMM KC_W
+#define DV_DOT KC_E
+#define DV_P KC_R
+#define DV_Y KC_T
+#define DV_F KC_Y
+#define DV_G KC_U
+#define DV_C KC_I
+#define DV_R KC_O
+#define DV_L KC_P
+#define DV_SLSH KC_LBRC
+#define DV_EQL KC_RBRC
+
+#define DV_A KC_A
+#define DV_O KC_S
+#define DV_E KC_D
+#define DV_U KC_F
+#define DV_I KC_G
+#define DV_D KC_H
+#define DV_H KC_J
+#define DV_T KC_K
+#define DV_N KC_L
+#define DV_S KC_SCLN
+#define DV_MINS KC_QUOT
+
+#define DV_SCLN KC_Z
+#define DV_Q KC_X
+#define DV_J KC_C
+#define DV_K KC_V
+#define DV_X KC_B
+#define DV_B KC_N
+#define DV_M KC_M
+#define DV_W KC_COMM
+#define DV_V KC_DOT
+#define DV_Z KC_SLSH
+
+// Shifted characters
+#define DV_TILD LSFT(DV_GRV)
+#define DV_EXLM LSFT(DV_1)
+#define DV_AT LSFT(DV_2)
+#define DV_HASH LSFT(DV_3)
+#define DV_DLR LSFT(DV_4)
+#define DV_PERC LSFT(DV_5)
+#define DV_CIRC LSFT(DV_6)
+#define DV_AMPR LSFT(DV_7)
+#define DV_ASTR LSFT(DV_8)
+#define DV_LPRN LSFT(DV_9)
+#define DV_RPRN LSFT(DV_0)
+#define DV_LCBR LSFT(DV_LBRC)
+#define DV_RCBR LSFT(DV_RBRC)
+
+#endif \ No newline at end of file
diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h
new file mode 100644
index 0000000000..ccfaed8f07
--- /dev/null
+++ b/quantum/keymap_extras/keymap_french.h
@@ -0,0 +1,83 @@
+#ifndef KEYMAP_FRENCH_H
+#define KEYMAP_FRENCH_H
+
+#include "keymap_common.h"
+
+// Alt gr
+#define ALGR(kc) kc | 0x1400
+#define NO_ALGR KC_RALT
+
+// Normal characters
+#define FR_SUP2 KC_GRV
+#define FR_AMP KC_1
+#define FR_EACU KC_2
+#define FR_QUOT KC_3
+#define FR_APOS KC_4
+#define FR_LPRN KC_5
+#define FR_MINS KC_6
+#define FR_EGRV KC_7
+#define FR_UNDS KC_8
+#define FR_CCED KC_9
+#define FR_AGRV KC_0
+#define FR_RPRN KC_MINS
+#define FR_EQL KC_EQL
+
+#define FR_A KC_Q
+#define FR_Z KC_W
+#define FR_CIRC KC_LBRC
+#define FR_DLR KC_RBRC
+
+#define FR_Q KC_A
+#define FR_M KC_SCLN
+#define FR_UGRV KC_QUOT
+#define FR_ASTR KC_NUHS
+
+#define FR_LESS KC_NUBS
+#define FR_W KC_Z
+#define FR_COMM KC_M
+#define FR_SCLN KC_COMM
+#define FR_COLN KC_DOT
+#define FR_EXLM KC_SLSH
+
+// Shifted characters
+#define FR_1 LSFT(KC_1)
+#define FR_2 LSFT(KC_2)
+#define FR_3 LSFT(KC_3)
+#define FR_4 LSFT(KC_4)
+#define FR_5 LSFT(KC_5)
+#define FR_6 LSFT(KC_6)
+#define FR_7 LSFT(KC_7)
+#define FR_8 LSFT(KC_8)
+#define FR_9 LSFT(KC_9)
+#define FR_0 LSFT(KC_0)
+#define FR_OVRR LSFT(FR_RPRN)
+#define FR_PLUS LSFT(FR_EQL)
+
+#define FR_UMLT LSFT(FR_CIRC)
+#define FR_PND LSFT(FR_DLR)
+#define FR_PERC LSFT(FR_UGRV)
+#define FR_MU LSFT(FR_ASTR)
+
+#define FR_GRTR LSFT(FR_LESS)
+#define FR_QUES LSFT(FR_COMM)
+#define FR_DOT LSFT(FR_SCLN)
+#define FR_SLSH LSFT(FR_COLN)
+#define FR_SECT LSFT(FR_EXLM)
+
+// Alt Gr-ed characters
+#define FR_TILD ALGR(KC_2)
+#define FR_HASH ALGR(KC_3)
+#define FR_LCBR ALGR(KC_4)
+#define FR_LBRC ALGR(KC_5)
+#define FR_PIPE ALGR(KC_6)
+#define FR_GRV ALGR(KC_7)
+#define FR_BSLS ALGR(KC_8)
+#define FR_CIRC ALGR(KC_9)
+#define FR_AT ALGR(KC_0)
+#define FR_RBRC ALGR(FR_RPRN)
+#define FR_LCBR ALGR(FR_EQL)
+
+#define FR_EURO ALGR(KC_E)
+#define FR_BULT ALGR(FR_DLR)
+
+#endif \ No newline at end of file
diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h
new file mode 100644
index 0000000000..02a704216a
--- /dev/null
+++ b/quantum/keymap_extras/keymap_nordic.h
@@ -0,0 +1,59 @@
+#ifndef KEYMAP_NORDIC_H
+#define KEYMAP_NORDIC_H
+
+#include "keymap_common.h"
+
+// Alt gr
+#define ALGR(kc) kc | 0x1400
+#define NO_ALGR KC_RALT
+
+// Normal characters
+#define NO_HALF KC_GRV
+#define NO_PLUS KC_MINS
+#define NO_ACUT KC_EQL
+
+#define NO_AM KC_LBRC
+#define NO_QUOT KC_RBRC
+#define NO_AE KC_SCLN
+#define NO_OSLH KC_QUOT
+#define NO_APOS KC_NUHS
+
+#define NO_LESS KC_NUBS
+#define NO_MINS KC_SLSH
+
+// Shifted characters
+#define NO_SECT LSFT(NO_HALF)
+#define NO_QUO2 LSFT(KC_2)
+#define NO_BULT LSFT(KC_4)
+#define NO_AMP LSFT(KC_6)
+#define NO_SLSH LSFT(KC_7)
+#define NO_LPRN LSFT(KC_8)
+#define NO_RPRN LSFT(KC_9)
+#define NO_EQL LSFT(KC_0)
+#define NO_QUES LSFT(NO_PLUS)
+#define NO_GRV LSFT(NO_ACUT)
+
+#define NO_CIRC LSFT(NO_QUOT)
+
+#define NO_GRTR LSFT(NO_LESS)
+#define NO_SCLN LSFT(KC_COMM)
+#define NO_COLN LSFT(KC_DOT)
+#define NO_UNDS LSFT(NO_MINS)
+
+// Alt Gr-ed characters
+#define NO_AT ALGR(KC_2)
+#define NO_PND ALGR(KC_3)
+#define NO_DLR ALGR(KC_4)
+#define NO_LCBR ALGR(KC_7)
+#define NO_LBRC ALGR(KC_8)
+#define NO_RBRC ALGR(KC_9)
+#define NO_RCBR ALGR(KC_0)
+#define NO_PIPE ALGR(NO_ACUT)
+
+#define NO_EURO ALGR(KC_E)
+#define NO_TILD ALGR(NO_QUOT)
+
+#define NO_BSLS ALGR(NO_LESS)
+#define NO_MU ALGR(KC_M)
+
+#endif \ No newline at end of file
diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h
new file mode 100644
index 0000000000..7f980afbcf
--- /dev/null
+++ b/quantum/keymap_extras/keymap_spanish.h
@@ -0,0 +1,62 @@
+#ifndef KEYMAP_SPANISH_H
+#define KEYMAP_SPANISH_H
+
+#include "keymap_common.h"
+
+// Alt gr
+#define ALGR(kc) kc | 0x1400
+#define NO_ALGR KC_RALT
+
+// Normal characters
+#define ES_OVRR KC_GRV
+#define ES_APOS KC_MINS
+#define ES_IEXL KC_EQL
+
+#define ES_GRV KC_LBRC
+#define ES_PLUS KC_RBRC
+
+#define ES_NTIL KC_SCLN
+#define ES_ACUT KC_QUOT
+#define ES_CCED KC_NUHS
+
+#define ES_LESS KC_NUBS
+#define ES_MINS KC_SLSH
+
+// Shifted characters
+#define ES_ASML LSFT(ES_OVRR)
+#define ES_QUOT LSFT(KC_2)
+#define ES_OVDT LSFT(KC_3)
+#define ES_AMPR LSFT(KC_6)
+#define ES_SLSH LSFT(KC_7)
+#define ES_LPRN LSFT(KC_8)
+#define ES_RPRN LSFT(KC_9)
+#define ES_EQL LSFT(KC_0)
+#define ES_QUES LSFT(ES_APOS)
+#define ES_IQUE LSFT(ES_IEXL)
+
+#define ES_CIRC LSFT(ES_GRV)
+#define ES_ASTR LSFT(ES_PLUS)
+
+#define ES_UMLT LSFT(ES_GRV)
+
+#define ES_GRTR LSFT(ES_LESS)
+#define ES_SCLN LSFT(ES_COMM)
+#define ES_COLN LSFT(ES_DOT)
+#define ES_UNDS LSFT(ES_MINS)
+
+// Alt Gr-ed characters
+#define ES_BSLS ALGR(ES_OVRR)
+#define ES_PIPE ALGR(KC_1)
+#define ES_AT ALGR(KC_2)
+#define ES_HASH ALGR(KC_3)
+#define ES_TILD ALGR(KC_4)
+#define ES_EURO ALGR(KC_5)
+#define ES_NOT ALGR(KC_6)
+
+#define ES_LBRC ALGR(ES_GRV)
+#define ES_RBRC ALGR(ES_PLUS)
+
+#define ES_LCBR ALGR(ES_ACUT)
+#define ES_RCRB ALGR(ES_CCED)
+
+#endif \ No newline at end of file
diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h
new file mode 100644
index 0000000000..5b4bd3c0d4
--- /dev/null
+++ b/quantum/keymap_extras/keymap_uk.h
@@ -0,0 +1,36 @@
+#ifndef KEYMAP_UK_H
+#define KEYMAP_UK_H
+
+#include "keymap_common.h"
+
+// Alt gr
+#define ALGR(kc) kc | 0x1400
+#define NO_ALGR KC_RALT
+
+// Normal characters
+#define UK_HASH KC_NUHS
+
+#define UK_BSLS KC_NUBS
+
+// Shifted characters
+#define UK_NOT LSFT(KC_GRV)
+#define UK_QUOT LSFT(KC_2)
+#define UK_PND LSFT(KC_3)
+
+#define UK_AT LSFT(KC_QUOT)
+#define UK_TILD LSFT(KC_NUHS)
+
+#define UK_PIPE LSFT(KC_NUBS)
+
+// Alt Gr-ed characters
+#define UK_BRKP ALGR(KC_GRV)
+#define UK_EURO ALGR(KC_4)
+
+#define UK_EACT ALGR(KC_E)
+#define UK_UACT ALGR(KC_U)
+#define UK_IACT ALGR(KC_I)
+#define UK_OACT ALGR(KC_O)
+
+#define UK_AACT ALGR(KC_A)
+
+#endif \ No newline at end of file
diff --git a/keyboard/planck/keymap_midi.c b/quantum/keymap_midi.c
index 60ad6d53a8..b7eba3ab76 100644
--- a/keyboard/planck/keymap_midi.c
+++ b/quantum/keymap_midi.c
@@ -44,7 +44,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
return;
} else {
stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
- // stop_all_notes();
+ stop_all_notes();
return;
}
}
@@ -60,7 +60,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
return;
} else {
stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
- // stop_all_notes();
+ stop_all_notes();
return;
}
}
@@ -72,7 +72,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
- // stop_all_notes();
+ stop_all_notes();
for (int i = 0; i <= 7; i++) {
play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
_delay_us(80000);
@@ -88,7 +88,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
- // stop_all_notes();
+ stop_all_notes();
for (int i = 0; i <= 7; i++) {
play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
_delay_us(80000);
@@ -100,9 +100,11 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.pressed) {
// midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
// midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
} \ No newline at end of file
diff --git a/keyboard/planck/keymap_midi.h b/quantum/keymap_midi.h
index c5917f884e..c5917f884e 100644
--- a/keyboard/planck/keymap_midi.h
+++ b/quantum/keymap_midi.h
diff --git a/quantum/keymap_unicode.c b/quantum/keymap_unicode.c
new file mode 100644
index 0000000000..a9357edec7
--- /dev/null
+++ b/quantum/keymap_unicode.c
@@ -0,0 +1,59 @@
+/*
+Copyright 2015 Jack Humbert <jack.humb@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "keymap_common.h"
+
+uint16_t hextokeycode(int hex) {
+ if (hex == 0x0) {
+ return KC_0;
+ } else if (hex < 0xA) {
+ return KC_1 + (hex - 0x1);
+ } else {
+ return KC_A + (hex - 0xA);
+ }
+}
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+
+ if (record->event.pressed) {
+ uint16_t unicode = (opt << 8) | id;
+ register_code(KC_LALT);
+
+ register_code(hextokeycode((unicode & 0xF000) >> 12));
+ unregister_code(hextokeycode((unicode & 0xF000) >> 12));
+ register_code(hextokeycode((unicode & 0x0F00) >> 8));
+ unregister_code(hextokeycode((unicode & 0x0F00) >> 8));
+ register_code(hextokeycode((unicode & 0x00F0) >> 4));
+ unregister_code(hextokeycode((unicode & 0x00F0) >> 4));
+ register_code(hextokeycode((unicode & 0x000F)));
+ unregister_code(hextokeycode((unicode & 0x000F)));
+
+ /* Test 'a' */
+ // register_code(hextokeycode(0x0));
+ // unregister_code(hextokeycode(0x0));
+ // register_code(hextokeycode(0x0));
+ // unregister_code(hextokeycode(0x0));
+ // register_code(hextokeycode(0x6));
+ // unregister_code(hextokeycode(0x6));
+ // register_code(hextokeycode(0x1));
+ // unregister_code(hextokeycode(0x1));
+
+ unregister_code(KC_LALT);
+ }
+ return;
+} \ No newline at end of file
diff --git a/keyboard/planck/led.c b/quantum/led.c
index 2c05746607..2c05746607 100644
--- a/keyboard/planck/led.c
+++ b/quantum/led.c
diff --git a/keyboard/planck/matrix.c b/quantum/matrix.c
index 98ef55ed68..95bf4c0973 100644
--- a/keyboard/planck/matrix.c
+++ b/quantum/matrix.c
@@ -37,11 +37,26 @@ static uint8_t debouncing = DEBOUNCE;
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+#if DIODE_DIRECTION == ROW2COL
+ static matrix_row_t matrix_reversed[MATRIX_COLS];
+ static matrix_row_t matrix_reversed_debouncing[MATRIX_COLS];
+#endif
+
static matrix_row_t read_cols(void);
static void init_cols(void);
static void unselect_rows(void);
static void select_row(uint8_t row);
+__attribute__ ((weak))
+void * matrix_init_kb(void) {
+
+};
+
+__attribute__ ((weak))
+void * matrix_scan_kb(void) {
+
+};
+
inline
uint8_t matrix_rows(void)
{
@@ -60,11 +75,6 @@ void matrix_init(void)
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
- backlight_init_ports();
-
- // Turn status LED on
- DDRE |= (1<<6);
- PORTE |= (1<<6);
// initialize row and col
unselect_rows();
@@ -75,11 +85,17 @@ void matrix_init(void)
matrix[i] = 0;
matrix_debouncing[i] = 0;
}
+
+ if (matrix_init_kb) {
+ (*matrix_init_kb)();
+ }
}
uint8_t matrix_scan(void)
{
+
+#if DIODE_DIRECTION == COL2ROW
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
select_row(i);
_delay_us(30); // without this wait read unstable value.
@@ -103,6 +119,42 @@ uint8_t matrix_scan(void)
}
}
}
+#else
+ for (uint8_t i = 0; i < MATRIX_COLS; i++) {
+ select_row(i);
+ _delay_us(30); // without this wait read unstable value.
+ matrix_row_t rows = read_cols();
+ if (matrix_reversed_debouncing[i] != rows) {
+ matrix_reversed_debouncing[i] = rows;
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); debug("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ unselect_rows();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ _delay_ms(1);
+ } else {
+ for (uint8_t i = 0; i < MATRIX_COLS; i++) {
+ matrix_reversed[i] = matrix_reversed_debouncing[i];
+ }
+ }
+ }
+ for (uint8_t y = 0; y < MATRIX_ROWS; y++) {
+ matrix_row_t row = 0;
+ for (uint8_t x = 0; x < MATRIX_COLS; x++) {
+ row |= ((matrix_reversed[x] & (1<<y)) >> y) << x;
+ }
+ matrix[y] = row;
+ }
+#endif
+
+ if (matrix_scan_kb) {
+ (*matrix_scan_kb)();
+ }
return 1;
}
@@ -147,8 +199,14 @@ uint8_t matrix_key_count(void)
static void init_cols(void)
{
int B = 0, C = 0, D = 0, E = 0, F = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
+
+#if DIODE_DIRECTION == COL2ROW
+ for(int x = 0; x < MATRIX_COLS; x++) {
int col = COLS[x];
+#else
+ for(int x = 0; x < MATRIX_ROWS; x++) {
+ int col = ROWS[x];
+#endif
if ((col & 0xF0) == 0x20) {
B |= (1<<(col & 0x0F));
} else if ((col & 0xF0) == 0x30) {
@@ -171,8 +229,15 @@ static void init_cols(void)
static matrix_row_t read_cols(void)
{
matrix_row_t result = 0;
+
+#if DIODE_DIRECTION == COL2ROW
for(int x = 0; x < MATRIX_COLS; x++) {
int col = COLS[x];
+#else
+ for(int x = 0; x < MATRIX_ROWS; x++) {
+ int col = ROWS[x];
+#endif
+
if ((col & 0xF0) == 0x20) {
result |= (PINB&(1<<(col & 0x0F)) ? 0 : (1<<x));
} else if ((col & 0xF0) == 0x30) {
@@ -191,8 +256,14 @@ static matrix_row_t read_cols(void)
static void unselect_rows(void)
{
int B = 0, C = 0, D = 0, E = 0, F = 0;
+
+#if DIODE_DIRECTION == COL2ROW
for(int x = 0; x < MATRIX_ROWS; x++) {
int row = ROWS[x];
+#else
+ for(int x = 0; x < MATRIX_COLS; x++) {
+ int row = COLS[x];
+#endif
if ((row & 0xF0) == 0x20) {
B |= (1<<(row & 0x0F));
} else if ((row & 0xF0) == 0x30) {
@@ -214,7 +285,13 @@ static void unselect_rows(void)
static void select_row(uint8_t row)
{
+
+#if DIODE_DIRECTION == COL2ROW
int row_pin = ROWS[row];
+#else
+ int row_pin = COLS[row];
+#endif
+
if ((row_pin & 0xF0) == 0x20) {
DDRB |= (1<<(row_pin & 0x0F));
PORTB &= ~(1<<(row_pin & 0x0F));