diff --git a/.gitignore b/.gitignore index 0d87fe42..d2d07241 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ tags build/ *.bak .DS_Store +!converter/*/binary/*.hex +!keyboard/*/binary/*.hex diff --git a/README.md b/README.md index f2a28413..241672f8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,22 @@ TMK Keyboard Firmware Collection ================================ -This is a keyboard firmware with some useful features for Atmel AVR controller. +This repository includes keyboard and converter firmware projects built with [`tmk_core`][tmk_core] keyboard library. -Source code is available here: +The latest source code is available here: Updates ------- +#### 2017/01/11 +Changed action code for `ACTION_LAYER_MODS` and this may cause incompatibility with existent shared URL and downloaded firmwware of keymap editor. If you are using the action you just have to redefine it on keymap editor. Existent keymap code should not suffer. + +#### 2016/06/26 +Keymap framework was updated. `fn_actions[]` should be defined as `action_t` instead of `uint16_t`. And default code for keymap handling is now included in core you just need define `uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]` and `action_t fn_actions[]`. + + +#### 2016/06/22 +Some projects were moved from `converter` and `keyboard` to `orphan` directory. Those might be removed in some future but you will be able to access them with `orphans` tag. See + #### 2016/02/10 core: flabbergast's Chibios protocol was merged from (@72b1668). See [tmk_core/protocol/chibios/README.md](tmk_core/protocol/chibios/README.md). Chibios protocol supports Cortex-M such as STM32 and Kinetis. @@ -19,28 +29,6 @@ In `Makefile` you need to set `TMK_DIR` to indicate core library location now. -Features --------- -These features can be used in your keyboard. - -* Multi-layer Keymap - Multiple keyboard layouts with layer switching -* Mouse key - Mouse control with keyboard -* System Control Key - Power Down, Sleep, Wake Up and USB Remote Wake up -* Media Control Key - Volume Down/Up, Mute, Next/Prev track, Play, Stop and etc -* USB NKRO - 120 keys(+ 8 modifiers) simultaneously -* PS/2 mouse support - PS/2 mouse(TrackPoint) as composite device -* Keyboard protocols - PS/2, ADB, M0110, Sun and other old keyboard protocols -* User Function - Customizable function of key with writing code -* Macro - Very primitive at this time -* Keyboard Tricks - Oneshot modifier and modifier with tapping feature -* Debug Console - Messages for debug and interaction with firmware -* Virtual DIP Switch - Configurations stored EEPROM(Boot Magic) -* Locking CapsLock - Mechanical switch support for CapsLock -* Breathing Sleep LED - Sleep indicator with charm during USB suspend -* Backlight - Control backlight levels - - - Projects -------- You can find some keyboard specific projects under `converter` and `keyboard` directory. @@ -54,32 +42,23 @@ You can find some keyboard specific projects under `converter` and `keyboard` di * [x68k_usb](converter/x68k_usb/) - [Sharp X68000 keyboard to USB][GH_x68k] * [sun_usb](converter/sun_usb/) - [Sun] to USB(type4, 5 and 3?) * [pc98_usb](converter/pc98_usb/) - [PC98] to USB -* [usb_usb](converter/usb_usb/) - USB to USB(experimental) -* [ascii_usb](converter/ascii_usb/) - ASCII(Serial console terminal) to USB -* [ibm4704_usb](converter/ibm4704_usb) - [IBM 4704 keyboard Converter][GH_ibm4704] +* [usb_usb](converter/usb_usb/) - [USB to USB][GH_usb] +* [ibm4704_usb](converter/ibm4704_usb) - [IBM 4704 keyboard to USB][GH_ibm4704] +* [next_usb](converter/next_usb) - NeXT(Non-ADB) to USB, contributed by [BCG](https://github.com/bgould) and based on [Adafruit's work](https://learn.adafruit.com/usb-next-keyboard-with-arduino-micro/overview) ### keyboard * [hhkb](keyboard/hhkb/) - [Happy Hacking Keyboard pro][GH_hhkb] **my main board** -* [gh60](keyboard/gh60/) - [GH60] DIY 60% keyboard [prototype][GH60_proto] **my second board** +* [alps64](keyboard/alps64/) - [Alps64 PCB](https://geekhack.org/index.php?topic=69740.0) * [hbkb](keyboard/hbkb/) - [Happy Buckling spring keyboard][GH_hbkb](IBM Model M 60% mod) -* [hid_liber](keyboard/hid_liber/) - [HID liberation][HID_liber] controller (by alaricljs) -* [phantom](keyboard/phantom/) - [Phantom] keyboard (by Tranquilite) -* [IIgs_Standard](keyboard/IIgs/) - Apple [IIGS] keyboard mod(by JeffreySung) -* [macway](keyboard/macway/) - [Compact keyboard mod][GH_macway] [retired] -* [KMAC](keyboard/kmac/) - Korean custom keyboard -* [Lightsaber](keyboard/lightsaber/) - Korean custom keyboard * [Infinity](keyboard/infinity/) - Massdrop [Infinity keyboard][Infinity] -* [NerD](keyboard/nerd/) - Korean custom keyboard -* [KittenPaw](keyboard/kitten_paw) - Custom Majestouch controller -* [Lightpad](keyboard/lightpad) - Korean custom keypad -* [ghost_squid](keyboard/ghost_squid/) - [The Ghost Squid][ghost_squid] controller for [Cooler Master QuickFire XT][cmxt] - -### External projects using tmk_keyboard -* [ErgoDox_cub-uanic][cub-uanic] - Split Ergonomic Keyboard [ErgoDox][ergodox_org] -* [mcdox][mcdox_tmk] - [mcdox][mcdox] +* [gh60](keyboard/gh60/) - [GH60] DIY 60% keyboard [prototype][GH60_proto] **my second board** +* [onekey](keyboard/onekey/) - Simple one key keyboard example + + +### Projects based tmk_keyboard or tmk_core +https://github.com/tmk/tmk_keyboard/wiki/TMK-Based-Projects -[GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 [GH_hhkb]: http://geekhack.org/showwiki.php?title=Island:12047 [GH_ps2]: http://geekhack.org/showwiki.php?title=Island:14618 [GH_adb]: http://geekhack.org/showwiki.php?title=Island:14290 @@ -90,20 +69,12 @@ You can find some keyboard specific projects under `converter` and `keyboard` di [GH_x68k]: http://geekhack.org/showwiki.php?title=Island:29060 [GH_hbkb]: http://geekhack.org/showwiki.php?title=Island:29483 [GH_ibm4704]: http://geekhack.org/index.php?topic=54706.0 -[HID_liber]: http://deskthority.net/wiki/HID_Liberation_Device_-_DIY_Instructions -[Phantom]: http://geekhack.org/index.php?topic=26742 [GH60]: http://geekhack.org/index.php?topic=34959 [GH60_proto]: http://geekhack.org/index.php?topic=37570.0 [PC98]: http://en.wikipedia.org/wiki/NEC_PC-9801 [Sun]: http://en.wikipedia.org/wiki/Sun-3 -[IIGS]: http://en.wikipedia.org/wiki/Apple_IIGS [Infinity]: https://www.massdrop.com/buy/infinity-keyboard-kit -[ghost_squid]: http://deskthority.net/wiki/Costar_replacement_controllers#The_Ghost_Squid -[cmxt]: http://gaming.coolermaster.com/en/products/keyboards/quickfirext/ -[ergodox_org]: http://ergodox.org/ -[cub-uanic]: https://github.com/cub-uanic/tmk_keyboard/tree/master/keyboard/ergodox -[mcdox]: https://github.com/DavidMcEwan/mcdox -[mcdox_tmk]: https://github.com/DavidMcEwan/tmk_keyboard/tree/master/keyboard/mcdox +[tmk_core]: https://github.com/tmk/tmk_core @@ -131,7 +102,7 @@ Magic Commands -------------- To see help press `Magic` + `H`. -`Magic` key combination is `LShift` + `RShift` in many project, but `Power` key on ADB converter. +`Magic` key combination is `LShift` + `RShift` in many projects, but `Power` key on ADB converter. `Magic` keybind can be vary on each project, check `config.h` in project directory. Following commands can be also executed with `Magic` + key. In console mode `Magic` keybind is not needed. @@ -202,11 +173,11 @@ To avoid configuring accidentally additive salt key `KC_SPACE` also needs to be Mechanical Locking support -------------------------- -This feature makes it possible for you to use mechanical locking switch for `CapsLock`, `NumLock` +This feature makes it possible for you to use mechanical locking switch for `CapsLock`, `NumLock` or `ScrollLock`. To enable this feature define these macros in `config.h` and use `KC_LCAP`, `KC_LN UM` or `KC_LSCR` in keymap for locking key instead of normal `KC_CAPS`, `KC_NLCK` or `KC_SLCK`. Res ync option tries to keep switch state consistent with keyboard LED state. - + #define LOCKING_SUPPORT_ENABLE #define LOCKING_RESYNC_ENABLE @@ -214,15 +185,21 @@ ync option tries to keep switch state consistent with keyboard LED state. Start Your Own Project ----------------------- -**TBD** +1. Add `tmk_core` into your repository using `git submodule` or `git subtree`. +2. Copy files from `tmk_keybaord` or other project similar to yours +3. Edit those files to support your keyboard. + +See these as examples. +- https://github.com/tmk/infinity_ergodox +- https://github.com/tmk/whitefox Debugging -------- -Use PJRC's `hid_listen` to see debug messages. You can use the tool for debug even if firmware use LUFA stack. +Use PJRC's `hid_listen` to see debug messages. You can use xprintf() to display debug info, see `tmk_core/common/xprintf.h`. -You can use xprintf() to display debug info on `hid_listen`, see `tmk_core/common/xprintf.h`. +- https://www.pjrc.com/teensy/hid_listen.html @@ -236,6 +213,13 @@ Files and Directories +Contribution +------------ +- Report bugs in github **[Issues](https://github.com/tmk/tmk_keyboard/issues)**. +- Pull requets are also welcomed. + + + Coding Style ------------- - Doesn't use Tab to indent, use 4-spaces instead. diff --git a/converter/adb_usb/Makefile b/converter/adb_usb/Makefile index 76e10950..14fc181b 100644 --- a/converter/adb_usb/Makefile +++ b/converter/adb_usb/Makefile @@ -1,64 +1,17 @@ -#---------------------------------------------------------------------------- -# 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 = adb_usb_lufa +TARGET ?= adb_usb # Directory common source filess exist -TMK_DIR = ../../tmk_core +TMK_DIR ?= ../../tmk_core # Directory keyboard dependent files exist -TARGET_DIR = . +TARGET_DIR ?= . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC ?= matrix.c \ led.c \ adb.c -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_plain.c $(SRC) -endif - CONFIG_H = config.h @@ -66,7 +19,7 @@ CONFIG_H = config.h # atmega32u4 Teensy2.0 # atemga32u4 TMK Converter rev.1 # atemga32u2 TMK Converter rev.2 -MCU = atmega32u2 +MCU ?= atmega32u2 # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the @@ -79,14 +32,14 @@ MCU = atmega32u2 # 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 +F_CPU ?= 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). -ARCH = AVR8 +ARCH ?= AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the @@ -99,7 +52,7 @@ ARCH = AVR8 # # 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) +F_USB ?= $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -125,6 +78,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend #NKRO_ENABLE = yes # USB Nkey Rollover ADB_MOUSE_ENABLE = yes +#UNIMAP_ENABLE = yes +#ACTIONMAP_ENABLE = yes # Use 16bit actionmap instead of 8bit keymap +#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor # ADB Mice need acceleration for todays much bigger screens. OPT_DEFS += -DADB_MOUSE_MAXACC=8 @@ -133,6 +89,26 @@ OPT_DEFS += -DADB_MOUSE_MAXACC=8 # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax + +# +# Keymap file +# +ifdef UNIMAP_ENABLE + KEYMAP_FILE = unimap +else + ifdef ACTIONMAP_ENABLE + KEYMAP_FILE = actionmap + else + KEYMAP_FILE = keymap + endif +endif +ifdef KEYMAP + SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) +else + SRC := $(KEYMAP_FILE)_plain.c $(SRC) +endif + + # Search Path VPATH += $(TARGET_DIR) VPATH += $(TMK_DIR) diff --git a/converter/adb_usb/Makefile.rev1 b/converter/adb_usb/Makefile.rev1 index 1cd539b6..caddb607 100644 --- a/converter/adb_usb/Makefile.rev1 +++ b/converter/adb_usb/Makefile.rev1 @@ -1,143 +1,3 @@ -#---------------------------------------------------------------------------- -# 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 = adb_usb_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - adb.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_ansi.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -# atmega32u4 Teensy2.0 -# atemga32u4 TMK Converter rev.1 -# atemga32u2 TMK Converter rev.2 +TARGET = adb_usb_rev1 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 for TMK Converter rev.1/rev.2 -# 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 -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover -ADB_MOUSE_ENABLE = yes - -# ADB Mice need acceleration for todays much bigger screens. -OPT_DEFS += -DADB_MOUSE_MAXACC=8 - - -# Optimize size but this may cause error "relocation truncated to fit" -#EXTRALDFLAGS = -Wl,--relax - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk +include Makefile diff --git a/converter/adb_usb/Makefile.teensy b/converter/adb_usb/Makefile.teensy index d97f0eb3..604e3642 100644 --- a/converter/adb_usb/Makefile.teensy +++ b/converter/adb_usb/Makefile.teensy @@ -1,143 +1,3 @@ -#---------------------------------------------------------------------------- -# 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 = adb_usb_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - adb.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_ansi.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -# atmega32u4 Teensy2.0 -# atemga32u4 TMK Converter rev.1 -# atemga32u2 TMK Converter rev.2 +TARGET = adb_usb_teensy 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 for TMK Converter rev.1/rev.2 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 - - -# 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 -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover -ADB_MOUSE_ENABLE = yes - -# ADB Mice need acceleration for todays much bigger screens. -OPT_DEFS += -DADB_MOUSE_MAXACC=8 - - -# Optimize size but this may cause error "relocation truncated to fit" -#EXTRALDFLAGS = -Wl,--relax - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk +include Makefile diff --git a/converter/adb_usb/Makefile.unimap.rev1 b/converter/adb_usb/Makefile.unimap.rev1 new file mode 100644 index 00000000..41ec16e6 --- /dev/null +++ b/converter/adb_usb/Makefile.unimap.rev1 @@ -0,0 +1,5 @@ +TARGET = adb_usb_rev1_unimap +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +MCU = atmega32u4 +include Makefile diff --git a/converter/adb_usb/Makefile.unimap.rev2 b/converter/adb_usb/Makefile.unimap.rev2 new file mode 100644 index 00000000..3e46eeeb --- /dev/null +++ b/converter/adb_usb/Makefile.unimap.rev2 @@ -0,0 +1,5 @@ +TARGET = adb_usb_rev2_unimap +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +MCU = atmega32u2 +include Makefile diff --git a/converter/adb_usb/README.md b/converter/adb_usb/README.md index 034540c9..2240d023 100644 --- a/converter/adb_usb/README.md +++ b/converter/adb_usb/README.md @@ -1,10 +1,10 @@ ADB to USB keyboard converter ============================= -This firmware converts Apple ADB keyboard protocol to USB. You can use TMK Converter, PJRC Teensy2.0 and other USB AVR MCU(ATMega32U4, AT90USB64/128 or etc) for this. But binary size is probably more than 10KB and it won't fit into 8K flash. +This firmware converts Apple ADB keyboard protocol to USB, you can use it to plug old ADB keyboard into modern computer. It works on TMK ADB-USB Converter, PJRC Teensy2.0 and other USB AVR MCU(ATMega32U4, AT90USB64/128 or etc) and needs more than 10KB flash at least. -Discuss: http://geekhack.org/showwiki.php?title=Island:14290 +Discuss here: http://geekhack.org/showwiki.php?title=Island:14290 -TMK Converter: https://geekhack.org/index.php?topic=72052.0 +You can buy a TMK converter here: https://geekhack.org/index.php?topic=72052.0 diff --git a/converter/adb_usb/binary/adb_usb_rev1_unimap.hex b/converter/adb_usb/binary/adb_usb_rev1_unimap.hex new file mode 100644 index 00000000..ecab407f --- /dev/null +++ b/converter/adb_usb/binary/adb_usb_rev1_unimap.hex @@ -0,0 +1,1299 @@ +:100000000C9462050C94A9050C94A9050C94A905FF +:100010000C94A9050C94A9050C94A9050C94A905A8 +:100020000C94A9050C94A9050C94590F0C942B1051 +:100030000C948F1E0C94A9050C94A9050C94A90589 +:100040000C94A9050C94A9050C94A9050C94A90578 +:100050000C94A9050C94031F0C94A9050C94A905F4 +:100060000C94A9050C94A9050C94A9050C94A90558 +:100070000C94A9050C94A9050C94A9050C94A90548 +:100080000C94A9050C94A9050C94A9050C94A90538 +:100090000C94A9050C94A9050C94A9050C94A90528 +:1000A0000C94A9050C94A9050C94A9059810BA10F4 +:1000B000A811BA10A811FF102211A81177118A11E6 +:1000C0004615461574157415D1150F1628182818DD +:1000D0002816281829172917FC1728182818131864 +:1000E000041607090B0A1D1B06196405141A0815C6 +:1000F0001C171E1F202123222E26242D25273012D7 +:10010000182F0C13280F0D340E33313638111037D9 +:100110002B2C352A5829787B79397A504F515272D5 +:100120006C63685680668053020103555880576D92 +:100130006E5462595A5B5C5D5E5F6F606174756698 +:100140003E3F403C4142774476466B47804365459D +:100150008048494A4B4C3D4D3B4E3A7D7E7C7F73F7 +:100160006164625F686F73745F6B62645F72656322 +:10017000763A204552524F52282564290A000A0037 +:1001800025303458006164625F686F73745F6B621E +:10019000645F726563763A20004552524F523A20AE +:1001A0006D65646961206B6579300A004552524F74 +:1001B000523A206D65646961206B6579310A005D92 +:1001C0000A0025640020002564007C002530325898 +:1001D00000200025303258006164625F6D6F7573D6 +:1001E00065207261773A205B000A00253031366263 +:1001F000006164625F686F73745F6D6F7573655FD4 +:10020000726563763A2000646562756720656E6189 +:10021000626C65642E0A005363616E3A2061646407 +:10022000723A25642C20726567333A253034580AB7 +:1002300000416674657220696E69743A0A00466FFF +:10024000756E643A206D65646961206B6579730A27 +:10025000005363616E3A20616464723A25642C2015 +:10026000726567333A253034580A004265666F720A +:100270006520696E69743A0A004B6579626F617234 +:10028000642073746172742E0A0055534220636FA8 +:100290006E666967757265642E0A000D0A696E697B +:1002A000740A005B445D005B435D002E0341004423 +:1002B00000420020006B006500790062006F006161 +:1002C0000072006400200063006F006E007600651D +:1002D00000720074006500720000000E0374002EAE +:1002E000006D002E006B002E0000000403090409BD +:1002F000027400040100A03209040000010301019E +:1003000000092111010001224000070581030800B6 +:100310000A09040100010301020009211101000181 +:10032000224D000705820308000A090402000103A8 +:100330000000000921110100012236000705830396 +:1003400008000A090403000203000000092111014A +:100350000001222200070584032000010705040391 +:100360002000011201100100000008EDFEDB0A016F +:1003700001010200010631FF0974A1010975150090 +:1003800026FF009520750881020976150026FF00DA +:10039000952075089102C005010980A1018502160A +:1003A000810026B7001A81002AB7007510950181D7 +:1003B00000C0050C0901A1018503160100269C025D +:1003C0001A01002A9C02751095018100C0050109DF +:1003D00002A1010901A1000509190129051500253E +:1003E00001950575018102950175038101050109DA +:1003F0003009311581257F95027508810609381568 +:1004000081257F950175088106050C0A3802158142 +:10041000257F950175088106C0C005010906A10167 +:10042000050719E029E715002501950875018102E6 +:1004300095017508810105081901290595057501C2 +:1004400091029501750391010507190029FF150017 +:1004500026FF00950675088100C0636F6E73756D89 +:1004600065723A20253034580A0073797374656DCB +:100470003A20253034580A000A002530325820002E +:100480006B6579626F6172643A20004C45443A2092 +:10049000253032580A00253032583A20253038624B +:1004A00025730A00722F63203031323334353637EA +:1004B0000A00290A002575002F002575005D280017 +:1004C000256400200025640020002564002000250C +:1004D00064007C0025303258006D6F7573656B6564 +:1004E00079205B62746E7C782079207620685D28A4 +:1004F0007265702F61636C293A205B006D6B5F77CA +:100500006865656C5F74696D655F746F5F6D617858 +:10051000203D2025640A006D6B5F776865656C5F20 +:100520006D61785F7370656564203D2025640A0005 +:100530006D6B5F74696D655F746F5F6D6178203D91 +:100540002025640A006D6B5F6D61785F737065656F +:1005500064203D2025640A006D6B5F696E746572CE +:1005600076616C203D2025640A006D6B5F64656CCC +:100570006179203D2025640A006D6B5F77686565B1 +:100580006C5F74696D655F746F5F6D6178203D208D +:1005900025640A006D6B5F776865656C5F6D6178D7 +:1005A0005F7370656564203D2025640A006D6B5F94 +:1005B00074696D655F746F5F6D6178203D2025649F +:1005C0000A006D6B5F6D61785F7370656564203DD7 +:1005D0002025640A006D6B5F696E74657276616CCC +:1005E000203D2025640A006D6B5F64656C61792095 +:1005F0003D2025640A000A00257500363A207768F8 +:1006000065656C5F74696D655F746F5F6D61783A85 +:1006100020000A00257500353A20776865656C5F13 +:100620006D61785F73706565643A20000A00257516 +:1006300000343A2074696D655F746F5F6D61783A5C +:1006400020000A00257500333A206D61785F7370D1 +:100650006565643A20000A00257500323A20696E0B +:1006600074657276616C286D73293A20000A002542 +:100670007500313A2064656C6179282A31306D73D8 +:10068000293A20000A092D2056616C756573202DCA +:100690000A004D3E004D25643E20003F0073657406 +:1006A0002064656661756C740A00433E20007768BB +:1006B0006572652064656C74613A20637572736F4E +:1006C000723D25642C20776865656C3D25640A536E +:1006D000656520687474703A2F2F656E2E77696B8C +:1006E0006970656469612E6F72672F77696B692F16 +:1006F0004D6F7573655F6B6579730A000A092D206C +:100700004D6F7573656B6579202D0A4553432F71C5 +:100710003A09717569740A313A0964656C6179281E +:100720002A31306D73290A323A09696E746572761E +:10073000616C286D73290A333A096D61785F7370B3 +:100740006565640A343A0974696D655F746F5F6D3D +:1007500061780A353A09776865656C5F6D61785F25 +:1007600073706565640A363A09776865656C5F740D +:10077000696D655F746F5F6D61780A0A703A097020 +:1007800072696E742076616C7565730A643A0973D8 +:1007900065742064656661756C74730A75703A09D6 +:1007A0002B310A646F776E3A092D310A70677570C4 +:1007B0003A092B31300A7067646F776E3A092D3130 +:1007C000300A0A7370656564203D2064656C74614D +:1007D000202A206D61785F7370656564202A202867 +:1007E000726570656174202F2074696D655F746F28 +:1007F0005F6D6178290A003F004D3E2000433E2096 +:10080000004C25640A000A092D20436F6E736F6C3B +:1008100065202D0A4553432F713A09717569740A91 +:100820006D3A096D6F7573656B65790A000A092D5C +:10083000204D61676963202D0A643A096465627519 +:10084000670A783A096465627567206D6174726938 +:10085000780A6B3A096465627567206B6579626F27 +:100860006172640A6D3A096465627567206D6F751F +:1008700073650A763A0976657273696F6E0A733A20 +:10088000097374617475730A633A09636F6E736FE9 +:100890006C65206D6F64650A302D343A096C61799E +:1008A0006572302D34284631302D4634290A506186 +:1008B00075733A09626F6F746C6F616465720A00D8 +:1008C0003F0074696D65725F726561643332282917 +:1008D0003A202530346C580A006B6579626F61727A +:1008E000645F69646C653A2025580A006B6579621B +:1008F0006F6172645F70726F746F636F6C3A202502 +:10090000580A00686F73745F6B6579626F61726417 +:100910005F6C65647328293A2025580A000A092D5E +:1009200020537461747573202D0A004743433A20A5 +:10093000342E392E32204156522D4C4942433A2012 +:10094000312E382E3073766E204156525F4152431D +:10095000483A20617672350A004F5054494F4E5341 +:100960003A204C554641204D4F5553454B45592053 +:1009700045585452414B455920434F4E534F4C45D7 +:1009800020434F4D4D414E44204B45594D41505F02 +:1009900053454354494F4E20343039360A004255AE +:1009A000494C443A20373738646337662D6469729E +:1009B0007479202830383A35323A3334204665622B +:1009C0002020332032303137290A005649443A205A +:1009D00030784645454428742E6D2E6B2E292050C4 +:1009E00049443A2030783041444228414442206B07 +:1009F0006579626F61726420636F6E76657274658B +:100A00007229205645523A203078303130310A0070 +:100A1000444553433A20636F6E76657274204144B7 +:100A200042206B6579626F61726420746F20555348 +:100A3000420A000A092D2056657273696F6E202DD7 +:100A40000A000A6D6F7573653A206F66660A000AC0 +:100A50006D6F7573653A206F6E0A000A6B65796277 +:100A60006F6172643A206F66660A000A6B6579628C +:100A70006F6172643A206F6E0A000A6D6174726968 +:100A8000783A206F66660A000A6D61747269783A76 +:100A9000206F6E0A000A64656275673A206F6E0AFD +:100AA000000A64656275673A206F66660A000A0A82 +:100AB000626F6F746C6F616465722E2E2E2000431E +:100AC0003E20000011241FBECFEFDAE0DEBFCDBF15 +:100AD00004B603FE27C08091DC019091DD01A09156 +:100AE000DE01B091DF018730904BA740B04BD1F4CD +:100AF0001092DC011092DD011092DE011092DF01F4 +:100B000014BE84B7877F84BF0FB6F894A8958091F0 +:100B10006000886180936000109260000FBEE0E08A +:100B2000F8E3099511E0A0E0B1E0E8EDFEE402C0D1 +:100B300005900D92A433B107D9F721E0A4E3B1E009 +:100B400001C01D92AC3DB207E1F70E94870C0C94E6 +:100B50006A270C940000FF93EF93E0913401F09129 +:100B60003501309709F00995EF91FF910895FC0147 +:100B70008591803011F0EFDFFBCF0895FF27E0E291 +:100B800030E247FF0CC0419597FF09C0EDE2609548 +:100B9000709580959095611D711D811D911D27FF98 +:100BA00002C0219530E350E2AA27660F771F881F05 +:100BB000991FAA1FA41710F0A41B63955A95A9F7B3 +:100BC000AA3008F0A95FA05DAF93F3956115710598 +:100BD0008105910541F7ED3211F4EF93F395F2178A +:100BE00018F43F93F395FBCF8F91B5DFFA95E1F7BA +:100BF0000895E991F9918591803021F0853219F0BD +:100C0000AADFF9CF089520E0E89455915532C1F359 +:100C1000503311F4689455915A3348F4505390F37B +:100C2000220F022E220F220F200D250FF4CF0EF4DB +:100C3000219589919991533619F3533729F15335F9 +:100C400059F1BC0188279927E8945C3621F48991F1 +:100C5000999168945591543639F446EF7EF077FFB8 +:100C60000DC08FEF9FEF0AC055374AE039F0583575 +:100C700040E121F0523642E009F00895FF93EF93EE +:100C80007DDFEF91FF91B7CFFF93EF93FC0181914F +:100C90008030B9F360DFFBCFFF93EF9368DFF1CFD4 +:100CA000DF93CF93CDB7DEB72596A3DFCF91DF914A +:100CB0000895282F2770E82FE695E695E695EF70C2 +:100CC000F0E0E95CFE4F87FF0AC081E090E001C0E0 +:100CD000880F2A95EAF780959081892308C081E0E2 +:100CE00090E001C0880F2A95EAF79081892B8083D4 +:100CF00008950F931F93CF93DF93569A5E9A0E94A5 +:100D000066092FEF87EA91E6215080409040E1F795 +:100D100000C000008BE692E09F938F930E945006E4 +:100D20000F900F90C1E0D0E001E512E063E08C2F5E +:100D30000E946A09009771F09F938F93DF93CF937E +:100D40001F930F930E9450060F900F900F900F90DB +:100D50000F900F909FEF29EF80E09150204080404E +:100D6000E1F700C000002196C031D105F9F663E03B +:100D700082E00E946A0999278131910511F174F48A +:100D800087309105F1F024F404970297F0F419C02C +:100D900089309105B1F00D97C1F413C08D319105E3 +:100DA00081F034F48431910561F0499771F409C000 +:100DB000843C910531F0873C910519F0813C910507 +:100DC00021F481E080934C0102C010924C0163E059 +:100DD00087E00E946A0991E0823009F090E09093E8 +:100DE0004D01992341F08EE392E09F938F930E94EF +:100DF00050060F900F9023E042E063E082E00E94F3 +:100E0000EA0981E392E09F938F930E9450060F902E +:100E10000F90C1E0D0E007E112E063E08C2F0E9468 +:100E20006A09009771F09F938F93DF93CF931F937D +:100E30000F930E9450060F900F900F900F900F90FD +:100E40000F908FEF99EF20E0815090402040E1F724 +:100E500000C000002196C031D105F9F6E7E3F1E0CA +:100E600080E18E0F11928E13FDCF0E94C5110E945A +:100E70000D098091BE0181608093BE0187E092E000 +:100E80000E94B705569A5E98DF91CF911F910F91FE +:100E90000895CF93DF938FE79BEB0197F1F700C0A5 +:100EA00000000E94E609EC01009711F481E0C3C044 +:100EB00097FD05C080914701816080934701D7FF6E +:100EC00005C0809147018E7F809347012D2F3327E6 +:100ED0002F733327BE016F737727C6FF02C060549C +:100EE0007109D6FF02C02054310940913601042E09 +:100EF000000C550B649FC001659F900D749F900D71 +:100F0000112481386FEF960714F481E89FEF9195D3 +:100F10008195910981386FEF960714F481E89FEF6E +:100F2000819580934801249FC001259F900D349F97 +:100F3000900D112481382FEF920714F481E89FEF70 +:100F400091958195910981386FEF960714F481E8A6 +:100F50009FEF8195809349018091BE0183FF60C01E +:100F600081EF91E00E94B705DF93CF938BEE91E084 +:100F70009F938F930E94500689EE91E00E94B705DF +:100F800088ED91E00E94B70580913601282F082E48 +:100F9000000C330B3F938F9383ED91E09F938F93DE +:100FA0000E94500681ED91E00E94B70580914701B3 +:100FB0001F928F938CEC91E09F938F930E94500629 +:100FC0008AEC91E00E94B70580914801282F082EF5 +:100FD000000C330B3F938F9387EC91E09F938F939B +:100FE0000E94500685EC91E00E94B705809149016E +:100FF000282F082E000C330B3F938F9382EC91E047 +:101000009F938F930E9450068FEB91E00E94B7054B +:101010008DB79EB744960FB6F8949EBF0FBE8DBF96 +:1010200087E491E00E941A128091360191E08830A5 +:101030000CF090E0890F80933601DF91CF910895F5 +:101040001F93CF93DF93C0910001D09101018FEFE7 +:101050009FEF9093010180930001CF3F8FEFD8075E +:1010600009F06AC08FE79BEB0197F1F700C0000021 +:1010700082E00E94E309EC01892B09F05DC08091B8 +:101080004D01882309F458C087E00E94E3090097C6 +:1010900009F452C09C012F77332722303105A1F08B +:1010A00048F42115310569F02130310599F4807833 +:1010B0008A641AC02330310551F02F373105A1F071 +:1010C00009C08078826410C0807889640DC08078FF +:1010D00088640AC08CEA91E09F938F930E94500627 +:1010E0000F900F9081E18FC0292F33272F7733275F +:1010F0002130310579F050F02230310579F023307C +:10110000310581F4EC01D078D86416C0EC01D078B8 +:10111000D26412C0EC01D078DA640EC0EC01D07851 +:10112000D9640AC089E991E09F938F930E94500689 +:101130000F900F9080E167C08091BE0181FF18C0C1 +:10114000209709F45DC085E891E00E94B705DF9320 +:10115000CF9380E891E09F938F930E9450068EE793 +:1011600091E00E94B7050F900F900F900F9003C071 +:10117000209709F445C0CF379FE7D90711F48FE7CF +:1011800005C0CF3F8FEFD80721F48FEF0E9459069B +:1011900039C02D2F3327822F1C2F2F3F310581F48B +:1011A000DF93CF9380E691E09F938F930E94500648 +:1011B0000E9479060F900F900F900F908C2F23C0F4 +:1011C00090914C01992381F0A9014F775527423323 +:1011D000510521F42078822F8A6006C04A305105DB +:1011E00019F42078822F82630E9459061F3F51F024 +:1011F000DC2FCC27CF6FD0930101C093000102C038 +:1012000080E001C081E0DF91CF911F910895E82F28 +:10121000F0E0E95CFE4F80810895682F609582E0E0 +:101220000C94240A509A83E091E00197F1F700C0F2 +:10123000000050989AEB9A95F1F700C00895509AE3 +:101240008AEB8A95F1F700C0509883E091E001970E +:10125000F1F700C000000895EF92FF920F931F93E3 +:10126000CF93DF93C0E0D0E090E8E92EF12C082F77 +:1012700010E0C7010C2E02C0959587950A94E2F7FD +:1012800080239123892B19F00E941F0902C00E941C +:1012900012092196C830D10561F7DF91CF911F91D6 +:1012A0000F91FF90EF900895489B06C023E02A9588 +:1012B000F1F700000197C1F70895489906C023E0AF +:1012C0002A95F1F700000197C1F7089558985098B2 +:1012D00008950895CF92DF92EF92FF920F931F939C +:1012E000CF93DF931F92CDB7DEB7182FF894509AA3 +:1012F00083EF9BE00197F1F700C0000069830E9433 +:101300001F0969816C6020E1129FC0011124862BA6 +:101310000E942C090E94120984EF91E00E945D094D +:10132000892B21F4789482EE9FEF43C084EF91E003 +:101330000E945409009711F478943BC011E1C12C2C +:10134000D12C02E882E890E00E945D097C018823AC +:1013500051F199270E945409882329F1CC0CDD1CF6 +:10136000902F9E19E81A9E1518F46894C0F806C0CC +:10137000113121F478948CEE9FEF1BC0115011F7BE +:101380008FE591E00E945D09892B21F478948BEE22 +:101390009FEF0FC08BE590E00E945409892BB1F7B5 +:1013A0007894C60106C07894812F90E0919581953C +:1013B00091090F90DF91CF911F910F91FF90EF90C6 +:1013C000DF90CF90089560E00C946A0960E083E0BC +:1013D0000C946A091F93CF93DF9300D01F92CDB76F +:1013E000DEB7182FF894509A83EF9BE00197F1F73E +:1013F00000C000002B834A8369830E941F09698112 +:10140000686030E1139FC0011124862B0E942C09D3 +:101410000E9412098FE193E00197F1F700C00000EC +:101420000E941F094A81842F0E942C092B81822F40 +:101430000E942C090E94120978940F900F900F902F +:10144000DF91CF911F910895262F277040E062E031 +:101450000C94EA0980915A0108959FB7F89410926C +:1014600051019FBF9091D301943009F057C09091E2 +:10147000E9009F703091EC00232F217030FD20E8AF +:10148000922B24E02093E9002091EB0020FF43C041 +:101490002091EE0027FF3FC020914E01222321F032 +:1014A0002091E80025FF37C010924E0126E03091D0 +:1014B000E80035FD15C03091D301343061F530912D +:1014C000EB0035FD28C0215021F481E080934E01CE +:1014D00022C0EFE9FFE03197F1F700C00000E7CF4D +:1014E0008093F1008091E80085FD0AC08091E800BA +:1014F00080FFFCCF8091E8008E778093E80006C0E3 +:101500008FB7F89421E0209351018FBF9F70909383 +:10151000E90080E008959F709093E9008FEF0895AF +:10152000CF93DF9300D01F92CDB7DEB79C0180919F +:10153000D301843019F593E099833B832A839093F8 +:10154000E9008FEF9091E800815095FD06C095ED80 +:101550009A95F1F700008111F5CF8091E80085FFA1 +:101560000DC040E050E063E070E0CE0101960E94C3 +:10157000490D8091E8008E778093E8000F900F90DE +:101580000F90DF91CF910895CF93DF9300D01F92FA +:10159000CDB7DEB72091D301243021F522E0298395 +:1015A0009B838A8383E08093E9008FEF9091E8002A +:1015B000815095FD06C095ED9A95F1F700008111D7 +:1015C000F5CF8091E80085FF0DC040E050E063E07A +:1015D00070E0CE0101960E94490D8091E8008E775F +:1015E0008093E8000F900F900F90DF91CF910895B6 +:1015F0002091D3012430F1F422E02093E9002FEF71 +:101600003091E800215035FD06C035ED3A95F1F7EF +:1016100000002111F5CF2091E80025FF0BC040E02C +:1016200050E065E070E00E94490D8091E8008E77FF +:101630008093E8000895CF93DF932091D301243065 +:1016400039F521E02093E9002FEF3091E800215097 +:1016500035FD06C035ED3A95F1F700002111F5CFC3 +:101660002091E80025FF14C0EC0140E050E068E064 +:1016700070E00E94490D8091E8008E778093E80029 +:1016800088E0FE01A2E5B1E001900D928A95E1F7B4 +:10169000DF91CF91089587EA92E00E94B70580918B +:1016A000D201811109C00E94DE0E0E943B0F809181 +:1016B000E20084608093E200089583EA92E00E9451 +:1016C000B7051092D2010895089520914F012F5F20 +:1016D000822F62E30E943027992319F020934F0153 +:1016E000089510924F0180915101882371F18091EA +:1016F000D301843041F58091E9008F702091EC0096 +:10170000922F917020FD90E8892B94E09093E9004E +:101710009091EB0090FF14C09091EE0097FF10C0E5 +:101720009091E80095FF03C01092F100F9CF9091DD +:10173000E80090FF05C09091E8009E779093E80044 +:101740008F708093E90010925101089542E061EC9E +:1017500081E00E94580E42E061EC82E00E94580E47 +:1017600042E061EC83E00E94580E42E261EC84E0CA +:101770000C94580E8091D501833009F453C030F495 +:10178000813071F0823009F48CC008958A3009F4F8 +:1017900078C08B3009F45EC0893009F09AC020C04F +:1017A0008091D401813A09F094C08091E800877F4C +:1017B0008093E8008091D8019091D901892B21F480 +:1017C00068E082E591E003C060E080E090E070E0D6 +:1017D0000E94940D8091E8008B778093E800089533 +:1017E0008091D401813209F074C08091D801909128 +:1017F000D901892B09F06DC08091E800877F809323 +:10180000E8008091E80082FD05C08091D30181113C +:10181000F8CF5FC08091F10080935A018091E80079 +:101820008B7753C08091D401813A09F052C08091E6 +:10183000D8019091D901892B09F04BC08091E80023 +:10184000877F8093E8008091E80080FFFCCF809143 +:101850000C0136C08091D4018132D9F58091D80134 +:101860009091D901892BA9F58091E800877F809319 +:10187000E8000E948D0E8091D60180930C010C949B +:101880004A188091D401813221F58091E800877F48 +:101890008093E8000E948D0E8091D70180935B01B8 +:1018A00008958091D401813AA1F48091E800877F66 +:1018B0008093E8008091E80080FFFCCF80915B017D +:1018C0008093F1008091E8008E778093E8000C947B +:1018D0008D0E08950895089580915A0180935001C6 +:1018E00010925A0180E00E940D090E944A130C9444 +:1018F0004A180C946C0C0E944E1E8091D1018823D2 +:1019000029F00E94771E81110C94330D089584B73D +:10191000877F84BF0FB6F894A89580916000886196 +:1019200080936000109260000FBE90E080E80FB6D8 +:10193000F89480936100909361000FBE8DE29AE06D +:101940000E941F1E8BE992E00E94B7050E946A0C5C +:101950000E9481120E94DE0E0E943B0F8091E200E5 +:1019600084608093E20078948091D3018430E1F721 +:101970008AE892E00E94B7050E94831282E091E01B +:101980000E94C01189E792E00E94B7050E946B0C8B +:101990008091D301853019F40E947B0CF9CF0E940D +:1019A0008912F6CF0E948B1E8091500180935A01BC +:1019B00008950C94D20C292F332723303105C9F018 +:1019C00064F42130310581F02230310509F043C043 +:1019D00084E790E02FEE32E042C021323105F1F091 +:1019E0002232310541F137C082E190E023E633E055 +:1019F00036C099278130910541F08230910541F040 +:101A0000892B49F5EBEEF2E005C0EBEDF2E002C008 +:101A1000EBEAF2E0849190E09F0121C06430D8F4B9 +:101A2000E62FF0E0EE0FFF1FEF5DFE4F20813181CA +:101A300089E090E014C0643070F470E0FB01EE0FB8 +:101A4000FF1FE75EFE4F20813181FB01EB5EFE4F01 +:101A5000808190E004C080E090E020E030E0FA0176 +:101A600031832083089580E189BD82E189BD09B475 +:101A700000FEFDCF8091D8008F7D8093D8008091AB +:101A8000E00082608093E0008091E00081FDFCCF67 +:101A90000895CF92DF92EF92FF920F931F93CF930F +:101AA000DF93EC018B016A010E94AC0E811133C0FF +:101AB000C114D10439F0F60180819181081B190B02 +:101AC000C80FD91FE12CF12C0115110519F18091D6 +:101AD000E80085FD16C08091E8008E778093E800CD +:101AE000C114D10449F0F60180819181E80EF91EFC +:101AF000F182E08285E00FC00E94AC0E882321F3C2 +:101B00000AC089918093F10001501109FFEFEF1A8B +:101B1000FF0ADACF80E0DF91CF911F910F91FF9004 +:101B2000EF90DF90CF9008952091DA013091DB01A2 +:101B30002617370748F06115710539F42091E80040 +:101B40002E772093E80001C0B90140E061157105CE +:101B5000A9F12091D301222309F443C0253009F4CF +:101B600042C02091E80023FD40C02091E80022FD02 +:101B700032C02091E80020FFE9CF4091F30020918E +:101B8000F20030E0342BFC01CF016115710559F0F2 +:101B90002830310540F481918093F1006150710942 +:101BA0002F5F3F4FF1CF41E02830310509F040E091 +:101BB0002091E8002E772093E800C8CF4111C9CFCB +:101BC0000AC08091D301882361F0853061F0809153 +:101BD000E80083FD0AC08091E80082FFF2CF80E038 +:101BE000089582E0089583E0089581E008952091AA +:101BF000DA013091DB012617370748F061157105CE +:101C000039F42091E8002E772093E80001C0B90153 +:101C1000FC0120E06115710591F18091D3018823C9 +:101C200009F440C0853009F43FC08091E80083FD8D +:101C30003DC08091E80082FD2FC08091E80080FFC8 +:101C4000E9CF2091F3008091F20090E0922B611592 +:101C5000710559F08830910540F424912093F100EA +:101C60003196615071090196F2CF21E0089709F091 +:101C700020E08091E8008E778093E800CBCF21119F +:101C8000CCCF0AC08091D301882361F0853061F008 +:101C90008091E80083FD0AC08091E80082FFF2CFC6 +:101CA00080E0089582E0089583E0089581E008953A +:101CB000982F973058F59093E900981739F0709164 +:101CC000EC002091ED005091F00003C0242F762FFE +:101CD00050E021FF19C03091EB003E7F3093EB00C4 +:101CE0003091ED003D7F3093ED003091EB0031609D +:101CF0003093EB007093EC002093ED005093F000D4 +:101D00002091EE0027FF07C09F5FD3CF8F70809395 +:101D1000E90081E0089580E008958091D40187FF73 +:101D200011C08091E80082FD05C08091D30181112E +:101D3000F8CF11C08091E8008B770BC08091D30160 +:101D4000882349F08091E80080FFF8CF8091E80077 +:101D50008E778093E80008952091E4003091E500AB +:101D600095E64091EC00842F817040FF22C0809165 +:101D7000E80080FD1CC08091D301882391F085305C +:101D800091F08091EB0085FD10C04091E4005091EE +:101D9000E5004217530729F39A01915011F784E0A7 +:101DA000089582E0089583E0089581E0089580E039 +:101DB00008954091E80042FFDECF08950E944C0F45 +:101DC0000E94540FE0EEF0E0808181608083E8EDB6 +:101DD000F0E080818F77808319BCA7EDB0E08C9113 +:101DE0008E7F8C9380818F7E80831092D2010895A4 +:101DF0000F931F93CF93DF930E944C0F0E94540FB9 +:101E0000C8EDD0E088818F77888388818068888357 +:101E100088818F7D888319BC1092D3011092CF01E5 +:101E20001092D1011092D00100EE10E0F8018081F3 +:101E30008B7F808388818160888342E060E080E0DE +:101E40000E94580EE1EEF0E080818E7F8083E2EE0A +:101E5000F0E0808181608083808188608083F801E8 +:101E600080818E7F8083888180618883DF91CF919C +:101E70001F910F910895E8EDF0E080818F7E8083BF +:101E8000E7EDF0E080818160808384E082BF81E0C3 +:101E90008093D2010C94F80EE8EDF0E080818E7F03 +:101EA00080831092E20008951092DA001092E1000F +:101EB00008951F920F920FB60F9211242F933F9304 +:101EC0004F935F936F937F938F939F93AF93BF9342 +:101ED000EF93FF938091E10082FF0BC08091E200BD +:101EE00082FF07C08091E1008B7F8093E1000E9418 +:101EF000650B8091DA0080FF1FC08091D80080FFC1 +:101F00001BC08091DA008E7F8093DA008091D90027 +:101F100080FF0DC080E189BD82E189BD09B400FE6A +:101F2000FDCF81E08093D3010E944B0B05C019BC0B +:101F30001092D3010E945D0B8091E10080FF19C0D7 +:101F40008091E20080FF15C08091E2008E7F809337 +:101F5000E2008091E20080618093E2008091D800ED +:101F600080628093D80019BC85E08093D3010E94E1 +:101F7000790C8091E10084FF30C08091E20084FF01 +:101F80002CC080E189BD82E189BD09B400FEFDCF8E +:101F90008091D8008F7D8093D8008091E1008F7E62 +:101FA0008093E1008091E2008F7E8093E200809137 +:101FB000E20081608093E2008091CF01882311F0DC +:101FC00084E007C08091E30087FD02C081E001C08A +:101FD00083E08093D3010E94D90C8091E10083FFBC +:101FE00029C08091E20083FF25C08091E100877FB6 +:101FF0008093E10082E08093D3011092CF01809121 +:10200000E1008E7F8093E1008091E2008E7F8093DB +:10201000E2008091E20080618093E20042E060E0B3 +:1020200080E00E94580E8091F00088608093F0005C +:102030000E94640BFF91EF91BF91AF919F918F919F +:102040007F916F915F914F913F912F910F900FBEB4 +:102050000F901F9018951F920F920FB60F92112498 +:102060002F933F934F935F936F937F938F939F93A0 +:10207000AF93BF93CF93DF93EF93FF93C091E900AA +:10208000CF708091EC00D82FD17080FDD0E81092F5 +:10209000E9008091F000877F8093F00078940E949F +:1020A0006F101092E9008091F00088608093F0003A +:1020B000CD2BCF70C093E900FF91EF91DF91CF91CD +:1020C000BF91AF919F918F917F916F915F914F9150 +:1020D0003F912F910F900FBE0F901F9018951F9357 +:1020E000CF93DF93CDB7DEB7AA970FB6F894DEBFD4 +:1020F0000FBECDBFE4EDF1E088E08E0F9091F100CE +:1021000091938E13FBCF0E94BA0B8091E80083FF5E +:102110001FC18091D4019091D501492F50E04A30E0 +:10212000510508F015C1FA01EA5AFF4F0C945027E7 +:10213000803881F0823809F00BC18091D8018F700E +:102140008093E9008091EB0085FB882780F910924D +:10215000E90006C08091D0019091D1019111826077 +:102160009091E800977F9093E8008093F10010929F +:10217000F100C8C0282F2D7F09F0EAC0882319F08C +:10218000823061F0E5C08091D601813009F0E0C075 +:10219000933009F080E08093D1012BC08091D6016B +:1021A000811127C08091D8018F7009F4D1C080932C +:1021B000E9002091EB0020FF1CC0933021F48091B6 +:1021C000EB00806214C09091EB0090619093EB0063 +:1021D00021E030E0A90102C0440F551F8A95E2F7C3 +:1021E0004093EA001092EA008091EB0088608093AF +:1021F000EB001092E9008091E800877F86C0811192 +:10220000A7C01091D6011F778091E3008078812BC1 +:102210008093E3008091E800877F8093E8000E942C +:102220008D0E8091E80080FFFCCF8091E3008068F4 +:102230008093E300111102C082E001C083E080932B +:10224000D30186C08058823008F082C08091D601C8 +:102250009091D7018C3D53E0950779F583E08A830F +:102260008AE289834FB7F894DE01139620E03EE0BE +:1022700051E2E32FF0E050935700E49120FF03C0B8 +:10228000E295EF703F5FEF708E2F90E0EA3010F034 +:10229000C79601C0C0968D939D932F5F243149F757 +:1022A0004FBF8091E800877F8093E8006AE270E08A +:1022B000CE0101960E94940D14C0AE014F5F5F4F96 +:1022C0006091D8010E94DB0CBC01892B09F440C04D +:1022D0009091E800977F9093E80089819A810E940D +:1022E000F70D8091E8008B778093E80031C080384B +:1022F00079F58091E800877F8093E8008091CF0195 +:102300008093F1008091E8008E778093E8000E942E +:102310008D0E1EC081111CC09091D6019230C0F468 +:102320008091E800877F8093E8009093CF010E941E +:102330008D0E8091CF01811106C08091E30087FD51 +:1023400002C081E001C084E08093D3010E94A60B0B +:102350008091E80083FF0AC08091E800877F809326 +:10236000E8008091EB0080628093EB00AA960FB6A4 +:10237000F894DEBF0FBECDBFDF91CF911F910895BE +:1023800090936101809360010895E0916001F09164 +:102390006101309721F00190F081E02D099480E0F7 +:1023A0000895EF92FF920F931F93CF93DF93E091E5 +:1023B0006001F09161013097B1F18C010280F381ED +:1023C000E02D09958091BE0182FF2DC080FF04C0E1 +:1023D00080E894E00E94B705E80118E08AE7E82E5B +:1023E00084E0F82E8091BE0180FF0BC088811F928F +:1023F0008F93FF92EF920E9450060F900F900F90D4 +:102400000F90115021961111EDCF8091BE0180FFE8 +:102410000AC088E794E0DF91CF911F910F91FF9060 +:10242000EF900C94B705DF91CF911F910F91FF9022 +:10243000EF900895E0916001F0916101309721F0F3 +:102440000480F581E02D09940895CF93DF93EC018A +:1024500080915E0190915F01C817D90709F1D0936F +:102460005F01C0935E01E0916001F09161013097DE +:10247000B9F00680F781E02DCE0109958091BE016B +:1024800082FF0EC080FF0CC0DF93CF938AE694E0FA +:102490009F938F930E9450060F900F900F900F9074 +:1024A000DF91CF910895CF93DF93EC0180915C0190 +:1024B00090915D01C817D90709F1D0935D01C093D0 +:1024C0005C01E0916001F09161013097B9F0008406 +:1024D000F185E02DCE0109958091BE0182FF0EC0ED +:1024E00080FF0CC0DF93CF938AE594E09F938F9396 +:1024F0000E9450060F900F900F900F90DF91CF9198 +:1025000008950C944B130E94B81E0E9479060C94F7 +:102510006909CF92DF92EF92FF920F931F93CF93AF +:10252000DF9300D000D000D0CDB7DEB70E942008E6 +:1025300083E6C82E81E0D82E00E010E0E02E802F48 +:102540000E940709F60141916F01F42EF826B1F4BB +:102550000F5F1F4F0031110589F78FEF89838A8341 +:102560001B820E94C11E8160782F9D838C834981CC +:102570005A816B818D810E949D1347C09091BE014D +:1025800091FF04C08E830E9467138E8120E030E0AB +:102590004F2D50E0922FBA01022E02C0759567951B +:1025A0000A94E2F760FF2BC02983EA8221E030E041 +:1025B000690102C0CC0CDD1C9A95E2F790E08C21F9 +:1025C0009D21892B09F420E02B830E94C11E81608C +:1025D000782F9D838C8349815A816B818D810E94E4 +:1025E0009D1349815A816B817C818D810E943B1EA4 +:1025F000F801ED59FE4F8081C826C08206C02F5FCA +:102600003F4F2830310531F6A3CF0E943A1E0E9479 +:1026100082210E944907109162010E94C51118177A +:1026200041F10E94C511809362019091BE0192FF19 +:102630000EC090FF0CC01F928F938BE894E09F9385 +:102640008F930E9450060F900F900F900F908091E3 +:10265000620126960FB6F894DEBF0FBECDBFDF91A4 +:10266000CF911F910F91FF90EF90DF90CF900C943E +:102670004C1E26960FB6F894DEBF0FBECDBFDF917D +:10268000CF911F910F91FF90EF90DF90CF90089521 +:102690000C940D0908950895CF93DF931F92CDB741 +:1026A000DEB769830E94070990E021E030E069818C +:1026B00002C0220F331F6A95E2F72823392381E0F5 +:1026C000232B09F480E00F90DF91CF910895EF92D2 +:1026D000FF920F931F93CF93DF9384EA94E00E94BD +:1026E000B705C0E0D0E089E2E82E81E0F82E06E9E7 +:1026F00014E08C2F0E9407090E94241EFF92EF9283 +:102700001F928F93DF93CF931F930F930E945006D6 +:1027100021968DB79EB708960FB6F8949EBF0FBE50 +:102720008DBFC031D10529F7DF91CF911F910F9156 +:10273000FF90EF90089508950895CF93DF93CDB75C +:10274000DEB72B970FB6F894DEBF0FBECDBF942F28 +:102750004F83252F588769877A878B874A855B85C2 +:10276000452B21F02F3F09F59F3FF9F4DE0111962B +:1027700086E0FD0111928A95E9F785E0FE01379622 +:1027800001900D928A95E1F749815A816B817C8194 +:102790008D819E810E94F51A2B960FB6F894DEBFAC +:1027A0000FBECDBFDF91CF9108954F8158856985C8 +:1027B0007A858B850E943B1ED9CFCF93882309F45D +:1027C000A9C0C82F8238A1F40E94C51181FDA2C002 +:1027D00089E30E94801D0E94F91D2FEF81EE94E095 +:1027E000215080409040E1F700C0000089E315C00F +:1027F0008338C1F40E94C51180FD8CC083E50E941E +:10280000801D0E94F91D2FEF81EE94E02150804041 +:102810009040E1F700C0000083E50E949D1DCF912C +:102820000C94F91D8438A1F40E94C51182FD72C078 +:1028300087E40E94801D0E94F91D2FEF81EE94E035 +:10284000215080409040E1F700C0000087E4E5CFD0 +:102850008CEF8C0F813A20F080E58C0F8E3248F49B +:102860008C2F0E94AC24811155C08C2F0E94801D9A +:10287000D6CF80E28C0F883048F4C77081E001C069 +:10288000880FCA95EAF70E94BF1DC9CF8BE58C0F50 +:10289000833078F4C53A29F0C63A31F083E890E005 +:1028A00005C081E890E002C082E890E0CF910C94EE +:1028B000251288E58C0F853168F5C83A89F0C93A48 +:1028C00091F0CA3A99F0CB3AA1F0CC3AA9F0CD3ABE +:1028D000B1F0CE3AB9F0CF3AC1F080E090E017C045 +:1028E00082EE90E014C089EE90E011C08AEE90E094 +:1028F0000EC085EB90E00BC086EB90E008C083EB48 +:1029000090E005C084EB90E002C087EB90E0CF91AF +:102910000C945312CF910895882309F46AC0823829 +:10292000A1F40E94C51181FF64C089E30E94801D4B +:102930000E94F91D2FEF81EE94E0215080409040DD +:10294000E1F700C0000089E315C08338B9F40E94A4 +:10295000C51180FF4EC083E50E94801D0E94F91DB5 +:102960002FEF81EE94E0215080409040E1F700C0CD +:10297000000083E50E949D1D0C94F91D8438A1F48C +:102980000E94C51182FF35C087E40E94801D0E940D +:10299000F91D2FEF81EE94E0215080409040E1F747 +:1029A00000C0000087E4E6CF9CEF980F913A10F347 +:1029B00090E5980F9E32F0F290E2980F983050F424 +:1029C000877091E001C0990F8A95EAF7892F0E94DC +:1029D000C51DD2CF9BE5980F933020F480E090E0A6 +:1029E0000C942512885A853120F480E090E00C94F4 +:1029F00053120895882321F00E94BF1D0C94F91DE5 +:102A00000895882321F00E94C51D0C94F91D089596 +:102A1000BF92CF92DF92EF92FF920F931F93CF93CB +:102A2000DF9300D000D000D0CDB7DEB725E0FC01A9 +:102A3000DE01119601900D922A95E1F7FC0140818B +:102A40003181F280258122952F7063817481672BFB +:102A500009F4FEC23F3F19F44F3F09F4F9C26C017B +:102A600049833A8389819A812E830E943F1D182FC2 +:102A7000B92E0E943E1D0E944E1CEB2DE295EF7078 +:102A8000F0E0E05AFF4F2E810C9450278B2D807F71 +:102A90009B2D9F70092F882311F00295007FFF2046 +:102AA00049F0002309F481C2802F0E94D21D0E94A8 +:102AB000F91D7BC2812F0E948C14002309F4C8C227 +:102AC000802F0E94D81D26960FB6F894DEBF0FBE49 +:102AD000CDBFDF91CF911F910F91FF90EF90DF90CD +:102AE000CF90BF900C94F91D8B2D807F9B2D9F70F4 +:102AF000092F803211F00295007F112319F0113057 +:102B000009F12AC0FF20B1F0802F222351F121309A +:102B100041F526960FB6F894DEBF0FBECDBFDF910C +:102B2000CF911F910F91FF90EF90DF90CF90BF90CA +:102B30000C94E21D222319F0213009F489C20E946D +:102B4000E51D2DC0FF20F1F0263008F081C20E9463 +:102B5000BC1D802329F023C0FF20F9F0211116C0ED +:102B6000802F26960FB6F894DEBF0FBECDBFDF9143 +:102B7000CF911F910F91FF90EF90DF90CF90BF907A +:102B80000C94FA14253008F063C209C0F60185815F +:102B900080FF0BC28F708583E3CF21111BC2802F72 +:102BA00082C12B2D26952695237030E02115310505 +:102BB00021F021303105D1F04BC2FF2021F0812FCF +:102BC0009B2D937002C080E090E026960FB6F8949B +:102BD000DEBF0FBECDBFDF91CF911F910F91FF9050 +:102BE000EF90DF90CF90BF900C942512FF2021F042 +:102BF000812F9B2D937002C080E090E026960FB647 +:102C0000F894DEBF0FBECDBFDF91CF911F910F9122 +:102C1000FF90EF90DF90CF90BF900C945312812FD4 +:102C2000FF2019F00E94082002C00E947020269602 +:102C30000FB6F894DEBF0FBECDBFDF91CF911F91CD +:102C40000F91FF90EF90DF90CF90BF900C94F52004 +:102C50008B2D837009F07BC0F110FAC1812F829512 +:102C600086958770880F880F912F9F70C92ED12C61 +:102C7000E12CF12C082E04C0CC0CDD1CEE1CFF1C3A +:102C80000A94D2F714FF12C04FE050E060E070E009 +:102C900004C0440F551F661F771F8A95D2F7CB01DA +:102CA000BA01609570958095909503C060E070E0E2 +:102CB000CB012B2D269526952370422F50E04230D4 +:102CC0005105D9F04330510569F16C297D298E29D0 +:102CD0009F294130510551F126960FB6F894DEBF79 +:102CE0000FBECDBFDF91CF911F910F91FF90EF905D +:102CF000DF90CF90BF900C94631C6C297D298E29A6 +:102D00009F2926960FB6F894DEBF0FBECDBFDF9188 +:102D1000CF911F910F91FF90EF90DF90CF90BF90D8 +:102D20000C94751C0E94631CC701B60126960FB651 +:102D3000F894DEBF0FBECDBFDF91CF911F910F91F1 +:102D4000FF90EF90DF90CF90BF900C94511CFF202C +:102D500019F08B2D817001C08695882309F478C104 +:102D6000812F829586958770880F880F912F9F708D +:102D7000C92ED12CE12CF12C082E04C0CC0CDD1C6A +:102D8000EE1CFF1C0A94D2F714FF12C04FE050E073 +:102D900060E070E004C0440F551F661F771F8A95DE +:102DA000D2F7CB01BA01609570958095909503C0DC +:102DB00060E070E0CB012B2D269526952370422FE5 +:102DC00050E042305105D9F04330510569F16C298A +:102DD0007D298E299F294130510551F126960FB644 +:102DE000F894DEBF0FBECDBFDF91CF911F910F9141 +:102DF000FF90EF90DF90CF90BF900C941A1D6C293C +:102E00007D298E299F2926960FB6F894DEBF0FBE26 +:102E1000CDBFDF91CF911F910F91FF90EF90DF9089 +:102E2000CF90BF900C942C1D0E941A1DC701B601B3 +:102E300026960FB6F894DEBF0FBECDBFDF91CF91BF +:102E40001F910F91FF90EF90DF90CF90BF900C9467 +:102E5000081D103FC9F128F480E4810F803250F042 +:102E60009FC0123F09F461C008F44AC0133F09F43F +:102E700071C096C0012F00718B2D8F71FF2051F012 +:102E80000E94A11C812F002319F08295807F69CEBA +:102E90008F7067CE0E94C21C812F002319F082958B +:102EA000807F01C08F7026960FB6F894DEBF0FBEEC +:102EB000CDBFDF91CF911F910F91FF90EF90DF90E9 +:102EC000CF90BF900C940115FF20B1F0253008F091 +:102ED000BFC08B2D8F7126960FB6F894DEBF0FBE44 +:102EE000CDBFDF91CF911F910F91FF90EF90DF90B9 +:102EF000CF90BF900C94E71C263008F0A9C0E9CF12 +:102F0000FF20A9F08B2D8F7126960FB6F894DEBFA7 +:102F10000FBECDBFDF91CF911F910F91FF90EF902A +:102F2000DF90CF90BF900C94A11CFF2059F38B2D04 +:102F30008F7126960FB6F894DEBF0FBECDBFDF911E +:102F4000CF911F910F91FF90EF90DF90CF90BF90A6 +:102F50000C94C21CFF2099F08B2D8F7126960FB612 +:102F6000F894DEBF0FBECDBFDF91CF911F910F91BF +:102F7000FF90EF90DF90CF90BF900C948C1C269622 +:102F80000FB6F894DEBF0FBECDBFDF91CF911F917A +:102F90000F91FF90EF90DF90CF90BF900C94871C23 +:102FA000FF20A9F0222309F4ADCF812F26960FB67A +:102FB000F894DEBF0FBECDBFDF91CF911F910F916F +:102FC000FF90EF90DF90CF90BF900C94DD13222301 +:102FD00009F4ADCF812F26960FB6F894DEBF0FBE51 +:102FE000CDBFDF91CF911F910F91FF90EF90DF90B8 +:102FF000CF90BF900C948C144B2D4F70612FC60155 +:103000000E94821F26960FB6F894DEBF0FBECDBF7A +:10301000DF91CF911F910F91FF90EF90DF90CF90B4 +:10302000BF900C94991B4B2D4F70612FC6012696B3 +:103030000FB6F894DEBF0FBECDBFDF91CF911F91C9 +:103040000F91FF90EF90DF90CF90BF900C94851F71 +:1030500026960FB6F894DEBF0FBECDBFDF91CF919D +:103060001F910F91FF90EF90DF90CF90BF90089548 +:103070000E94DF1D0E94AE1D0E94F91D0E942722A2 +:103080000E94F52080E090E00E94251280E090E010 +:103090000C9453120E94CF1D0C9438180E943F1DAF +:1030A000292F22952F7030E02C3031054CF42A3036 +:1030B0003105C4F4225031092230310540F023C0DB +:1030C0002C303105D1F02F303105B9F01CC0853AD4 +:1030D00028F48430B0F4823028F413C090E2980FC2 +:1030E000983078F0883E30F4803E58F48450813A2D +:1030F00050F407C0803F39F404C093FB882780F95F +:10310000089581E0089580E00895CF93DF9300D083 +:1031100000D01F92CDB7DEB70F900F900F900F9099 +:103120000F90DF91CF910895CF93DF9300D000D01F +:1031300000D0CDB7DEB726960FB6F894DEBF0FBE2F +:10314000CDBFDF91CF9108951F93CF93DF93C091AF +:10315000730116E080917401C81799F0D0E01C9FAC +:10316000F0011D9FF00D1124EB58FE4F408151815D +:1031700062817381848195810E9494182196C77021 +:10318000E9CFDF91CF911F9108954091A501509112 +:10319000A6016091A7017091A8018091A901909169 +:1031A000AA010C9494188091AA0182958F7009F05D +:1031B00054C08091A701882309F44FC08091730106 +:1031C000A09174016091A5017091A6014091A801A0 +:1031D0005091A901B6E08A1709F43FC090E041156B +:1031E0005105C1F17F3F11F46F3FA1F1B89FF0018C +:1031F000B99FF00D1124EB58FE4F218172132AC0A4 +:103200002081621327C02281211124C023813481AF +:103210002417350710F421503109241B350B283CA5 +:103220003105C0F42091AA012F7020612093AA01DA +:1032300026E0289FF001299FF00D1124E658FE4F4B +:1032400080818F708061808385EA91E00E940815FB +:103250000C94A41801968770BECF0895CF92DF9288 +:10326000EF92FF920F931F93CF93DF93CDB7DEB70B +:1032700062970FB6F894DEBF0FBECDBF8C0185E01C +:10328000F801DE011D9601900D928A95E1F7D801B3 +:103290004C9111965C91119712966C91129713961E +:1032A000CD90DC9014973091A5017091A60180918A +:1032B000A8019091A901009709F46BC17F3F19F40F +:1032C0003F3F09F466C1E090A701EE2009F4C0C0B9 +:1032D0002091AA01C816D90628F0F601E81BF90BBF +:1032E000CF0104C0809590958C0D9D1DFF24F39413 +:1032F000883C910578F0F12C207F09F0C6C07C2D28 +:10330000D98AC88A89890E94851885EA91E00E9435 +:103310000815B1C0822F807F09F046C0751314C014 +:10332000341312C0611110C02F7020612093AA01C4 +:103330000E94C51885EA91E00E9408158091AA01B3 +:10334000D80115968C932EC0CD2819F15F3F11F44A +:103350004F3FF9F0F62E61111CC08091730120914E +:10336000740136E0821709F45AC090E0389FF001EA +:10337000399FF00D1124EB58FE4F7181571306C091 +:103380007081471303C07281711103C00196877069 +:10339000E9CFF62E662309F418C18091AA01816055 +:1033A0008093AA01F12C11C1751308C0341306C013 +:1033B000611104C08091AA01D801C3C04D875E8706 +:1033C0008D859E856A8B0E944E186A898823E1F15B +:1033D0006623D1F12091AA01822F82958F7090E00F +:1033E000029774F08091A5019091A60198878F8330 +:1033F0001986DB86CA862C87CE0107960E9408159F +:1034000086E0F801A5EAB1E001900D928A95E1F716 +:103410000E94D3180E94C518FF24F394D6C04D878C +:103420005E878D859E850E943F1D292F22952F70D6 +:1034300030E0223031050CF0BCC09F7009F0B6C0FE +:10344000805E883008F4C1C0C8010E940815E4CF2E +:10345000C816D90608F453C0F601E81BF90BCF01D2 +:10346000883C910508F450C0F12C7C2DD98AC88A7B +:1034700089890E948518E5EAF1E086E0DF011D9266 +:103480008A95E9F70E94C518A0C0751314C03413BB +:1034900012C0611110C08091AA01F8018583C80192 +:1034A0000E94081586E0E5EAF1E0DF011D928A95A9 +:1034B000E9F7FE2C8AC04D875E878D859E856A8BD5 +:1034C0000E944E186A89882309F4BECF662309F446 +:1034D000BBCF2091AA01822F82958F7090E0029736 +:1034E0000CF48ECF8091A5019091A6019A838983D7 +:1034F0001B82DD82CC822E83CE0101967FCF809508 +:1035000090958C0D9D1DACCFF62E662309F49CCFB3 +:1035100075132EC034132CC02091AA0120FD1FC0AA +:10352000822F82958F70D9F0D80115962C9315971C +:103530008F3049F08F5F982F9295907F822F8F70F8 +:10354000892B15968C93C8010E94081586E0F80116 +:10355000A5EAB1E001900D928A95E1F793CF86E05C +:10356000F801A5EAB1E001900D928A95E1F72DC02E +:103570004D875E878D859E850E944E18811140CFB4 +:103580008091AA0181608093AA01C8010E94081558 +:103590001CC0662309F458CF4D875E878D859E85B4 +:1035A0000E944E18882309F44FCF2ACF811148CFAB +:1035B0000CC0243031050CF047CF9F7009F440CF88 +:1035C000F8019581907F09F03BCF8F2D62960FB661 +:1035D000F894DEBF0FBECDBFDF91CF911F910F9149 +:1035E000FF90EF90DF90CF9008951F93CF93DF93DC +:1035F000CDB7DEB72C970FB6F894DEBF0FBECDBFA8 +:103600004F83588769877A878B879C87CE01079677 +:103610000E942E19882369F08F8198852A853B8521 +:10362000232BF1F19F3F09F063C08F3F09F060C089 +:1036300037C086E0FE013796DE01119601900D92AB +:103640008A95E1F76F817885EA85FB85309741F1AE +:103650007F3F11F46F3F21F12091740130E0C901E7 +:103660000196877099274091730150E08417950760 +:1036700009F447C069837A83FD83EC8396E0929FC7 +:10368000D001939FB00D1124AB58BE4FFE0131966F +:1036900001900D929A95E1F7809374010E94A4180D +:1036A00016E080917301909174018917C1F1189F00 +:1036B000C00111248B589E4F0E942E19882379F146 +:1036C000E09173011E9FF0011124EB58FE4F4081E1 +:1036D000518162817381848195810E9494188091C7 +:1036E000730190E001968770992780937301D9CF79 +:1036F0004F81588569857A858B859C850E949418B1 +:10370000CFCF0E944A181092740110927301E5EA1B +:10371000F1E086E0DF011D928A95E9F7C1CF2C9692 +:103720000FB6F894DEBF0FBECDBFDF91CF911F91D2 +:103730000895DF92EF92FF920F931F93CF93DF9341 +:10374000FC01892B09F48AC0E12CF12CDD24D394EF +:10375000EF0121968491853709F461C058F48437CC +:1037600008F04EC0843008F06AC08130D1F0823059 +:1037700071F174C0883709F45DC050F4863709F4DC +:1037800055C0873709F06AC08E2D0E94CC1D54C0E9 +:103790009CE7980F903708F061C08F770E948C14D7 +:1037A00050C08F010E5F1F4FFE01849190E2980F71 +:1037B000983050F48770FD2D01C0FF0F8A95EAF70D +:1037C0008F2F0E94D21D14C00E94DD1313C08F01E1 +:1037D0000E5F1F4FFE01C49180E28C0F883060F4B1 +:1037E000C7708D2D01C0880FCA95EAF70E94D81DB9 +:1037F0000E94F91DE80125C08C2F0E948C14FACF7D +:103800009F012E5F3F4FFE01C491CC2369F08FE9E9 +:103810009FE00197F1F700C00000C150F6CF9F0173 +:103820002E5F3F4FFE01F490E9010BC00E94BC1DCA +:10383000E82E07C00E94CF1D0E94F91D02C00E9401 +:10384000DD138F2D882341F0EFE9FFE03197F1F789 +:1038500000C000008150F6CFFE017ACFDF91CF91FA +:103860001F910F91FF90EF90DF9008956093AF014B +:103870007093B0018093B1019093B2010E944A1EEF +:103880000C9438186093AB017093AC018093AD0138 +:103890009093AE010E944B1E0C94381808950C941E +:1038A000361C0F931F930091AF011091B00120912E +:1038B000B1013091B201602B712B822B932B1F91A0 +:1038C0000F910C94361C0F931F930091AF01109130 +:1038D000B0012091B1013091B201602371238223A4 +:1038E00093231F910F910C94361C0F931F930091FB +:1038F000AF011091B0012091B1013091B201602768 +:103900007127822793271F910F910C94361C60E03A +:1039100070E0CB010C94421C0F931F9341E050E0E8 +:1039200060E070E08A019B0104C0000F111F221F9C +:10393000331F8A95D2F7C901B8011F910F910C94DA +:10394000421C0F931F9341E050E060E070E004C020 +:10395000440F551F661F771F8A95D2F78091AB01E0 +:103960009091AC01A091AD01B091AE018A019B0193 +:10397000082B192B2A2B3B2BC901B8011F910F9142 +:103980000C94421C0F931F9341E050E060E070E004 +:1039900004C0440F551F661F771F8A95D2F74095C4 +:1039A0005095609570958091AB019091AC01A0917C +:1039B000AD01B091AE018A019B01082319232A238E +:1039C0003B23C901B8011F910F910C94421C0F9326 +:1039D0001F9341E050E060E070E004C0440F551FC9 +:1039E000661F771F8A95D2F78091AB019091AC0149 +:1039F000A091AD01B091AE018A019B010827192762 +:103A00002A273B27C901B8011F910F910C94421C32 +:103A10000F931F930091AB011091AC012091AD0168 +:103A20003091AE01602B712B822B932B1F910F9144 +:103A30000C94421C0F931F930091AB011091AC01A9 +:103A40002091AD013091AE01602371238223932335 +:103A50001F910F910C94421C0F931F930091AB0187 +:103A60001091AC012091AD013091AE01602771271A +:103A7000822793271F910F910C94421C0895CF9297 +:103A8000DF92EF92FF920F931F93CF93DF938C01FE +:103A9000C090AF01D090B001E090B101F090B201C0 +:103AA0004091AB015091AC016091AD017091AE01BC +:103AB000C42AD52AE62AF72ACFE1D0E0D701C601E9 +:103AC0000C2E04C0B695A795979587950A94D2F7C2 +:103AD00080FF07C0B8018C2F0E94581F81309105CC +:103AE00031F4219758F7B80180E00E94581FDF9108 +:103AF000CF911F910F91FF90EF90DF90CF9008959D +:103B000020910D0130910E01F90132969FEF40E0B6 +:103B10005191581789F09F3F19F4511101C0942F0A +:103B20004F5F4630A9F79F3F39F0F901E90FF11DCA +:103B300097FDFA9582830895089520910D013091A3 +:103B40000E01F9013296285F3F4F9081981301C012 +:103B500010823196E217F307C1F7089581E090E0F3 +:103B6000E0910D01F0910E01E80FF91F108201960E +:103B700088309105A9F708958091BD01089590912D +:103B8000BD01892B8093BD01089580959091BD0161 +:103B900089238093BD0108958093BD0108951092FB +:103BA000BD0108959091BC01892B8093BC010895BB +:103BB00080959091BC0189238093BC010895109257 +:103BC000BC0108958093B30108951092B301089544 +:103BD00080910D0190910E01FC0131969C01285FAE +:103BE0003F4F80E0919191118F5FE217F307D1F77A +:103BF0000895E0910D01F0910E018091BD01808347 +:103C0000E0910D01F0910E0190818091BC01892B12 +:103C100080838091B301882361F0E0910D01F091E0 +:103C20000E019081892B80830E94E81D81111092E2 +:103C3000B30180910D0190910E010C94D1119093DC +:103C400035018093340108958295982F9C7C392FFB +:103C500036953695282F237344E0249FC001112404 +:103C6000932F982B292F2A7A2695892F8575880FCF +:103C7000822B08950895CF93DF9300D000D01F9238 +:103C8000CDB7DEB70F900F900F900F900F90DF9190 +:103C9000CF910895089508950C9448138091D3010D +:103CA000843021F11092BF0120E488E190E00FB64A +:103CB000F894A895809360000FBE2093600083B7AE +:103CC000817F846083BF83B7816083BF7894889548 +:103CD00083B78E7F83BF0FB6F894A895809160005C +:103CE000886180936000109260000FBE0895CF93AA +:103CF0000E949B130E9420080E949C13C0E08C2FFE +:103D00000E940709811104C0CF5FC031C1F701C013 +:103D100081E0CF9108950E944A130C944A181F9293 +:103D20000F920FB60F9211248F939F93AF93BF936F +:103D30008091BF01811113C08091C0019091C10198 +:103D4000A091C201B091C3014196A11DB11D809304 +:103D5000C0019093C101A093C201B093C301BF9170 +:103D6000AF919F918F910F900FBE0F901F9018955C +:103D700082E084BD93E095BD9AEF97BD80936E007D +:103D800008952FB7F8948091C0019091C101A0913E +:103D9000C201B091C3012FBF08952FB7F89460916D +:103DA000C0017091C1018091C2019091C3012FBFE8 +:103DB0000895CF92DF92EF92FF920F931F932FB748 +:103DC000F8944091C0015091C1016091C20170917D +:103DD000C3012FBF6A017B01EE24FF248C0120E088 +:103DE00030E0C016D106E206F30610F44150510946 +:103DF0009A01281B390BC9011F910F91FF90EF9079 +:103E0000DF90CF9008951F920F920FB60F9211245A +:103E10008F939F93AF93BF938091C0019091C10105 +:103E2000A091C201B091C3010196A11DB11D809363 +:103E3000C0019093C101A093C201B093C301BF918F +:103E4000AF919F918F910F900FBE0F901F9018957B +:103E50000E94DE0EF8942FEF87EA91E62150804011 +:103E60009040E1F700C0000087E090EBDC01809318 +:103E7000DC019093DD01A093DE01B093DF019CE0B3 +:103E800088E10FB6F894A895809360000FBE9093D8 +:103E90006000FFCF28E0929FF0011124E80FF11D90 +:103EA000E052FF4F9491892F8F7092959F700895E3 +:103EB000CF93C82FCB010E944A1F282F30E080E10A +:103EC000989FA0011124422B532B4038510519F41F +:103ED00080E090E015C09770E92FF0E088E0C89F7F +:103EE000E00DF11D112484E0EE0FFF1F8A95E1F72C +:103EF000E20FF31FEE0FFF1FE050F84985919491F8 +:103F0000CF91089580E090E0089508958091C601D2 +:103F100080FF0BC06091120185E0689FB001112401 +:103F200075956795759567952BC081FF09C0609160 +:103F3000120185E0689FB00111247595679520C036 +:103F400082FF07C06091120185E0689FB0011124D3 +:103F500017C09091C7019923D1F060911101961774 +:103F600088F72091120185E0289F90011124929FEB +:103F7000A001939F500D112470E0CA010E943C27BC +:103F80006038710540F46115710539F002C065E0D3 +:103F900070E0862F08958FE7089581E0089580915D +:103FA000C60180FF08C06091100170E075956795AB +:103FB0007595679521C081FF06C06091100170E082 +:103FC0007595679519C082FF04C06091100170E07B +:103FD00010C09091C7019923C1F060910F0196170D +:103FE000A0F780911001899FC001112470E00E9408 +:103FF0003C276038710528F46115710521F0862F82 +:1040000008958FE7089581E0089561E070E0F4CFAE +:10401000803F21F40E94861F819504C0813F29F4CE +:104020000E94861F8093CA010895823F21F40E9456 +:10403000861F819504C0833F29F40E94861F8093C8 +:10404000C9010895893F19F40E94CF1F05C08A3F16 +:1040500031F40E94CF1F81958093CB0108958B3F4F +:1040600021F40E94CF1F819504C08C3F29F40E9447 +:10407000CF1F8093CC010895843F21F48091C80123 +:10408000816017C0853F21F48091C801826011C012 +:10409000863F21F48091C80184600BC0873F21F4E2 +:1040A0008091C801886005C0883F31F48091C801C3 +:1040B00080618093C80108958D3F21F48091C601ED +:1040C00081600BC08E3F21F48091C601826005C0E3 +:1040D0008F3F29F48091C60184608093C6010895C2 +:1040E000803F39F48091CA0187FF6CC01092CA01E9 +:1040F00069C0813F29F48091CA011816BCF362C0DF +:104100009091C901823F29F497FF5CC01092C901C8 +:1041100059C0833F19F41916CCF354C0893F41F4B8 +:104120008091CB0118160CF04DC01092CB014AC003 +:104130008A3F29F48091CB0187FF44C0F6CF8B3FA3 +:1041400039F48091CC0187FF3DC01092CC013AC078 +:104150008C3F29F48091CC011816BCF333C0843F06 +:1041600021F48091C8018E7F17C0853F21F4809192 +:10417000C8018D7F11C0863F21F48091C8018B7FDB +:104180000BC0873F21F48091C801877F05C0883F1D +:1041900031F48091C8018F7E8093C80113C08D3F98 +:1041A00021F48091C6018E7F0BC08E3F21F4809157 +:1041B000C6018D7F05C08F3F29F48091C6018B7F9A +:1041C0008093C6018091C90181110EC08091CA01FE +:1041D00081110AC08091CB01811106C08091CC0170 +:1041E000811102C01092C70108958091BE0183FF22 +:1041F0007EC089ED94E00E94B7058091C8011F92AE +:104200008F9384ED94E09F938F930E94500682EDEC +:1042100094E00E94B7058091C901282F082E000C58 +:10422000330B3F938F938FEC94E09F938F930E9477 +:1042300050068DEC94E00E94B7058091CA01282FAA +:10424000082E000C330B3F938F938AEC94E09F93DE +:104250008F930E94500688EC94E00E94B7058091ED +:10426000CB01282F082E000C330B3F938F9385EC46 +:1042700094E09F938F930E94500683EC94E00E94F9 +:10428000B7058091CC01282F082E000C330B3F93EB +:104290008F9380EC94E09F938F930E9450068DEB58 +:1042A00094E00E94B7058091C7011F928F938AEB1B +:1042B00094E09F938F930E94500688EB94E00E94B5 +:1042C000B7058091C6011F928F9385EB94E09F9371 +:1042D0008F930E94500682EB94E00E94B7058DB741 +:1042E0009EB74C960FB6F8949EBF0FBE8DBF88EC5C +:1042F00091E00E941A120E94C11E9093C501809302 +:10430000C40108951F93CF93DF938091C4019091CE +:10431000C5010E94D91EAC019091C701992321F0DB +:104320002091130130E006C0209114018AE0289FFB +:10433000900111244217530708F485C08091C901E8 +:10434000C091CA01D091CB011091CC01811107C05D +:10435000C11175C0D11173C0111171C074C09F3FDC +:1043600019F09F5F9093C701181624F40E94861FCE +:104370008093C9018091C90187FF05C00E94861FF3 +:1043800081958093C9011C1624F40E94861F809396 +:10439000CA018091CA0187FF05C00E94861F8195CE +:1043A0008093CA016091C901662331F1C091CA01AD +:1043B000CC2311F1062E000C770B880B990B0E9471 +:1043C000372623E333E343E35FE30E949B260E9407 +:1043D000FF256093C9016C2FCC0F770B880B990BCD +:1043E0000E94372623E333E343E35FE30E949B26E7 +:1043F0000E94FF256093CA011D1624F40E94CF1F5E +:104400008093CB018091CB0187FF05C00E94CF1F15 +:1044100081958093CB01111624F40E94CF1F8093C5 +:10442000CC018091CC0187FF05C00E94CF1F8195F0 +:104430008093CC01DF91CF911F910C94F5209F3F89 +:1044400009F08FCF97CFDF91CF911F910895E8ECBE +:10445000F1E085E0DF011D928A95E9F71092C7012E +:104460001092C60108958CEF96E00E94B7051F9246 +:1044700081E08F931F9285E08F938EEA96E09F9361 +:104480008F930E9450060F900F900F900F900F90F7 +:104490000F9008958330E9F128F4813061F0823083 +:1044A00009F10895853009F462C008F449C08630E6 +:1044B00009F474C0089580911401262F30E0280F6C +:1044C000311D2F3F310524F4680F6093140103C0A0 +:1044D0008FEF80931401809114011F928F9387EEC8 +:1044E00095E072C080911301262F30E0280F311D16 +:1044F0002F3F310524F4680F6093130103C08FEF41 +:1045000080931301809113011F928F9385ED95E0A5 +:104510005BC080911201262F30E0280F311D2F3F04 +:10452000310524F4680F6093120103C08FEF80936C +:104530001201809112011F928F9382EC95E044C08A +:1045400080911101262F30E0280F311D2F3F3105BA +:1045500024F4680F6093110103C08FEF8093110161 +:10456000809111011F928F938DEA95E02DC080916B +:104570001001262F30E0280F311D2F3F310524F484 +:10458000680F6093100103C08FEF8093100180913A +:1045900010011F928F9384E995E016C080910F015E +:1045A000262F30E0280F311D2F3F310524F4680FEE +:1045B00060930F0103C08FEF80930F0180910F0173 +:1045C0001F928F9389E795E09F938F930E945006E7 +:1045D0000F900F900F900F900895833081F128F481 +:1045E000813059F08230D1F00895853009F449C006 +:1045F000B8F1863009F456C0089580911401681707 +:1046000020F4861B8093140102C010921401809143 +:1046100014011F928F938AE695E054C08091130194 +:10462000681720F4861B8093130102C010921301B7 +:10463000809113011F928F9388E595E043C080918C +:104640001201681720F4861B8093120102C0109299 +:104650001201809112011F928F9385E495E032C080 +:1046600080911101681720F4861B8093110102C00C +:1046700010921101809111011F928F9380E395E0B8 +:1046800021C080911001681720F4861B80931001CF +:1046900002C010921001809110011F928F9387E148 +:1046A00095E010C080910F01681720F4861B80935D +:1046B0000F0102C010920F0180910F011F928F9382 +:1046C0008CEF94E09F938F930E9450060F900F9071 +:1046D0000F900F900895CF93C82F1F928F9381E072 +:1046E00098E09F938F930E94500681E090E0A0E0B5 +:1046F000B0E0BC01CD0104C0660F771F881F991F71 +:10470000CA95D2F70E944F1C0F900F900F900F90F8 +:10471000CF910C944A18CF93873288F58E3108F0E8 +:104720000BC18E3009F487C0D8F4873009F460C01B +:104730008B3009F44FC0863009F002C18091BE0170 +:10474000817F8E7F8093BE0186E098E00E94B7054E +:104750008FEB9AE00E94B70581E08093CE0146C0BE +:10476000863109F4B0C020F4803109F47AC0E8C081 +:10477000893109F491C08B3109F449C0E1C0883313 +:1047800049F150F4893209F4D5C0853309F4D2C017 +:10479000873209F0D5C0CEC0833409F4CBC028F4E9 +:1047A0008A3308F4CDC08953C8C0883409F0C8C022 +:1047B0000E944A188EEA9AE00E94B7052FEF83ED17 +:1047C00090E3215080409040E1F700C000000E943B +:1047D000281F0CC08DE298E041C085E99AE00E9454 +:1047E000B7058091BE0181608093BE01C1E0ADC07C +:1047F0008091BE01C82FC17080FFEFCF81EA9AE09F +:104800000E94B7058091BE01817F8E7F3FC090914D +:10481000BE0191FBCC27C0F981E0C827892FC0FBDE +:1048200081F98093BE01CC2319F088E89AE029C071 +:104830008AE79AE013C09091BE0192FBCC27C0F9A1 +:1048400081E0C827892FC0FB82F98093BE01CC2369 +:1048500019F08BE69AE015C08BE59AE00E94B70547 +:10486000C5CF9091BE0193FBCC27C0F981E0C8274A +:10487000892FC0FB83F98093BE01CC2351F08FE4D4 +:104880009AE00E94B7058091BE0181608093BE01CD +:104890005CC082E49AE0E2CF83E39AE00E94B7052D +:1048A00080E19AE00E94B7058BEC99E00E94B70581 +:1048B0008EE999E00E94B70589E599E00E94B70565 +:1048C0008BE299E0CBCF8DE199E00E94B7050E9481 +:1048D000C5111F928F9383E099E09F938F930E945D +:1048E000500680910C011F928F938CEE98E09F935D +:1048F0008F930E94500680915B011F928F9389EDE8 +:1049000098E09F938F930E9450060E94CD1E9F9324 +:104910008F937F936F9382EC98E09F938F930E9485 +:1049200050068DB79EB742960FB6F8949EBF0FBE45 +:104930008DBF5CCF80E001C08D510E946B2356CFAC +:1049400080EC98E00E94B705C0E08C2FCF910895CD +:1049500080E0089580E00895CF93C82F8091CE0124 +:10496000813069F020F0823009F449C040C167E02D +:104970008FE00E944C13882309F43FC106C067E012 +:104980008FE00E944C13882361F08C2F0E94A82492 +:10499000811104C08C2F0E948B232FC081E090E0F6 +:1049A0002CC08C2F0E94AA24811126C0C431E1F0B2 +:1049B00070F4CB3081F0C031D1F40E94332289EF02 +:1049C00097E00E94B70582E08093CE0115C0C932FE +:1049D00059F0C83361F486E098E00E94B7058DEF86 +:1049E00097E00E94B70508C01092CE0104C187EF7E +:1049F00097E00E94B705FFC081E08170FEC0C4321D +:104A000028F5CE3108F0C1C0CB30A1F1D0F4C730C9 +:104A100009F0D3C08EE18093140182E380931301E7 +:104A20008AE08093120184E18093110188E08093F1 +:104A3000100188E280930F018DE996E00E94B7058E +:104A4000BFC0C33149F1C431C1F0B7C0CB3409F4A0 +:104A5000A9C028F4C93289F0C83361F0AEC0C135AD +:104A600009F49EC0C23509F499C0CE3409F0A5C03E +:104A70006AE09EC00E943322A3C08091CD018823AA +:104A800019F01092CD019CC08AEA96E00E94B70509 +:104A900081E08093CE01B1C084E896E00E94B70522 +:104AA00082E796E00E94B705809114011F928F93D0 +:104AB0008FE696E09F938F930E9450068DE696E0D6 +:104AC0000E94B7058BE596E00E94B705809113011F +:104AD0001F928F9388E596E09F938F930E945006D4 +:104AE00086E596E00E94B70587E496E00E94B70548 +:104AF000809112011F928F9384E496E09F938F938D +:104B00000E94500682E496E00E94B70581E396E099 +:104B10000E94B705809111011F928F938EE296E05B +:104B20009F938F930E9450068CE296E00E94B705F7 +:104B300087E196E00E94B705809110011F928F9344 +:104B400084E196E09F938F930E94500682E196E065 +:104B50000E94B7058BEF95E00E94B70580910F0189 +:104B60001F928F9388EF95E09F938F930E9450063A +:104B700086EF95E00E94B7058DB79EB748960FB6B1 +:104B8000F8949EBF0FBE8DBF1BC0CE51EC2FF0E03E +:104B9000E65DFE4F80818093CD0112C061E003C0CD +:104BA00061E006C06AE08091CD010E944A2208C0FF +:104BB0008091CD010E94ED2203C08BE996E013C0E5 +:104BC0008091CD01882369F01F928F9385E996E04B +:104BD0009F938F930E9450060F900F900F900F900D +:104BE00004C082E996E00E94B70581E006C01092F9 +:104BF000CE0180E002C080E000CFCF9108950E94F6 +:104C000006266894B1110C94952608950E947A2680 +:104C100088F09F5798F0B92F9927B751B0F0E1F07D +:104C2000660F771F881F991F1AF0BA95C9F714C02D +:104C3000B13091F00E949426B1E008950C9494262E +:104C4000672F782F8827B85F39F0B93FCCF3869566 +:104C500077956795B395D9F73EF4909580957095C3 +:104C600061957F4F8F4F9F4F0895E89409C097FB40 +:104C70003EF490958095709561957F4F8F4F9F4F33 +:104C80009923A9F0F92F96E9BB279395F695879577 +:104C900077956795B795F111F8CFFAF4BB0F11F43A +:104CA00060FF1BC06F5F7F4F8F4F9F4F16C08823E1 +:104CB00011F096E911C0772321F09EE8872F762F17 +:104CC00005C0662371F096E8862F70E060E02AF058 +:104CD0009A95660F771F881FDAF7880F9695879544 +:104CE00097F9089557FD9058440F551F59F05F3FAD +:104CF00071F04795880F97FB991F61F09F3F79F0FE +:104D000087950895121613061406551FF2CF46957F +:104D1000F1DF08C0161617061806991FF1CF869501 +:104D20007105610508940895E894BB2766277727E5 +:104D3000CB0197F908950E94AE260C941F270E947C +:104D4000112738F00E94182720F0952311F00C94B9 +:104D500008270C940E2711240C9495260E94722685 +:104D600070F3959FC1F3950F50E0551F629FF001BE +:104D7000729FBB27F00DB11D639FAA27F00DB11DD7 +:104D8000AA1F649F6627B00DA11D661F829F222760 +:104D9000B00DA11D621F739FB00DA11D621F839FE7 +:104DA000A00D611D221F749F3327A00D611D231FBD +:104DB000849F600D211D822F762F6A2F11249F570B +:104DC00050409AF0F1F088234AF0EE0FFF1FBB1F0E +:104DD000661F771F881F91505040A9F79E3F5105CD +:104DE00080F00C9408270C9495265F3FE4F3983EDE +:104DF000D4F3869577956795B795F795E7959F5F77 +:104E0000C1F7FE2B880F911D9695879597F9089508 +:104E100097F99F6780E870E060E008959FEF80EC6D +:104E2000089500240A941616170618060906089510 +:104E300000240A9412161306140605060895092E76 +:104E40000394000C11F4882352F0BB0F40F4BF2BE5 +:104E500011F460FF04C06F5F7F4F8F4F9F4F089525 +:104E6000991B79E004C0991F961708F0961B881FBC +:104E70007A95C9F78095089597FB072E16F400944C +:104E800007D077FD09D00E94562707FC05D03EF4D5 +:104E9000909581959F4F0895709561957F4F0895E6 +:104EA000EE0FFF1F0590F491E02D0994AA1BBB1B88 +:104EB00051E107C0AA1FBB1FA617B70710F0A61B1A +:104EC000B70B881F991F5A95A9F780959095BC013B +:084ED000CD010895F894FFCF15 +:104ED800FFFF2A0A1B0BF80AC40A900A01B401282A +:104EE80008140A321E404D36221A04CD0397037562 +:104EF8000301031A0333034C0300010203040506EC +:044F0800070809008D +:106800000000EA44E944E2440400050006000700F1 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031A132003300340035A1360037004A +:10687000380082003A003B003C003D003E003F00F3 +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530067005400550056003C +:1068B000580059005A005B005C005D005E005F00FC +:1068C0006000610062006300640000005700000087 +:1068D000CD440000000000000000000000000000A7 +:1068E0000000000000006620000000000000000022 +:1068F000E000E100E200E300E400E500E600E7007C +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010001004C00010001004400450052000C +:1069600049000100010050004F0001004D004E00A1 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E000010001000100010001000100010001009F +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/adb_usb/binary/adb_usb_rev2_unimap.hex b/converter/adb_usb/binary/adb_usb_rev2_unimap.hex new file mode 100644 index 00000000..78fccbbc --- /dev/null +++ b/converter/adb_usb/binary/adb_usb_rev2_unimap.hex @@ -0,0 +1,1290 @@ +:100000000C9442050C9489050C9489050C9489057F +:100010000C9489050C9489050C9489050C94890528 +:100020000C9489050C9489050C9489050C94FB0E9D +:100030000C94AA0F0C941D1E0C9489050C94890530 +:100040000C9489050C9489050C9489050C94911ED7 +:100050000C9489050C9489050C9489050C948905E8 +:100060000C9489050C9489050C9489050C948905D8 +:100070000C948905171039102711391027117E109B +:10008000A1102711F6100911C514C514F314F314A7 +:1000900050158E15A717A717A715A717A816A816E6 +:1000A0007B17A717A7179217041607090B0A1D1B22 +:1000B00006196405141A08151C171E1F2021232277 +:1000C0002E26242D25273012182F0C13280F0D341F +:1000D0000E333136381110372B2C352A5829787BBE +:1000E00079397A504F5152726C63685680668053EA +:1000F000020103555880576D6E5462595A5B5C5D1E +:100100005E5F6F60617475663E3F403C414277447C +:1001100076466B47804365458048494A4B4C3D4D88 +:100120003B4E3A7D7E7C7F736164625F686F73745F +:100130005F6B62645F726563763A204552524F523C +:10014000282564290A000A002530345800616462B9 +:100150005F686F73745F6B62645F726563763A2089 +:10016000004552524F523A206D65646961206B65BB +:1001700079300A004552524F523A206D65646961E8 +:10018000206B6579310A005D0A0025640020002596 +:1001900064007C00253032580020002530325800A1 +:1001A0006164625F6D6F757365207261773A205B81 +:1001B000000A002530313662006164625F686F7347 +:1001C000745F6D6F7573655F726563763A20006466 +:1001D0006562756720656E61626C65642E0A005306 +:1001E00063616E3A20616464723A25642C20726502 +:1001F00067333A253034580A0041667465722069C5 +:100200006E69743A0A00466F756E643A206D6564D3 +:100210006961206B6579730A005363616E3A2061EE +:100220006464723A25642C20726567333A25303451 +:10023000580A004265666F726520696E69743A0AF1 +:10024000004B6579626F6172642073746172742E01 +:100250000A0055534220636F6E6669677572656464 +:100260002E0A000D0A696E69740A002E03410044CB +:1002700000420020006B006500790062006F0061A1 +:100280000072006400200063006F006E007600655D +:1002900000720074006500720000000E0374002EEE +:1002A000006D002E006B002E0000000403090409FD +:1002B000027400040100A0320904000001030101DE +:1002C00000092111010001224000070581030800F7 +:1002D0000A090401000103010200092111010001C2 +:1002E000224D000705820308000A090402000103E9 +:1002F00000000009211101000122360007058303D7 +:1003000008000A090403000203000000092111018A +:1003100000012222000705840320000107050403D1 +:100320002000011201100100000008EDFEDB0A01AF +:1003300001010200010631FF0974A10109751500D0 +:1003400026FF009520750881020976150026FF001A +:10035000952075089102C005010980A1018502164A +:10036000810026B7001A81002AB700751095018117 +:1003700000C0050C0901A1018503160100269C029D +:100380001A01002A9C02751095018100C00501091F +:1003900002A1010901A1000509190129051500257E +:1003A000019505750181029501750381010501091A +:1003B0003009311581257F950275088106093815A8 +:1003C00081257F950175088106050C0A3802158183 +:1003D000257F950175088106C0C005010906A101A8 +:1003E000050719E029E71500250195087501810227 +:1003F0009501750881010508190129059505750103 +:1004000091029501750391010507190029FF150057 +:1004100026FF00950675088100C0636F6E73756DC9 +:1004200065723A20253034580A0073797374656D0B +:100430003A20253034580A000A002530325820006E +:100440006B6579626F6172643A20004C45443A20D2 +:10045000253032580A00253032583A20253038628B +:1004600025730A00722F632030313233343536372A +:100470000A00290A002575002F002575005D280057 +:10048000256400200025640020002564002000254C +:1004900064007C0025303258006D6F7573656B65A4 +:1004A00079205B62746E7C782079207620685D28E4 +:1004B0007265702F61636C293A205B006D6B5F770A +:1004C0006865656C5F74696D655F746F5F6D617899 +:1004D000203D2025640A006D6B5F776865656C5F61 +:1004E0006D61785F7370656564203D2025640A0046 +:1004F0006D6B5F74696D655F746F5F6D6178203DD2 +:100500002025640A006D6B5F6D61785F73706565AF +:1005100064203D2025640A006D6B5F696E7465720E +:1005200076616C203D2025640A006D6B5F64656C0C +:100530006179203D2025640A006D6B5F77686565F1 +:100540006C5F74696D655F746F5F6D6178203D20CD +:1005500025640A006D6B5F776865656C5F6D617817 +:100560005F7370656564203D2025640A006D6B5FD4 +:1005700074696D655F746F5F6D6178203D202564DF +:100580000A006D6B5F6D61785F7370656564203D17 +:100590002025640A006D6B5F696E74657276616C0C +:1005A000203D2025640A006D6B5F64656C617920D5 +:1005B0003D2025640A000A00257500363A20776838 +:1005C00065656C5F74696D655F746F5F6D61783AC6 +:1005D00020000A00257500353A20776865656C5F54 +:1005E0006D61785F73706565643A20000A00257557 +:1005F00000343A2074696D655F746F5F6D61783A9D +:1006000020000A00257500333A206D61785F737011 +:100610006565643A20000A00257500323A20696E4B +:1006200074657276616C286D73293A20000A002582 +:100630007500313A2064656C6179282A31306D7318 +:10064000293A20000A092D2056616C756573202D0A +:100650000A004D3E004D25643E20003F0073657446 +:100660002064656661756C740A00433E20007768FB +:100670006572652064656C74613A20637572736F8E +:10068000723D25642C20776865656C3D25640A53AE +:10069000656520687474703A2F2F656E2E77696BCC +:1006A0006970656469612E6F72672F77696B692F56 +:1006B0004D6F7573655F6B6579730A000A092D20AC +:1006C0004D6F7573656B6579202D0A4553432F7106 +:1006D0003A09717569740A313A0964656C6179285F +:1006E0002A31306D73290A323A09696E746572765F +:1006F000616C286D73290A333A096D61785F7370F4 +:100700006565640A343A0974696D655F746F5F6D7D +:1007100061780A353A09776865656C5F6D61785F65 +:1007200073706565640A363A09776865656C5F744D +:10073000696D655F746F5F6D61780A0A703A097060 +:1007400072696E742076616C7565730A643A097318 +:1007500065742064656661756C74730A75703A0916 +:100760002B310A646F776E3A092D310A7067757004 +:100770003A092B31300A7067646F776E3A092D3170 +:10078000300A0A7370656564203D2064656C74618D +:10079000202A206D61785F7370656564202A2028A7 +:1007A000726570656174202F2074696D655F746F68 +:1007B0005F6D6178290A003F004D3E2000433E20D6 +:1007C000004C25640A000A092D20436F6E736F6C7C +:1007D00065202D0A4553432F713A09717569740AD2 +:1007E0006D3A096D6F7573656B65790A000A092D9D +:1007F000204D61676963202D0A643A09646562755A +:10080000670A783A096465627567206D6174726978 +:10081000780A6B3A096465627567206B6579626F67 +:100820006172640A6D3A096465627567206D6F755F +:1008300073650A763A0976657273696F6E0A733A60 +:10084000097374617475730A633A09636F6E736F29 +:100850006C65206D6F64650A302D343A096C6179DE +:100860006572302D34284631302D4634290A5061C6 +:1008700075733A09626F6F746C6F616465720A0018 +:100880003F0074696D65725F726561643332282957 +:100890003A202530346C580A006B6579626F6172BA +:1008A000645F69646C653A2025580A006B6579625B +:1008B0006F6172645F70726F746F636F6C3A202542 +:1008C000580A00686F73745F6B6579626F61726458 +:1008D0005F6C65647328293A2025580A000A092D9F +:1008E00020537461747573202D0A004743433A20E6 +:1008F000342E392E32204156522D4C4942433A2053 +:10090000312E382E3073766E204156525F4152435D +:10091000483A2061767233350A004F5054494F4EA1 +:10092000533A204C554641204D4F5553454B455960 +:100930002045585452414B455920434F4E534F4C3C +:100940004520434F4D4D414E44204B45594D41505C +:100950005F53454354494F4E20343039360A0042E4 +:1009600055494C443A20373738646337662D6469FB +:10097000727479202830383A35313A30362046655D +:10098000622020332032303137290A005649443A58 +:100990002030784645454428742E6D2E6B2E292034 +:1009A0005049443A20307830414442284144422062 +:1009B0006B6579626F61726420636F6E76657274C5 +:1009C000657229205645523A203078303130310A4C +:1009D00000444553433A20636F6E7665727420413C +:1009E0004442206B6579626F61726420746F205598 +:1009F00053420A000A092D2056657273696F6E20F2 +:100A00002D0A000A6D6F7573653A206F66660A00DD +:100A10000A6D6F7573653A206F6E0A000A6B65790F +:100A2000626F6172643A206F66660A000A6B6579CC +:100A3000626F6172643A206F6E0A000A6D617472AF +:100A400069783A206F66660A000A6D617472697887 +:100A50003A206F6E0A000A64656275673A206F6E0D +:100A60000A000A64656275673A206F66660A000AC2 +:100A70000A626F6F746C6F616465722E2E2E200097 +:100A8000433E200011241FBECFEFD4E0DEBFCDBF18 +:100A900004B603FE27C08091DC019091DD01A09196 +:100AA000DE01B091DF018730904BA740B04BD1F40D +:100AB0001092DC011092DD011092DE011092DF0134 +:100AC00014BE84B7877F84BF0FB6F894A895809131 +:100AD0006000886180936000109260000FBEE0E0CB +:100AE000F8E3099511E0A0E0B1E0E2E4FEE402C021 +:100AF00005900D92A433B107D9F721E0A4E3B1E04A +:100B000001C01D92AC3DB207E1F70E94470C0C9466 +:100B10001F270C940000FF93EF93E0913401F091B4 +:100B20003501309709F00995EF91FF910895FC0187 +:100B30008591803011F0EFDFFBCF0895FF27E0E2D1 +:100B400030E247FF0CC0419597FF09C0EDE2609588 +:100B5000709580959095611D711D811D911D27FFD8 +:100B600002C0219530E350E2AA27660F771F881F45 +:100B7000991FAA1FA41710F0A41B63955A95A9F7F3 +:100B8000AA3008F0A95FA05DAF93F39561157105D8 +:100B90008105910541F7ED3211F4EF93F395F217CA +:100BA00018F43F93F395FBCF8F91B5DFFA95E1F7FA +:100BB0000895E991F9918591803021F0853219F0FD +:100BC000AADFF9CF089520E0E89455915532C1F39A +:100BD000503311F4689455915A3348F4505390F3BC +:100BE000220F022E220F220F200D250FF4CF0EF41C +:100BF000219589919991533619F3533729F153353A +:100C000059F1BC0188279927E8945C3621F4899131 +:100C1000999168945591543639F446EF7EF077FFF8 +:100C20000DC08FEF9FEF0AC055374AE039F05835B5 +:100C300040E121F0523642E009F00895FF93EF932E +:100C40007DDFEF91FF91B7CFFF93EF93FC0181918F +:100C50008030B9F360DFFBCFFF93EF9368DFF1CF14 +:100C6000DF93CF93CDB7DEB72596A3DFCF91DF918A +:100C70000895282F2770E82FE695E695E695EF7002 +:100C8000F0E0E95CFE4F87FF0AC081E090E001C020 +:100C9000880F2A95EAF780959081892308C081E022 +:100CA00090E001C0880F2A95EAF79081892B808314 +:100CB00008950F931F93CF93DF93569A5E9A0E94E5 +:100CC00040092FEF87EA91E6215080409040E1F7FC +:100CD00000C0000083E392E09F938F930E94300650 +:100CE0000F900F90C1E0D0E009E112E063E08C2F9B +:100CF0000E944409009771F09F938F93DF93CF93E5 +:100D00001F930F930E9430060F900F900F900F903B +:100D10000F900F909FEF29EF80E09150204080408E +:100D2000E1F700C000002196C031D105F9F663E07B +:100D300082E00E94440999278131910511F174F4F0 +:100D400087309105F1F024F404970297F0F419C06C +:100D500089309105B1F00D97C1F413C08D31910523 +:100D600081F034F48431910561F0499771F409C040 +:100D7000843C910531F0873C910519F0813C910547 +:100D800021F481E080934C0102C010924C0163E099 +:100D900087E00E94440991E0823009F090E090934E +:100DA0004D01992341F086E092E09F938F930E943A +:100DB00030060F900F9023E042E063E082E00E9453 +:100DC000C40989EF91E09F938F930E9430060F90A2 +:100DD0000F90C1E0D0E00FED11E063E08C2F0E9496 +:100DE0004409009771F09F938F93DF93CF931F93E4 +:100DF0000F930E9430060F900F900F900F900F905E +:100E00000F908FEF99EF20E0815090402040E1F764 +:100E100000C000002196C031D105F9F6E7E3F1E00A +:100E200080E18E0F11928E13FDCF0E9444110E941B +:100E3000E7088091BE0181608093BE018FEC91E054 +:100E40000E949705569A5E98DF91CF911F910F915E +:100E50000895CF93DF938FE79BEB0197F1F700C0E5 +:100E600000000E94C009EC01009711F481E0BDC0B0 +:100E700097FD05C080914701816080934701D7FFAE +:100E800005C0809147018E7F80934701ED2FFF279A +:100E9000EF73FF27CE018F739927C6FF02C08054DE +:100EA0009109D6FF02C0E054F109A09136010A2E43 +:100EB000000CBB0BBD010E94D42681382FEF920796 +:100EC00014F481E89FEF22273327281B390B2138A0 +:100ED0008FEF380714F421E83FEF21952093480164 +:100EE000CF01BD010E94D42681382FEF920714F460 +:100EF00081E89FEF91958195910981382FEF9207B5 +:100F000014F481E89FEF8195809349018091BE019F +:100F100083FF60C089EB91E00E949705DF93CF9338 +:100F200083EB91E09F938F930E94300681EB91E0D9 +:100F30000E94970580EA91E00E9497058091360112 +:100F4000282F082E000C330B3F938F938BE991E0F1 +:100F50009F938F930E94300689E991E00E94970544 +:100F6000809147011F928F9384E991E09F938F9323 +:100F70000E94300682E991E00E9497058091480125 +:100F8000282F082E000C330B3F938F938FE891E0AE +:100F90009F938F930E9430068DE891E00E94970501 +:100FA00080914901282F082E000C330B3F938F931B +:100FB0008AE891E09F938F930E94300687E891E042 +:100FC0000E9497058DB79EB744960FB6F8949EBFC2 +:100FD0000FBE8DBF87E491E00E9499118091360188 +:100FE00091E088300CF090E0890F80933601DF911A +:100FF000CF9108951F93CF93DF93C0910001D091BB +:1010000001018FEF9FEF9093010180930001CF3F8B +:101010008FEFD80709F06AC08FE79BEB0197F1F7D4 +:1010200000C0000082E00E94BD09EC01892B09F09C +:101030005DC080914D01882309F458C087E00E946B +:10104000BD09009709F452C09C012F773327223045 +:101050003105A1F048F42115310569F02130310541 +:1010600099F480788A641AC02330310551F02F3703 +:101070003105A1F009C08078826410C0807889644D +:101080000DC0807888640AC084E791E09F938F93B5 +:101090000E9430060F900F9081E18FC0292F3327D7 +:1010A0002F7733272130310579F050F02230310588 +:1010B00079F02330310581F4EC01D078D86416C082 +:1010C000EC01D078D26412C0EC01D078DA640EC0A2 +:1010D000EC01D078D9640AC081E691E09F938F93A8 +:1010E0000E9430060F900F9080E167C08091BE0192 +:1010F00081FF18C0209709F45DC08DE491E00E9443 +:101100009705DF93CF9388E491E09F938F930E949C +:10111000300686E491E00E9497050F900F900F90A3 +:101120000F9003C0209709F445C0CF379FE7D90738 +:1011300011F48FE705C0CF3F8FEFD80721F48FEF71 +:101140000E94390639C02D2F3327822F1C2F2F3FA5 +:10115000310581F4DF93CF9388E291E09F938F93E1 +:101160000E9430060E9459060F900F900F900F902A +:101170008C2F23C090914C01992381F0A9014F77C6 +:1011800055274233510521F42078822F8A6006C00A +:101190004A30510519F42078822F82630E94390663 +:1011A0001F3F51F0DC2FCC27CF6FD0930101C093AC +:1011B000000102C080E001C081E0DF91CF911F916A +:1011C0000895E82FF0E0E95CFE4F80810895682FD4 +:1011D000609582E00C94FD09509A83E091E00197BC +:1011E000F1F700C0000050989AEB9A95F1F700C013 +:1011F0000895509A8AEB8A95F1F700C0509883E0E1 +:1012000091E00197F1F700C000000895EF92FF927E +:101210000F931F93CF93DF93C0E0D0E090E8E92EC7 +:10122000F12C082F10E0C7010C2E02C09595879570 +:101230000A94E2F780239123892B19F00E94F90880 +:1012400002C00E94EC082196C830D10561F7DF91F9 +:10125000CF911F910F91FF90EF900895489B06C08A +:1012600023E02A95F1F700000197C1F70895489906 +:1012700006C023E02A95F1F700000197C1F7089511 +:101280005898509808950895CF92DF92EF92FF9268 +:101290000F931F93CF93DF9300D0CDB7DEB7F894B1 +:1012A000509AE3EFFBE03197F1F700C000006A834A +:1012B00089830E94F9086A816C6089818295807FA8 +:1012C000862B0E9406090E94EC0884EF91E00E94A0 +:1012D0003709892B21F4789482EE9FEF43C084EF85 +:1012E00091E00E942E09009711F478943BC011E11F +:1012F000C12CD12C02E882E890E00E9437097C01E1 +:10130000882351F199270E942E09882329F1CC0CBA +:10131000DD1C902F9E19E81A9E1518F46894C0F8E9 +:1013200006C0113121F478948CEE9FEF1BC0115050 +:1013300011F78FE591E00E943709892B21F4789409 +:101340008BEE9FEF0FC08BE590E00E942E09892B5A +:10135000B1F77894C60106C07894812F90E09195FA +:10136000819591090F900F90DF91CF911F910F916F +:10137000FF90EF90DF90CF90089560E00C944409C7 +:1013800060E083E00C9444091F93CF93DF9300D077 +:101390001F92CDB7DEB7182FF894509A83EF9BE0D9 +:1013A0000197F1F700C000002B834A8369830E94F4 +:1013B000F9086981862F88601295107F812B0E9421 +:1013C00006090E94EC088FE193E00197F1F700C055 +:1013D00000000E94F9084A81842F0E9406092B818F +:1013E000822F0E9406090E94EC0878940F900F90BB +:1013F0000F90DF91CF911F910895262F277040E025 +:1014000062E00C94C40980915A0108959FB7F89442 +:10141000109251019FBF9091D301943009F057C0B1 +:101420009091E9009F703091EC00232F217030FDE6 +:1014300020E8922B24E02093E9002091EB0020FF8C +:1014400043C02091EE0027FF3FC020914E01222390 +:1014500021F02091E80025FF37C010924E0126E0D0 +:101460003091E80035FD15C03091D301343061F57D +:101470003091EB0035FD28C0215021F481E08093AC +:101480004E0122C0EFE9FFE03197F1F700C0000004 +:10149000E7CF8093F1008091E80085FD0AC080913C +:1014A000E80080FFFCCF8091E8008E778093E80011 +:1014B00006C08FB7F89421E0209351018FBF9F7031 +:1014C0009093E90080E008959F709093E9008FEF7A +:1014D0000895CF93DF9300D01F92CDB7DEB79C0164 +:1014E0008091D301843019F593E099833B832A835B +:1014F0009093E9008FEF9091E800815095FD06C030 +:1015000095ED9A95F1F700008111F5CF8091E800F3 +:1015100085FF0DC040E050E063E070E0CE01019631 +:101520000E94090D8091E8008E778093E8000F906B +:101530000F900F90DF91CF910895CF93DF9300D05C +:101540001F92CDB7DEB72091D301243021F522E0E0 +:1015500029839B838A8383E08093E9008FEF9091B6 +:10156000E800815095FD06C095ED9A95F1F70000D1 +:101570008111F5CF8091E80085FF0DC040E050E07B +:1015800063E070E0CE0101960E94090D8091E800B1 +:101590008E778093E8000F900F900F90DF91CF919E +:1015A00008952091D3012430F1F422E02093E90042 +:1015B0002FEF3091E800215035FD06C035ED3A950A +:1015C000F1F700002111F5CF2091E80025FF0BC0B5 +:1015D00040E050E065E070E00E94090D8091E80075 +:1015E0008E778093E8000895CF93DF932091D30105 +:1015F000243039F521E02093E9002FEF3091E80005 +:10160000215035FD06C035ED3A95F1F70000211166 +:10161000F5CF2091E80025FF14C0EC0140E050E038 +:1016200068E070E00E94090D8091E8008E77809359 +:10163000E80088E0FE01A2E5B1E001900D928A95F4 +:10164000E1F7DF91CF910895089520914F012F5F29 +:10165000822F62E30E94E526992319F020934F011F +:10166000089510924F0180915101882371F180916A +:10167000D301843041F58091E9008F702091EC0016 +:10168000922F917020FD90E8892B94E09093E900CF +:101690009091EB0090FF14C09091EE0097FF10C066 +:1016A0009091E80095FF03C01092F100F9CF90915E +:1016B000E80090FF05C09091E8009E779093E800C5 +:1016C0008F708093E90010925101089542E061EC1F +:1016D00081E00E94120E42E061EC82E00E94120E54 +:1016E00042E061EC83E00E94120E42E261EC84E091 +:1016F0000C94120E8091D501833009F453C030F45C +:10170000813071F0823009F48CC008958A3009F478 +:1017100078C08B3009F45EC0893009F09AC020C0CF +:101720008091D401813A09F094C08091E800877FCC +:101730008093E8008091D8019091D901892B21F400 +:1017400068E082E591E003C060E080E090E070E056 +:101750000E94540D8091E8008B778093E8000895F3 +:101760008091D401813209F074C08091D8019091A8 +:10177000D901892B09F06DC08091E800877F8093A3 +:10178000E8008091E80082FD05C08091D3018111BD +:10179000F8CF5FC08091F10080935A018091E800FA +:1017A0008B7753C08091D401813A09F052C0809167 +:1017B000D8019091D901892B09F04BC08091E800A4 +:1017C000877F8093E8008091E80080FFFCCF8091C4 +:1017D0000C0136C08091D4018132D9F58091D801B5 +:1017E0009091D901892BA9F58091E800877F80939A +:1017F000E8000E94470E8091D60180930C010C9462 +:10180000C9178091D401813221F58091E800877F4A +:101810008093E8000E94470E8091D70180935B017E +:1018200008958091D401813AA1F48091E800877FE6 +:101830008093E8008091E80080FFFCCF80915B01FD +:101840008093F1008091E8008E778093E8000C94FB +:10185000470E08950895089580915A01809350018C +:1018600010925A0180E00E94E7080E94C9120C946D +:10187000C9170C942C0C0E94DC1D8091D101882387 +:1018800029F00E94051E81110C94F30C089584B771 +:10189000877F84BF0FB6F894A89580916000886117 +:1018A00080936000109260000FBE90E080E80FB659 +:1018B000F89480936100909361000FBE86E09AE0F7 +:1018C0000E94B11D83E692E00E9497050E942A0CB7 +:1018D0000E9400120E94980E0E94EB0E8091E2007E +:1018E00084608093E20078948091D3018430E1F7A2 +:1018F00082E592E00E9497050E94021282E091E048 +:101900000E943F1181E492E00E9497050E942B0CF7 +:101910008091D301853019F40E943B0CF9CF0E94CD +:101920000812F6CF0E94191E8091500180935A012F +:1019300008950C94920C292F332723303105C9F0D8 +:1019400064F42130310581F02230310509F043C0C3 +:1019500084E790E02FEA32E042C021323105F1F015 +:101960002232310541F137C082E190E023E233E0D9 +:1019700036C099278130910541F08230910541F0C0 +:10198000892B49F5EBEAF2E005C0EBE9F2E002C091 +:10199000EBE6F2E0849190E09F0121C06430D8F43E +:1019A000E62FF0E0EE0FFF1FEF5DFE4F208131814B +:1019B00089E090E014C0643070F470E0FB01EE0F39 +:1019C000FF1FE75EFE4F20813181FB01EB5EFE4F82 +:1019D000808190E004C080E090E020E030E0FA01F7 +:1019E00031832083089584E089BD86E089BD09B4F0 +:1019F00000FEFDCF8091D8008F7D8093D80080912C +:101A0000E00082608093E0008091E00081FDFCCFE7 +:101A10000895CF92DF92EF92FF920F931F93CF938F +:101A2000DF93EC018B016A010E94660E811133C0C5 +:101A3000C114D10439F0F60180819181081B190B82 +:101A4000C80FD91FE12CF12C0115110519F1809156 +:101A5000E80085FD16C08091E8008E778093E8004D +:101A6000C114D10449F0F60180819181E80EF91E7C +:101A7000F182E08285E00FC00E94660E882321F388 +:101A80000AC089918093F10001501109FFEFEF1A0C +:101A9000FF0ADACF80E0DF91CF911F910F91FF9085 +:101AA000EF90DF90CF9008952091DA013091DB0123 +:101AB0002617370748F06115710539F42091E800C1 +:101AC0002E772093E80001C0B90140E0611571054F +:101AD00091F12091D301222309F440C0253009F46B +:101AE0003FC02091E80023FD3DC02091E80022FD89 +:101AF0002FC02091E80020FFE9CF2091F20030E0D4 +:101B0000FC01CF016115710559F02830310540F411 +:101B100081918093F100615071092F5F3F4FF1CFA8 +:101B200041E02830310509F040E02091E8002E77AF +:101B30002093E800CBCF4111CCCF0AC08091D301D4 +:101B4000882361F0853061F08091E80083FD0AC050 +:101B50008091E80082FFF2CF80E0089582E008954E +:101B600083E0089581E008952091DA013091DB014E +:101B70002617370748F06115710539F42091E80000 +:101B80002E772093E80001C0B901FC0120E0611527 +:101B9000710579F18091D301882309F43DC0853026 +:101BA00009F43CC08091E80083FD3AC08091E800D0 +:101BB00082FD2CC08091E80080FFE9CF8091F20087 +:101BC00090E06115710559F08830910540F4249139 +:101BD0002093F1003196615071090196F2CF21E016 +:101BE000089709F020E08091E8008E778093E80064 +:101BF000CECF2111CFCF0AC08091D301882361F0CD +:101C0000853061F08091E80083FD0AC08091E80092 +:101C100082FFF2CF80E0089582E0089583E0089586 +:101C200081E00895982F953058F59093E900981722 +:101C300039F07091EC002091ED005091F00003C05C +:101C4000242F762F50E021FF19C03091EB003E7F0A +:101C50003093EB003091ED003D7F3093ED003091FB +:101C6000EB0031603093EB007093EC002093ED00BB +:101C70005093F0002091EE0027FF07C09F5FD3CF65 +:101C80008F708093E90081E0089580E0089580914D +:101C9000D40187FF11C08091E80082FD05C08091CA +:101CA000D3018111F8CF11C08091E8008B770BC070 +:101CB0008091D301882349F08091E80080FFF8CF1C +:101CC0008091E8008E778093E80008952091E400E9 +:101CD0003091E50095E64091EC00842F817040FF43 +:101CE00022C08091E80080FD1CC08091D301882330 +:101CF00091F0853091F08091EB0085FD10C040910E +:101D0000E4005091E5004217530729F39A019150DE +:101D100011F784E0089582E0089583E0089581E05A +:101D2000089580E008954091E80042FFDECF0895D5 +:101D30000E94F50E0E94F80EE0EEF0E080818160D6 +:101D40008083E8EDF0E080818F77808319BCE3E643 +:101D5000F0E08081816080831092D20108950E941A +:101D6000F50E0E94F80E8091D8008F778093D800EE +:101D70008091D80080688093D8008091D8008F7DB2 +:101D80008093D80084E089BD86E089BD09B400FE57 +:101D9000FDCF1092D3011092CF011092D101109279 +:101DA000D00142E060E080E00E94120E8091E100EC +:101DB0008E7F8093E1008091E20081608093E20059 +:101DC0008091E20088608093E2008091E0008E7F45 +:101DD0008093E0000895E3E6F0E080818E7F8083C9 +:101DE00081E08093D2010C94AF0E1092E20008952E +:101DF0001092E10008951F920F920FB60F921124D6 +:101E00002F933F934F935F936F937F938F939F9302 +:101E1000AF93BF93EF93FF938091E10082FF0BC0DC +:101E20008091E20082FF07C08091E1008B7F809368 +:101E3000E1000E94250B8091E10080FF19C0809194 +:101E4000E20080FF15C08091E2008E7F8093E20067 +:101E50008091E20080618093E2008091D8008062EE +:101E60008093D80019BC85E08093D3010E94390C7F +:101E70008091E10084FF30C08091E20084FF2CC09B +:101E800084E089BD86E089BD09B400FEFDCF809164 +:101E9000D8008F7D8093D8008091E1008F7E809361 +:101EA000E1008091E2008F7E8093E2008091E20069 +:101EB00081608093E2008091CF01882311F084E05B +:101EC00007C08091E30087FD02C081E001C083E08C +:101ED0008093D3010E94990C8091E10083FF29C077 +:101EE0008091E20083FF25C08091E100877F80938D +:101EF000E10082E08093D3011092CF018091E10054 +:101F00008E7F8093E1008091E2008E7F8093E200DB +:101F10008091E20080618093E20042E060E080E036 +:101F20000E94120E8091F00088608093F0000E9461 +:101F3000240BFF91EF91BF91AF919F918F917F9172 +:101F40006F915F914F913F912F910F900FBE0F9026 +:101F50001F9018951F920F920FB60F9211242F9376 +:101F60003F934F935F936F937F938F939F93AF9321 +:101F7000BF93CF93DF93EF93FF93C091E900CF70AE +:101F80008091EC00D82FD17080FDD0E81092E9004C +:101F90008091F000877F8093F00078940E94EE0F8C +:101FA0001092E9008091F00088608093F000CD2BC2 +:101FB000CF70C093E900FF91EF91DF91CF91BF9176 +:101FC000AF919F918F917F916F915F914F913F91D1 +:101FD0002F910F900FBE0F901F9018951F93CF93C6 +:101FE000DF93CDB7DEB7AA970FB6F894DEBF0FBE6A +:101FF000CDBFE4EDF1E088E08E0F9091F100919378 +:102000008E13FBCF0E947A0B8091E80083FF1FC1E3 +:102010008091D4019091D501492F50E04A3051056B +:1020200008F015C1FA01E65CFF4F0C9405278038D3 +:1020300081F0823809F00BC18091D8018F708093B4 +:10204000E9008091EB0085FB882780F91092E90078 +:1020500006C08091D0019091D10191118260909140 +:10206000E800977F9093E8008093F1001092F100D0 +:10207000C8C0282F2D7F09F0EAC0882319F08230CC +:1020800061F0E5C08091D601813009F0E0C0933065 +:1020900009F080E08093D1012BC08091D60181119D +:1020A00027C08091D8018F7009F4D1C08093E900D6 +:1020B0002091EB0020FF1CC0933021F48091EB00B5 +:1020C000806214C09091EB0090619093EB0021E04E +:1020D00030E0A90102C0440F551F8A95E2F74093F2 +:1020E000EA001092EA008091EB0088608093EB0098 +:1020F0001092E9008091E800877F86C08111A7C017 +:102100001091D6011F778091E3008078812B809316 +:10211000E3008091E800877F8093E8000E94470EEB +:102120008091E80080FFFCCF8091E300806880937D +:10213000E300111102C082E001C083E08093D3016B +:1021400086C08058823008F082C08091D60190917C +:10215000D7018C3D53E0950779F583E08A838AE2C5 +:1021600089834FB7F894DE01139620E03EE051E2F8 +:10217000E32FF0E050935700E49120FF03C0E29575 +:10218000EF703F5FEF708E2F90E0EA3010F0C7964F +:1021900001C0C0968D939D932F5F243149F74FBFA7 +:1021A0008091E800877F8093E8006AE270E0CE01CA +:1021B00001960E94540D14C0AE014F5F5F4F6091B5 +:1021C000D8010E949B0CBC01892B09F440C090915E +:1021D000E800977F9093E80089819A810E94B40D6E +:1021E0008091E8008B778093E80031C0803879F5E2 +:1021F0008091E800877F8093E8008091CF018093F1 +:10220000F1008091E8008E778093E8000E94470EED +:102210001EC081111CC09091D6019230C0F48091F3 +:10222000E800877F8093E8009093CF010E94470EDB +:102230008091CF01811106C08091E30087FD02C02B +:1022400081E001C084E08093D3010E94660B8091FD +:10225000E80083FF0AC08091E800877F8093E80050 +:102260008091EB0080628093EB00AA960FB6F89401 +:10227000DEBF0FBECDBFDF91CF911F910895909328 +:102280006101809360010895E0916001F091610126 +:10229000309721F00190F081E02D099480E00895BD +:1022A000EF92FF920F931F93CF93DF93E091600122 +:1022B000F09161013097B1F18C010280F381E02D42 +:1022C00009958091BE0182FF2DC080FF04C080E48B +:1022D00094E00E949705E80118E08AE3E82E84E084 +:1022E000F82E8091BE0180FF0BC088811F928F93D2 +:1022F000FF92EF920E9430060F900F900F900F9078 +:10230000115021961111EDCF8091BE0180FF0AC0BE +:1023100088E394E0DF91CF911F910F91FF90EF90B0 +:102320000C949705DF91CF911F910F91FF90EF9043 +:102330000895E0916001F0916101309721F00480EF +:10234000F581E02D09940895CF93DF93EC018091FE +:102350005E0190915F01C817D90709F1D0935F0121 +:10236000C0935E01E0916001F09161013097B9F096 +:102370000680F781E02DCE0109958091BE0182FF94 +:102380000EC080FF0CC0DF93CF938AE294E09F934E +:102390008F930E9430060F900F900F900F90DF9157 +:1023A000CF910895CF93DF93EC0180915C019091E0 +:1023B0005D01C817D90709F1D0935D01C0935C0195 +:1023C000E0916001F09161013097B9F00084F185EE +:1023D000E02DCE0109958091BE0182FF0EC080FFE5 +:1023E0000CC0DF93CF938AE194E09F938F930E9478 +:1023F00030060F900F900F900F90DF91CF910895BE +:102400000C94CA120E94461E0E9459060C9443095D +:10241000CF92DF92EF92FF920F931F93CF93DF93B0 +:1024200000D000D000D0CDB7DEB70E94FA0783E617 +:10243000C82E81E0D82E00E010E0E02E802F0E9410 +:10244000E108F60141916F01F42EF826B1F40F5F17 +:102450001F4F0031110589F78FEF89838A831B8213 +:102460000E944F1E8160782F9D838C8349815A8101 +:102470006B818D810E941C1347C09091BE0191FF1A +:1024800004C08E830E94E6128E8120E030E04F2D42 +:1024900050E0922FBA01022E02C0759567950A94FA +:1024A000E2F760FF2BC02983EA8221E030E0690176 +:1024B00002C0CC0CDD1C9A95E2F790E08C219D21A6 +:1024C000892B09F420E02B830E944F1E8160782F16 +:1024D0009D838C8349815A816B818D810E941C135D +:1024E00049815A816B817C818D810E94C91DF801CF +:1024F000ED59FE4F8081C826C08206C02F5F3F4F36 +:102500002830310531F6A3CF0E94C81D0E941C213E +:102510000E942907109162010E944411181741F18D +:102520000E944411809362019091BE0192FF0EC0FF +:1025300090FF0CC01F928F938BE494E09F938F9336 +:102540000E9430060F900F900F900F9080916201C3 +:1025500026960FB6F894DEBF0FBECDBFDF91CF91A8 +:102560001F910F91FF90EF90DF90CF900C94DA1DA8 +:1025700026960FB6F894DEBF0FBECDBFDF91CF9188 +:102580001F910F91FF90EF90DF90CF9008950C94E2 +:10259000E70808950895CF93DF931F92CDB7DEB774 +:1025A00069830E94E10890E021E030E0698102C087 +:1025B000220F331F6A95E2F72823392381E0232B6A +:1025C00009F480E00F90DF91CF910895EF92FF9290 +:1025D0000F931F93CF93DF9384E694E00E949705B7 +:1025E000C0E0D0E089E2E82E81E0F82E06E514E0B4 +:1025F0008C2F0E94E1080E94B61DFF92EF921F925D +:102600008F93DF93CF931F930F930E9430062196F1 +:102610008DB79EB708960FB6F8949EBF0FBE8DBFBC +:10262000C031D10529F7DF91CF911F910F91FF9014 +:10263000EF90089508950895CF93DF93CDB7DEB757 +:102640002B970FB6F894DEBF0FBECDBF942F4F83EC +:10265000252F588769877A878B874A855B85452B25 +:1026600021F02F3F09F59F3FF9F4DE01119686E036 +:10267000FD0111928A95E9F785E0FE0137960190F8 +:102680000D928A95E1F749815A816B817C818D8118 +:102690009E810E94831A2B960FB6F894DEBF0FBE60 +:1026A000CDBFDF91CF9108954F81588569857A8597 +:1026B0008B850E94C91DD9CFCF93882309F4A9C067 +:1026C000C82F8238A1F40E94441181FDA2C089E381 +:1026D0000E94121D0E948B1D2FEF81EE94E021506D +:1026E00080409040E1F700C0000089E315C08338C6 +:1026F000C1F40E94441180FD8CC083E50E94121D2C +:102700000E948B1D2FEF81EE94E02150804090407D +:10271000E1F700C0000083E50E942F1DCF910C94CB +:102720008B1D8438A1F40E94441182FD72C087E49D +:102730000E94121D0E948B1D2FEF81EE94E021500C +:1027400080409040E1F700C0000087E4E5CF8CEFC7 +:102750008C0F813A20F080E58C0F8E3248F48C2F5C +:102760000E944824811155C08C2F0E94121DD6CF83 +:1027700080E28C0F883048F4C77081E001C0880F78 +:10278000CA95EAF70E94511DC9CF8BE58C0F8330A3 +:1027900078F4C53A29F0C63A31F083E890E005C0F4 +:1027A00081E890E002C082E890E0CF910C94A411FF +:1027B00088E58C0F853168F5C83A89F0C93A91F0FF +:1027C000CA3A99F0CB3AA1F0CC3AA9F0CD3AB1F09F +:1027D000CE3AB9F0CF3AC1F080E090E017C082EE77 +:1027E00090E014C089EE90E011C08AEE90E00EC037 +:1027F00085EB90E00BC086EB90E008C083EB90E0A7 +:1028000005C084EB90E002C087EB90E0CF910C9480 +:10281000D211CF910895882309F46AC08238A1F4B7 +:102820000E94441181FF64C089E30E94121D0E942E +:102830008B1D2FEF81EE94E0215080409040E1F716 +:1028400000C0000089E315C08338B9F40E94441128 +:1028500080FF4EC083E50E94121D0E948B1D2FEF4A +:1028600081EE94E0215080409040E1F700C00000EC +:1028700083E50E942F1D0C948B1D8438A1F40E94C7 +:10288000441182FF35C087E40E94121D0E948B1DF7 +:102890002FEF81EE94E0215080409040E1F700C09E +:1028A000000087E4E6CF9CEF980F913A10F390E593 +:1028B000980F9E32F0F290E2980F983050F48770A3 +:1028C00091E001C0990F8A95EAF7892F0E94571D60 +:1028D000D2CF9BE5980F933020F480E090E00C94E9 +:1028E000A411885A853120F480E090E00C94D21134 +:1028F0000895882321F00E94511D0C948B1D08958A +:10290000882321F00E94571D0C948B1D0895BF92BF +:10291000CF92DF92EF92FF920F931F93CF93DF93AB +:1029200000D000D000D0CDB7DEB725E0FC01DE013D +:10293000119601900D922A95E1F7FC0140813181B9 +:10294000F280258122952F7063817481672B09F4B1 +:10295000FEC23F3F19F44F3F09F4F9C26C014983AD +:102960003A8389819A812E830E94D11C182FB92E17 +:102970000E94D01C0E94E01BEB2DE295EF70F0E06E +:10298000EC5BFF4F2E810C9405278B2D807F9B2DB8 +:102990009F70092F882311F00295007FFF2049F0D6 +:1029A000002309F481C2802F0E94641D0E948B1DA8 +:1029B0007BC2812F0E940B14002309F4C8C2802F10 +:1029C0000E946A1D26960FB6F894DEBF0FBECDBFDB +:1029D000DF91CF911F910F91FF90EF90DF90CF90FB +:1029E000BF900C948B1D8B2D807F9B2D9F70092F8A +:1029F000803211F00295007F112319F0113009F196 +:102A00002AC0FF20B1F0802F222351F1213041F55F +:102A100026960FB6F894DEBF0FBECDBFDF91CF91E3 +:102A20001F910F91FF90EF90DF90CF90BF900C948B +:102A3000741D222319F0213009F489C20E94771DE8 +:102A40002DC0FF20F1F0263008F081C20E944E1DFB +:102A5000802329F023C0FF20F9F0211116C0802F18 +:102A600026960FB6F894DEBF0FBECDBFDF91CF9193 +:102A70001F910F91FF90EF90DF90CF90BF900C943B +:102A80007914253008F063C209C0F601858180FF02 +:102A90000BC28F708583E3CF21111BC2802F82C1AF +:102AA0002B2D26952695237030E02115310521F038 +:102AB00021303105D1F04BC2FF2021F0812F9B2D19 +:102AC000937002C080E090E026960FB6F894DEBFC7 +:102AD0000FBECDBFDF91CF911F910F91FF90EF906F +:102AE000DF90CF90BF900C94A411FF2021F0812F94 +:102AF0009B2D937002C080E090E026960FB6F8946C +:102B0000DEBF0FBECDBFDF91CF911F910F91FF9020 +:102B1000EF90DF90CF90BF900C94D211812FFF20C7 +:102B200019F00E94A21F02C00E940A2026960FB62A +:102B3000F894DEBF0FBECDBFDF91CF911F910F91F3 +:102B4000FF90EF90DF90CF90BF900C948F208B2D53 +:102B5000837009F07BC0F110FAC1812F82958695B0 +:102B60008770880F880F912F9F70C92ED12CE12C70 +:102B7000F12C082E04C0CC0CDD1CEE1CFF1C0A94AA +:102B8000D2F714FF12C04FE050E060E070E004C0E4 +:102B9000440F551F661F771F8A95D2F7CB01BA01E4 +:102BA000609570958095909503C060E070E0CB01D2 +:102BB0002B2D269526952370422F50E0423051054B +:102BC000D9F04330510569F16C297D298E299F295F +:102BD0004130510551F126960FB6F894DEBF0FBE75 +:102BE000CDBFDF91CF911F910F91FF90EF90DF90BC +:102BF000CF90BF900C94F51B6C297D298E299F29BD +:102C000026960FB6F894DEBF0FBECDBFDF91CF91F1 +:102C10001F910F91FF90EF90DF90CF90BF900C9499 +:102C2000071C0E94F51BC701B60126960FB6F89443 +:102C3000DEBF0FBECDBFDF91CF911F910F91FF90EF +:102C4000EF90DF90CF90BF900C94E31BFF2019F022 +:102C50008B2D817001C08695882309F478C1812F5E +:102C6000829586958770880F880F912F9F70C92E47 +:102C7000D12CE12CF12C082E04C0CC0CDD1CEE1C58 +:102C8000FF1C0A94D2F714FF12C04FE050E060E03E +:102C900070E004C0440F551F661F771F8A95D2F756 +:102CA000CB01BA01609570958095909503C060E066 +:102CB00070E0CB012B2D269526952370422F50E0F6 +:102CC00042305105D9F04330510569F16C297D2915 +:102CD0008E299F294130510551F126960FB6F8945F +:102CE000DEBF0FBECDBFDF91CF911F910F91FF903F +:102CF000EF90DF90CF90BF900C94AC1C6C297D2995 +:102D00008E299F2926960FB6F894DEBF0FBECDBF41 +:102D1000DF91CF911F910F91FF90EF90DF90CF90B7 +:102D2000BF900C94BE1C0E94AC1CC701B601269635 +:102D30000FB6F894DEBF0FBECDBFDF91CF911F91CC +:102D40000F91FF90EF90DF90CF90BF900C949A1C62 +:102D5000103FC9F128F480E4810F803250F09FC009 +:102D6000123F09F461C008F44AC0133F09F471C06E +:102D700096C0012F00718B2D8F71FF2051F00E94A2 +:102D8000331C812F002319F08295807F69CE8F70CC +:102D900067CE0E94541C812F002319F08295807FFA +:102DA00001C08F7026960FB6F894DEBF0FBECDBF60 +:102DB000DF91CF911F910F91FF90EF90DF90CF9017 +:102DC000BF900C948014FF20B1F0253008F0BFC0F4 +:102DD0008B2D8F7126960FB6F894DEBF0FBECDBF38 +:102DE000DF91CF911F910F91FF90EF90DF90CF90E7 +:102DF000BF900C94791C263008F0A9C0E9CFFF20C1 +:102E0000A9F08B2D8F7126960FB6F894DEBF0FBEFA +:102E1000CDBFDF91CF911F910F91FF90EF90DF9089 +:102E2000CF90BF900C94331CFF2059F38B2D8F71E2 +:102E300026960FB6F894DEBF0FBECDBFDF91CF91BF +:102E40001F910F91FF90EF90DF90CF90BF900C9467 +:102E5000541CFF2099F08B2D8F7126960FB6F89495 +:102E6000DEBF0FBECDBFDF91CF911F910F91FF90BD +:102E7000EF90DF90CF90BF900C941E1C26960FB65B +:102E8000F894DEBF0FBECDBFDF91CF911F910F91A0 +:102E9000FF90EF90DF90CF90BF900C94191CFF2013 +:102EA000A9F0222309F4ADCF812F26960FB6F8940E +:102EB000DEBF0FBECDBFDF91CF911F910F91FF906D +:102EC000EF90DF90CF90BF900C945C13222309F415 +:102ED000ADCF812F26960FB6F894DEBF0FBECDBFC3 +:102EE000DF91CF911F910F91FF90EF90DF90CF90E6 +:102EF000BF900C940B144B2D4F70612FC6010E9494 +:102F0000181F26960FB6F894DEBF0FBECDBFDF9117 +:102F1000CF911F910F91FF90EF90DF90CF90BF90D6 +:102F20000C942B1B4B2D4F70612FC60126960FB6AC +:102F3000F894DEBF0FBECDBFDF91CF911F910F91EF +:102F4000FF90EF90DF90CF90BF900C941B1F2696C0 +:102F50000FB6F894DEBF0FBECDBFDF91CF911F91AA +:102F60000F91FF90EF90DF90CF90BF9008950E9457 +:102F7000711D0E94401D0E948B1D0E94C3210E9452 +:102F80008F2080E090E00E94A41180E090E00C94FB +:102F9000D2110E94611D0C94B7170E94D11C292FD9 +:102FA00022952F7030E02C3031054CF42A30310559 +:102FB000C4F4225031092230310540F023C02C30B6 +:102FC0003105D1F02F303105B9F01CC0853A28F415 +:102FD0008430B0F4823028F413C090E2980F983017 +:102FE00078F0883E30F4803E58F48450813A50F4B2 +:102FF00007C0803F39F404C093FB882780F9089507 +:1030000081E0089580E00895CF93DF9300D000D051 +:103010001F92CDB7DEB70F900F900F900F900F90CB +:10302000DF91CF910895CF93DF9300D000D000D0EF +:10303000CDB7DEB726960FB6F894DEBF0FBECDBF74 +:10304000DF91CF910895CF93DF93C0917301809169 +:103050007401C817A1F0D0E0CE0166E070E00E94D4 +:10306000D426FC01EB58FE4F40815181628173816F +:10307000848195810E9413182196C770E8CFDF9153 +:10308000CF9108954091A5015091A6016091A701AB +:103090007091A8018091A9019091AA010C94131834 +:1030A000CF93DF938091AA0182958F7009F05CC065 +:1030B0008091A701882309F457C020917301D09112 +:1030C00074014091A501C091A601E091A801F09181 +:1030D000A9012D1709F448C030E0309709F440C029 +:1030E000CF3F11F44F3FE1F1C90166E070E00E946B +:1030F000D426DC01AB58BE4F11968C911197C813A2 +:103100002FC08C9148132CC012968C91129781116C +:1031100027C013968D919C9114978E179F0708F4E2 +:1031200001978E1B9F0B883C9105D0F48091AA01DA +:103130008F7080618093AA01C90166E070E00E94EF +:10314000D426FC01E658FE4F90819F7090619083D9 +:1031500085EA91E00E948714DF91CF910C942318A7 +:103160002F5F3F4F2770B5CFDF91CF910895BF926A +:10317000CF92DF92EF92FF920F931F93CF93DF9343 +:10318000CDB7DEB761970FB6F894DEBF0FBECDBFE7 +:103190008C0185E0F801DE011D9601900D928A9563 +:1031A000E1F7D8014C9111962C9111971296EC9061 +:1031B00012971396CD90DC9014975091A5016091D1 +:1031C000A6018091A8019091A901009709F46EC110 +:1031D0006F3F19F45F3F09F469C1B090A701BB20AC +:1031E00009F4C3C03091AA01C816D90628F0F60127 +:1031F000E81BF90BCF0104C0809590958C0D9D1DA7 +:10320000FF24F394883C910588F0F12C307F09F07D +:10321000CBC07C2DD98AC88A522F6E2D89890E94F5 +:10322000041885EA91E00E948714B4C0832F807F40 +:1032300009F049C0621314C0541312C0E11010C049 +:103240003F7030613093AA010E94421885EA91E0F4 +:103250000E9487148091AA01D80115968C9331C0E1 +:10326000CD2831F12F3F11F44F3F11F1FE2CE11029 +:103270001FC0E091730130917401E31709F45CC041 +:10328000F0E0CF0166E070E00E94D426DC01AB588C +:10329000BE4F11968C911197281307C08C9148133B +:1032A00004C012968C91811103C03196E770E5CF6E +:1032B000FE2CEE2009F416C18091AA018160809352 +:1032C000AA01F12C0FC1621308C0541306C0E1100B +:1032D00004C08091AA01D801C1C04D872E878D8579 +:1032E0009E850E94CD178823E1F1EE20D1F1209137 +:1032F000AA01822F82958F7090E0029774F08091DE +:10330000A5019091A60198878F831986DB86CA86CE +:103310002C87CE0107960E94871486E0F801A5EA63 +:10332000B1E001900D928A95E1F70E9450180E9439 +:103330004218FF24F394D6C04D872E878D859E8535 +:103340000E94D11C292F22952F7030E022303105A8 +:103350000CF0BCC09F7009F0B6C0805E883008F4E5 +:10336000C1C0C8010E948714E4CFC816D90608F46A +:1033700053C0F601E81BF90BCF01883C910508F416 +:1033800050C0F12C7C2DD98AC88A522F6E2D898984 +:103390000E940418E5EAF1E086E0DF011D928A95BB +:1033A000E9F70E9442189EC0621314C0541312C061 +:1033B000E11010C08091AA01F8018583C8010E9424 +:1033C000871486E0E5EAF1E0DF011D928A95E9F7CE +:1033D000FB2C88C04D872E878D859E850E94CD173A +:1033E000882309F4BECFEE2009F4BBCF2091AA01B7 +:1033F000822F82958F7090E002970CF48ECF80918F +:10340000A5019091A6019A8389831B82DD82CC82DB +:103410002E83CE0101967FCF809590958C0D9D1DBA +:10342000ACCFFE2CEE2009F49CCF62132EC05413B7 +:103430002CC02091AA0120FD1FC0822F82958F7081 +:10344000D9F0D80115962C9315978F3049F08F5FDE +:10345000982F9295907F822F8F70892B15968C9341 +:10346000C8010E94871486E0F801A5EAB1E0019046 +:103470000D928A95E1F795CF86E0F801A5EAB1E0D3 +:1034800001900D928A95E1F72DC04D872E878D858D +:103490009E850E94CD17811140CF8091AA01816045 +:1034A0008093AA01C8010E9487141CC0EE2009F471 +:1034B00058CF4D872E878D859E850E94CD178823F6 +:1034C00009F44FCF2ACF811148CF0CC024303105E9 +:1034D0000CF047CF9F7009F440CFF8019581907FA1 +:1034E00009F03BCF8F2D61960FB6F894DEBF0FBE6B +:1034F000CDBFDF91CF911F910F91FF90EF90DF90A3 +:10350000CF90BF900895CF93DF93CDB7DEB72C97C0 +:103510000FB6F894DEBF0FBECDBF4F8358876987C3 +:103520007A878B879C87CE0107960E94B7188823DD +:1035300071F08F8198852A853B85232B09F43FC044 +:103540009F3F09F068C08F3F09F065C038C086E032 +:10355000FE013796DE01119601900D928A95E1F7F2 +:103560006F817885EA85FB85309749F17F3F11F4BB +:103570006F3F29F18091740190E09C012F5F3F4FD4 +:10358000277033274091730150E02417350709F461 +:103590004BC069837A83FD83EC8366E070E00E9410 +:1035A000D426DC01AB58BE4F96E0FE013196019067 +:1035B0000D929A95E1F7209374010E94231880914F +:1035C0007301909174018917E9F190E066E070E071 +:1035D0000E94D4268B589E4F0E94B718882391F1E1 +:1035E0008091730190E066E070E00E94D426FC01B7 +:1035F000EB58FE4F408151816281738184819581B6 +:103600000E9413188091730190E0019687709927AA +:1036100080937301D4CF4F81588569857A858B85D6 +:103620009C850E941318CBCF0E94C9171092740179 +:1036300010927301E5EAF1E086E0DF011D928A95C0 +:10364000E9F7BDCF2C960FB6F894DEBF0FBECDBF05 +:10365000DF91CF910895DF92EF92FF920F931F9326 +:10366000CF93DF93FC01892B09F48AC0E12CF12C64 +:10367000DD24D394EF0121968491853709F461C04C +:1036800058F4843708F04EC0843008F06AC08130A6 +:10369000D1F0823071F174C0883709F45DC050F404 +:1036A000863709F455C0873709F06AC08E2D0E940D +:1036B0005E1D54C09CE7980F903708F061C08F776B +:1036C0000E940B1450C08F010E5F1F4FFE018491AA +:1036D00090E2980F983050F48770FD2D01C0FF0FD5 +:1036E0008A95EAF78F2F0E94641D14C00E945C1314 +:1036F00013C08F010E5F1F4FFE01C49180E28C0F3B +:10370000883060F4C7708D2D01C0880FCA95EAF724 +:103710000E946A1D0E948B1DE80125C08C2F0E940B +:103720000B14FACF9F012E5F3F4FFE01C491CC23B3 +:1037300069F08FE99FE00197F1F700C00000C150E8 +:10374000F6CF9F012E5F3F4FFE01F490E9010BC0C1 +:103750000E944E1DE82E07C00E94611D0E948B1D15 +:1037600002C00E945C138F2D882341F0EFE9FFE037 +:103770003197F1F700C000008150F6CFFE017ACFFB +:10378000DF91CF911F910F91FF90EF90DF900895FF +:103790006093AF017093B0018093B1019093B20137 +:1037A0000E94D81D0C94B7176093AB017093AC01C5 +:1037B0008093AD019093AE010E94D91D0C94B71770 +:1037C00008950C94C81B0F931F930091AF011091A3 +:1037D000B0012091B1013091B201602B712B822B8D +:1037E000932B1F910F910C94C81B0F931F93009163 +:1037F000AF011091B0012091B1013091B20160236D +:103800007123822393231F910F910C94C81B0F9354 +:103810001F930091AF011091B0012091B10130913F +:10382000B20160277127822793271F910F910C9473 +:10383000C81B60E070E0CB010C94D41B0F931F9366 +:1038400041E050E060E070E08A019B0104C0000F9D +:10385000111F221F331F8A95D2F7C901B8011F918A +:103860000F910C94D41B0F931F9341E050E060E044 +:1038700070E004C0440F551F661F771F8A95D2F76A +:103880008091AB019091AC01A091AD01B091AE01DE +:103890008A019B01082B192B2A2B3B2BC901B8014C +:1038A0001F910F910C94D41B0F931F9341E050E094 +:1038B00060E070E004C0440F551F661F771F8A95B3 +:1038C000D2F740955095609570958091AB0190919D +:1038D000AC01A091AD01B091AE018A019B0108231A +:1038E00019232A233B23C901B8011F910F910C947E +:1038F000D41B0F931F9341E050E060E070E004C0E0 +:10390000440F551F661F771F8A95D2F78091AB0130 +:103910009091AC01A091AD01B091AE018A019B01E3 +:10392000082719272A273B27C901B8011F910F91A2 +:103930000C94D41B0F931F930091AB011091AC0119 +:103940002091AD013091AE01602B712B822B932B16 +:103950001F910F910C94D41B0F931F930091AB01F7 +:103960001091AC012091AD013091AE016023712323 +:10397000822393231F910F910C94D41B0F931F93B9 +:103980000091AB011091AC012091AD013091AE01DD +:1039900060277127822793271F910F910C94D41BC6 +:1039A0000895CF92DF92EF92FF920F931F93CF93E0 +:1039B000DF938C01C090AF01D090B001E090B101D5 +:1039C000F090B2014091AB015091AC016091AD011A +:1039D0007091AE01C42AD52AE62AF72ACFE1D0E0B9 +:1039E000D701C6010C2E04C0B695A795979587956B +:1039F0000A94D2F780FF07C0B8018C2F0E94E91EFD +:103A00008130910531F4219758F7B80180E00E9488 +:103A1000E91EDF91CF911F910F91FF90EF90DF9002 +:103A2000CF90089520910D0130910E01F901329649 +:103A30009FEF40E05191581789F09F3F19F45111C1 +:103A400001C0942F4F5F4630A9F79F3F39F0F9012D +:103A5000E90FF11D97FDFA9582830895089520914D +:103A60000D0130910E01F9013296285F3F4F908190 +:103A7000981301C010823196E217F307C1F7089539 +:103A800081E090E0E0910D01F0910E01E80FF91F47 +:103A90001082019688309105A9F708958091BD01A3 +:103AA00008959091BD01892B8093BD010895809563 +:103AB0009091BD0189238093BD0108958093BD013C +:103AC00008951092BD0108959091BC01892B8093B7 +:103AD000BC01089580959091BC0189238093BC011D +:103AE00008951092BC0108958093B3010895109237 +:103AF000B301089580910D0190910E01FC01319662 +:103B00009C01285F3F4F80E0919191118F5FE217F8 +:103B1000F307D1F70895E0910D01F0910E01809126 +:103B2000BD018083E0910D01F0910E0190818091A3 +:103B3000BC01892B80838091B301882361F0E091DF +:103B40000D01F0910E019081892B80830E947A1DD6 +:103B500081111092B30180910D0190910E010C948E +:103B60005011909335018093340108958295982FD8 +:103B70009C7C292F26952695982F9373990F990F42 +:103B8000922B892F8A7A86959575990F892B08959E +:103B90000895CF93DF9300D000D01F92CDB7DEB74A +:103BA0000F900F900F900F900F90DF91CF9108958D +:103BB000089508950C94C7128091D301843021F1A7 +:103BC0001092BF0120E488E190E00FB6F894A89528 +:103BD000809360000FBE2093600083B7817F846074 +:103BE00083BF83B7816083BF7894889583B78E7FC6 +:103BF00083BF0FB6F894A895809160008861809388 +:103C00006000109260000FBE0895CF930E941A13B7 +:103C10000E94FA070E941B13C0E08C2F0E94E1084B +:103C2000811104C0CF5FC031C1F701C081E0CF91E5 +:103C300008950E94C9120C94C9171F920F920FB6D3 +:103C40000F9211248F939F93AF93BF938091BF01E5 +:103C5000811113C08091C0019091C101A091C20156 +:103C6000B091C3014196A11DB11D8093C0019093F5 +:103C7000C101A093C201B093C301BF91AF919F91C5 +:103C80008F910F900FBE0F901F90189582E084BD0A +:103C900093E095BD9AEF97BD80936E0008952FB77E +:103CA000F8948091C0019091C101A091C201B0919E +:103CB000C3012FBF08952FB7F8946091C001709190 +:103CC000C1018091C2019091C3012FBF0895CF928D +:103CD000DF92EF92FF920F931F932FB7F8944091CA +:103CE000C0015091C1016091C2017091C3012FBF09 +:103CF0006A017B01EE24FF248C0120E030E0C01635 +:103D0000D106E206F30610F4415051099A01281B2E +:103D1000390BC9011F910F91FF90EF90DF90CF9069 +:103D200008951F920F920FB60F9211248F939F93B5 +:103D3000AF93BF938091C0019091C101A091C20146 +:103D4000B091C3010196A11DB11D8093C001909354 +:103D5000C101A093C201B093C301BF91AF919F91E4 +:103D60008F910F900FBE0F901F9018950E94980E84 +:103D7000F8942FEF87EA91E6215080409040E1F7D8 +:103D800000C0000087E090EBDC018093DC019093A1 +:103D9000DD01A093DE01B093DF019CE088E10FB666 +:103DA000F894A895809360000FBE90936000FFCFB9 +:103DB000E92FF0E093E0EE0FFF1F9A95E1F7E80F8F +:103DC000F11DE855FF4F9491892F8F7092959F7048 +:103DD0000895CF93C82FCB010E94D81E492F90E0A1 +:103DE000242F30E054E0220F331F5A95E1F7282B9F +:103DF000392B2038310519F480E090E017C0EC2F02 +:103E0000F0E023E0EE0FFF1F2A95E1F74770E40F83 +:103E1000F11D34E0EE0FFF1F3A95E1F7E80FF91FAF +:103E2000EE0FFF1FE050F84985919491CF910895CE +:103E300080E090E0089508958091C60180FF0CC055 +:103E40008091120190E065E070E00E94D426959583 +:103E50008795959587952EC081FF0AC080911201A4 +:103E600090E065E070E00E94D4269595879522C089 +:103E700082FF08C08091120190E065E070E00E942E +:103E8000D42618C02091C7012223D1F0309111010E +:103E9000231780F78091120190E065E070E00E94A6 +:103EA000D426622F70E00E94D426632F70E00E9417 +:103EB000F126CB018038910530F4009731F0089558 +:103EC00085E090E008958FE7089581E0089580915E +:103ED000C60180FF08C06091100170E0759567957C +:103EE0007595679523C081FF06C06091100170E051 +:103EF000759567951BC082FF04C06091100170E04A +:103F000012C06091C7016623D1F020910F016217A2 +:103F1000A0F78091100170E090E00E94D426622FFB +:103F200070E00E94F1266038710528F46115710572 +:103F300021F0862F08958FE7089581E0089561E0CC +:103F400070E0F4CF803F21F40E941C1F819504C0D3 +:103F5000813F29F40E941C1F8093CA010895823F6B +:103F600021F40E941C1F819504C0833F29F40E9404 +:103F70001C1F8093C9010895893F19F40E94671F8F +:103F800005C08A3F31F40E94671F81958093CB0161 +:103F900008958B3F21F40E94671F819504C08C3FD8 +:103FA00029F40E94671F8093CC010895843F21F477 +:103FB0008091C801816017C0853F21F48091C801BC +:103FC000826011C0863F21F48091C80184600BC0DB +:103FD000873F21F48091C801886005C0883F31F493 +:103FE0008091C80180618093C80108958D3F21F4BC +:103FF0008091C60181600BC08E3F21F48091C60183 +:10400000826005C08F3F29F48091C601846080934F +:10401000C6010895803F39F48091CA0187FF6CC0C2 +:104020001092CA0169C0813F29F48091CA01181613 +:10403000BCF362C09091C901823F29F497FF5CC034 +:104040001092C90159C0833F19F41916CCF354C01A +:10405000893F41F48091CB0118160CF04DC01092AD +:10406000CB014AC08A3F29F48091CB0187FF44C02D +:10407000F6CF8B3F39F48091CC0187FF3DC0109281 +:10408000CC013AC08C3F29F48091CC011816BCF3C6 +:1040900033C0843F21F48091C8018E7F17C0853FD3 +:1040A00021F48091C8018D7F11C0863F21F4809159 +:1040B000C8018B7F0BC0873F21F48091C801877FA7 +:1040C00005C0883F31F48091C8018F7E8093C8017C +:1040D00013C08D3F21F48091C6018E7F0BC08E3FAF +:1040E00021F48091C6018D7F05C08F3F29F4809116 +:1040F000C6018B7F8093C6018091C90181110EC0DA +:104100008091CA0181110AC08091CB01811106C042 +:104110008091CC01811102C01092C7010895809155 +:10412000BE0183FF7EC089E994E00E9497058091DB +:10413000C8011F928F9384E994E09F938F930E940C +:10414000300682E994E00E9497058091C901282FEA +:10415000082E000C330B3F938F938FE894E09F93CE +:104160008F930E9430068DE894E00E94970580911D +:10417000CA01282F082E000C330B3F938F938AE837 +:1041800094E09F938F930E94300688E894E00E9409 +:1041900097058091CB01282F082E000C330B3F93FD +:1041A0008F9385E894E09F938F930E94300683E875 +:1041B00094E00E9497058091CC01282F082E000CD6 +:1041C000330B3F938F9380E894E09F938F930E94EB +:1041D00030068DE794E00E9497058091C7011F92F9 +:1041E0008F938AE794E09F938F930E94300688E72D +:1041F00094E00E9497058091C6011F928F9385E7F6 +:1042000094E09F938F930E94300682E794E00E948F +:1042100097058DB79EB74C960FB6F8949EBF0FBE0C +:104220008DBF88EC91E00E9499110E944F1E9093DF +:10423000C5018093C40108951F93CF93DF938091AC +:10424000C4019091C5010E94671EFC012091C70125 +:10425000222329F090911301892F90E007C08091CB +:10426000140190E06AE070E00E94D426E817F90794 +:1042700008F485C08091C901C091CA01D091CB01D9 +:104280001091CC01811107C0C11175C0D11173C04B +:10429000111171C074C02F3F19F02F5F2093C70117 +:1042A000181624F40E941C1F8093C9018091C90133 +:1042B00087FF05C00E941C1F81958093C9011C16B1 +:1042C00024F40E941C1F8093CA018091CA0187FFB9 +:1042D00005C00E941C1F81958093CA016091C9018D +:1042E000662331F1C091CA01CC2311F1062E000CD6 +:1042F000770B880B990B0E94D32523E333E343E329 +:104300005FE30E9437260E949B256093C9016C2FB2 +:10431000CC0F770B880B990B0E94D32523E333E353 +:1043200043E35FE30E9437260E949B256093CA0106 +:104330001D1624F40E94671F8093CB018091CB014E +:1043400087FF05C00E94671F81958093CB011116DE +:1043500024F40E94671F8093CC018091CC0187FFD9 +:1043600005C00E94671F81958093CC01DF91CF919A +:104370001F910C948F202F3F09F08FCF97CFDF91A3 +:10438000CF911F910895E8ECF1E085E0DF011D92E7 +:104390008A95E9F71092C7011092C60108958CEB37 +:1043A00096E00E9497051F9281E08F931F9285E00F +:1043B0008F938EE696E09F938F930E9430060F9026 +:1043C0000F900F900F900F900F9008958330E9F1A8 +:1043D00028F4813061F0823009F10895853009F4C4 +:1043E00062C008F449C0863009F474C00895809111 +:1043F0001401262F30E0280F311D2F3F310524F402 +:10440000680F6093140103C08FEF809314018091B3 +:1044100014011F928F9387EA95E072C08091130177 +:10442000262F30E0280F311D2F3F310524F4680F6F +:104430006093130103C08FEF8093130180911301E8 +:104440001F928F9385E995E05BC080911201262F22 +:1044500030E0280F311D2F3F310524F4680F6093A1 +:10446000120103C08FEF80931201809112011F92FD +:104470008F9382E895E044C080911101262F30E0AF +:10448000280F311D2F3F310524F4680F609311016F +:1044900003C08FEF80931101809111011F928F93C0 +:1044A0008DE695E02DC080911001262F30E0280F79 +:1044B000311D2F3F310524F4680F6093100103C0B4 +:1044C0008FEF80931001809110011F928F9384E5EC +:1044D00095E016C080910F01262F30E0280F311D86 +:1044E0002F3F310524F4680F60930F0103C08FEF55 +:1044F00080930F0180910F011F928F9389E395E0C4 +:104500009F938F930E9430060F900F900F900F9003 +:104510000895833081F128F4813059F08230D1F050 +:104520000895853009F449C0B8F1863009F456C0C1 +:10453000089580911401681720F4861B809314015C +:1045400002C010921401809114011F928F938AE28D +:1045500095E054C080911301681720F4861B809366 +:10456000130102C010921301809113011F928F93C7 +:1045700088E195E043C080911201681720F4861B02 +:104580008093120102C010921201809112011F92B9 +:104590008F9385E095E032C080911101681720F477 +:1045A000861B8093110102C01092110180911101AC +:1045B0001F928F9380EF94E021C0809110016817C3 +:1045C00020F4861B8093100102C01092100180918C +:1045D00010011F928F9387ED94E010C080910F011E +:1045E000681720F4861B80930F0102C010920F0100 +:1045F00080910F011F928F938CEB94E09F938F9388 +:104600000E9430060F900F900F900F900895CF9357 +:10461000C82F1F928F9381EC97E09F938F930E94F6 +:10462000300681E090E0A0E0B0E0BC01CD0104C024 +:10463000660F771F881F991FCA95D2F70E94E11B4A +:104640000F900F900F900F90CF910C94C917CF93AC +:10465000873288F58E3108F00BC18E3009F487C09F +:10466000D8F4873009F460C08B3009F44FC086302D +:1046700009F002C18091BE01817F8E7F8093BE01CF +:1046800086EC97E00E94970580E89AE00E949705E3 +:1046900081E08093CE0146C0863109F4B0C020F499 +:1046A000803109F47AC0E8C0893109F491C08B31B6 +:1046B00009F449C0E1C0883349F150F4893209F462 +:1046C000D5C0853309F4D2C0873209F0D5C0CEC039 +:1046D000833409F4CBC028F48A3308F4CDC089535D +:1046E000C8C0883409F0C8C00E94C9178FE69AE094 +:1046F0000E9497052FEF83ED90E32150804090407A +:10470000E1F700C000000E94B61E0CC08DEE97E0DD +:1047100041C086E59AE00E9497058091BE018160C4 +:104720008093BE01C1E0ADC08091BE01C82FC170B1 +:1047300080FFEFCF82E69AE00E9497058091BE014C +:10474000817F8E7F3FC09091BE0191FBCC27C0F945 +:1047500081E0C827892FC0FB81F98093BE01CC235B +:1047600019F089E49AE029C08BE39AE013C0909194 +:10477000BE0192FBCC27C0F981E0C827892FC0FB7E +:1047800082F98093BE01CC2319F08CE29AE015C027 +:104790008CE19AE00E949705C5CF9091BE0193FBF2 +:1047A000CC27C0F981E0C827892FC0FB83F980930B +:1047B000BE01CC2351F080E19AE00E9497058091E0 +:1047C000BE0181608093BE015CC083E09AE0E2CFCD +:1047D00084EF99E00E94970581ED99E00E9497058A +:1047E0008CE899E00E9497058FE599E00E94970573 +:1047F0008AE199E00E9497058BEE98E0CBCF8DED92 +:1048000098E00E9497050E9444111F928F9383ECB9 +:1048100098E09F938F930E94300680910C011F9225 +:104820008F938CEA98E09F938F930E94300680913B +:104830005B011F928F9389E998E09F938F930E9469 +:1048400030060E945B1E9F938F937F936F9382E845 +:1048500098E09F938F930E9430068DB79EB7429643 +:104860000FB6F8949EBF0FBE8DBF5CCF80E001C035 +:104870008D510E94072356CF80E898E00E9497054B +:10488000C0E08C2FCF91089580E0089580E00895D6 +:10489000CF93C82F8091CE01813069F020F0823013 +:1048A00009F449C040C167E08FE00E94CB12882321 +:1048B00009F43FC106C067E08FE00E94CB12882355 +:1048C00061F08C2F0E944424811104C08C2F0E941F +:1048D00027232FC081E090E02CC08C2F0E9446241B +:1048E000811126C0C431E1F070F4CB3081F0C031C9 +:1048F000D1F40E94CF2189EB97E00E94970582E0D6 +:104900008093CE0115C0C93259F0C83361F486ECEA +:1049100097E00E9497058DEB97E00E94970508C0ED +:104920001092CE0104C187EB97E00E949705FFC06B +:1049300081E08170FEC0C43228F5CE3108F0C1C0DC +:10494000CB30A1F1D0F4C73009F0D3C08EE1809311 +:10495000140182E3809313018AE08093120184E1C1 +:104960008093110188E08093100188E280930F0109 +:104970008DE596E00E949705BFC0C33149F1C4316F +:10498000C1F0B7C0CB3409F4A9C028F4C93289F00A +:10499000C83361F0AEC0C13509F49EC0C23509F418 +:1049A00099C0CE3409F0A5C06AE09EC00E94CF2114 +:1049B000A3C08091CD01882319F01092CD019CC035 +:1049C0008AE696E00E94970581E08093CE01B1C00F +:1049D00084E496E00E94970582E396E00E949705A2 +:1049E000809114011F928F938FE296E09F938F9393 +:1049F0000E9430068DE296E00E9497058BE196E0DA +:104A00000E949705809113011F928F9388E196E091 +:104A10009F938F930E94300686E196E00E9497054F +:104A200087E096E00E949705809112011F928F9374 +:104A300084E096E09F938F930E94300682E096E098 +:104A40000E94970581EF95E00E94970580911101E2 +:104A50001F928F938EEE95E09F938F930E94300666 +:104A60008CEE95E00E94970587ED95E00E949705F2 +:104A7000809110011F928F9384ED95E09F938F9307 +:104A80000E94300682ED95E00E9497058BEB95E041 +:104A90000E94970580910F011F928F9388EB95E0FC +:104AA0009F938F930E94300686EB95E00E949705B6 +:104AB0008DB79EB748960FB6F8949EBF0FBE8DBFB8 +:104AC0001BC0CE51EC2FF0E0E65DFE4F808180935D +:104AD000CD0112C061E003C061E006C06AE08091D0 +:104AE000CD010E94E62108C08091CD010E9489225B +:104AF00003C08BE596E013C08091CD01882369F057 +:104B00001F928F9385E596E09F938F930E943006C6 +:104B10000F900F900F900F9004C082E596E00E94D6 +:104B2000970581E006C01092CE0180E002C080E0CF +:104B300000CFCF9108950E94A2256894B1110C94E2 +:104B4000312608950E94162688F09F5798F0B92FB5 +:104B50009927B751B0F0E1F0660F771F881F991FB2 +:104B60001AF0BA95C9F714C0B13091F00E943026FE +:104B7000B1E008950C943026672F782F8827B85F0E +:104B800039F0B93FCCF3869577956795B395D9F70A +:104B90003EF490958095709561957F4F8F4F9F4F14 +:104BA0000895E89409C097FB3EF490958095709520 +:104BB00061957F4F8F4F9F4F9923A9F0F92F96E969 +:104BC000BB279395F695879577956795B795F111DE +:104BD000F8CFFAF4BB0F11F460FF1BC06F5F7F4F7B +:104BE0008F4F9F4F16C0882311F096E911C077238D +:104BF00021F09EE8872F762F05C0662371F096E896 +:104C0000862F70E060E02AF09A95660F771F881F64 +:104C1000DAF7880F9695879597F9089557FD90587C +:104C2000440F551F59F05F3F71F04795880F97FB70 +:104C3000991F61F09F3F79F087950895121613062A +:104C40001406551FF2CF4695F1DF08C01616170659 +:104C50001806991FF1CF869571056105089408958E +:104C6000E894BB2766277727CB0197F908950E9420 +:104C700049260C94C3260E94B52638F00E94BC2613 +:104C800020F0952311F00C94AC260C94B2260C94D1 +:104C900031260E940E2678F39923C9F35523B9F3E0 +:104CA000950F50E0551FAA27EE27FF27BB270024AA +:104CB0000894679520F4E20FF31FB41F0A1E220F19 +:104CC000331F441FAA1F6695A9F7779530F4F30F99 +:104CD000B41F0A1E121E08F46395330F441FAA1F47 +:104CE000221F769599F7879520F4B40F0A1E121E9D +:104CF000631F440FAA1F221F331F8695A9F7862F13 +:104D0000712D602D11249F5750409AF0F1F08823A7 +:104D10004AF0EE0FFF1FBB1F661F771F881F9150C1 +:104D20005040A9F79E3F510580F00C94AC260C949E +:104D300031265F3FE4F3983ED4F3869577956795E7 +:104D4000B795F795E7959F5FC1F7FE2B880F911DEB +:104D50009695879597F9089597F99F6780E870E091 +:104D600060E008959FEF80EC089500240A941616E1 +:104D7000170618060906089500240A941216130649 +:104D8000140605060895092E0394000C11F48823D7 +:104D900052F0BB0F40F4BF2B11F460FF04C06F5FF3 +:104DA0007F4F8F4F9F4F08950024552704C0080E52 +:104DB000591F880F991F009729F076956795B8F3CA +:104DC0007105B9F7802D952F0895991B79E004C0DE +:104DD000991F961708F0961B881F7A95C9F780953A +:104DE000089597FB072E16F4009407D077FD09D09D +:104DF0000E940B2707FC05D03EF4909581959F4FAC +:104E00000895709561957F4F0895EE0FFF1F0590EF +:104E1000F491E02D0994AA1BBB1B51E107C0AA1F06 +:104E2000BB1FA617B70710F0A61BB70B881F991F4B +:104E30005A95A9F780959095BC01CD010895F894F5 +:024E4000FFCFA2 +:104E4200FFFF030AF40AD10A9D0A690A01B4012884 +:104E520008140A321E404D3622DA038D03570335F9 +:104E620003C102DA02F3020C030001020304050685 +:044E72000708090024 +:106800000000EA44E944E2440400050006000700F1 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031A132003300340035A1360037004A +:10687000380082003A003B003C003D003E003F00F3 +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530067005400550056003C +:1068B000580059005A005B005C005D005E005F00FC +:1068C0006000610062006300640000005700000087 +:1068D000CD440000000000000000000000000000A7 +:1068E0000000000000006620000000000000000022 +:1068F000E000E100E200E300E400E500E600E7007C +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010001004C00010001004400450052000C +:1069600049000100010050004F0001004D004E00A1 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E000010001000100010001000100010001009F +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/adb_usb/config.h b/converter/adb_usb/config.h index 5ce5c221..3500188d 100644 --- a/converter/adb_usb/config.h +++ b/converter/adb_usb/config.h @@ -40,10 +40,6 @@ along with this program. If not, see . #define LOCKING_RESYNC_ENABLE -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - /* ADB port setting */ #define ADB_PORT PORTD #define ADB_PIN PIND diff --git a/converter/adb_usb/keymap_ansi.c b/converter/adb_usb/keymap_ansi.c index aa993192..8d69ec5b 100644 --- a/converter/adb_usb/keymap_ansi.c +++ b/converter/adb_usb/keymap_ansi.c @@ -12,5 +12,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/adb_usb/keymap_common.h b/converter/adb_usb/keymap_common.h index cb643c8f..4a1931b7 100644 --- a/converter/adb_usb/keymap_common.h +++ b/converter/adb_usb/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -29,10 +28,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* Common layout: ANSI+ISO * ,---. .---------------. ,---------------. ,---------------. ,-----------. ,---------------. * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| @@ -230,7 +225,7 @@ extern const uint16_t fn_actions[]; K36,K3A,K37, K31, K3B,K3C,K3D, K52, K41,K4C \ ) { \ { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ + { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ diff --git a/converter/adb_usb/keymap_hasu.c b/converter/adb_usb/keymap_hasu.c index a0b3f1fc..14701160 100644 --- a/converter/adb_usb/keymap_hasu.c +++ b/converter/adb_usb/keymap_hasu.c @@ -53,6 +53,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_BSLS), }; diff --git a/converter/adb_usb/keymap_iso.c b/converter/adb_usb/keymap_iso.c index 1ccb17e2..ffb7f431 100644 --- a/converter/adb_usb/keymap_iso.c +++ b/converter/adb_usb/keymap_iso.c @@ -12,5 +12,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/adb_usb/keymap_plain.c b/converter/adb_usb/keymap_plain.c index 2f11f86a..b7a80f57 100644 --- a/converter/adb_usb/keymap_plain.c +++ b/converter/adb_usb/keymap_plain.c @@ -36,7 +36,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_GRV), [1] = ACTION_LAYER_TAP_KEY(1, KC_BSLS), }; diff --git a/converter/adb_usb/matrix.c b/converter/adb_usb/matrix.c index 6190c71a..83f46041 100644 --- a/converter/adb_usb/matrix.c +++ b/converter/adb_usb/matrix.c @@ -29,46 +29,21 @@ along with this program. If not, see . #include "matrix.h" #include "report.h" #include "host.h" +#include "led.h" -#if (MATRIX_COLS > 16) -# error "MATRIX_COLS must not exceed 16" -#endif -#if (MATRIX_ROWS > 255) -# error "MATRIX_ROWS must not exceed 255" -#endif static bool has_media_keys = false; static bool is_iso_layout = false; -static bool is_modified = false; static report_mouse_t mouse_report = {}; // matrix state buffer(1:on, 0:off) -#if (MATRIX_COLS <= 8) -static uint8_t matrix[MATRIX_ROWS]; -#else -static uint16_t matrix[MATRIX_ROWS]; -#endif +static matrix_row_t matrix[MATRIX_ROWS]; -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif static void register_key(uint8_t key); -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { // LED on @@ -90,7 +65,7 @@ void matrix_init(void) // Determine ISO keyboard by handler id // http://lxr.free-electrons.com/source/drivers/macintosh/adbhid.c?v=4.4#L815 - uint16_t handler_id = adb_host_talk(ADB_ADDR_KEYBOARD, ADB_REG_3); + uint8_t handler_id = (uint8_t) adb_host_talk(ADB_ADDR_KEYBOARD, ADB_REG_3); switch (handler_id) { case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D: case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1: @@ -127,6 +102,8 @@ void matrix_init(void) // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + led_set(host_keyboard_leds()); + debug_enable = true; //debug_matrix = true; //debug_keyboard = true; @@ -208,8 +185,6 @@ uint8_t matrix_scan(void) uint16_t codes; uint8_t key0, key1; - is_modified = false; - codes = extra_key; extra_key = 0xFFFF; @@ -328,93 +303,12 @@ uint8_t matrix_scan(void) return 1; } -bool matrix_is_modified(void) -{ - return is_modified; -} - inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< + +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 . +*/ +#ifndef UNIMAP_COMMON_H +#define UNIMAP_COMMON_H + +#include +#include +#include "unimap.h" + + +/* Apple Extended Keyboard Common layout: ANSI+ISO + * ,---. .---------------. ,---------------. ,---------------. ,-----------. ,---------------. + * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|F24| + * `---' `---------------' `---------------' `---------------' `-----------' `---------------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| -| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shif|\ | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl |Alt |Gui | Space |Gui |Alt |Ctrl | |Lef|Dow|Rig| | 0| .| | + * `-----------------------------------------------------------' `-----------' `---------------' + * Command = Gui + * Option = Alt + * Power key = F24 + * Mic = F13(Adjustable keyboard) + */ +// http://lxr.free-electrons.com/source/drivers/macintosh/adbhid.c +// http://opensource.apple.com//source/IOHIDFamily/IOHIDFamily-701.20.10/IOHIDFamily/Cosmo_USB2ADB.c +// http://m0115.web.fc2.com/m0115.jpg +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + // Position(unimap) ADB scan code(matrix) + // --------------------------------------------- + { + UNIMAP_A, // 0x00 + UNIMAP_S, // 0x01 + UNIMAP_D, // 0x02 + UNIMAP_F, // 0x03 + UNIMAP_H, // 0x04 + UNIMAP_G, // 0x05 + UNIMAP_Z, // 0x06 + UNIMAP_X, // 0x07 + }, + { + UNIMAP_C, // 0x08 + UNIMAP_V, // 0x09 + UNIMAP_NONUS_BSLASH, // 0x0A + UNIMAP_B, // 0x0B + UNIMAP_Q, // 0x0C + UNIMAP_W, // 0x0D + UNIMAP_E, // 0x0E + UNIMAP_R, // 0x0F + }, + { + UNIMAP_Y, // 0x10 + UNIMAP_T, // 0x11 + UNIMAP_1, // 0x12 + UNIMAP_2, // 0x13 + UNIMAP_3, // 0x14 + UNIMAP_4, // 0x15 + UNIMAP_6, // 0x16 + UNIMAP_5, // 0x17 + }, + { + UNIMAP_EQUAL, // 0x18 + UNIMAP_9, // 0x19 + UNIMAP_7, // 0x1A + UNIMAP_MINUS, // 0x1B + UNIMAP_8, // 0x1C + UNIMAP_0, // 0x1D + UNIMAP_RBRACKET, // 0x1E + UNIMAP_O, // 0x1F + }, + { + UNIMAP_U, // 0x20 + UNIMAP_LBRACKET, // 0x21 + UNIMAP_I, // 0x22 + UNIMAP_P, // 0x23 + UNIMAP_ENTER, // 0x24 + UNIMAP_L, // 0x25 + UNIMAP_J, // 0x26 + UNIMAP_QUOTE, // 0x27 + }, + { + UNIMAP_K, // 0x28 + UNIMAP_SCOLON, // 0x29 + UNIMAP_BSLASH, // 0x2A + UNIMAP_COMMA, // 0x2B + UNIMAP_SLASH, // 0x2C + UNIMAP_N, // 0x2D + UNIMAP_M, // 0x2E + UNIMAP_DOT, // 0x2F + }, + { + UNIMAP_TAB, // 0x30 + UNIMAP_SPACE, // 0x31 + UNIMAP_GRAVE, // 0x32 + UNIMAP_BSPACE, // 0x33 + UNIMAP_KP_ENTER, // 0x34 + UNIMAP_ESCAPE, // 0x35 + UNIMAP_LCTRL, // 0x36 + UNIMAP_LGUI, // 0x37 + }, + { + UNIMAP_LSHIFT, // 0x38 + UNIMAP_CAPSLOCK, // 0x39 + UNIMAP_LALT, // 0x3A + UNIMAP_LEFT, // 0x3B + UNIMAP_RIGHT, // 0x3C + UNIMAP_DOWN, // 0x3D + UNIMAP_UP, // 0x3E + UNIMAP_F23, // 0x3F FN? + }, + { + UNIMAP_F17, // 0x40 + UNIMAP_KP_DOT, // 0x41 + UNIMAP_F13, // 0x42 Mic(Adjustable keyboard) + UNIMAP_KP_MINUS, // 0x43 ADB keypad asterisk(top right) + UNIMAP_NO, // 0x44 + UNIMAP_KP_COMMA, // 0x45 ADB keypad plus + UNIMAP_NO, // 0x46 + UNIMAP_NUMLOCK, // 0x47 + }, + { + UNIMAP_VOLUME_UP, // 0x48 Vol Up(Adjustable keyboard) + UNIMAP_VOLUME_DOWN, // 0x49 Vol Down(Adjustable keyboard) + UNIMAP_VOLUME_MUTE, // 0x4A Vol Mute(Adjustable keyboard) + UNIMAP_KP_ASTERISK, // 0x4B ADB keypad slash(between equal and asterisk) + UNIMAP_KP_ENTER, // 0x4C + UNIMAP_NO, // 0x4D + UNIMAP_KP_PLUS, // 0x4E ADB keypad minus + UNIMAP_F18, // 0x4F + }, + { + UNIMAP_F19, // 0x50 + UNIMAP_KP_SLASH, // 0x51 ADB keypad equal(next to clear/numlock) + UNIMAP_KP_0, // 0x52 + UNIMAP_KP_1, // 0x53 + UNIMAP_KP_2, // 0x54 + UNIMAP_KP_3, // 0x55 + UNIMAP_KP_4, // 0x56 + UNIMAP_KP_5, // 0x57 + }, + { + UNIMAP_KP_6, // 0x58 + UNIMAP_KP_7, // 0x59 + UNIMAP_F20, // 0x5A + UNIMAP_KP_8, // 0x5B + UNIMAP_KP_9, // 0x5C + UNIMAP_JYEN, // 0x5D + UNIMAP_RO, // 0x5E + UNIMAP_KP_COMMA, // 0x5F + }, + { + UNIMAP_F5, // 0x60 + UNIMAP_F6, // 0x61 + UNIMAP_F7, // 0x62 + UNIMAP_F3, // 0x63 + UNIMAP_F8, // 0x64 + UNIMAP_F9, // 0x65 + UNIMAP_MHEN, // 0x66 + UNIMAP_F11, // 0x67 + }, + { + UNIMAP_HENK, // 0x68 + UNIMAP_PSCREEN, // 0x69 + UNIMAP_F16, // 0x6A + UNIMAP_SCROLLLOCK, // 0x6B + UNIMAP_NO, // 0x6C + UNIMAP_F10, // 0x6D + UNIMAP_APPLICATION, // 0x6E compose + UNIMAP_F12, // 0x6F + }, + { + UNIMAP_NO, // 0x70 + UNIMAP_PAUSE, // 0x71 + UNIMAP_INSERT, // 0x72 + UNIMAP_HOME, // 0x73 + UNIMAP_PGUP, // 0x74 + UNIMAP_DELETE, // 0x75 + UNIMAP_F4, // 0x76 + UNIMAP_END, // 0x77 + }, + { + UNIMAP_F2, // 0x78 + UNIMAP_PGDOWN, // 0x79 + UNIMAP_F1, // 0x7A + UNIMAP_RSHIFT, // 0x7B + UNIMAP_RALT, // 0x7C + UNIMAP_RCTRL, // 0x7D + UNIMAP_RGUI, // 0x7E + UNIMAP_F24, // 0x7F power key + } +}; + +#endif diff --git a/converter/adb_usb/unimap_plain.c b/converter/adb_usb/unimap_plain.c new file mode 100644 index 00000000..3d2b56f3 --- /dev/null +++ b/converter/adb_usb/unimap_plain.c @@ -0,0 +1,47 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#include "unimap_common.h" + + +#define AC_FN0 ACTION_LAYER_TAP_KEY(1, KC_GRV) +#define AC_FN1 ACTION_LAYER_TAP_KEY(1, KC_BSLS) +#define AC_PKEY ACTION_MODS_TAP_KEY(MOD_NONE, KC_POWER) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + MPLY,NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, PKEY, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE, + FN0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NO, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, FN1, DEL, END, PGDN, P7, P8, P9, PMNS, + LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PPLS, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, NO, RSFT, UP, P1, P2, P3, PENT, + LCTL,LGUI,LALT,NO, SPC, NO, NO, RALT,RGUI,NO, RCTL, LEFT,DOWN,RGHT, P0, PDOT,NO + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + TRNS,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; diff --git a/converter/ibm4704_usb/Makefile b/converter/ibm4704_usb/Makefile index 79f17ec0..f930cb59 100644 --- a/converter/ibm4704_usb/Makefile +++ b/converter/ibm4704_usb/Makefile @@ -1,25 +1,36 @@ # Target file name (without extension). -TARGET = ibm4704_usb +TARGET ?= ibm4704_usb # Directory common source filess exist -TMK_DIR = ../../tmk_core +TMK_DIR ?= ../../tmk_core # Directory keyboard dependent files exist -TARGET_DIR = . +TARGET_DIR ?= . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC ?= matrix.c \ led.c \ protocol/ibm4704.c -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) +# +# Keymap file +# +ifdef UNIMAP_ENABLE + KEYMAP_FILE = unimap else - SRC := keymap_plain.c $(SRC) + ifdef ACTIONMAP_ENABLE + KEYMAP_FILE = actionmap + else + KEYMAP_FILE = keymap + endif +endif +ifdef KEYMAP + SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) +else + SRC := $(KEYMAP_FILE)_plain.c $(SRC) endif -CONFIG_H = config.h +CONFIG_H ?= config.h # MCU name @@ -37,14 +48,14 @@ MCU ?= atmega32u2 # 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 +F_CPU ?= 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). -ARCH = AVR8 +ARCH ?= AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the @@ -57,7 +68,7 @@ ARCH = AVR8 # # 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) +F_USB ?= $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -69,18 +80,19 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +BOOTLOADER_SIZE ?= 4096 +OPT_DEFS += -DBOOTLOADER_SIZE=$(BOOTLOADER_SIZE) # 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 -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +BOOTMAGIC_ENABLE ?= no # 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 +NKRO_ENABLE ?= no # USB Nkey Rollover # Search Path diff --git a/converter/ibm4704_usb/Makefile.tmk_rev1 b/converter/ibm4704_usb/Makefile.rev1 similarity index 83% rename from converter/ibm4704_usb/Makefile.tmk_rev1 rename to converter/ibm4704_usb/Makefile.rev1 index 338b7da5..52e92aee 100644 --- a/converter/ibm4704_usb/Makefile.tmk_rev1 +++ b/converter/ibm4704_usb/Makefile.rev1 @@ -1,5 +1,6 @@ # TMK Converter rev.1 # which looks like this: # https://github.com/tmk/keyboard_converter#pcb-rev1 +TARGET = ibm4704_usb_rev1 MCU = atmega32u4 include Makefile diff --git a/converter/ibm4704_usb/Makefile.tmk_rev2 b/converter/ibm4704_usb/Makefile.rev2 similarity index 83% rename from converter/ibm4704_usb/Makefile.tmk_rev2 rename to converter/ibm4704_usb/Makefile.rev2 index 56c2c2c6..4931e434 100644 --- a/converter/ibm4704_usb/Makefile.tmk_rev2 +++ b/converter/ibm4704_usb/Makefile.rev2 @@ -1,6 +1,6 @@ # TMK Converter rev.2 # which looks like this: # https://github.com/tmk/keyboard_converter#pcb-rev2 +TARGET = ibm4704_usb_rev2 MCU = atmega32u2 include Makefile - diff --git a/converter/ibm4704_usb/Makefile.unimap.alps.rev1 b/converter/ibm4704_usb/Makefile.unimap.alps.rev1 new file mode 100644 index 00000000..eab1416a --- /dev/null +++ b/converter/ibm4704_usb/Makefile.unimap.alps.rev1 @@ -0,0 +1,7 @@ +TARGET = ibm4704_usb_rev1_alps_unimap +MCU = atmega32u4 +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +OPT_DEFS += -DIBM4704_ALPS + +include Makefile diff --git a/converter/ibm4704_usb/Makefile.unimap.alps.rev2 b/converter/ibm4704_usb/Makefile.unimap.alps.rev2 new file mode 100644 index 00000000..382eb8cc --- /dev/null +++ b/converter/ibm4704_usb/Makefile.unimap.alps.rev2 @@ -0,0 +1,7 @@ +TARGET = ibm4704_usb_rev2_alps_unimap +MCU = atmega32u2 +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +OPT_DEFS += -DIBM4704_ALPS + +include Makefile diff --git a/converter/ibm4704_usb/Makefile.unimap.rev1 b/converter/ibm4704_usb/Makefile.unimap.rev1 new file mode 100644 index 00000000..afb81dee --- /dev/null +++ b/converter/ibm4704_usb/Makefile.unimap.rev1 @@ -0,0 +1,7 @@ +TARGET = ibm4704_usb_rev1_unimap +MCU = atmega32u4 +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +#OPT_DEFS += -DIBM4704_ALPS + +include Makefile diff --git a/converter/ibm4704_usb/Makefile.unimap.rev2 b/converter/ibm4704_usb/Makefile.unimap.rev2 new file mode 100644 index 00000000..5872e93f --- /dev/null +++ b/converter/ibm4704_usb/Makefile.unimap.rev2 @@ -0,0 +1,7 @@ +TARGET = ibm4704_usb_rev2_unimap +MCU = atmega32u2 +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +#OPT_DEFS += -DIBM4704_ALPS + +include Makefile diff --git a/converter/ibm4704_usb/README.md b/converter/ibm4704_usb/README.md index 45b1f683..38478455 100644 --- a/converter/ibm4704_usb/README.md +++ b/converter/ibm4704_usb/README.md @@ -1,12 +1,14 @@ IBM 4704 to USB keyboard converter ================================== This firmware converts IBM 4704 keyboard protocol to USB HID. +Keyboard initialization process takes a few seconds at start up. **You may need to plug USB cable after hooking up your keyboard to the converter.** -Keyboard initialization process takes a few seconds at start up. During that you will hear buzzer from the keyboard. **You need to plug USB cable after hooking up your keyboard to the converter.** +TMK Converter for IBM4704 is available here: https://geekhack.org/index.php?topic=72052.0 Update ------ +- 2016/09/30 Unimap editor support - 2015/09/07 Added keymap for Alps 102-key. Thanks, tai @ geekhack! - 2015/05/05 Added keymaps for 107-key, 77-key and 50-key. Thanks, orihalcon @ geekhack! - 2015/05/19 Fixed a protocol handling bug. @@ -63,17 +65,17 @@ Just run `make`: $ make -f -For TMK Converter rev.1 use `Makefile.tmk_rev1` as makefile: +For TMK Converter rev.1 use `Makefile.rev1` as makefile: - $ make -f Makefile.tmk_rev1 + $ make -f Makefile.rev1 -For TMK Converter rev.2 use `Makefile.tmk_rev2` as makefile: +For TMK Converter rev.2 use `Makefile.rev2` as makefile: - $ make -f Makefile.tmk_rev2 + $ make -f Makefile.rev2 To select keymap: - $ make -f KEYMAP=[plain|...] + $ make -f KEYMAP=[plain|alsp102key|...] To indentify your TMK Converter revision see [this](https://github.com/tmk/keyboard_converter#pcb-revisions). diff --git a/converter/ibm4704_usb/binary/ibm4704_usb_rev1_alps_unimap.hex b/converter/ibm4704_usb/binary/ibm4704_usb_rev1_alps_unimap.hex new file mode 100644 index 00000000..7145b1d3 --- /dev/null +++ b/converter/ibm4704_usb/binary/ibm4704_usb_rev1_alps_unimap.hex @@ -0,0 +1,1230 @@ +:100000000C9418050C945F050C9454080C945F052F +:100010000C945F050C945F050C945F050C945F05D0 +:100020000C945F050C945F050C94330E0C94050F33 +:100030000C945E1C0C945F050C945F050C945F059A +:100040000C945F050C945F050C945F050C945F05A0 +:100050000C945F050C94D21C0C945F050C945F0506 +:100060000C945F050C945F050C945F050C945F0580 +:100070000C945F050C945F050C945F050C945F0570 +:100080000C945F050C945F050C945F050C945F0560 +:100090000C945F050C945F050C945F050C945F0550 +:1000A0000C945F050C945F050C945F05720F940F20 +:1000B0008210940F8210D90FFC0F8210511064101F +:1000C0004D134D137A137A13D5131114091609160B +:1000D0002914091624152415DF1509160916F51516 +:1000E000351F20212223242526272D2E742A3A1E4F +:1000F0002B141A0815171C180C12132F30313B80C3 +:1001000039041607090A0B0D0E0F333432283C7CD4 +:1001100079781D1B0619051110363738757D3D7A23 +:100120002C545553494A4B7B7F8056808080587EA3 +:100130005F6061634C4D4E4F80805780808080802F +:100140005C5D5E624647485180808066808080802A +:10015000595A5B294452455080808080808080803D +:10016000253032583A20253038620A000A722F634F +:100170002030313233343536370A00253032580AD0 +:1001800000253032580A004572726F723A202530CD +:1001900032580A00456E640A0073253032583A72AC +:1001A000253032582000456E61626C6520627265B0 +:1001B000616B3A20004B6579626F6172642049443B +:1001C0003A20253032580A0049424D203437303425 +:1001D00020636F6E7665727465720A00726275666E +:1001E0003A2066756C6C0A00523A25303258253038 +:1001F00032580A00533A2530325820005B735D00B4 +:100200004B6579626F6172642073746172742E0A37 +:100210000055534220636F6E666967757265642E80 +:100220000A005B575D005B535D005B525D005B4401 +:100230005D005B435D003803490042004D00200033 +:10024000340037003000340020006B006500790076 +:1002500062006F00610072006400200063006F00A4 +:100260006E00760065007200740065007200000088 +:100270000E0374002E006D002E006B002E00000097 +:100280000403090409027400040100A032090400F7 +:1002900000010301010009211101000122400007B2 +:1002A00005810308000A0904010001030102000995 +:1002B0002111010001224D000705820308000A09EF +:1002C000040200010300000009211101000122368F +:1002D000000705830308000A090403000203000065 +:1002E00000092111010001222200070584032000DA +:1002F000010705040320000112011001000000089D +:10030000EDFE07470100010200010631FF0974A15B +:10031000010975150026FF009520750881020976F0 +:10032000150026FF00952075089102C0050109807F +:10033000A101850216810026B7001A81002AB700A4 +:10034000751095018100C0050C0901A101850316F6 +:100350000100269C021A01002A9C02751095018159 +:1003600000C005010902A1010901A1000509190147 +:100370002905150025019505750181029501750373 +:1003800081010501093009311581257F9502750824 +:10039000810609381581257F950175088106050CB0 +:1003A0000A38021581257F950175088106C0C005B0 +:1003B000010906A101050719E029E71500250195A6 +:1003C0000875018102950175088101050819012947 +:1003D00005950575019102950175039101050719B0 +:1003E0000029FF150026FF00950675088100C00A48 +:1003F000002530325820006B6579626F6172645F4E +:100400007265706F72743A20004C45443A20253072 +:1004100032580A00290A002575002F002575005D55 +:1004200028002564002000256400200025640020A9 +:10043000002564007C0025303258006D6F757365AF +:100440006B6579205B62746E7C78207920762068F9 +:100450005D287265702F61636C293A205B006D6BBB +:100460005F776865656C5F74696D655F746F5F6DFC +:100470006178203D2025640A006D6B5F77686565B3 +:100480006C5F6D61785F7370656564203D202564E5 +:100490000A006D6B5F74696D655F746F5F6D617885 +:1004A000203D2025640A006D6B5F6D61785F73707D +:1004B000656564203D2025640A006D6B5F696E747C +:1004C000657276616C203D2025640A006D6B5F6467 +:1004D000656C6179203D2025640A006D6B5F77684B +:1004E00065656C5F74696D655F746F5F6D617820C1 +:1004F0003D2025640A006D6B5F776865656C5F6DF4 +:1005000061785F7370656564203D2025640A006D25 +:100510006B5F74696D655F746F5F6D6178203D20FE +:1005200025640A006D6B5F6D61785F73706565644B +:10053000203D2025640A006D6B5F696E74657276DC +:10054000616C203D2025640A006D6B5F64656C6101 +:1005500079203D2025640A000A00257500363A20DE +:10056000776865656C5F74696D655F746F5F6D61F9 +:10057000783A20000A00257500353A2077686565CD +:100580006C5F6D61785F73706565643A20000A0086 +:10059000257500343A2074696D655F746F5F6D6115 +:1005A000783A20000A00257500333A206D61785FA3 +:1005B00073706565643A20000A00257500323A20A0 +:1005C000696E74657276616C286D73293A20000A31 +:1005D00000257500313A2064656C6179282A313034 +:1005E0006D73293A20000A092D2056616C756573D8 +:1005F000202D0A004D3E004D25643E20003F007333 +:1006000065742064656661756C740A00433E200061 +:1006100077686572652064656C74613A20637572F1 +:10062000736F723D25642C20776865656C3D256489 +:100630000A53656520687474703A2F2F656E2E77A3 +:10064000696B6970656469612E6F72672F77696B7A +:10065000692F4D6F7573655F6B6579730A000A09C1 +:100660002D204D6F7573656B6579202D0A455343B9 +:100670002F713A09717569740A313A0964656C61C0 +:1006800079282A31306D73290A323A09696E746506 +:100690007276616C286D73290A333A096D61785F4F +:1006A00073706565640A343A0974696D655F746FC7 +:1006B0005F6D61780A353A09776865656C5F6D61D1 +:1006C000785F73706565640A363A09776865656CAA +:1006D0005F74696D655F746F5F6D61780A0A703A67 +:1006E000097072696E742076616C7565730A643A7C +:1006F000097365742064656661756C74730A75703E +:100700003A092B310A646F776E3A092D310A706706 +:1007100075703A092B31300A7067646F776E3A0949 +:100720002D31300A0A7370656564203D2064656C64 +:100730007461202A206D61785F7370656564202A7A +:100740002028726570656174202F2074696D655F63 +:10075000746F5F6D6178290A003F004D3E200043B1 +:100760003E20004C25640A000A092D20436F6E7359 +:100770006F6C65202D0A4553432F713A09717569D5 +:10078000740A6D3A096D6F7573656B65790A000AB5 +:10079000092D204D61676963202D0A643A0964655B +:1007A0006275670A783A096465627567206D6174DD +:1007B0007269780A6B3A096465627567206B6579BE +:1007C000626F6172640A6D3A096465627567206DD3 +:1007D0006F7573650A763A0976657273696F6E0A8A +:1007E000733A097374617475730A633A09636F6EBF +:1007F000736F6C65206D6F64650A302D343A096C37 +:1008000061796572302D34284631302D4634290AFD +:10081000506175733A09626F6F746C6F61646572D1 +:100820000A003F0074696D65725F726561643332FE +:1008300028293A202530346C580A006B6579626F9C +:100840006172645F69646C653A2025580A006B65C3 +:1008500079626F6172645F70726F746F636F6C3A0C +:100860002025580A00686F73745F6B6579626F6149 +:1008700072645F6C65647328293A2025580A000A5F +:10088000092D20537461747573202D0A004743436A +:100890003A20342E392E32204156522D4C494243B3 +:1008A0003A20312E382E3073766E204156525F41F9 +:1008B0005243483A20617672350A004F5054494FEE +:1008C0004E533A204C554641204D4F5553454B45CC +:1008D000592045585452414B455920434F4E534F90 +:1008E0004C4520434F4D4D414E44204B45594D41C1 +:1008F000505F53454354494F4E20343039360A0037 +:100900004255494C443A20363663613335612D6493 +:1009100069727479202831323A30343A35362053AE +:1009200065702033302032303136290A0056494470 +:100930003A2030784645454428742E6D2E6B2E297A +:10094000205049443A203078343730372849424DD6 +:100950002034373034206B6579626F6172642063B4 +:100960006F6E76657274657229205645523A203052 +:1009700078303030310A00444553433A20636F6E7B +:10098000766572742049424D2034373034206B65CF +:1009900079626F61726420746F205553420A000AB5 +:1009A000092D2056657273696F6E202D0A000A6D3D +:1009B0006F7573653A206F66660A000A6D6F75730E +:1009C000653A206F6E0A000A6B6579626F61726426 +:1009D0003A206F66660A000A6B6579626F6172641D +:1009E0003A206F6E0A000A6D61747269783A206F5E +:1009F00066660A000A6D61747269783A206F6E0A41 +:100A0000000A64656275673A206F6E0A000A6465C1 +:100A10006275673A206F66660A000A0A626F6F7431 +:100A20006C6F616465722E2E2E2000433E20000004 +:100A300011241FBECFEFDAE0DEBFCDBF04B603FE48 +:100A400027C08091F7019091F801A091F901B09130 +:100A5000FA018730904BA740B04BD1F41092F701C8 +:100A60001092F8011092F9011092FA0114BE84B7A5 +:100A7000877F84BF0FB6F894A89580916000886145 +:100A800080936000109260000FBEE0E0F8E30995EB +:100A900011E0A0E0B1E0E2E8FAE402C005900D92B6 +:100AA000A233B107D9F721E0A2E3B1E001C01D9262 +:100AB000A73FB207E1F70E94620B0C943F250C940C +:100AC0000000FF93EF93E0913201F09133013097F2 +:100AD00009F00995EF91FF910895FC01859180300F +:100AE00011F0EFDFFBCF0895FF27E0E230E247FF90 +:100AF0000CC0419597FF09C0EDE260957095809517 +:100B00009095611D711D811D911D27FF02C02195CA +:100B100030E350E2AA27660F771F881F991FAA1F8C +:100B2000A41710F0A41B63955A95A9F7AA3008F0F2 +:100B3000A95FA05DAF93F3956115710581059105DE +:100B400041F7ED3211F4EF93F395F21718F43F9358 +:100B5000F395FBCF8F91B5DFFA95E1F70895E99111 +:100B6000F9918591803021F0853219F0AADFF9CF13 +:100B7000089520E0E89455915532C1F3503311F4B3 +:100B8000689455915A3348F4505390F3220F022E33 +:100B9000220F220F200D250FF4CF0EF421958991FD +:100BA0009991533619F3533729F1533559F1BC0153 +:100BB00088279927E8945C3621F489919991689463 +:100BC0005591543639F446EF7EF077FF0DC08FEF24 +:100BD0009FEF0AC055374AE039F0583540E121F01F +:100BE000523642E009F00895FF93EF937DDFEF91D5 +:100BF000FF91B7CFFF93EF93FC0181918030B9F360 +:100C000060DFFBCFFF93EF9368DFF1CFDF93CF93EC +:100C1000CDB7DEB72596A3DFCF91DF9108950C9471 +:100C20007307FF920F931F93CF93DF938091D901A6 +:100C300081608093D90188EC91E00E946D05E4E326 +:100C4000F1E080E18E0F11928E13FDCF2FEF87EA36 +:100C500091E6215080409040E1F700C000000E94E2 +:100C600048081F928F9385EB91E09F938F930E948A +:100C7000060686EA91E00E946D050F900F900F9096 +:100C80000F908CEF0E948207882339F08FE39CE954 +:100C90000197F1F700C00000F4CFC0E0D0E009E90F +:100CA00011E08C2F8068F82E8F2D0E9482078823F8 +:100CB00039F08FE39CE90197F1F700C00000F4CF11 +:100CC0008FE19EE40197F1F700C000000E94480800 +:100CD0001F928F93DF93CF931F930F930E9406066B +:100CE00021960F900F900F900F900F900F90CF378D +:100CF000D105B9F68FEF0E948207882339F08FE380 +:100D00009CE90197F1F700C00000F4CF84E991E07D +:100D1000DF91CF911F910F91FF900C946D05CF93B0 +:100D2000DF930E9448088F3F11F480E05BC0982F4A +:100D30009F779C37A0F01F928F9387E891E09F9355 +:100D40008F930E9406060F900F900F900F90E4E390 +:100D5000F1E080E18E0F11928E13FDCFE6CF9091DE +:100D6000D901C82FC695C695C695D82FD77087FFCD +:100D70001CC090FF0CC01F928F9381E891E09F935D +:100D80008F930E9406060F900F900F900F90EC2FFC +:100D9000EF70F0E0EC5CFE4F81E090E001C0880F66 +:100DA000DA95EAF79081892B1BC090FF0CC01F9247 +:100DB0008F938BE791E09F938F930E9406060F908D +:100DC0000F900F900F90EC2FF0E0EC5CFE4F81E065 +:100DD00090E001C0880FDA95EAF780959081892329 +:100DE000808381E0DF91CF910895E82FF0E0EC5C03 +:100DF000FE4F80810895EF92FF920F931F93CF9340 +:100E0000DF938CE691E00E946D0584E3E82E81E09B +:100E1000F82EC0E0D0E000E611E0F70181917F01FB +:100E20000E94F31B1F928F93DF93CF931F930F9317 +:100E30000E94060621960F900F900F900F900F9032 +:100E40000F90C031D10549F7DF91CF911F910F91DC +:100E5000FF90EF90089508959FB7F894209148016E +:100E600080914901821761F030E0F901E65BFE4FA5 +:100E700080812F5F3F4F2F7133272093480101C09E +:100E800080E09FBF08955198599A08955898509AB4 +:100E900008955098589A08955198599A85E08A95DE +:100EA000F1F7000089B18695817008955098589A9D +:100EB00085E08A95F1F7000089B181700895CF939C +:100EC000DF93C4E6D0E00E944C07811108C0209750 +:100ED00031F085E08A95F1F700002197F4CFCE013B +:100EE000DF91CF9108950E9443070E944607E9E6EB +:100EF000F0E080818C608083E19AE99A0E94430748 +:100F00000C944907BF92CF92DF92EF92FF920F931A +:100F10001F93CF93DF93C82E10924701E9980E9448 +:100F200043070E9449075998519A0CE211E00E9428 +:100F3000560781110AC00115110549F085E08A950F +:100F4000F1F7000001501109F2CF012B11F480E3F9 +:100F500073C000E010E0D1E0D12CBB24B394C02FCB +:100F60000E945F07892B11F4C05C24C0C601002ECB +:100F700002C0959587950A94E2F780FF04C0DB25AF +:100F80000E94490702C00E94460784E6E82EF12C21 +:100F90000E944C07882359F0E114F10451F085E0D8 +:100FA0008A95F1F7000081E0E81AF108F1CFEF2807 +:100FB00021F4C85BC09347014AC00F5F1F4F083040 +:100FC000110569F60E945F07892B11F484E334C090 +:100FD000DD2329F00E94490704E610E00CC00E94BE +:100FE0004607FACF0115110561F085E08A95F1F702 +:100FF0000000015011090E944C078111F3CF012B11 +:1010000011F485E319C00E945F07892BF9F20E9451 +:10101000490704E610E00E945607882351F00115A5 +:10102000110549F085E08A95F1F70000015011099A +:10103000F2CF012B21F486E38093470108C00E9480 +:1010400043070E944907E19AE99A80E017C00E948D +:1010500043070E94490780914701813360F01F9246 +:101060008F9384EF91E09F938F930E9406060F90D9 +:101070000F900F900F90E19AE99A8FEFDF91CF9147 +:101080001F910F91FF90EF90DF90CF90BF90089548 +:101090002FB7F89490914901809148012FBF981380 +:1010A0000C942C078FEF08951F920F920FB60F929A +:1010B00011242F933F934F935F936F937F938F935D +:1010C0009F93AF93BF93CF93DF93EF93FF931092D0 +:1010D0004701809146018830F1F030F0893009F005 +:1010E0005CC0C4E6D0E02EC0809145018695809317 +:1010F00045010E945607882309F449C080914501A3 +:1011000080688093450181E090914401911180E0D5 +:10111000809344013CC00E945607882339F081E047 +:1011200090914401911180E08093440180914401A9 +:10113000882399F12CC0209781F185E08A95F1F7F9 +:10114000000021970E9456078111F5CFCD2B29F180 +:1011500040914501CFB7F8948091490190E09C01FE +:101160002F5F3F4F2F71332750914801521739F0AD +:10117000FC01E65BFE4F40832093490104C08CEDE7 +:1011800091E00E946D05CFBF109247012AC0809167 +:1011900046018F5F809346012AC08091460180936B +:1011A00047018EEF0E948207882339F08FE99FE084 +:1011B0000197F1F700C00000F4CF809145011F9224 +:1011C0008F93809146011F928F9388EE91E09F93B9 +:1011D0008F930E9406060F900F900F900F900F9024 +:1011E0000F90109246011092450110924401FF9118 +:1011F000EF91DF91CF91BF91AF919F918F917F91AF +:101200006F915F914F913F912F910F900FBE0F9073 +:101210001F9018958091750108959FB7F8941092CA +:101220006C019FBF9091EE01943009F057C09091EE +:10123000E9009F703091EC00232F217030FD20E8F1 +:10124000922B24E02093E9002091EB0020FF43C083 +:101250002091EE0027FF3FC020916A01222321F058 +:101260002091E80025FF37C010926A0126E03091F6 +:10127000E80035FD15C03091EE01343061F5309154 +:10128000EB0035FD28C0215021F481E080936A01F4 +:1012900022C0EFE9FFE03197F1F700C00000E7CF8F +:1012A0008093F1008091E80085FD0AC08091E800FC +:1012B00080FFFCCF8091E8008E778093E80006C025 +:1012C0008FB7F89421E020936C018FBF9F709093AB +:1012D000E90080E008959F709093E9008FEF0895F2 +:1012E000CF93DF9300D01F92CDB7DEB79C018091E2 +:1012F000EE01843019F593E099833B832A83909320 +:10130000E9008FEF9091E800815095FD06C095EDC2 +:101310009A95F1F700008111F5CF8091E80085FFE3 +:101320000DC040E050E063E070E0CE0101960E9405 +:10133000230C8091E8008E778093E8000F900F9047 +:101340000F90DF91CF910895CF93DF9300D01F923C +:10135000CDB7DEB72091EE01243021F522E02983BC +:101360009B838A8383E08093E9008FEF9091E8006C +:10137000815095FD06C095ED9A95F1F70000811119 +:10138000F5CF8091E80085FF0DC040E050E063E0BC +:1013900070E0CE0101960E94230C8091E8008E77C8 +:1013A0008093E8000F900F900F90DF91CF910895F8 +:1013B0002091EE012430F1F422E02093E9002FEF98 +:1013C0003091E800215035FD06C035ED3A95F1F732 +:1013D00000002111F5CF2091E80025FF0BC040E06F +:1013E00050E065E070E00E94230C8091E8008E7769 +:1013F0008093E8000895CF93DF932091EE0124308D +:1014000039F521E02093E9002FEF3091E8002150D9 +:1014100035FD06C035ED3A95F1F700002111F5CF05 +:101420002091E80025FF14C0EC0140E050E068E0A6 +:1014300070E00E94230C8091E8008E778093E80092 +:1014400088E0FE01ADE6B1E001900D928A95E1F7EA +:10145000DF91CF91089582E392E00E946D05809123 +:10146000ED01811109C00E94B80D0E94150E8091F6 +:10147000E20084608093E20008958EE292E00E9490 +:101480006D051092ED0108958AE292E00C946D05CD +:1014900020916B012F5F822F62E30E940525992323 +:1014A00019F020936B01089510926B0180916C01EB +:1014B000882371F18091EE01843041F58091E9003B +:1014C0008F702091EC00922F917020FD90E8892B75 +:1014D00094E09093E9009091EB0090FF14C09091FC +:1014E000EE0097FF10C09091E80095FF03C01092A6 +:1014F000F100F9CF9091E80090FF05C09091E800CD +:101500009E779093E8008F708093E90010926C01B1 +:10151000089542E061EC81E00E94320D42E061EC0E +:1015200082E00E94320D42E061EC83E00E94320DC5 +:1015300042E261EC84E00C94320D8091F001833042 +:1015400009F453C030F4813071F0823009F48CC05A +:1015500008958A3009F478C08B3009F45EC0893070 +:1015600009F09AC020C08091EF01813A09F094C03F +:101570008091E800877F8093E8008091F30190914B +:10158000F401892B21F468E08DE691E003C060E06E +:1015900080E090E070E00E946E0C8091E8008B7714 +:1015A0008093E80008958091EF01813209F074C0C2 +:1015B0008091F3019091F401892B09F06DC0809125 +:1015C000E800877F8093E8008091E80082FD05C0F5 +:1015D0008091EE018111F8CF5FC08091F10080937E +:1015E00075018091E8008B7753C08091EF01813ABB +:1015F00009F052C08091F3019091F401892B09F018 +:101600004BC08091E800877F8093E8008091E800DC +:1016100080FFFCCF80910A0136C08091EF018132BA +:10162000D9F58091F3019091F401892BA9F580916E +:10163000E800877F8093E8000E94670D8091F101A8 +:1016400080930A010C942A168091EF01813221F5D2 +:101650008091E800877F8093E8000E94670D809169 +:10166000F2018093760108958091EF01813AA1F40F +:101670008091E800877F8093E8008091E80080FFF8 +:10168000FCCF809176018093F1008091E8008E7705 +:101690008093E8000C94670D0895089508950895C7 +:1016A00086E292E00E946D050C944F0B0E941D1C77 +:1016B0008091EC01882329F00E94481C81110C9430 +:1016C0000D0C089584B7877F84BF0FB6F894A89552 +:1016D00080916000886180936000109260000FBE6E +:1016E00090E080E80FB6F8948093610090936100D9 +:1016F0000FBE0E944D0B0E942B110E94B80D0E943C +:10170000150E8091E20084608093E2008DE099E004 +:101710000E94EE1B78948091EE018430E1F781E124 +:1017200092E00E946D050E942D1180E091E00E94E0 +:101730009A1080E092E00E946D050E944E0B80910D +:10174000EE01853039F48CEF91E00E946D050E9426 +:10175000560BF5CF0E943111F2CF0C945C1C82E243 +:1017600092E00E946D050C94AD0B292F3327233096 +:101770003105C9F064F42130310581F022303105A2 +:1017800009F043C084E790E024E832E042C021320F +:101790003105F1F02232310541F137C082E190E0AC +:1017A00028EF32E036C099278130910541F0823030 +:1017B000910541F0892B49F5E0E8F2E005C0E0E74A +:1017C000F2E002C0E6E3F2E0849190E09F0121C0E4 +:1017D0006430D8F4E62FF0E0EE0FFF1FE15EFE4F1D +:1017E0002081318189E090E014C0643070F470E0B1 +:1017F000FB01EE0FFF1FE95EFE4F20813181FB01EF +:10180000ED5EFE4F808190E004C080E090E020E03B +:1018100030E0FA0131832083089580E189BD82E1BF +:1018200089BD09B400FEFDCF8091D8008F7D8093E3 +:10183000D8008091E00082608093E0008091E00019 +:1018400081FDFCCF0895CF92DF92EF92FF920F932C +:101850001F93CF93DF93EC018B016A010E94860DE9 +:10186000811133C0C114D10439F0F6018081918116 +:10187000081B190BC80FD91FE12CF12C01151105FC +:1018800019F18091E80085FD16C08091E8008E77FF +:101890008093E800C114D10449F0F6018081918160 +:1018A000E80EF91EF182E08285E00FC00E94860DED +:1018B000882321F30AC089918093F1000150110916 +:1018C000FFEFEF1AFF0ADACF80E0DF91CF911F918F +:1018D0000F91FF90EF90DF90CF9008952091F50148 +:1018E0003091F6012617370748F06115710539F474 +:1018F0002091E8002E772093E80001C0B90140E074 +:1019000061157105A9F12091EE01222309F443C06C +:10191000253009F442C02091E80023FD40C0209109 +:10192000E80022FD32C02091E80020FFE9CF40917D +:10193000F3002091F20030E0342BFC01CF0161155F +:10194000710559F02830310540F481918093F10000 +:10195000615071092F5F3F4FF1CF41E028303105D1 +:1019600009F040E02091E8002E772093E800C8CFEE +:101970004111C9CF0AC08091EE01882361F0853002 +:1019800061F08091E80083FD0AC08091E80082FF49 +:10199000F2CF80E0089582E0089583E0089581E029 +:1019A00008952091F5013091F6012617370748F088 +:1019B0006115710539F42091E8002E772093E80035 +:1019C00001C0B901FC0120E06115710591F1809120 +:1019D000EE01882309F440C0853009F43FC08091AE +:1019E000E80083FD3DC08091E80082FD2FC080911A +:1019F000E80080FFE9CF2091F3008091F20090E0B1 +:101A0000922B6115710559F08830910540F42491AD +:101A10002093F1003196615071090196F2CF21E0D7 +:101A2000089709F020E08091E8008E778093E80025 +:101A3000CBCF2111CCCF0AC08091EE01882361F079 +:101A4000853061F08091E80083FD0AC08091E80054 +:101A500082FFF2CF80E0089582E0089583E0089548 +:101A600081E00895982F973058F59093E9009817E2 +:101A700039F07091EC002091ED005091F00003C01E +:101A8000242F762F50E021FF19C03091EB003E7FCC +:101A90003093EB003091ED003D7F3093ED003091BD +:101AA000EB0031603093EB007093EC002093ED007D +:101AB0005093F0002091EE0027FF07C09F5FD3CF27 +:101AC0008F708093E90081E0089580E0089580910F +:101AD000EF0187FF11C08091E80082FD05C0809171 +:101AE000EE018111F8CF11C08091E8008B770BC017 +:101AF0008091EE01882349F08091E80080FFF8CFC3 +:101B00008091E8008E778093E80008952091E400AA +:101B10003091E50095E64091EC00842F817040FF04 +:101B200022C08091E80080FD1CC08091EE018823D6 +:101B300091F0853091F08091EB0085FD10C04091CF +:101B4000E4005091E5004217530729F39A019150A0 +:101B500011F784E0089582E0089583E0089581E01C +:101B6000089580E008954091E80042FFDECF089597 +:101B70000E94260E0E942E0EE0EEF0E08081816031 +:101B80008083E8EDF0E080818F77808319BCA7ED3A +:101B9000B0E08C918E7F8C9380818F7E80831092B9 +:101BA000ED0108950F931F93CF93DF930E94260EAC +:101BB0000E942E0EC8EDD0E088818F7788838881BF +:101BC0008068888388818F7D888319BC1092EE019C +:101BD0001092EA011092EC011092EB0100EE10E07D +:101BE000F80180818B7F808388818160888342E0D7 +:101BF00060E080E00E94320DE1EEF0E080818E7FB7 +:101C00008083E2EEF0E08081816080838081886063 +:101C10008083F80180818E7F8083888180618883C2 +:101C2000DF91CF911F910F910895E8EDF0E0808151 +:101C30008F7E8083E7EDF0E080818160808384E0A7 +:101C400082BF81E08093ED010C94D20DE8EDF0E0CD +:101C500080818E7F80831092E20008951092DA00D6 +:101C60001092E10008951F920F920FB60F92112467 +:101C70002F933F934F935F936F937F938F939F9394 +:101C8000AF93BF93EF93FF938091E10082FF0BC06E +:101C90008091E20082FF07C08091E1008B7F8093FA +:101CA000E1000E94480A8091DA0080FF1FC0809105 +:101CB000D80080FF1BC08091DA008E7F8093DA000D +:101CC0008091D90080FF0DC080E189BD82E189BD8E +:101CD00009B400FEFDCF81E08093EE010E942B0A43 +:101CE00005C019BC1092EE010E943D0A8091E100EE +:101CF00080FF19C08091E20080FF15C08091E20052 +:101D00008E7F8093E2008091E20080618093E20008 +:101D10008091D80080628093D80019BC85E08093C0 +:101D2000EE010E94500B8091E10084FF30C0809151 +:101D3000E20084FF2CC080E189BD82E189BD09B445 +:101D400000FEFDCF8091D8008F7D8093D8008091D8 +:101D5000E1008F7E8093E1008091E2008F7E80938E +:101D6000E2008091E20081608093E2008091EA01CC +:101D7000882311F084E007C08091E30087FD02C052 +:101D800081E001C083E08093EE010E94AF0B80915F +:101D9000E10083FF29C08091E20083FF25C080918C +:101DA000E100877F8093E10082E08093EE01109252 +:101DB000EA018091E1008E7F8093E1008091E20052 +:101DC0008E7F8093E2008091E20080618093E20048 +:101DD00042E060E080E00E94320D8091F000886077 +:101DE0008093F0000E94440AFF91EF91BF91AF9160 +:101DF0009F918F917F916F915F914F913F912F9123 +:101E00000F900FBE0F901F9018951F920F920FB654 +:101E10000F9211242F933F934F935F936F937F9370 +:101E20008F939F93AF93BF93CF93DF93EF93FF93E2 +:101E3000C091E900CF708091EC00D82FD17080FD67 +:101E4000D0E81092E9008091F000877F8093F00045 +:101E500078940E94490F1092E9008091F000886008 +:101E60008093F000CD2BCF70C093E900FF91EF91EC +:101E7000DF91CF91BF91AF919F918F917F916F91A2 +:101E80005F914F913F912F910F900FBE0F901F9038 +:101E900018951F93CF93DF93CDB7DEB7AA970FB6F0 +:101EA000F894DEBF0FBECDBFEFEEF1E088E08E0FFD +:101EB0009091F10091938E13FBCF0E949D0A809127 +:101EC000E80083FF1FC18091EF019091F001492F3D +:101ED00050E04A30510508F015C1FA01EA5AFF4FA7 +:101EE0000C942525803881F0823809F00BC180914F +:101EF000F3018F708093E9008091EB0085FB8827C8 +:101F000080F91092E90006C08091EB019091EC01FC +:101F1000911182609091E800977F9093E800809300 +:101F2000F1001092F100C8C0282F2D7F09F0EAC0FF +:101F3000882319F0823061F0E5C08091F101813091 +:101F400009F0E0C0933009F080E08093EC012BC0F1 +:101F50008091F101811127C08091F3018F7009F404 +:101F6000D1C08093E9002091EB0020FF1CC093308A +:101F700021F48091EB00806214C09091EB0090619D +:101F80009093EB0021E030E0A90102C0440F551FFF +:101F90008A95E2F74093EA001092EA008091EB0004 +:101FA00088608093EB001092E9008091E800877FC1 +:101FB00086C08111A7C01091F1011F778091E300C5 +:101FC0008078812B8093E3008091E800877F809365 +:101FD000E8000E94670D8091E80080FFFCCF8091AF +:101FE000E30080688093E300111102C082E001C029 +:101FF00083E08093EE0186C08058823008F082C072 +:102000008091F1019091F2018C3D53E0950779F5B3 +:1020100083E08A838AE289834FB7F894DE011396BE +:1020200020E03EE051E2E32FF0E050935700E491CE +:1020300020FF03C0E295EF703F5FEF708E2F90E0BE +:10204000EA3010F0C79601C0C0968D939D932F5F24 +:10205000243149F74FBF8091E800877F8093E800E3 +:102060006AE270E0CE0101960E946E0C14C0AE01CF +:102070004F5F5F4F6091F3010E94B50BBC01892B4C +:1020800009F440C09091E800977F9093E80089811F +:102090009A810E94D10C8091E8008B778093E800B0 +:1020A00031C0803879F58091E800877F8093E8001F +:1020B0008091EA018093F1008091E8008E7780930F +:1020C000E8000E94670D1EC081111CC09091F101B3 +:1020D0009230C0F48091E800877F8093E80090936D +:1020E000EA010E94670D8091EA01811106C080918A +:1020F000E30087FD02C081E001C084E08093EE012F +:102100000E94890A8091E80083FF0AC08091E8005C +:10211000877F8093E8008091EB0080628093EB00E2 +:10212000AA960FB6F894DEBF0FBECDBFDF91CF9158 +:102130001F91089590937C0180937B010895E09115 +:102140007B01F0917C01309721F00190F081E02D2E +:10215000099480E00895EF92FF920F931F93CF931D +:10216000DF93E0917B01F0917C013097B1F18C011C +:102170000280F381E02D09958091D90182FF2DC065 +:1021800080FF04C087EF93E00E946D05E80118E02E +:1021900081EFE82E83E0F82E8091D90180FF0BC0FB +:1021A00088811F928F93FF92EF920E9406060F90F4 +:1021B0000F900F900F90115021961111EDCF80913B +:1021C000D90180FF0AC08FEE93E0DF91CF911F917C +:1021D0000F91FF90EF900C946D05DF91CF911F91BF +:1021E0000F91FF90EF900895E0917B01F0917C01B9 +:1021F000309721F00480F581E02D09940895209115 +:10220000790130917A018217930771F090937A01E6 +:1022100080937901E0917B01F0917C01309721F06E +:102220000680F781E02D099408952091770130917F +:1022300078018217930771F090937801809377016A +:10224000E0917B01F0917C01309721F00084F185D1 +:10225000E02D099408950C940F060E94871C0C949D +:102260001106CF92DF92EF92FF920F931F93CF93BD +:10227000DF9300D000D000D0CDB7DEB70E948F062C +:102280008EE7C82E81E0D82E00E010E0E02E802FEF +:102290000E94F506F60141916F01F42EF826B1F483 +:1022A0000F5F1F4F0031110589F78FEF89838A83F4 +:1022B0001B820E94901C8160782F9D838C834981B2 +:1022C0005A816B818D810E94F01147C09091D90194 +:1022D00091FF04C08E830E94FB068E8120E030E0D7 +:1022E0004F2D50E0922FBA01022E02C075956795CE +:1022F0000A94E2F760FF2BC02983EA8221E030E0F4 +:10230000690102C0CC0CDD1C9A95E2F790E08C21AB +:102310009D21892B09F420E02B830E94901C816071 +:10232000782F9D838C8349815A816B818D810E9496 +:10233000F01149815A816B817C818D810E940A1C38 +:10234000F801E258FE4F8081C826C08206C02F5F88 +:102350003F4F2830310531F6A3CF0E94091C0E945F +:10236000511F10917D010E949F10181741F10E948A +:102370009F1080937D019091D90192FF0EC090FF34 +:102380000CC01F928F9389E094E09F938F930E94DB +:1023900006060F900F900F900F9080917D0126966A +:1023A0000FB6F894DEBF0FBECDBFDF91CF911F9166 +:1023B0000F91FF90EF90DF90CF900C941B1C26960E +:1023C0000FB6F894DEBF0FBECDBFDF91CF911F9146 +:1023D0000F91FF90EF90DF90CF9008950C942B0712 +:1023E000CF93DF93CDB7DEB72B970FB6F894DEBF50 +:1023F0000FBECDBF942F4F83252F588769877A87CB +:102400008B874A855B85452B21F02F3F09F59F3F40 +:10241000F9F4DE01119686E0FD0111928A95E9F743 +:1024200085E0FE01379601900D928A95E1F749818A +:102430005A816B817C818D819E810E94C4182B966C +:102440000FB6F894DEBF0FBECDBFDF91CF910895D8 +:102450004F81588569857A858B850E940A1CD9CF62 +:10246000CF93882309F4A4C0C82F8CEF8C0F813A36 +:1024700048F48C2F0E947B2281119AC08C2F0E94DD +:102480004F1B0CC080E28C0F883058F4C77081E07D +:1024900001C0880FCA95EAF70E948E1BCF910C9459 +:1024A000C81B8BE58C0F833078F4C53A29F0C63A07 +:1024B00031F083E890E005C081E890E002C082E856 +:1024C00090E0CF910C94FF1088E58C0F853108F0D7 +:1024D0006FC0C83A61F1C93A69F1CA3A71F1CB3AB1 +:1024E00079F1CC3A81F1CD3A89F1CE3A91F1CF3AF6 +:1024F00099F1C13BA1F1C03BA9F1C23BB1F1C33B92 +:10250000B9F1C43BC1F1C53BC9F1C63BD1F1C73BF1 +:10251000D9F1C83BE1F1C93BE9F1CA3BF1F1CB3B51 +:10252000F9F1CC3B09F43FC080E090E03EC082EE80 +:1025300090E03BC089EE90E038C08AEE90E035C074 +:1025400085EB90E032C086EB90E02FC083EB90E00B +:102550002CC084EB90E029C087EB90E026C08CEC87 +:1025600090E023C08DEC90E020C083E891E01DC096 +:102570008AE891E01AC082E991E017C084E991E00D +:1025800014C081E292E011C083E292E00EC084E2C6 +:1025900092E00BC085E292E008C086E292E005C0BE +:1025A00087E292E002C08AE292E0CF910C9415118A +:1025B000CF910895882329F19CEF980F913A18F450 +:1025C0000E946C1B0DC090E2980F983058F48770F1 +:1025D00091E001C0990F8A95EAF7892F0E94941B18 +:1025E0000C94C81B9BE5980F933020F480E090E09A +:1025F0000C94FF10885A853120F480E090E00C9410 +:1026000015110895882321F00E948E1B0C94C81B7D +:102610000895882321F00E94941B0C94C81B0895F0 +:10262000CF92DF92EF92FF920F931F93CF93DF939E +:1026300000D000D000D0CDB7DEB725E0FC01DE0130 +:10264000119601900D922A95E1F7FC0140813181AC +:10265000F280258122952F7063817481672B09F4A4 +:10266000D8C23F3F19F44F3F09F4D3C26C014983EC +:102670003A8389819A812E830E940E1B182F092F7D +:102680000E940D1B0E941D1AE02FE295EF70F0E0F2 +:10269000E05AFF4F2E810C942525802F807F902FAC +:1026A0009F70092F882311F00295007FFF2049F0C9 +:1026B000002309F45FC2802F0E94A11B0E94C81B47 +:1026C00059C2812F0E94DA12002309F4A2C2802F7E +:1026D0000E94A71B26960FB6F894DEBF0FBECDBF93 +:1026E000DF91CF911F910F91FF90EF90DF90CF90EE +:1026F0000C94C81B802F807F902F9F70092F8032F1 +:1027000011F00295007F112319F0113001F129C059 +:10271000FF20A9F0802F222349F1213039F5269698 +:102720000FB6F894DEBF0FBECDBFDF91CF911F91E2 +:102730000F91FF90EF90DF90CF900C94B11B22236C +:1027400019F0213009F465C20E94B41B2CC0FF208F +:10275000E9F0263008F05DC20E948B1B802329F02F +:1027600022C0FF20F1F0211115C0802F26960FB650 +:10277000F894DEBF0FBECDBFDF91CF911F910F91B7 +:10278000FF90EF90DF90CF900C940213253008F06B +:1027900040C209C0F601858180FFECC18F7085833E +:1027A000E4CF2111FBC1802F69C1202F26952695EA +:1027B000237030E02115310521F021303105C9F0B9 +:1027C00028C2FF2021F0812F902F937002C080E05B +:1027D00090E026960FB6F894DEBF0FBECDBFDF9116 +:1027E000CF911F910F91FF90EF90DF90CF900C94BD +:1027F000FF10FF2021F0812F902F937002C080E006 +:1028000090E026960FB6F894DEBF0FBECDBFDF91E5 +:10281000CF911F910F91FF90EF90DF90CF900C948C +:102820001511812FFF2019F00E94D71D02C00E94B0 +:102830003F1E26960FB6F894DEBF0FBECDBFDF91C8 +:10284000CF911F910F91FF90EF90DF90CF900C945C +:10285000C41E802F837009F078C0F110DAC1812F77 +:10286000829586958770880F880F912F9F70C92E4B +:10287000D12CE12CF12C082E04C0CC0CDD1CEE1C5C +:10288000FF1C0A94D2F714FF12C04FE050E060E042 +:1028900070E004C0440F551F661F771F8A95D2F75A +:1028A000CB01BA01609570958095909503C060E06A +:1028B00070E0CB01202F269526952370422F50E003 +:1028C00042305105D1F04330510559F16C297D2931 +:1028D0008E299F294130510541F126960FB6F89473 +:1028E000DEBF0FBECDBFDF91CF911F910F91FF9043 +:1028F000EF90DF90CF900C94321A6C297D298E29AD +:102900009F2926960FB6F894DEBF0FBECDBFDF918C +:10291000CF911F910F91FF90EF90DF90CF900C948B +:10292000441A0E94321AC701B60126960FB6F894CF +:10293000DEBF0FBECDBFDF91CF911F910F91FF90F2 +:10294000EF90DF90CF900C94201AFF2019F0802F89 +:10295000817001C08695882309F45BC1812F82951F +:1029600086958770880F880F912F9F70C92ED12C64 +:10297000E12CF12C082E04C0CC0CDD1CEE1CFF1C3D +:102980000A94D2F714FF12C04FE050E060E070E00C +:1029900004C0440F551F661F771F8A95D2F7CB01DD +:1029A000BA01609570958095909503C060E070E0E5 +:1029B000CB01202F269526952370422F50E04230E0 +:1029C0005105D1F04330510559F16C297D298E29EB +:1029D0009F294130510541F126960FB6F894DEBF8C +:1029E0000FBECDBFDF91CF911F910F91FF90EF9060 +:1029F000DF90CF900C94E91A6C297D298E299F29AC +:102A000026960FB6F894DEBF0FBECDBFDF91CF91F3 +:102A10001F910F91FF90EF90DF90CF900C94FB1AD5 +:102A20000E94E91AC701B60126960FB6F894DEBFD8 +:102A30000FBECDBFDF91CF911F910F91FF90EF900F +:102A4000DF90CF900C94D71A103F41F118F4103E4C +:102A500048F48BC0123F09F450C0D8F1133F09F479 +:102A600060C083C01F70802F8F71FF2021F00E94F3 +:102A7000701A812F7BCE0E94911A812F26960FB655 +:102A8000F894DEBF0FBECDBFDF91CF911F910F91A4 +:102A9000FF90EF90DF90CF900C940913FF20A9F0E6 +:102AA000253008F0B6C0802F8F7126960FB6F894A7 +:102AB000DEBF0FBECDBFDF91CF911F910F91FF9071 +:102AC000EF90DF90CF900C94B61A263008F0A1C09A +:102AD000EACFFF20A1F0802F8F7126960FB6F894D1 +:102AE000DEBF0FBECDBFDF91CF911F910F91FF9041 +:102AF000EF90DF90CF900C94701AFF2061F3802F3D +:102B00008F7126960FB6F894DEBF0FBECDBFDF9152 +:102B1000CF911F910F91FF90EF90DF90CF900C9489 +:102B2000911AFF2091F0802F8F7126960FB6F8949E +:102B3000DEBF0FBECDBFDF91CF911F910F91FF90F0 +:102B4000EF90DF90CF900C945B1A26960FB6F89416 +:102B5000DEBF0FBECDBFDF91CF911F910F91FF90D0 +:102B6000EF90DF90CF900C94561AFF20A1F0222313 +:102B700009F4B1CF812F26960FB6F894DEBF0FBEB1 +:102B8000CDBFDF91CF911F910F91FF90EF90DF901C +:102B9000CF900C943012222309F4B1CF812F2696C6 +:102BA0000FB6F894DEBF0FBECDBFDF91CF911F915E +:102BB0000F91FF90EF90DF90CF900C94DA12402F9E +:102BC0004F70612FC6010E94511D26960FB6F894D2 +:102BD000DEBF0FBECDBFDF91CF911F910F91FF9050 +:102BE000EF90DF90CF900C946819402F4F70612FB9 +:102BF000C60126960FB6F894DEBF0FBECDBFDF919B +:102C0000CF911F910F91FF90EF90DF90CF900C9498 +:102C1000541D26960FB6F894DEBF0FBECDBFDF91D0 +:102C2000CF911F910F91FF90EF90DF90CF9008957B +:102C30000E94AE1B0E947D1B0E94C81B0E94F61FB3 +:102C40000E94C41E80E090E00E94FF1080E090E0AF +:102C50000C9415110E949E1B0C9418160E940E1BBA +:102C6000292F22952F7030E02C3031054CF42A307A +:102C700031056CF4225031092230310588F407C047 +:102C80002C30310549F02F30310531F009C0803E3C +:102C900048F0803F29F406C093FB882780F9089507 +:102CA00080E0089581E00895CF93DF9300D000D0B5 +:102CB0001F92CDB7DEB70F900F900F900F900F902F +:102CC000DF91CF910895CF93DF9300D000D000D053 +:102CD000CDB7DEB726960FB6F894DEBF0FBECDBFD8 +:102CE000DF91CF9108951F93CF93DF93C0918E0111 +:102CF00016E080918F01C81799F0D0E01C9FF00179 +:102D00001D9FF00D1124E057FE4F408151816281DB +:102D10007381848195810E9463162196C770E9CFE3 +:102D2000DF91CF911F9108954091C0015091C10151 +:102D30006091C2017091C3018091C4019091C5015D +:102D40000C9463168091C50182958F7009F054C070 +:102D50008091C201882309F44FC080918E01A09117 +:102D60008F016091C0017091C1014091C3015091E8 +:102D7000C401B6E08A1709F43FC090E0411551053F +:102D8000C1F17F3F11F46F3FA1F1B89FF001B99FEE +:102D9000F00D1124E057FE4F218172132AC02081CB +:102DA000621327C02281211124C02381348124177A +:102DB000350710F421503109241B350B283C31050F +:102DC000C0F42091C5012F7020612093C50126E039 +:102DD000289FF001299FF00D1124EB56FE4F8081B2 +:102DE0008F708061808380EC91E00E9410130C94BE +:102DF000731601968770BECF0895CF92DF92EF923F +:102E0000FF920F931F93CF93DF93CDB7DEB76297F7 +:102E10000FB6F894DEBF0FBECDBF8C0185E0F80180 +:102E2000DE011D9601900D928A95E1F7D8014C9133 +:102E300011965C91119712966C9112971396CD9002 +:102E4000DC9014973091C0017091C1018091C30151 +:102E50009091C401009709F46BC17F3F19F43F3F83 +:102E600009F466C1E090C201EE2009F4C0C02091CF +:102E7000C501C816D90628F0F601E81BF90BCF01E9 +:102E800004C0809590958C0D9D1DFF24F394883C83 +:102E9000910578F0F12C207F09F0C6C07C2DD98AED +:102EA000C88A89890E94541680EC91E00E94101310 +:102EB000B1C0822F807F09F046C0751314C034134F +:102EC00012C0611110C02F7020612093C5010E94B3 +:102ED000941680EC91E00E9410138091C501D801F6 +:102EE00015968C932EC0CD2819F15F3F11F44F3FFA +:102EF000F9F0F62E61111CC080918E0120918F0196 +:102F000036E0821709F45AC090E0389FF001399FEB +:102F1000F00D1124E057FE4F7181571306C07081E8 +:102F2000471303C07281711103C001968770E9CF06 +:102F3000F62E662309F418C18091C5018160809343 +:102F4000C501F12C11C1751308C0341306C06111FD +:102F500004C08091C501D801C3C04D875E878D85AF +:102F60009E856A8B0E942E166A898823E1F166236A +:102F7000D1F12091C501822F82958F7090E0029748 +:102F800074F08091C0019091C10198878F83198658 +:102F9000DB86CA862C87CE0107960E94101386E036 +:102FA000F801A0ECB1E001900D928A95E1F70E9442 +:102FB000A2160E949416FF24F394D6C04D875E8714 +:102FC0008D859E850E940E1B292F22952F7030E043 +:102FD000223031050CF0BCC09F7009F0B6C0805E95 +:102FE000883008F4C1C0C8010E941013E4CFC8168D +:102FF000D90608F453C0F601E81BF90BCF01883C51 +:10300000910508F450C0F12C7C2DD98AC88A898991 +:103010000E945416E0ECF1E086E0DF011D928A95F3 +:10302000E9F70E949416A0C0751314C0341312C09F +:10303000611110C08091C501F8018583C8010E940B +:10304000101386E0E0ECF1E0DF011D928A95E9F7CC +:10305000FE2C8AC04D875E878D859E856A8B0E9477 +:103060002E166A89882309F4BECF662309F4BBCFE4 +:103070002091C501822F82958F7090E002970CF409 +:103080008ECF8091C0019091C1019A8389831B8268 +:10309000DD82CC822E83CE0101967FCF80959095E4 +:1030A0008C0D9D1DACCFF62E662309F49CCF7513B5 +:1030B0002EC034132CC02091C50120FD1FC0822FCB +:1030C00082958F70D9F0D80115962C9315978F3073 +:1030D00049F08F5F982F9295907F822F8F70892B68 +:1030E00015968C93C8010E94101386E0F801A0EC9D +:1030F000B1E001900D928A95E1F793CF86E0F80157 +:10310000A0ECB1E001900D928A95E1F72DC04D87BA +:103110005E878D859E850E942E16811140CF8091FD +:10312000C50181608093C501C8010E9410131CC0B5 +:10313000662309F458CF4D875E878D859E850E9452 +:103140002E16882309F44FCF2ACF811148CF0CC007 +:10315000243031050CF047CF9F7009F440CFF801BF +:103160009581907F09F03BCF8F2D62960FB6F89432 +:10317000DEBF0FBECDBFDF91CF911F910F91FF90AA +:10318000EF90DF90CF9008951F93CF93DF93CDB74B +:10319000DEB72C970FB6F894DEBF0FBECDBF4F83BE +:1031A000588769877A878B879C87CE0107960E940C +:1031B000FD16882369F08F8198852A853B85232B0E +:1031C000F1F19F3F09F063C08F3F09F060C037C045 +:1031D00086E0FE013796DE01119601900D928A95E8 +:1031E000E1F76F817885EA85FB85309741F17F3F74 +:1031F00011F46F3F21F120918F0130E0C901019658 +:103200008770992740918E0150E08417950709F443 +:1032100047C069837A83FD83EC8396E0929FD00157 +:10322000939FB00D1124A057BE4FFE01319601901F +:103230000D929A95E1F780938F010E94731616E024 +:1032400080918E0190918F018917C1F1189FC00163 +:10325000112480579E4F0E94FD16882379F1E0913A +:103260008E011E9FF0011124E057FE4F40815181D5 +:1032700062817381848195810E94631680918E01A1 +:1032800090E001968770992780938E01D9CF4F8166 +:10329000588569857A858B859C850E946316CFCF7A +:1032A0000E942A1610928F0110928E01E0ECF1E03C +:1032B00086E0DF011D928A95E9F7C1CF2C960FB603 +:1032C000F894DEBF0FBECDBFDF91CF911F9108955F +:1032D000DF92EF92FF920F931F93CF93DF93FC0146 +:1032E000892B09F48AC0E12CF12CDD24D394EF0161 +:1032F00021968491853709F461C058F4843708F029 +:103300004EC0843008F06AC08130D1F0823071F153 +:1033100074C0883709F45DC050F4863709F455C08D +:10332000873709F06AC08E2D0E949B1B54C09CE712 +:10333000980F903708F061C08F770E94DA1250C062 +:103340008F010E5F1F4FFE01849190E2980F98301D +:1033500050F48770FD2D01C0FF0F8A95EAF78F2F7B +:103360000E94A11B14C00E94301213C08F010E5F77 +:103370001F4FFE01C49180E28C0F883060F4C7704B +:103380008D2D01C0880FCA95EAF70E94A71B0E94E5 +:10339000C81BE80125C08C2F0E94DA12FACF9F01CA +:1033A0002E5F3F4FFE01C491CC2369F08FE99FE06F +:1033B0000197F1F700C00000C150F6CF9F012E5FCA +:1033C0003F4FFE01F490E9010BC00E948B1BE82ED9 +:1033D00007C00E949E1B0E94C81B02C00E943012A0 +:1033E0008F2D882341F0EFE9FFE03197F1F700C01E +:1033F00000008150F6CFFE017ACFDF91CF911F916F +:103400000F91FF90EF90DF9008956093CA01709341 +:10341000CB018093CC019093CD010E94191C0C9498 +:1034200018166093C6017093C7018093C8019093EA +:10343000C9010E941A1C0C94181608950C94051AC0 +:103440000F931F930091CA011091CB012091CC01E1 +:103450003091CD01602B712B822B932B1F910F91FB +:103460000C94051A0F931F930091CA011091CB0180 +:103470002091CC013091CD016023712382239323CD +:103480001F910F910C94051A0F931F930091CA017D +:103490001091CB012091CC013091CD016027712793 +:1034A000822793271F910F910C94051A60E070E01A +:1034B000CB010C94111A0F931F9341E050E060E090 +:1034C00070E08A019B0104C0000F111F221F331FEF +:1034D0008A95D2F7C901B8011F910F910C94111A66 +:1034E0000F931F9341E050E060E070E004C0440F90 +:1034F000551F661F771F8A95D2F78091C60190915C +:10350000C701A091C801B091C9018A019B01082B94 +:10351000192B2A2B3B2BC901B8011F910F910C9439 +:10352000111A0F931F9341E050E060E070E004C077 +:10353000440F551F661F771F8A95D2F74095509507 +:10354000609570958091C6019091C701A091C801C6 +:10355000B091C9018A019B01082319232A233B2327 +:10356000C901B8011F910F910C94111A0F931F9369 +:1035700041E050E060E070E004C0440F551F661F5A +:10358000771F8A95D2F78091C6019091C701A091CB +:10359000C801B091C9018A019B01082719272A2770 +:1035A0003B27C901B8011F910F910C94111A0F9379 +:1035B0001F930091C6011091C7012091C80130915D +:1035C000C901602B712B822B932B1F910F910C94AF +:1035D000111A0F931F930091C6011091C7012091FA +:1035E000C8013091C90160237123822393231F9165 +:1035F0000F910C94111A0F931F930091C601109113 +:10360000C7012091C8013091C90160277127822725 +:1036100093271F910F910C94111A0895CF92DF9266 +:10362000EF92FF920F931F93CF93DF938C01C09083 +:10363000CA01D090CB01E090CC01F090CD01409137 +:10364000C6015091C7016091C8017091C901C42A97 +:10365000D52AE62AF72ACFE1D0E0D701C6010C2E01 +:1036600004C0B695A795979587950A94D2F780FFE1 +:1036700007C0B8018C2F0E94271D8130910531F4BD +:10368000219758F7B80180E00E94271DDF91CF9164 +:103690001F910F91FF90EF90DF90CF9008952091B0 +:1036A0000B0130910C01F90132969FEF40E05191EE +:1036B000581789F09F3F19F4511101C0942F4F5FA3 +:1036C0004630A9F79F3F39F0F901E90FF11D97FD49 +:1036D000FA9582830895089520910B0130910C0191 +:1036E000F9013296285F3F4F9081981301C01082F4 +:1036F0003196E217F307C1F7089581E090E0E09179 +:103700000B01F0910C01E80FF91F1082019688302F +:103710009105A9F708958091D80108959091D80155 +:10372000892B8093D801089580959091D8018923A1 +:103730008093D80108958093D80108951092D801FC +:1037400008959091D701892B8093D7010895809592 +:103750009091D70189238093D70108951092D701C2 +:1037600008958093CE0108951092CE01089580911E +:103770000B0190910C01FC0131969C01285F3F4F99 +:1037800080E0919191118F5FE217F307D1F70895CF +:10379000E0910B01F0910C018091D8018083E091C0 +:1037A0000B01F0910C0190818091D701892B8083CE +:1037B0008091CE01882361F0E0910B01F0910C0122 +:1037C0009081892B80830E94B71B81111092CE01BA +:1037D00080910B0190910C010C94AB1090933301EC +:1037E0008093320108958295982F9C7C392F3695CD +:1037F0003695282F237344E0249FC0011124932F72 +:10380000982B292F2A7A2695892F8575880F822B48 +:1038100008950895CF93DF9300D000D01F92CDB7C5 +:10382000DEB70F900F900F900F900F90DF91CF9118 +:103830000895089508950C94EE118091EE0184305E +:1038400021F11092DA0120E488E190E00FB6F894BB +:10385000A895809360000FBE2093600083B7817F9E +:10386000846083BF83B7816083BF7894889583B772 +:103870008E7F83BF0FB6F894A89580916000886111 +:1038800080936000109260000FBE0895089508951F +:10389000CF930E94461C0E948F060E94471CC0E0E6 +:1038A0008C2F0E94F506811104C0CF5FC031C1F793 +:1038B00001C081E0CF9108950C942A161F920F92B7 +:1038C0000FB60F9211248F939F93AF93BF93809164 +:1038D000DA01811113C08091DB019091DC01A0918C +:1038E000DD01B091DE014196A11DB11D8093DB0188 +:1038F0009093DC01A093DD01B093DE01BF91AF9105 +:103900009F918F910F900FBE0F901F90189582E09E +:1039100084BD93E095BD9AEF97BD80936E000895A6 +:103920002FB7F8948091DB019091DC01A091DD012B +:10393000B091DE012FBF08952FB7F8946091DB019D +:103940007091DC018091DD019091DE012FBF08951F +:10395000CF92DF92EF92FF920F931F932FB7F894BD +:103960004091DB015091DC016091DD017091DE013D +:103970002FBF6A017B01EE24FF248C0120E030E0A0 +:10398000C016D106E206F30610F4415051099A011F +:10399000281B390BC9011F910F91FF90EF90DF9009 +:1039A000CF9008951F920F920FB60F9211248F930C +:1039B0009F93AF93BF938091DB019091DC01A09125 +:1039C000DD01B091DE010196A11DB11D8093DB01E7 +:1039D0009093DC01A093DD01B093DE01BF91AF9124 +:1039E0009F918F910F900FBE0F901F9018950E947E +:1039F000B80DF8942FEF87EA91E62150804090406F +:103A0000E1F700C0000087E090EBDC018093F70154 +:103A10009093F801A093F901B093FA019CE088E13A +:103A20000FB6F894A895809360000FBE9093600045 +:103A3000FFCF28E0929FF0011124E80FF11DE05222 +:103A4000FF4F9491892F8F7092959F700895CF9317 +:103A5000C82FCB010E94191D282F30E080E1989FCC +:103A6000A0011124422B532B4038510519F480E05A +:103A700090E015C09770E92FF0E088E0C89FE00D56 +:103A8000F11D112484E0EE0FFF1F8A95E1F7E20F8C +:103A9000F31FEE0FFF1FE050F84985919491CF91ED +:103AA000089580E090E0089508958091E10180FFFD +:103AB0000BC06091100185E0689FB00111247595DD +:103AC0006795759567952BC081FF09C060911001BE +:103AD00085E0689FB00111247595679520C082FF2D +:103AE00007C06091100185E0689FB001112417C0E4 +:103AF0009091E2019923D1F060910F01961788F718 +:103B00002091100185E0289F90011124929FA0012F +:103B1000939F500D112470E0CA010E941125603856 +:103B2000710540F46115710539F002C065E070E07F +:103B3000862F08958FE7089581E008958091E1012F +:103B400080FF08C060910E0170E0759567957595CE +:103B5000679521C081FF06C060910E0170E07595E8 +:103B6000679519C082FF04C060910E0170E010C01B +:103B70009091E2019923C1F060910D019617A0F791 +:103B800080910E01899FC001112470E00E941125CF +:103B90006038710528F46115710521F0862F0895AC +:103BA0008FE7089581E0089561E070E0F4CF803FF1 +:103BB00021F40E94551D819504C0813F29F40E9483 +:103BC000551D8093E5010895823F21F40E94551D03 +:103BD000819504C0833F29F40E94551D8093E40120 +:103BE0000895893F19F40E949E1D05C08A3F31F453 +:103BF0000E949E1D81958093E60108958B3F21F4DC +:103C00000E949E1D819504C08C3F29F40E949E1D38 +:103C10008093E7010895843F21F48091E30181605E +:103C200017C0853F21F48091E301826011C0863F77 +:103C300021F48091E30184600BC0873F21F48091DF +:103C4000E301886005C0883F31F48091E301806121 +:103C50008093E30108958D3F21F48091E10181601B +:103C60000BC08E3F21F48091E101826005C08F3F3F +:103C700029F48091E10184608093E1010895803FFF +:103C800039F48091E50187FF6CC01092E50169C0AD +:103C9000813F29F48091E5011816BCF362C0909130 +:103CA000E401823F29F497FF5CC01092E40159C0FF +:103CB000833F19F41916CCF354C0893F41F4809125 +:103CC000E60118160CF04DC01092E6014AC08A3F7A +:103CD00029F48091E60187FF44C0F6CF8B3F39F489 +:103CE0008091E70187FF3DC01092E7013AC08C3F09 +:103CF00029F48091E7011816BCF333C0843F21F406 +:103D00008091E3018E7F17C0853F21F48091E3010C +:103D10008D7F11C0863F21F48091E3018B7F0BC022 +:103D2000873F21F48091E301877F05C0883F31F40C +:103D30008091E3018F7E8093E30113C08D3F21F4D6 +:103D40008091E1018E7F0BC08E3F21F48091E101D3 +:103D50008D7F05C08F3F29F48091E1018B7F809397 +:103D6000E1018091E40181110EC08091E501811192 +:103D70000AC08091E601811106C08091E70181119E +:103D800002C01092E20108958091D90183FF7EC0A4 +:103D90008BE394E00E946D058091E3011F928F9365 +:103DA00086E394E09F938F930E94060684E394E059 +:103DB0000E946D058091E401282F082E000C330B22 +:103DC0003F938F9381E394E09F938F930E94060625 +:103DD0008FE294E00E946D058091E501282F082E66 +:103DE000000C330B3F938F938CE294E09F938F935F +:103DF0000E9406068AE294E00E946D058091E60129 +:103E0000282F082E000C330B3F938F9387E294E00A +:103E10009F938F930E94060685E294E00E946D05B1 +:103E20008091E701282F082E000C330B3F938F93CE +:103E300082E294E09F938F930E9406068FE194E0C4 +:103E40000E946D058091E2011F928F938CE194E0B6 +:103E50009F938F930E9406068AE194E00E946D056D +:103E60008091E1011F928F9387E194E09F938F935C +:103E70000E94060684E194E00E946D058DB79EB70E +:103E80004C960FB6F8949EBF0FBE8DBF83EE91E0A7 +:103E90000E94F4100E94901C9093E0018093DF0137 +:103EA00008951F93CF93DF938091DF019091E001FC +:103EB0000E94A81CAC019091E201992321F020916D +:103EC000110130E006C0209112018AE0289F900184 +:103ED00011244217530708F485C08091E401C09172 +:103EE000E501D091E6011091E701811107C0C111F0 +:103EF00075C0D11173C0111171C074C09F3F19F00A +:103F00009F5F9093E201181624F40E94551D809340 +:103F1000E4018091E40187FF05C00E94551D819551 +:103F20008093E4011C1624F40E94551D8093E50142 +:103F30008091E50187FF05C00E94551D8195809302 +:103F4000E5016091E401662331F1C091E501CC23E4 +:103F500011F1062E000C770B880B990B0E940C2494 +:103F600023E333E343E35FE30E9470240E94D423FE +:103F70006093E4016C2FCC0F770B880B990B0E9498 +:103F80000C2423E333E343E35FE30E9470240E94A5 +:103F9000D4236093E5011D1624F40E949E1D809396 +:103FA000E6018091E60187FF05C00E949E1D819574 +:103FB0008093E601111624F40E949E1D8093E70170 +:103FC0008091E70187FF05C00E949E1D8195809327 +:103FD000E701DF91CF911F910C94C41E9F3F09F020 +:103FE0008FCF97CFDF91CF911F910895E3EEF1E04E +:103FF00085E0DF011D928A95E9F71092E2011092A7 +:10400000E10108958EE596E00E946D051F9281E022 +:104010008F931F9285E08F9380E196E09F938F931B +:104020000E9406060F900F900F900F900F900F9028 +:1040300008958330E9F128F4813061F0823009F18C +:104040000895853009F462C008F449C0863009F447 +:1040500074C0089580911201262F30E0280F311D81 +:104060002F3F310524F4680F6093120103C08FEFD6 +:1040700080931201809112011F928F9389E495E041 +:1040800072C080911101262F30E0280F311D2F3F83 +:10409000310524F4680F6093110103C08FEF809302 +:1040A0001101809111011F928F9387E395E05BC00E +:1040B00080911001262F30E0280F311D2F3F310550 +:1040C00024F4680F6093100103C08FEF80931001F8 +:1040D000809110011F928F9384E295E044C08091FB +:1040E0000F01262F30E0280F311D2F3F310524F41A +:1040F000680F60930F0103C08FEF80930F018091D1 +:104100000F011F928F938FE095E02DC080910E01DB +:10411000262F30E0280F311D2F3F310524F4680F82 +:1041200060930E0103C08FEF80930E0180910E010A +:104130001F928F9386EF94E016C080910D01262F79 +:1041400030E0280F311D2F3F310524F4680F6093B4 +:104150000D0103C08FEF80930D0180910D011F921F +:104160008F938BED94E09F938F930E9406060F90A0 +:104170000F900F900F900895833081F128F48130D3 +:1041800059F08230D1F00895853009F449C0B8F172 +:10419000863009F456C0089580911201681720F402 +:1041A000861B8093120102C01092120180911201AD +:1041B0001F928F938CEC94E054C08091110168178A +:1041C00020F4861B8093110102C01092110180918E +:1041D00011011F928F938AEB94E043C080911001EC +:1041E000681720F4861B8093100102C01092100102 +:1041F000809110011F928F9387EA94E032C08091E2 +:104200000F01681720F4861B80930F0102C01092E3 +:104210000F0180910F011F928F9382E994E021C0DA +:1042200080910E01681720F4861B80930E0102C056 +:1042300010920E0180910E011F928F9389E794E0F6 +:1042400010C080910D01681720F4861B80930D012A +:1042500002C010920D0180910D011F928F938EE587 +:1042600094E09F938F930E9406060F900F900F90FB +:104270000F900895CF93C82F1F928F9383E697E0F6 +:104280009F938F930E94060681E090E0A0E0B0E04B +:10429000BC01CD0104C0660F771F881F991FCA9506 +:1042A000D2F70E941E1A0F900F900F900F90CF918F +:1042B0000C942A16CF93873288F58E3108F00BC103 +:1042C0008E3009F487C0D8F4873009F460C08B3091 +:1042D00009F44FC0863009F002C18091D901817F75 +:1042E0008E7F8093D90188E697E00E946D058BE26E +:1042F0009AE00E946D0581E08093E90146C0863115 +:1043000009F4B0C020F4803109F47AC0E8C08931E2 +:1043100009F491C08B3109F449C0E1C0883349F1F7 +:1043200050F4893209F4D5C0853309F4D2C08732FC +:1043300009F0D5C0CEC0833409F4CBC028F48A3349 +:1043400008F4CDC08953C8C0883409F0C8C00E94A1 +:104350002A168AE19AE00E946D052FEF83ED90E323 +:10436000215080409040E1F700C000000E94F71CFF +:104370000CC08FE897E041C081E09AE00E946D0593 +:104380008091D90181608093D901C1E0ADC0809155 +:10439000D901C82FC17080FFEFCF8DE09AE00E9455 +:1043A0006D058091D901817F8E7F3FC09091D901A9 +:1043B00091FBCC27C0F981E0C827892FC0FB81F988 +:1043C0008093D901CC2319F084EF99E029C086EEBF +:1043D00099E013C09091D90192FBCC27C0F981E0FC +:1043E000C827892FC0FB82F98093D901CC2319F00B +:1043F00087ED99E015C087EC99E00E946D05C5CF67 +:104400009091D90193FBCC27C0F981E0C827892F6F +:10441000C0FB83F98093D901CC2351F08BEB99E059 +:104420000E946D058091D90181608093D9015CC0A3 +:104430008EEA99E0E2CF8FE999E00E946D0587E767 +:1044400099E00E946D058DE299E00E946D0580E083 +:1044500099E00E946D058BEB98E00E946D058DE858 +:1044600098E0CBCF8FE798E00E946D050E949F10E7 +:104470001F928F9385E698E09F938F930E94060684 +:1044800080910A011F928F938EE498E09F938F93FF +:104490000E940606809176011F928F938BE398E02D +:1044A0009F938F930E9406060E949C1C9F938F935C +:1044B0007F936F9384E298E09F938F930E94060608 +:1044C0008DB79EB742960FB6F8949EBF0FBE8DBFB4 +:1044D0005CCF80E001C08D510E943A2156CF82E22C +:1044E00098E00E946D05C0E08C2FCF91089580E088 +:1044F000089580E00895CF93C82F8091E90181301D +:1045000081F020F0823009F44FC046C1E0910B01E8 +:10451000F0910C018081813169F0823209F03EC155 +:1045200009C0E0910B01F0910C018081813111F003 +:10453000823261F48C2F0E947722811104C08C2F6B +:104540000E945A212FC081E090E02CC08C2F0E9445 +:104550007922811126C0C431E1F070F4CB3081F0B2 +:10456000C031D1F40E9402208BE597E00E946D05D6 +:1045700082E08093E90115C0C93259F0C83361F473 +:1045800088E697E00E946D058FE597E00E946D0533 +:1045900008C01092E90104C189E597E00E946D0509 +:1045A000FFC081E08170FEC0C43228F5CE3108F032 +:1045B000C1C0CB30A1F1D0F4C73009F0D3C08EE137 +:1045C0008093120182E3809311018AE080931001AD +:1045D00084E180930F0188E080930E0188E280934C +:1045E0000D018FEF95E00E946D05BFC0C33149F109 +:1045F000C431C1F0B7C0CB3409F4A9C028F4C93222 +:1046000089F0C83361F0AEC0C13509F49EC0C2352F +:1046100009F499C0CE3409F0A5C06AE09EC00E949A +:104620000220A3C08091E801882319F01092E801CC +:104630009CC08CE096E00E946D0581E08093E901CA +:10464000B1C086EE95E00E946D0584ED95E00E9474 +:104650006D05809112011F928F9381ED95E09F93DC +:104660008F930E9406068FEC95E00E946D058DEBFE +:1046700095E00E946D05809111011F928F938AEB46 +:1046800095E09F938F930E94060688EB95E00E9429 +:104690006D0589EA95E00E946D05809110011F92D9 +:1046A0008F9386EA95E09F938F930E94060684EA93 +:1046B00095E00E946D0583E995E00E946D0580916B +:1046C0000F011F928F9380E995E09F938F930E9433 +:1046D00006068EE895E00E946D0589E795E00E9448 +:1046E0006D0580910E011F928F9386E795E09F9351 +:1046F0008F930E94060684E795E00E946D058DE584 +:1047000095E00E946D0580910D011F928F938AE5BF +:1047100095E09F938F930E94060688E595E00E949E +:104720006D058DB79EB748960FB6F8949EBF0FBE25 +:104730008DBF1BC0CE51EC2FF0E0E95DFE4F8081B4 +:104740008093E80112C061E003C061E006C06AE046 +:104750008091E8010E94192008C08091E8010E9420 +:10476000BC2003C08DEF95E013C08091E801882341 +:1047700069F01F928F9387EF95E09F938F930E942C +:1047800006060F900F900F900F9004C084EF95E0F5 +:104790000E946D0581E006C01092E90180E002C030 +:1047A00080E000CFCF9108950E94DB236894B1117F +:1047B0000C946A2408950E944F2488F09F5798F023 +:1047C000B92F9927B751B0F0E1F0660F771F881F16 +:1047D000991F1AF0BA95C9F714C0B13091F00E9430 +:1047E0006924B1E008950C946924672F782F8827F5 +:1047F000B85F39F0B93FCCF3869577956795B39557 +:10480000D9F73EF490958095709561957F4F8F4FC5 +:104810009F4F0895E89409C097FB3EF490958095CA +:10482000709561957F4F8F4F9F4F9923A9F0F92F76 +:1048300096E9BB279395F695879577956795B795F4 +:10484000F111F8CFFAF4BB0F11F460FF1BC06F5FDA +:104850007F4F8F4F9F4F16C0882311F096E911C0EC +:10486000772321F09EE8872F762F05C0662371F00D +:1048700096E8862F70E060E02AF09A95660F771F21 +:10488000881FDAF7880F9695879597F9089557FD51 +:104890009058440F551F59F05F3F71F04795880FAE +:1048A00097FB991F61F09F3F79F087950895121645 +:1048B00013061406551FF2CF4695F1DF08C01616F1 +:1048C00017061806991FF1CF8695710561050894A2 +:1048D0000895E894BB2766277727CB0197F90895B9 +:1048E0000E9483240C94F4240E94E62438F00E9451 +:1048F000ED2420F0952311F00C94DD240C94E32496 +:1049000011240C946A240E94472470F3959FC1F3EC +:10491000950F50E0551F629FF001729FBB27F00D6D +:10492000B11D639FAA27F00DB11DAA1F649F6627C2 +:10493000B00DA11D661F829F2227B00DA11D621F11 +:10494000739FB00DA11D621F839FA00D611D221FCB +:10495000749F3327A00D611D231F849F600D211DAF +:10496000822F762F6A2F11249F5750409AF0F1F032 +:1049700088234AF0EE0FFF1FBB1F661F771F881F9B +:1049800091505040A9F79E3F510580F00C94DD24D2 +:104990000C946A245F3FE4F3983ED4F386957795B0 +:1049A0006795B795F795E7959F5FC1F7FE2B880F41 +:1049B000911D9695879597F9089597F99F6780E8D7 +:1049C00070E060E008959FEF80EC089500240A9461 +:1049D0001616170618060906089500240A941216DA +:1049E0001306140605060895092E0394000C11F40D +:1049F000882352F0BB0F40F4BF2B11F460FF04C0BA +:104A00006F5F7F4F8F4F9F4F0895991B79E004C0D0 +:104A1000991F961708F0961B881F7A95C9F78095FD +:104A2000089597FB072E16F4009407D077FD09D060 +:104A30000E942B2507FC05D03EF4909581959F4F51 +:104A40000895709561957F4F0895EE0FFF1F0590B3 +:104A5000F491E02D0994AA1BBB1B51E107C0AA1FCA +:104A6000BB1FA617B70710F0A61BB70B881F991F0F +:104A70005A95A9F780959095BC01CD010895F894B9 +:024A8000FFCF66 +:104A82000A09FB09D809A409700901CF01280814F1 +:104A92000A321E404D3622AF0362032C030A0396EC +:104AA20002AF02C802E10201020304050607080977 +:024AB200000002 +:106800008800EA44E944E244040005000600070069 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031003200330034003500360037008C +:10687000380039003A003B003C003D003E003F003C +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530054005500560057004C +:1068B000580059005A005B005C005D005E005F00FC +:1068C000600061006200630064006500850067008D +:1068D000680069006A006B006C006D006E006F005C +:1068E0007000710072007300890087008A008B00BD +:1068F000E000E100E200E300F1A1E500E600E700CE +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010035004C0039000100440045005200A0 +:1069600049000100010050004F0029004D004E0079 +:1069700051000100680069006A006B006C006D0046 +:106980006E006F0070007100720073000100010062 +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E0000100010001000100490001000100010057 +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/ibm4704_usb/binary/ibm4704_usb_rev1_unimap.hex b/converter/ibm4704_usb/binary/ibm4704_usb_rev1_unimap.hex new file mode 100644 index 00000000..3cafd000 --- /dev/null +++ b/converter/ibm4704_usb/binary/ibm4704_usb_rev1_unimap.hex @@ -0,0 +1,1230 @@ +:100000000C9418050C945F050C9454080C945F052F +:100010000C945F050C945F050C945F050C945F05D0 +:100020000C945F050C945F050C94330E0C94050F33 +:100030000C945E1C0C945F050C945F050C945F059A +:100040000C945F050C945F050C945F050C945F05A0 +:100050000C945F050C94D21C0C945F050C945F0506 +:100060000C945F050C945F050C945F050C945F0580 +:100070000C945F050C945F050C945F050C945F0570 +:100080000C945F050C945F050C945F050C945F0560 +:100090000C945F050C945F050C945F050C945F0550 +:1000A0000C945F050C945F050C945F05720F940F20 +:1000B0008210940F8210D90FFC0F8210511064101F +:1000C0004D134D137A137A13D5131114091609160B +:1000D0002914091624152415DF1509160916F51516 +:1000E000350C12132B141A8024252680742E2A27EF +:1000F0002122230815171C181E1F202F3031802D98 +:1001000039041607090A0B0D0E0F33343228807C90 +:1001100079781D1B0619051110363738757D647AFC +:100120002C7B7F8040413A535455565F6061578025 +:100130005C5D5E6642433C585A5B67296263598046 +:10014000808080803B473D518080494A4B4C4D4EDA +:10015000463E48804452453F504F8080808080809A +:10016000253032583A20253038620A000A722F634F +:100170002030313233343536370A00253032580AD0 +:1001800000253032580A004572726F723A202530CD +:1001900032580A00456E640A0073253032583A72AC +:1001A000253032582000456E61626C6520627265B0 +:1001B000616B3A20004B6579626F6172642049443B +:1001C0003A20253032580A0049424D203437303425 +:1001D00020636F6E7665727465720A00726275666E +:1001E0003A2066756C6C0A00523A25303258253038 +:1001F00032580A00533A2530325820005B735D00B4 +:100200004B6579626F6172642073746172742E0A37 +:100210000055534220636F6E666967757265642E80 +:100220000A005B575D005B535D005B525D005B4401 +:100230005D005B435D003803490042004D00200033 +:10024000340037003000340020006B006500790076 +:1002500062006F00610072006400200063006F00A4 +:100260006E00760065007200740065007200000088 +:100270000E0374002E006D002E006B002E00000097 +:100280000403090409027400040100A032090400F7 +:1002900000010301010009211101000122400007B2 +:1002A00005810308000A0904010001030102000995 +:1002B0002111010001224D000705820308000A09EF +:1002C000040200010300000009211101000122368F +:1002D000000705830308000A090403000203000065 +:1002E00000092111010001222200070584032000DA +:1002F000010705040320000112011001000000089D +:10030000EDFE07470100010200010631FF0974A15B +:10031000010975150026FF009520750881020976F0 +:10032000150026FF00952075089102C0050109807F +:10033000A101850216810026B7001A81002AB700A4 +:10034000751095018100C0050C0901A101850316F6 +:100350000100269C021A01002A9C02751095018159 +:1003600000C005010902A1010901A1000509190147 +:100370002905150025019505750181029501750373 +:1003800081010501093009311581257F9502750824 +:10039000810609381581257F950175088106050CB0 +:1003A0000A38021581257F950175088106C0C005B0 +:1003B000010906A101050719E029E71500250195A6 +:1003C0000875018102950175088101050819012947 +:1003D00005950575019102950175039101050719B0 +:1003E0000029FF150026FF00950675088100C00A48 +:1003F000002530325820006B6579626F6172645F4E +:100400007265706F72743A20004C45443A20253072 +:1004100032580A00290A002575002F002575005D55 +:1004200028002564002000256400200025640020A9 +:10043000002564007C0025303258006D6F757365AF +:100440006B6579205B62746E7C78207920762068F9 +:100450005D287265702F61636C293A205B006D6BBB +:100460005F776865656C5F74696D655F746F5F6DFC +:100470006178203D2025640A006D6B5F77686565B3 +:100480006C5F6D61785F7370656564203D202564E5 +:100490000A006D6B5F74696D655F746F5F6D617885 +:1004A000203D2025640A006D6B5F6D61785F73707D +:1004B000656564203D2025640A006D6B5F696E747C +:1004C000657276616C203D2025640A006D6B5F6467 +:1004D000656C6179203D2025640A006D6B5F77684B +:1004E00065656C5F74696D655F746F5F6D617820C1 +:1004F0003D2025640A006D6B5F776865656C5F6DF4 +:1005000061785F7370656564203D2025640A006D25 +:100510006B5F74696D655F746F5F6D6178203D20FE +:1005200025640A006D6B5F6D61785F73706565644B +:10053000203D2025640A006D6B5F696E74657276DC +:10054000616C203D2025640A006D6B5F64656C6101 +:1005500079203D2025640A000A00257500363A20DE +:10056000776865656C5F74696D655F746F5F6D61F9 +:10057000783A20000A00257500353A2077686565CD +:100580006C5F6D61785F73706565643A20000A0086 +:10059000257500343A2074696D655F746F5F6D6115 +:1005A000783A20000A00257500333A206D61785FA3 +:1005B00073706565643A20000A00257500323A20A0 +:1005C000696E74657276616C286D73293A20000A31 +:1005D00000257500313A2064656C6179282A313034 +:1005E0006D73293A20000A092D2056616C756573D8 +:1005F000202D0A004D3E004D25643E20003F007333 +:1006000065742064656661756C740A00433E200061 +:1006100077686572652064656C74613A20637572F1 +:10062000736F723D25642C20776865656C3D256489 +:100630000A53656520687474703A2F2F656E2E77A3 +:10064000696B6970656469612E6F72672F77696B7A +:10065000692F4D6F7573655F6B6579730A000A09C1 +:100660002D204D6F7573656B6579202D0A455343B9 +:100670002F713A09717569740A313A0964656C61C0 +:1006800079282A31306D73290A323A09696E746506 +:100690007276616C286D73290A333A096D61785F4F +:1006A00073706565640A343A0974696D655F746FC7 +:1006B0005F6D61780A353A09776865656C5F6D61D1 +:1006C000785F73706565640A363A09776865656CAA +:1006D0005F74696D655F746F5F6D61780A0A703A67 +:1006E000097072696E742076616C7565730A643A7C +:1006F000097365742064656661756C74730A75703E +:100700003A092B310A646F776E3A092D310A706706 +:1007100075703A092B31300A7067646F776E3A0949 +:100720002D31300A0A7370656564203D2064656C64 +:100730007461202A206D61785F7370656564202A7A +:100740002028726570656174202F2074696D655F63 +:10075000746F5F6D6178290A003F004D3E200043B1 +:100760003E20004C25640A000A092D20436F6E7359 +:100770006F6C65202D0A4553432F713A09717569D5 +:10078000740A6D3A096D6F7573656B65790A000AB5 +:10079000092D204D61676963202D0A643A0964655B +:1007A0006275670A783A096465627567206D6174DD +:1007B0007269780A6B3A096465627567206B6579BE +:1007C000626F6172640A6D3A096465627567206DD3 +:1007D0006F7573650A763A0976657273696F6E0A8A +:1007E000733A097374617475730A633A09636F6EBF +:1007F000736F6C65206D6F64650A302D343A096C37 +:1008000061796572302D34284631302D4634290AFD +:10081000506175733A09626F6F746C6F61646572D1 +:100820000A003F0074696D65725F726561643332FE +:1008300028293A202530346C580A006B6579626F9C +:100840006172645F69646C653A2025580A006B65C3 +:1008500079626F6172645F70726F746F636F6C3A0C +:100860002025580A00686F73745F6B6579626F6149 +:1008700072645F6C65647328293A2025580A000A5F +:10088000092D20537461747573202D0A004743436A +:100890003A20342E392E32204156522D4C494243B3 +:1008A0003A20312E382E3073766E204156525F41F9 +:1008B0005243483A20617672350A004F5054494FEE +:1008C0004E533A204C554641204D4F5553454B45CC +:1008D000592045585452414B455920434F4E534F90 +:1008E0004C4520434F4D4D414E44204B45594D41C1 +:1008F000505F53454354494F4E20343039360A0037 +:100900004255494C443A20383030653963612D6492 +:1009100069727479202831303A35313A30322053B7 +:1009200065702033302032303136290A0056494470 +:100930003A2030784645454428742E6D2E6B2E297A +:10094000205049443A203078343730372849424DD6 +:100950002034373034206B6579626F6172642063B4 +:100960006F6E76657274657229205645523A203052 +:1009700078303030310A00444553433A20636F6E7B +:10098000766572742049424D2034373034206B65CF +:1009900079626F61726420746F205553420A000AB5 +:1009A000092D2056657273696F6E202D0A000A6D3D +:1009B0006F7573653A206F66660A000A6D6F75730E +:1009C000653A206F6E0A000A6B6579626F61726426 +:1009D0003A206F66660A000A6B6579626F6172641D +:1009E0003A206F6E0A000A6D61747269783A206F5E +:1009F00066660A000A6D61747269783A206F6E0A41 +:100A0000000A64656275673A206F6E0A000A6465C1 +:100A10006275673A206F66660A000A0A626F6F7431 +:100A20006C6F616465722E2E2E2000433E20000004 +:100A300011241FBECFEFDAE0DEBFCDBF04B603FE48 +:100A400027C08091F7019091F801A091F901B09130 +:100A5000FA018730904BA740B04BD1F41092F701C8 +:100A60001092F8011092F9011092FA0114BE84B7A5 +:100A7000877F84BF0FB6F894A89580916000886145 +:100A800080936000109260000FBEE0E0F8E30995EB +:100A900011E0A0E0B1E0E2E8FAE402C005900D92B6 +:100AA000A233B107D9F721E0A2E3B1E001C01D9262 +:100AB000A73FB207E1F70E94620B0C943F250C940C +:100AC0000000FF93EF93E0913201F09133013097F2 +:100AD00009F00995EF91FF910895FC01859180300F +:100AE00011F0EFDFFBCF0895FF27E0E230E247FF90 +:100AF0000CC0419597FF09C0EDE260957095809517 +:100B00009095611D711D811D911D27FF02C02195CA +:100B100030E350E2AA27660F771F881F991FAA1F8C +:100B2000A41710F0A41B63955A95A9F7AA3008F0F2 +:100B3000A95FA05DAF93F3956115710581059105DE +:100B400041F7ED3211F4EF93F395F21718F43F9358 +:100B5000F395FBCF8F91B5DFFA95E1F70895E99111 +:100B6000F9918591803021F0853219F0AADFF9CF13 +:100B7000089520E0E89455915532C1F3503311F4B3 +:100B8000689455915A3348F4505390F3220F022E33 +:100B9000220F220F200D250FF4CF0EF421958991FD +:100BA0009991533619F3533729F1533559F1BC0153 +:100BB00088279927E8945C3621F489919991689463 +:100BC0005591543639F446EF7EF077FF0DC08FEF24 +:100BD0009FEF0AC055374AE039F0583540E121F01F +:100BE000523642E009F00895FF93EF937DDFEF91D5 +:100BF000FF91B7CFFF93EF93FC0181918030B9F360 +:100C000060DFFBCFFF93EF9368DFF1CFDF93CF93EC +:100C1000CDB7DEB72596A3DFCF91DF9108950C9471 +:100C20007307FF920F931F93CF93DF938091D901A6 +:100C300081608093D90188EC91E00E946D05E4E326 +:100C4000F1E080E18E0F11928E13FDCF2FEF87EA36 +:100C500091E6215080409040E1F700C000000E94E2 +:100C600048081F928F9385EB91E09F938F930E948A +:100C7000060686EA91E00E946D050F900F900F9096 +:100C80000F908CEF0E948207882339F08FE39CE954 +:100C90000197F1F700C00000F4CFC0E0D0E009E90F +:100CA00011E08C2F8068F82E8F2D0E9482078823F8 +:100CB00039F08FE39CE90197F1F700C00000F4CF11 +:100CC0008FE19EE40197F1F700C000000E94480800 +:100CD0001F928F93DF93CF931F930F930E9406066B +:100CE00021960F900F900F900F900F900F90CF378D +:100CF000D105B9F68FEF0E948207882339F08FE380 +:100D00009CE90197F1F700C00000F4CF84E991E07D +:100D1000DF91CF911F910F91FF900C946D05CF93B0 +:100D2000DF930E9448088F3F11F480E05BC0982F4A +:100D30009F779C37A0F01F928F9387E891E09F9355 +:100D40008F930E9406060F900F900F900F90E4E390 +:100D5000F1E080E18E0F11928E13FDCFE6CF9091DE +:100D6000D901C82FC695C695C695D82FD77087FFCD +:100D70001CC090FF0CC01F928F9381E891E09F935D +:100D80008F930E9406060F900F900F900F90EC2FFC +:100D9000EF70F0E0EC5CFE4F81E090E001C0880F66 +:100DA000DA95EAF79081892B1BC090FF0CC01F9247 +:100DB0008F938BE791E09F938F930E9406060F908D +:100DC0000F900F900F90EC2FF0E0EC5CFE4F81E065 +:100DD00090E001C0880FDA95EAF780959081892329 +:100DE000808381E0DF91CF910895E82FF0E0EC5C03 +:100DF000FE4F80810895EF92FF920F931F93CF9340 +:100E0000DF938CE691E00E946D0584E3E82E81E09B +:100E1000F82EC0E0D0E000E611E0F70181917F01FB +:100E20000E94F31B1F928F93DF93CF931F930F9317 +:100E30000E94060621960F900F900F900F900F9032 +:100E40000F90C031D10549F7DF91CF911F910F91DC +:100E5000FF90EF90089508959FB7F894209148016E +:100E600080914901821761F030E0F901E65BFE4FA5 +:100E700080812F5F3F4F2F7133272093480101C09E +:100E800080E09FBF08955198599A08955898509AB4 +:100E900008955098589A08955198599A85E08A95DE +:100EA000F1F7000089B18695817008955098589A9D +:100EB00085E08A95F1F7000089B181700895CF939C +:100EC000DF93C4E6D0E00E944C07811108C0209750 +:100ED00031F085E08A95F1F700002197F4CFCE013B +:100EE000DF91CF9108950E9443070E944607E9E6EB +:100EF000F0E080818C608083E19AE99A0E94430748 +:100F00000C944907BF92CF92DF92EF92FF920F931A +:100F10001F93CF93DF93C82E10924701E9980E9448 +:100F200043070E9449075998519A0CE211E00E9428 +:100F3000560781110AC00115110549F085E08A950F +:100F4000F1F7000001501109F2CF012B11F480E3F9 +:100F500073C000E010E0D1E0D12CBB24B394C02FCB +:100F60000E945F07892B11F4C05C24C0C601002ECB +:100F700002C0959587950A94E2F780FF04C0DB25AF +:100F80000E94490702C00E94460784E6E82EF12C21 +:100F90000E944C07882359F0E114F10451F085E0D8 +:100FA0008A95F1F7000081E0E81AF108F1CFEF2807 +:100FB00021F4C85BC09347014AC00F5F1F4F083040 +:100FC000110569F60E945F07892B11F484E334C090 +:100FD000DD2329F00E94490704E610E00CC00E94BE +:100FE0004607FACF0115110561F085E08A95F1F702 +:100FF0000000015011090E944C078111F3CF012B11 +:1010000011F485E319C00E945F07892BF9F20E9451 +:10101000490704E610E00E945607882351F00115A5 +:10102000110549F085E08A95F1F70000015011099A +:10103000F2CF012B21F486E38093470108C00E9480 +:1010400043070E944907E19AE99A80E017C00E948D +:1010500043070E94490780914701813360F01F9246 +:101060008F9384EF91E09F938F930E9406060F90D9 +:101070000F900F900F90E19AE99A8FEFDF91CF9147 +:101080001F910F91FF90EF90DF90CF90BF90089548 +:101090002FB7F89490914901809148012FBF981380 +:1010A0000C942C078FEF08951F920F920FB60F929A +:1010B00011242F933F934F935F936F937F938F935D +:1010C0009F93AF93BF93CF93DF93EF93FF931092D0 +:1010D0004701809146018830F1F030F0893009F005 +:1010E0005CC0C4E6D0E02EC0809145018695809317 +:1010F00045010E945607882309F449C080914501A3 +:1011000080688093450181E090914401911180E0D5 +:10111000809344013CC00E945607882339F081E047 +:1011200090914401911180E08093440180914401A9 +:10113000882399F12CC0209781F185E08A95F1F7F9 +:10114000000021970E9456078111F5CFCD2B29F180 +:1011500040914501CFB7F8948091490190E09C01FE +:101160002F5F3F4F2F71332750914801521739F0AD +:10117000FC01E65BFE4F40832093490104C08CEDE7 +:1011800091E00E946D05CFBF109247012AC0809167 +:1011900046018F5F809346012AC08091460180936B +:1011A00047018EEF0E948207882339F08FE99FE084 +:1011B0000197F1F700C00000F4CF809145011F9224 +:1011C0008F93809146011F928F9388EE91E09F93B9 +:1011D0008F930E9406060F900F900F900F900F9024 +:1011E0000F90109246011092450110924401FF9118 +:1011F000EF91DF91CF91BF91AF919F918F917F91AF +:101200006F915F914F913F912F910F900FBE0F9073 +:101210001F9018958091750108959FB7F8941092CA +:101220006C019FBF9091EE01943009F057C09091EE +:10123000E9009F703091EC00232F217030FD20E8F1 +:10124000922B24E02093E9002091EB0020FF43C083 +:101250002091EE0027FF3FC020916A01222321F058 +:101260002091E80025FF37C010926A0126E03091F6 +:10127000E80035FD15C03091EE01343061F5309154 +:10128000EB0035FD28C0215021F481E080936A01F4 +:1012900022C0EFE9FFE03197F1F700C00000E7CF8F +:1012A0008093F1008091E80085FD0AC08091E800FC +:1012B00080FFFCCF8091E8008E778093E80006C025 +:1012C0008FB7F89421E020936C018FBF9F709093AB +:1012D000E90080E008959F709093E9008FEF0895F2 +:1012E000CF93DF9300D01F92CDB7DEB79C018091E2 +:1012F000EE01843019F593E099833B832A83909320 +:10130000E9008FEF9091E800815095FD06C095EDC2 +:101310009A95F1F700008111F5CF8091E80085FFE3 +:101320000DC040E050E063E070E0CE0101960E9405 +:10133000230C8091E8008E778093E8000F900F9047 +:101340000F90DF91CF910895CF93DF9300D01F923C +:10135000CDB7DEB72091EE01243021F522E02983BC +:101360009B838A8383E08093E9008FEF9091E8006C +:10137000815095FD06C095ED9A95F1F70000811119 +:10138000F5CF8091E80085FF0DC040E050E063E0BC +:1013900070E0CE0101960E94230C8091E8008E77C8 +:1013A0008093E8000F900F900F90DF91CF910895F8 +:1013B0002091EE012430F1F422E02093E9002FEF98 +:1013C0003091E800215035FD06C035ED3A95F1F732 +:1013D00000002111F5CF2091E80025FF0BC040E06F +:1013E00050E065E070E00E94230C8091E8008E7769 +:1013F0008093E8000895CF93DF932091EE0124308D +:1014000039F521E02093E9002FEF3091E8002150D9 +:1014100035FD06C035ED3A95F1F700002111F5CF05 +:101420002091E80025FF14C0EC0140E050E068E0A6 +:1014300070E00E94230C8091E8008E778093E80092 +:1014400088E0FE01ADE6B1E001900D928A95E1F7EA +:10145000DF91CF91089582E392E00E946D05809123 +:10146000ED01811109C00E94B80D0E94150E8091F6 +:10147000E20084608093E20008958EE292E00E9490 +:101480006D051092ED0108958AE292E00C946D05CD +:1014900020916B012F5F822F62E30E940525992323 +:1014A00019F020936B01089510926B0180916C01EB +:1014B000882371F18091EE01843041F58091E9003B +:1014C0008F702091EC00922F917020FD90E8892B75 +:1014D00094E09093E9009091EB0090FF14C09091FC +:1014E000EE0097FF10C09091E80095FF03C01092A6 +:1014F000F100F9CF9091E80090FF05C09091E800CD +:101500009E779093E8008F708093E90010926C01B1 +:10151000089542E061EC81E00E94320D42E061EC0E +:1015200082E00E94320D42E061EC83E00E94320DC5 +:1015300042E261EC84E00C94320D8091F001833042 +:1015400009F453C030F4813071F0823009F48CC05A +:1015500008958A3009F478C08B3009F45EC0893070 +:1015600009F09AC020C08091EF01813A09F094C03F +:101570008091E800877F8093E8008091F30190914B +:10158000F401892B21F468E08DE691E003C060E06E +:1015900080E090E070E00E946E0C8091E8008B7714 +:1015A0008093E80008958091EF01813209F074C0C2 +:1015B0008091F3019091F401892B09F06DC0809125 +:1015C000E800877F8093E8008091E80082FD05C0F5 +:1015D0008091EE018111F8CF5FC08091F10080937E +:1015E00075018091E8008B7753C08091EF01813ABB +:1015F00009F052C08091F3019091F401892B09F018 +:101600004BC08091E800877F8093E8008091E800DC +:1016100080FFFCCF80910A0136C08091EF018132BA +:10162000D9F58091F3019091F401892BA9F580916E +:10163000E800877F8093E8000E94670D8091F101A8 +:1016400080930A010C942A168091EF01813221F5D2 +:101650008091E800877F8093E8000E94670D809169 +:10166000F2018093760108958091EF01813AA1F40F +:101670008091E800877F8093E8008091E80080FFF8 +:10168000FCCF809176018093F1008091E8008E7705 +:101690008093E8000C94670D0895089508950895C7 +:1016A00086E292E00E946D050C944F0B0E941D1C77 +:1016B0008091EC01882329F00E94481C81110C9430 +:1016C0000D0C089584B7877F84BF0FB6F894A89552 +:1016D00080916000886180936000109260000FBE6E +:1016E00090E080E80FB6F8948093610090936100D9 +:1016F0000FBE0E944D0B0E942B110E94B80D0E943C +:10170000150E8091E20084608093E2008DE099E004 +:101710000E94EE1B78948091EE018430E1F781E124 +:1017200092E00E946D050E942D1180E091E00E94E0 +:101730009A1080E092E00E946D050E944E0B80910D +:10174000EE01853039F48CEF91E00E946D050E9426 +:10175000560BF5CF0E943111F2CF0C945C1C82E243 +:1017600092E00E946D050C94AD0B292F3327233096 +:101770003105C9F064F42130310581F022303105A2 +:1017800009F043C084E790E024E832E042C021320F +:101790003105F1F02232310541F137C082E190E0AC +:1017A00028EF32E036C099278130910541F0823030 +:1017B000910541F0892B49F5E0E8F2E005C0E0E74A +:1017C000F2E002C0E6E3F2E0849190E09F0121C0E4 +:1017D0006430D8F4E62FF0E0EE0FFF1FE15EFE4F1D +:1017E0002081318189E090E014C0643070F470E0B1 +:1017F000FB01EE0FFF1FE95EFE4F20813181FB01EF +:10180000ED5EFE4F808190E004C080E090E020E03B +:1018100030E0FA0131832083089580E189BD82E1BF +:1018200089BD09B400FEFDCF8091D8008F7D8093E3 +:10183000D8008091E00082608093E0008091E00019 +:1018400081FDFCCF0895CF92DF92EF92FF920F932C +:101850001F93CF93DF93EC018B016A010E94860DE9 +:10186000811133C0C114D10439F0F6018081918116 +:10187000081B190BC80FD91FE12CF12C01151105FC +:1018800019F18091E80085FD16C08091E8008E77FF +:101890008093E800C114D10449F0F6018081918160 +:1018A000E80EF91EF182E08285E00FC00E94860DED +:1018B000882321F30AC089918093F1000150110916 +:1018C000FFEFEF1AFF0ADACF80E0DF91CF911F918F +:1018D0000F91FF90EF90DF90CF9008952091F50148 +:1018E0003091F6012617370748F06115710539F474 +:1018F0002091E8002E772093E80001C0B90140E074 +:1019000061157105A9F12091EE01222309F443C06C +:10191000253009F442C02091E80023FD40C0209109 +:10192000E80022FD32C02091E80020FFE9CF40917D +:10193000F3002091F20030E0342BFC01CF0161155F +:10194000710559F02830310540F481918093F10000 +:10195000615071092F5F3F4FF1CF41E028303105D1 +:1019600009F040E02091E8002E772093E800C8CFEE +:101970004111C9CF0AC08091EE01882361F0853002 +:1019800061F08091E80083FD0AC08091E80082FF49 +:10199000F2CF80E0089582E0089583E0089581E029 +:1019A00008952091F5013091F6012617370748F088 +:1019B0006115710539F42091E8002E772093E80035 +:1019C00001C0B901FC0120E06115710591F1809120 +:1019D000EE01882309F440C0853009F43FC08091AE +:1019E000E80083FD3DC08091E80082FD2FC080911A +:1019F000E80080FFE9CF2091F3008091F20090E0B1 +:101A0000922B6115710559F08830910540F42491AD +:101A10002093F1003196615071090196F2CF21E0D7 +:101A2000089709F020E08091E8008E778093E80025 +:101A3000CBCF2111CCCF0AC08091EE01882361F079 +:101A4000853061F08091E80083FD0AC08091E80054 +:101A500082FFF2CF80E0089582E0089583E0089548 +:101A600081E00895982F973058F59093E9009817E2 +:101A700039F07091EC002091ED005091F00003C01E +:101A8000242F762F50E021FF19C03091EB003E7FCC +:101A90003093EB003091ED003D7F3093ED003091BD +:101AA000EB0031603093EB007093EC002093ED007D +:101AB0005093F0002091EE0027FF07C09F5FD3CF27 +:101AC0008F708093E90081E0089580E0089580910F +:101AD000EF0187FF11C08091E80082FD05C0809171 +:101AE000EE018111F8CF11C08091E8008B770BC017 +:101AF0008091EE01882349F08091E80080FFF8CFC3 +:101B00008091E8008E778093E80008952091E400AA +:101B10003091E50095E64091EC00842F817040FF04 +:101B200022C08091E80080FD1CC08091EE018823D6 +:101B300091F0853091F08091EB0085FD10C04091CF +:101B4000E4005091E5004217530729F39A019150A0 +:101B500011F784E0089582E0089583E0089581E01C +:101B6000089580E008954091E80042FFDECF089597 +:101B70000E94260E0E942E0EE0EEF0E08081816031 +:101B80008083E8EDF0E080818F77808319BCA7ED3A +:101B9000B0E08C918E7F8C9380818F7E80831092B9 +:101BA000ED0108950F931F93CF93DF930E94260EAC +:101BB0000E942E0EC8EDD0E088818F7788838881BF +:101BC0008068888388818F7D888319BC1092EE019C +:101BD0001092EA011092EC011092EB0100EE10E07D +:101BE000F80180818B7F808388818160888342E0D7 +:101BF00060E080E00E94320DE1EEF0E080818E7FB7 +:101C00008083E2EEF0E08081816080838081886063 +:101C10008083F80180818E7F8083888180618883C2 +:101C2000DF91CF911F910F910895E8EDF0E0808151 +:101C30008F7E8083E7EDF0E080818160808384E0A7 +:101C400082BF81E08093ED010C94D20DE8EDF0E0CD +:101C500080818E7F80831092E20008951092DA00D6 +:101C60001092E10008951F920F920FB60F92112467 +:101C70002F933F934F935F936F937F938F939F9394 +:101C8000AF93BF93EF93FF938091E10082FF0BC06E +:101C90008091E20082FF07C08091E1008B7F8093FA +:101CA000E1000E94480A8091DA0080FF1FC0809105 +:101CB000D80080FF1BC08091DA008E7F8093DA000D +:101CC0008091D90080FF0DC080E189BD82E189BD8E +:101CD00009B400FEFDCF81E08093EE010E942B0A43 +:101CE00005C019BC1092EE010E943D0A8091E100EE +:101CF00080FF19C08091E20080FF15C08091E20052 +:101D00008E7F8093E2008091E20080618093E20008 +:101D10008091D80080628093D80019BC85E08093C0 +:101D2000EE010E94500B8091E10084FF30C0809151 +:101D3000E20084FF2CC080E189BD82E189BD09B445 +:101D400000FEFDCF8091D8008F7D8093D8008091D8 +:101D5000E1008F7E8093E1008091E2008F7E80938E +:101D6000E2008091E20081608093E2008091EA01CC +:101D7000882311F084E007C08091E30087FD02C052 +:101D800081E001C083E08093EE010E94AF0B80915F +:101D9000E10083FF29C08091E20083FF25C080918C +:101DA000E100877F8093E10082E08093EE01109252 +:101DB000EA018091E1008E7F8093E1008091E20052 +:101DC0008E7F8093E2008091E20080618093E20048 +:101DD00042E060E080E00E94320D8091F000886077 +:101DE0008093F0000E94440AFF91EF91BF91AF9160 +:101DF0009F918F917F916F915F914F913F912F9123 +:101E00000F900FBE0F901F9018951F920F920FB654 +:101E10000F9211242F933F934F935F936F937F9370 +:101E20008F939F93AF93BF93CF93DF93EF93FF93E2 +:101E3000C091E900CF708091EC00D82FD17080FD67 +:101E4000D0E81092E9008091F000877F8093F00045 +:101E500078940E94490F1092E9008091F000886008 +:101E60008093F000CD2BCF70C093E900FF91EF91EC +:101E7000DF91CF91BF91AF919F918F917F916F91A2 +:101E80005F914F913F912F910F900FBE0F901F9038 +:101E900018951F93CF93DF93CDB7DEB7AA970FB6F0 +:101EA000F894DEBF0FBECDBFEFEEF1E088E08E0FFD +:101EB0009091F10091938E13FBCF0E949D0A809127 +:101EC000E80083FF1FC18091EF019091F001492F3D +:101ED00050E04A30510508F015C1FA01EA5AFF4FA7 +:101EE0000C942525803881F0823809F00BC180914F +:101EF000F3018F708093E9008091EB0085FB8827C8 +:101F000080F91092E90006C08091EB019091EC01FC +:101F1000911182609091E800977F9093E800809300 +:101F2000F1001092F100C8C0282F2D7F09F0EAC0FF +:101F3000882319F0823061F0E5C08091F101813091 +:101F400009F0E0C0933009F080E08093EC012BC0F1 +:101F50008091F101811127C08091F3018F7009F404 +:101F6000D1C08093E9002091EB0020FF1CC093308A +:101F700021F48091EB00806214C09091EB0090619D +:101F80009093EB0021E030E0A90102C0440F551FFF +:101F90008A95E2F74093EA001092EA008091EB0004 +:101FA00088608093EB001092E9008091E800877FC1 +:101FB00086C08111A7C01091F1011F778091E300C5 +:101FC0008078812B8093E3008091E800877F809365 +:101FD000E8000E94670D8091E80080FFFCCF8091AF +:101FE000E30080688093E300111102C082E001C029 +:101FF00083E08093EE0186C08058823008F082C072 +:102000008091F1019091F2018C3D53E0950779F5B3 +:1020100083E08A838AE289834FB7F894DE011396BE +:1020200020E03EE051E2E32FF0E050935700E491CE +:1020300020FF03C0E295EF703F5FEF708E2F90E0BE +:10204000EA3010F0C79601C0C0968D939D932F5F24 +:10205000243149F74FBF8091E800877F8093E800E3 +:102060006AE270E0CE0101960E946E0C14C0AE01CF +:102070004F5F5F4F6091F3010E94B50BBC01892B4C +:1020800009F440C09091E800977F9093E80089811F +:102090009A810E94D10C8091E8008B778093E800B0 +:1020A00031C0803879F58091E800877F8093E8001F +:1020B0008091EA018093F1008091E8008E7780930F +:1020C000E8000E94670D1EC081111CC09091F101B3 +:1020D0009230C0F48091E800877F8093E80090936D +:1020E000EA010E94670D8091EA01811106C080918A +:1020F000E30087FD02C081E001C084E08093EE012F +:102100000E94890A8091E80083FF0AC08091E8005C +:10211000877F8093E8008091EB0080628093EB00E2 +:10212000AA960FB6F894DEBF0FBECDBFDF91CF9158 +:102130001F91089590937C0180937B010895E09115 +:102140007B01F0917C01309721F00190F081E02D2E +:10215000099480E00895EF92FF920F931F93CF931D +:10216000DF93E0917B01F0917C013097B1F18C011C +:102170000280F381E02D09958091D90182FF2DC065 +:1021800080FF04C087EF93E00E946D05E80118E02E +:1021900081EFE82E83E0F82E8091D90180FF0BC0FB +:1021A00088811F928F93FF92EF920E9406060F90F4 +:1021B0000F900F900F90115021961111EDCF80913B +:1021C000D90180FF0AC08FEE93E0DF91CF911F917C +:1021D0000F91FF90EF900C946D05DF91CF911F91BF +:1021E0000F91FF90EF900895E0917B01F0917C01B9 +:1021F000309721F00480F581E02D09940895209115 +:10220000790130917A018217930771F090937A01E6 +:1022100080937901E0917B01F0917C01309721F06E +:102220000680F781E02D099408952091770130917F +:1022300078018217930771F090937801809377016A +:10224000E0917B01F0917C01309721F00084F185D1 +:10225000E02D099408950C940F060E94871C0C949D +:102260001106CF92DF92EF92FF920F931F93CF93BD +:10227000DF9300D000D000D0CDB7DEB70E948F062C +:102280008EE7C82E81E0D82E00E010E0E02E802FEF +:102290000E94F506F60141916F01F42EF826B1F483 +:1022A0000F5F1F4F0031110589F78FEF89838A83F4 +:1022B0001B820E94901C8160782F9D838C834981B2 +:1022C0005A816B818D810E94F01147C09091D90194 +:1022D00091FF04C08E830E94FB068E8120E030E0D7 +:1022E0004F2D50E0922FBA01022E02C075956795CE +:1022F0000A94E2F760FF2BC02983EA8221E030E0F4 +:10230000690102C0CC0CDD1C9A95E2F790E08C21AB +:102310009D21892B09F420E02B830E94901C816071 +:10232000782F9D838C8349815A816B818D810E9496 +:10233000F01149815A816B817C818D810E940A1C38 +:10234000F801E258FE4F8081C826C08206C02F5F88 +:102350003F4F2830310531F6A3CF0E94091C0E945F +:10236000511F10917D010E949F10181741F10E948A +:102370009F1080937D019091D90192FF0EC090FF34 +:102380000CC01F928F9389E094E09F938F930E94DB +:1023900006060F900F900F900F9080917D0126966A +:1023A0000FB6F894DEBF0FBECDBFDF91CF911F9166 +:1023B0000F91FF90EF90DF90CF900C941B1C26960E +:1023C0000FB6F894DEBF0FBECDBFDF91CF911F9146 +:1023D0000F91FF90EF90DF90CF9008950C942B0712 +:1023E000CF93DF93CDB7DEB72B970FB6F894DEBF50 +:1023F0000FBECDBF942F4F83252F588769877A87CB +:102400008B874A855B85452B21F02F3F09F59F3F40 +:10241000F9F4DE01119686E0FD0111928A95E9F743 +:1024200085E0FE01379601900D928A95E1F749818A +:102430005A816B817C818D819E810E94C4182B966C +:102440000FB6F894DEBF0FBECDBFDF91CF910895D8 +:102450004F81588569857A858B850E940A1CD9CF62 +:10246000CF93882309F4A4C0C82F8CEF8C0F813A36 +:1024700048F48C2F0E947B2281119AC08C2F0E94DD +:102480004F1B0CC080E28C0F883058F4C77081E07D +:1024900001C0880FCA95EAF70E948E1BCF910C9459 +:1024A000C81B8BE58C0F833078F4C53A29F0C63A07 +:1024B00031F083E890E005C081E890E002C082E856 +:1024C00090E0CF910C94FF1088E58C0F853108F0D7 +:1024D0006FC0C83A61F1C93A69F1CA3A71F1CB3AB1 +:1024E00079F1CC3A81F1CD3A89F1CE3A91F1CF3AF6 +:1024F00099F1C13BA1F1C03BA9F1C23BB1F1C33B92 +:10250000B9F1C43BC1F1C53BC9F1C63BD1F1C73BF1 +:10251000D9F1C83BE1F1C93BE9F1CA3BF1F1CB3B51 +:10252000F9F1CC3B09F43FC080E090E03EC082EE80 +:1025300090E03BC089EE90E038C08AEE90E035C074 +:1025400085EB90E032C086EB90E02FC083EB90E00B +:102550002CC084EB90E029C087EB90E026C08CEC87 +:1025600090E023C08DEC90E020C083E891E01DC096 +:102570008AE891E01AC082E991E017C084E991E00D +:1025800014C081E292E011C083E292E00EC084E2C6 +:1025900092E00BC085E292E008C086E292E005C0BE +:1025A00087E292E002C08AE292E0CF910C9415118A +:1025B000CF910895882329F19CEF980F913A18F450 +:1025C0000E946C1B0DC090E2980F983058F48770F1 +:1025D00091E001C0990F8A95EAF7892F0E94941B18 +:1025E0000C94C81B9BE5980F933020F480E090E09A +:1025F0000C94FF10885A853120F480E090E00C9410 +:1026000015110895882321F00E948E1B0C94C81B7D +:102610000895882321F00E94941B0C94C81B0895F0 +:10262000CF92DF92EF92FF920F931F93CF93DF939E +:1026300000D000D000D0CDB7DEB725E0FC01DE0130 +:10264000119601900D922A95E1F7FC0140813181AC +:10265000F280258122952F7063817481672B09F4A4 +:10266000D8C23F3F19F44F3F09F4D3C26C014983EC +:102670003A8389819A812E830E940E1B182F092F7D +:102680000E940D1B0E941D1AE02FE295EF70F0E0F2 +:10269000E05AFF4F2E810C942525802F807F902FAC +:1026A0009F70092F882311F00295007FFF2049F0C9 +:1026B000002309F45FC2802F0E94A11B0E94C81B47 +:1026C00059C2812F0E94DA12002309F4A2C2802F7E +:1026D0000E94A71B26960FB6F894DEBF0FBECDBF93 +:1026E000DF91CF911F910F91FF90EF90DF90CF90EE +:1026F0000C94C81B802F807F902F9F70092F8032F1 +:1027000011F00295007F112319F0113001F129C059 +:10271000FF20A9F0802F222349F1213039F5269698 +:102720000FB6F894DEBF0FBECDBFDF91CF911F91E2 +:102730000F91FF90EF90DF90CF900C94B11B22236C +:1027400019F0213009F465C20E94B41B2CC0FF208F +:10275000E9F0263008F05DC20E948B1B802329F02F +:1027600022C0FF20F1F0211115C0802F26960FB650 +:10277000F894DEBF0FBECDBFDF91CF911F910F91B7 +:10278000FF90EF90DF90CF900C940213253008F06B +:1027900040C209C0F601858180FFECC18F7085833E +:1027A000E4CF2111FBC1802F69C1202F26952695EA +:1027B000237030E02115310521F021303105C9F0B9 +:1027C00028C2FF2021F0812F902F937002C080E05B +:1027D00090E026960FB6F894DEBF0FBECDBFDF9116 +:1027E000CF911F910F91FF90EF90DF90CF900C94BD +:1027F000FF10FF2021F0812F902F937002C080E006 +:1028000090E026960FB6F894DEBF0FBECDBFDF91E5 +:10281000CF911F910F91FF90EF90DF90CF900C948C +:102820001511812FFF2019F00E94D71D02C00E94B0 +:102830003F1E26960FB6F894DEBF0FBECDBFDF91C8 +:10284000CF911F910F91FF90EF90DF90CF900C945C +:10285000C41E802F837009F078C0F110DAC1812F77 +:10286000829586958770880F880F912F9F70C92E4B +:10287000D12CE12CF12C082E04C0CC0CDD1CEE1C5C +:10288000FF1C0A94D2F714FF12C04FE050E060E042 +:1028900070E004C0440F551F661F771F8A95D2F75A +:1028A000CB01BA01609570958095909503C060E06A +:1028B00070E0CB01202F269526952370422F50E003 +:1028C00042305105D1F04330510559F16C297D2931 +:1028D0008E299F294130510541F126960FB6F89473 +:1028E000DEBF0FBECDBFDF91CF911F910F91FF9043 +:1028F000EF90DF90CF900C94321A6C297D298E29AD +:102900009F2926960FB6F894DEBF0FBECDBFDF918C +:10291000CF911F910F91FF90EF90DF90CF900C948B +:10292000441A0E94321AC701B60126960FB6F894CF +:10293000DEBF0FBECDBFDF91CF911F910F91FF90F2 +:10294000EF90DF90CF900C94201AFF2019F0802F89 +:10295000817001C08695882309F45BC1812F82951F +:1029600086958770880F880F912F9F70C92ED12C64 +:10297000E12CF12C082E04C0CC0CDD1CEE1CFF1C3D +:102980000A94D2F714FF12C04FE050E060E070E00C +:1029900004C0440F551F661F771F8A95D2F7CB01DD +:1029A000BA01609570958095909503C060E070E0E5 +:1029B000CB01202F269526952370422F50E04230E0 +:1029C0005105D1F04330510559F16C297D298E29EB +:1029D0009F294130510541F126960FB6F894DEBF8C +:1029E0000FBECDBFDF91CF911F910F91FF90EF9060 +:1029F000DF90CF900C94E91A6C297D298E299F29AC +:102A000026960FB6F894DEBF0FBECDBFDF91CF91F3 +:102A10001F910F91FF90EF90DF90CF900C94FB1AD5 +:102A20000E94E91AC701B60126960FB6F894DEBFD8 +:102A30000FBECDBFDF91CF911F910F91FF90EF900F +:102A4000DF90CF900C94D71A103F41F118F4103E4C +:102A500048F48BC0123F09F450C0D8F1133F09F479 +:102A600060C083C01F70802F8F71FF2021F00E94F3 +:102A7000701A812F7BCE0E94911A812F26960FB655 +:102A8000F894DEBF0FBECDBFDF91CF911F910F91A4 +:102A9000FF90EF90DF90CF900C940913FF20A9F0E6 +:102AA000253008F0B6C0802F8F7126960FB6F894A7 +:102AB000DEBF0FBECDBFDF91CF911F910F91FF9071 +:102AC000EF90DF90CF900C94B61A263008F0A1C09A +:102AD000EACFFF20A1F0802F8F7126960FB6F894D1 +:102AE000DEBF0FBECDBFDF91CF911F910F91FF9041 +:102AF000EF90DF90CF900C94701AFF2061F3802F3D +:102B00008F7126960FB6F894DEBF0FBECDBFDF9152 +:102B1000CF911F910F91FF90EF90DF90CF900C9489 +:102B2000911AFF2091F0802F8F7126960FB6F8949E +:102B3000DEBF0FBECDBFDF91CF911F910F91FF90F0 +:102B4000EF90DF90CF900C945B1A26960FB6F89416 +:102B5000DEBF0FBECDBFDF91CF911F910F91FF90D0 +:102B6000EF90DF90CF900C94561AFF20A1F0222313 +:102B700009F4B1CF812F26960FB6F894DEBF0FBEB1 +:102B8000CDBFDF91CF911F910F91FF90EF90DF901C +:102B9000CF900C943012222309F4B1CF812F2696C6 +:102BA0000FB6F894DEBF0FBECDBFDF91CF911F915E +:102BB0000F91FF90EF90DF90CF900C94DA12402F9E +:102BC0004F70612FC6010E94511D26960FB6F894D2 +:102BD000DEBF0FBECDBFDF91CF911F910F91FF9050 +:102BE000EF90DF90CF900C946819402F4F70612FB9 +:102BF000C60126960FB6F894DEBF0FBECDBFDF919B +:102C0000CF911F910F91FF90EF90DF90CF900C9498 +:102C1000541D26960FB6F894DEBF0FBECDBFDF91D0 +:102C2000CF911F910F91FF90EF90DF90CF9008957B +:102C30000E94AE1B0E947D1B0E94C81B0E94F61FB3 +:102C40000E94C41E80E090E00E94FF1080E090E0AF +:102C50000C9415110E949E1B0C9418160E940E1BBA +:102C6000292F22952F7030E02C3031054CF42A307A +:102C700031056CF4225031092230310588F407C047 +:102C80002C30310549F02F30310531F009C0803E3C +:102C900048F0803F29F406C093FB882780F9089507 +:102CA00080E0089581E00895CF93DF9300D000D0B5 +:102CB0001F92CDB7DEB70F900F900F900F900F902F +:102CC000DF91CF910895CF93DF9300D000D000D053 +:102CD000CDB7DEB726960FB6F894DEBF0FBECDBFD8 +:102CE000DF91CF9108951F93CF93DF93C0918E0111 +:102CF00016E080918F01C81799F0D0E01C9FF00179 +:102D00001D9FF00D1124E057FE4F408151816281DB +:102D10007381848195810E9463162196C770E9CFE3 +:102D2000DF91CF911F9108954091C0015091C10151 +:102D30006091C2017091C3018091C4019091C5015D +:102D40000C9463168091C50182958F7009F054C070 +:102D50008091C201882309F44FC080918E01A09117 +:102D60008F016091C0017091C1014091C3015091E8 +:102D7000C401B6E08A1709F43FC090E0411551053F +:102D8000C1F17F3F11F46F3FA1F1B89FF001B99FEE +:102D9000F00D1124E057FE4F218172132AC02081CB +:102DA000621327C02281211124C02381348124177A +:102DB000350710F421503109241B350B283C31050F +:102DC000C0F42091C5012F7020612093C50126E039 +:102DD000289FF001299FF00D1124EB56FE4F8081B2 +:102DE0008F708061808380EC91E00E9410130C94BE +:102DF000731601968770BECF0895CF92DF92EF923F +:102E0000FF920F931F93CF93DF93CDB7DEB76297F7 +:102E10000FB6F894DEBF0FBECDBF8C0185E0F80180 +:102E2000DE011D9601900D928A95E1F7D8014C9133 +:102E300011965C91119712966C9112971396CD9002 +:102E4000DC9014973091C0017091C1018091C30151 +:102E50009091C401009709F46BC17F3F19F43F3F83 +:102E600009F466C1E090C201EE2009F4C0C02091CF +:102E7000C501C816D90628F0F601E81BF90BCF01E9 +:102E800004C0809590958C0D9D1DFF24F394883C83 +:102E9000910578F0F12C207F09F0C6C07C2DD98AED +:102EA000C88A89890E94541680EC91E00E94101310 +:102EB000B1C0822F807F09F046C0751314C034134F +:102EC00012C0611110C02F7020612093C5010E94B3 +:102ED000941680EC91E00E9410138091C501D801F6 +:102EE00015968C932EC0CD2819F15F3F11F44F3FFA +:102EF000F9F0F62E61111CC080918E0120918F0196 +:102F000036E0821709F45AC090E0389FF001399FEB +:102F1000F00D1124E057FE4F7181571306C07081E8 +:102F2000471303C07281711103C001968770E9CF06 +:102F3000F62E662309F418C18091C5018160809343 +:102F4000C501F12C11C1751308C0341306C06111FD +:102F500004C08091C501D801C3C04D875E878D85AF +:102F60009E856A8B0E942E166A898823E1F166236A +:102F7000D1F12091C501822F82958F7090E0029748 +:102F800074F08091C0019091C10198878F83198658 +:102F9000DB86CA862C87CE0107960E94101386E036 +:102FA000F801A0ECB1E001900D928A95E1F70E9442 +:102FB000A2160E949416FF24F394D6C04D875E8714 +:102FC0008D859E850E940E1B292F22952F7030E043 +:102FD000223031050CF0BCC09F7009F0B6C0805E95 +:102FE000883008F4C1C0C8010E941013E4CFC8168D +:102FF000D90608F453C0F601E81BF90BCF01883C51 +:10300000910508F450C0F12C7C2DD98AC88A898991 +:103010000E945416E0ECF1E086E0DF011D928A95F3 +:10302000E9F70E949416A0C0751314C0341312C09F +:10303000611110C08091C501F8018583C8010E940B +:10304000101386E0E0ECF1E0DF011D928A95E9F7CC +:10305000FE2C8AC04D875E878D859E856A8B0E9477 +:103060002E166A89882309F4BECF662309F4BBCFE4 +:103070002091C501822F82958F7090E002970CF409 +:103080008ECF8091C0019091C1019A8389831B8268 +:10309000DD82CC822E83CE0101967FCF80959095E4 +:1030A0008C0D9D1DACCFF62E662309F49CCF7513B5 +:1030B0002EC034132CC02091C50120FD1FC0822FCB +:1030C00082958F70D9F0D80115962C9315978F3073 +:1030D00049F08F5F982F9295907F822F8F70892B68 +:1030E00015968C93C8010E94101386E0F801A0EC9D +:1030F000B1E001900D928A95E1F793CF86E0F80157 +:10310000A0ECB1E001900D928A95E1F72DC04D87BA +:103110005E878D859E850E942E16811140CF8091FD +:10312000C50181608093C501C8010E9410131CC0B5 +:10313000662309F458CF4D875E878D859E850E9452 +:103140002E16882309F44FCF2ACF811148CF0CC007 +:10315000243031050CF047CF9F7009F440CFF801BF +:103160009581907F09F03BCF8F2D62960FB6F89432 +:10317000DEBF0FBECDBFDF91CF911F910F91FF90AA +:10318000EF90DF90CF9008951F93CF93DF93CDB74B +:10319000DEB72C970FB6F894DEBF0FBECDBF4F83BE +:1031A000588769877A878B879C87CE0107960E940C +:1031B000FD16882369F08F8198852A853B85232B0E +:1031C000F1F19F3F09F063C08F3F09F060C037C045 +:1031D00086E0FE013796DE01119601900D928A95E8 +:1031E000E1F76F817885EA85FB85309741F17F3F74 +:1031F00011F46F3F21F120918F0130E0C901019658 +:103200008770992740918E0150E08417950709F443 +:1032100047C069837A83FD83EC8396E0929FD00157 +:10322000939FB00D1124A057BE4FFE01319601901F +:103230000D929A95E1F780938F010E94731616E024 +:1032400080918E0190918F018917C1F1189FC00163 +:10325000112480579E4F0E94FD16882379F1E0913A +:103260008E011E9FF0011124E057FE4F40815181D5 +:1032700062817381848195810E94631680918E01A1 +:1032800090E001968770992780938E01D9CF4F8166 +:10329000588569857A858B859C850E946316CFCF7A +:1032A0000E942A1610928F0110928E01E0ECF1E03C +:1032B00086E0DF011D928A95E9F7C1CF2C960FB603 +:1032C000F894DEBF0FBECDBFDF91CF911F9108955F +:1032D000DF92EF92FF920F931F93CF93DF93FC0146 +:1032E000892B09F48AC0E12CF12CDD24D394EF0161 +:1032F00021968491853709F461C058F4843708F029 +:103300004EC0843008F06AC08130D1F0823071F153 +:1033100074C0883709F45DC050F4863709F455C08D +:10332000873709F06AC08E2D0E949B1B54C09CE712 +:10333000980F903708F061C08F770E94DA1250C062 +:103340008F010E5F1F4FFE01849190E2980F98301D +:1033500050F48770FD2D01C0FF0F8A95EAF78F2F7B +:103360000E94A11B14C00E94301213C08F010E5F77 +:103370001F4FFE01C49180E28C0F883060F4C7704B +:103380008D2D01C0880FCA95EAF70E94A71B0E94E5 +:10339000C81BE80125C08C2F0E94DA12FACF9F01CA +:1033A0002E5F3F4FFE01C491CC2369F08FE99FE06F +:1033B0000197F1F700C00000C150F6CF9F012E5FCA +:1033C0003F4FFE01F490E9010BC00E948B1BE82ED9 +:1033D00007C00E949E1B0E94C81B02C00E943012A0 +:1033E0008F2D882341F0EFE9FFE03197F1F700C01E +:1033F00000008150F6CFFE017ACFDF91CF911F916F +:103400000F91FF90EF90DF9008956093CA01709341 +:10341000CB018093CC019093CD010E94191C0C9498 +:1034200018166093C6017093C7018093C8019093EA +:10343000C9010E941A1C0C94181608950C94051AC0 +:103440000F931F930091CA011091CB012091CC01E1 +:103450003091CD01602B712B822B932B1F910F91FB +:103460000C94051A0F931F930091CA011091CB0180 +:103470002091CC013091CD016023712382239323CD +:103480001F910F910C94051A0F931F930091CA017D +:103490001091CB012091CC013091CD016027712793 +:1034A000822793271F910F910C94051A60E070E01A +:1034B000CB010C94111A0F931F9341E050E060E090 +:1034C00070E08A019B0104C0000F111F221F331FEF +:1034D0008A95D2F7C901B8011F910F910C94111A66 +:1034E0000F931F9341E050E060E070E004C0440F90 +:1034F000551F661F771F8A95D2F78091C60190915C +:10350000C701A091C801B091C9018A019B01082B94 +:10351000192B2A2B3B2BC901B8011F910F910C9439 +:10352000111A0F931F9341E050E060E070E004C077 +:10353000440F551F661F771F8A95D2F74095509507 +:10354000609570958091C6019091C701A091C801C6 +:10355000B091C9018A019B01082319232A233B2327 +:10356000C901B8011F910F910C94111A0F931F9369 +:1035700041E050E060E070E004C0440F551F661F5A +:10358000771F8A95D2F78091C6019091C701A091CB +:10359000C801B091C9018A019B01082719272A2770 +:1035A0003B27C901B8011F910F910C94111A0F9379 +:1035B0001F930091C6011091C7012091C80130915D +:1035C000C901602B712B822B932B1F910F910C94AF +:1035D000111A0F931F930091C6011091C7012091FA +:1035E000C8013091C90160237123822393231F9165 +:1035F0000F910C94111A0F931F930091C601109113 +:10360000C7012091C8013091C90160277127822725 +:1036100093271F910F910C94111A0895CF92DF9266 +:10362000EF92FF920F931F93CF93DF938C01C09083 +:10363000CA01D090CB01E090CC01F090CD01409137 +:10364000C6015091C7016091C8017091C901C42A97 +:10365000D52AE62AF72ACFE1D0E0D701C6010C2E01 +:1036600004C0B695A795979587950A94D2F780FFE1 +:1036700007C0B8018C2F0E94271D8130910531F4BD +:10368000219758F7B80180E00E94271DDF91CF9164 +:103690001F910F91FF90EF90DF90CF9008952091B0 +:1036A0000B0130910C01F90132969FEF40E05191EE +:1036B000581789F09F3F19F4511101C0942F4F5FA3 +:1036C0004630A9F79F3F39F0F901E90FF11D97FD49 +:1036D000FA9582830895089520910B0130910C0191 +:1036E000F9013296285F3F4F9081981301C01082F4 +:1036F0003196E217F307C1F7089581E090E0E09179 +:103700000B01F0910C01E80FF91F1082019688302F +:103710009105A9F708958091D80108959091D80155 +:10372000892B8093D801089580959091D8018923A1 +:103730008093D80108958093D80108951092D801FC +:1037400008959091D701892B8093D7010895809592 +:103750009091D70189238093D70108951092D701C2 +:1037600008958093CE0108951092CE01089580911E +:103770000B0190910C01FC0131969C01285F3F4F99 +:1037800080E0919191118F5FE217F307D1F70895CF +:10379000E0910B01F0910C018091D8018083E091C0 +:1037A0000B01F0910C0190818091D701892B8083CE +:1037B0008091CE01882361F0E0910B01F0910C0122 +:1037C0009081892B80830E94B71B81111092CE01BA +:1037D00080910B0190910C010C94AB1090933301EC +:1037E0008093320108958295982F9C7C392F3695CD +:1037F0003695282F237344E0249FC0011124932F72 +:10380000982B292F2A7A2695892F8575880F822B48 +:1038100008950895CF93DF9300D000D01F92CDB7C5 +:10382000DEB70F900F900F900F900F90DF91CF9118 +:103830000895089508950C94EE118091EE0184305E +:1038400021F11092DA0120E488E190E00FB6F894BB +:10385000A895809360000FBE2093600083B7817F9E +:10386000846083BF83B7816083BF7894889583B772 +:103870008E7F83BF0FB6F894A89580916000886111 +:1038800080936000109260000FBE0895089508951F +:10389000CF930E94461C0E948F060E94471CC0E0E6 +:1038A0008C2F0E94F506811104C0CF5FC031C1F793 +:1038B00001C081E0CF9108950C942A161F920F92B7 +:1038C0000FB60F9211248F939F93AF93BF93809164 +:1038D000DA01811113C08091DB019091DC01A0918C +:1038E000DD01B091DE014196A11DB11D8093DB0188 +:1038F0009093DC01A093DD01B093DE01BF91AF9105 +:103900009F918F910F900FBE0F901F90189582E09E +:1039100084BD93E095BD9AEF97BD80936E000895A6 +:103920002FB7F8948091DB019091DC01A091DD012B +:10393000B091DE012FBF08952FB7F8946091DB019D +:103940007091DC018091DD019091DE012FBF08951F +:10395000CF92DF92EF92FF920F931F932FB7F894BD +:103960004091DB015091DC016091DD017091DE013D +:103970002FBF6A017B01EE24FF248C0120E030E0A0 +:10398000C016D106E206F30610F4415051099A011F +:10399000281B390BC9011F910F91FF90EF90DF9009 +:1039A000CF9008951F920F920FB60F9211248F930C +:1039B0009F93AF93BF938091DB019091DC01A09125 +:1039C000DD01B091DE010196A11DB11D8093DB01E7 +:1039D0009093DC01A093DD01B093DE01BF91AF9124 +:1039E0009F918F910F900FBE0F901F9018950E947E +:1039F000B80DF8942FEF87EA91E62150804090406F +:103A0000E1F700C0000087E090EBDC018093F70154 +:103A10009093F801A093F901B093FA019CE088E13A +:103A20000FB6F894A895809360000FBE9093600045 +:103A3000FFCF28E0929FF0011124E80FF11DE05222 +:103A4000FF4F9491892F8F7092959F700895CF9317 +:103A5000C82FCB010E94191D282F30E080E1989FCC +:103A6000A0011124422B532B4038510519F480E05A +:103A700090E015C09770E92FF0E088E0C89FE00D56 +:103A8000F11D112484E0EE0FFF1F8A95E1F7E20F8C +:103A9000F31FEE0FFF1FE050F84985919491CF91ED +:103AA000089580E090E0089508958091E10180FFFD +:103AB0000BC06091100185E0689FB00111247595DD +:103AC0006795759567952BC081FF09C060911001BE +:103AD00085E0689FB00111247595679520C082FF2D +:103AE00007C06091100185E0689FB001112417C0E4 +:103AF0009091E2019923D1F060910F01961788F718 +:103B00002091100185E0289F90011124929FA0012F +:103B1000939F500D112470E0CA010E941125603856 +:103B2000710540F46115710539F002C065E070E07F +:103B3000862F08958FE7089581E008958091E1012F +:103B400080FF08C060910E0170E0759567957595CE +:103B5000679521C081FF06C060910E0170E07595E8 +:103B6000679519C082FF04C060910E0170E010C01B +:103B70009091E2019923C1F060910D019617A0F791 +:103B800080910E01899FC001112470E00E941125CF +:103B90006038710528F46115710521F0862F0895AC +:103BA0008FE7089581E0089561E070E0F4CF803FF1 +:103BB00021F40E94551D819504C0813F29F40E9483 +:103BC000551D8093E5010895823F21F40E94551D03 +:103BD000819504C0833F29F40E94551D8093E40120 +:103BE0000895893F19F40E949E1D05C08A3F31F453 +:103BF0000E949E1D81958093E60108958B3F21F4DC +:103C00000E949E1D819504C08C3F29F40E949E1D38 +:103C10008093E7010895843F21F48091E30181605E +:103C200017C0853F21F48091E301826011C0863F77 +:103C300021F48091E30184600BC0873F21F48091DF +:103C4000E301886005C0883F31F48091E301806121 +:103C50008093E30108958D3F21F48091E10181601B +:103C60000BC08E3F21F48091E101826005C08F3F3F +:103C700029F48091E10184608093E1010895803FFF +:103C800039F48091E50187FF6CC01092E50169C0AD +:103C9000813F29F48091E5011816BCF362C0909130 +:103CA000E401823F29F497FF5CC01092E40159C0FF +:103CB000833F19F41916CCF354C0893F41F4809125 +:103CC000E60118160CF04DC01092E6014AC08A3F7A +:103CD00029F48091E60187FF44C0F6CF8B3F39F489 +:103CE0008091E70187FF3DC01092E7013AC08C3F09 +:103CF00029F48091E7011816BCF333C0843F21F406 +:103D00008091E3018E7F17C0853F21F48091E3010C +:103D10008D7F11C0863F21F48091E3018B7F0BC022 +:103D2000873F21F48091E301877F05C0883F31F40C +:103D30008091E3018F7E8093E30113C08D3F21F4D6 +:103D40008091E1018E7F0BC08E3F21F48091E101D3 +:103D50008D7F05C08F3F29F48091E1018B7F809397 +:103D6000E1018091E40181110EC08091E501811192 +:103D70000AC08091E601811106C08091E70181119E +:103D800002C01092E20108958091D90183FF7EC0A4 +:103D90008BE394E00E946D058091E3011F928F9365 +:103DA00086E394E09F938F930E94060684E394E059 +:103DB0000E946D058091E401282F082E000C330B22 +:103DC0003F938F9381E394E09F938F930E94060625 +:103DD0008FE294E00E946D058091E501282F082E66 +:103DE000000C330B3F938F938CE294E09F938F935F +:103DF0000E9406068AE294E00E946D058091E60129 +:103E0000282F082E000C330B3F938F9387E294E00A +:103E10009F938F930E94060685E294E00E946D05B1 +:103E20008091E701282F082E000C330B3F938F93CE +:103E300082E294E09F938F930E9406068FE194E0C4 +:103E40000E946D058091E2011F928F938CE194E0B6 +:103E50009F938F930E9406068AE194E00E946D056D +:103E60008091E1011F928F9387E194E09F938F935C +:103E70000E94060684E194E00E946D058DB79EB70E +:103E80004C960FB6F8949EBF0FBE8DBF83EE91E0A7 +:103E90000E94F4100E94901C9093E0018093DF0137 +:103EA00008951F93CF93DF938091DF019091E001FC +:103EB0000E94A81CAC019091E201992321F020916D +:103EC000110130E006C0209112018AE0289F900184 +:103ED00011244217530708F485C08091E401C09172 +:103EE000E501D091E6011091E701811107C0C111F0 +:103EF00075C0D11173C0111171C074C09F3F19F00A +:103F00009F5F9093E201181624F40E94551D809340 +:103F1000E4018091E40187FF05C00E94551D819551 +:103F20008093E4011C1624F40E94551D8093E50142 +:103F30008091E50187FF05C00E94551D8195809302 +:103F4000E5016091E401662331F1C091E501CC23E4 +:103F500011F1062E000C770B880B990B0E940C2494 +:103F600023E333E343E35FE30E9470240E94D423FE +:103F70006093E4016C2FCC0F770B880B990B0E9498 +:103F80000C2423E333E343E35FE30E9470240E94A5 +:103F9000D4236093E5011D1624F40E949E1D809396 +:103FA000E6018091E60187FF05C00E949E1D819574 +:103FB0008093E601111624F40E949E1D8093E70170 +:103FC0008091E70187FF05C00E949E1D8195809327 +:103FD000E701DF91CF911F910C94C41E9F3F09F020 +:103FE0008FCF97CFDF91CF911F910895E3EEF1E04E +:103FF00085E0DF011D928A95E9F71092E2011092A7 +:10400000E10108958EE596E00E946D051F9281E022 +:104010008F931F9285E08F9380E196E09F938F931B +:104020000E9406060F900F900F900F900F900F9028 +:1040300008958330E9F128F4813061F0823009F18C +:104040000895853009F462C008F449C0863009F447 +:1040500074C0089580911201262F30E0280F311D81 +:104060002F3F310524F4680F6093120103C08FEFD6 +:1040700080931201809112011F928F9389E495E041 +:1040800072C080911101262F30E0280F311D2F3F83 +:10409000310524F4680F6093110103C08FEF809302 +:1040A0001101809111011F928F9387E395E05BC00E +:1040B00080911001262F30E0280F311D2F3F310550 +:1040C00024F4680F6093100103C08FEF80931001F8 +:1040D000809110011F928F9384E295E044C08091FB +:1040E0000F01262F30E0280F311D2F3F310524F41A +:1040F000680F60930F0103C08FEF80930F018091D1 +:104100000F011F928F938FE095E02DC080910E01DB +:10411000262F30E0280F311D2F3F310524F4680F82 +:1041200060930E0103C08FEF80930E0180910E010A +:104130001F928F9386EF94E016C080910D01262F79 +:1041400030E0280F311D2F3F310524F4680F6093B4 +:104150000D0103C08FEF80930D0180910D011F921F +:104160008F938BED94E09F938F930E9406060F90A0 +:104170000F900F900F900895833081F128F48130D3 +:1041800059F08230D1F00895853009F449C0B8F172 +:10419000863009F456C0089580911201681720F402 +:1041A000861B8093120102C01092120180911201AD +:1041B0001F928F938CEC94E054C08091110168178A +:1041C00020F4861B8093110102C01092110180918E +:1041D00011011F928F938AEB94E043C080911001EC +:1041E000681720F4861B8093100102C01092100102 +:1041F000809110011F928F9387EA94E032C08091E2 +:104200000F01681720F4861B80930F0102C01092E3 +:104210000F0180910F011F928F9382E994E021C0DA +:1042200080910E01681720F4861B80930E0102C056 +:1042300010920E0180910E011F928F9389E794E0F6 +:1042400010C080910D01681720F4861B80930D012A +:1042500002C010920D0180910D011F928F938EE587 +:1042600094E09F938F930E9406060F900F900F90FB +:104270000F900895CF93C82F1F928F9383E697E0F6 +:104280009F938F930E94060681E090E0A0E0B0E04B +:10429000BC01CD0104C0660F771F881F991FCA9506 +:1042A000D2F70E941E1A0F900F900F900F90CF918F +:1042B0000C942A16CF93873288F58E3108F00BC103 +:1042C0008E3009F487C0D8F4873009F460C08B3091 +:1042D00009F44FC0863009F002C18091D901817F75 +:1042E0008E7F8093D90188E697E00E946D058BE26E +:1042F0009AE00E946D0581E08093E90146C0863115 +:1043000009F4B0C020F4803109F47AC0E8C08931E2 +:1043100009F491C08B3109F449C0E1C0883349F1F7 +:1043200050F4893209F4D5C0853309F4D2C08732FC +:1043300009F0D5C0CEC0833409F4CBC028F48A3349 +:1043400008F4CDC08953C8C0883409F0C8C00E94A1 +:104350002A168AE19AE00E946D052FEF83ED90E323 +:10436000215080409040E1F700C000000E94F71CFF +:104370000CC08FE897E041C081E09AE00E946D0593 +:104380008091D90181608093D901C1E0ADC0809155 +:10439000D901C82FC17080FFEFCF8DE09AE00E9455 +:1043A0006D058091D901817F8E7F3FC09091D901A9 +:1043B00091FBCC27C0F981E0C827892FC0FB81F988 +:1043C0008093D901CC2319F084EF99E029C086EEBF +:1043D00099E013C09091D90192FBCC27C0F981E0FC +:1043E000C827892FC0FB82F98093D901CC2319F00B +:1043F00087ED99E015C087EC99E00E946D05C5CF67 +:104400009091D90193FBCC27C0F981E0C827892F6F +:10441000C0FB83F98093D901CC2351F08BEB99E059 +:104420000E946D058091D90181608093D9015CC0A3 +:104430008EEA99E0E2CF8FE999E00E946D0587E767 +:1044400099E00E946D058DE299E00E946D0580E083 +:1044500099E00E946D058BEB98E00E946D058DE858 +:1044600098E0CBCF8FE798E00E946D050E949F10E7 +:104470001F928F9385E698E09F938F930E94060684 +:1044800080910A011F928F938EE498E09F938F93FF +:104490000E940606809176011F928F938BE398E02D +:1044A0009F938F930E9406060E949C1C9F938F935C +:1044B0007F936F9384E298E09F938F930E94060608 +:1044C0008DB79EB742960FB6F8949EBF0FBE8DBFB4 +:1044D0005CCF80E001C08D510E943A2156CF82E22C +:1044E00098E00E946D05C0E08C2FCF91089580E088 +:1044F000089580E00895CF93C82F8091E90181301D +:1045000081F020F0823009F44FC046C1E0910B01E8 +:10451000F0910C018081813169F0823209F03EC155 +:1045200009C0E0910B01F0910C018081813111F003 +:10453000823261F48C2F0E947722811104C08C2F6B +:104540000E945A212FC081E090E02CC08C2F0E9445 +:104550007922811126C0C431E1F070F4CB3081F0B2 +:10456000C031D1F40E9402208BE597E00E946D05D6 +:1045700082E08093E90115C0C93259F0C83361F473 +:1045800088E697E00E946D058FE597E00E946D0533 +:1045900008C01092E90104C189E597E00E946D0509 +:1045A000FFC081E08170FEC0C43228F5CE3108F032 +:1045B000C1C0CB30A1F1D0F4C73009F0D3C08EE137 +:1045C0008093120182E3809311018AE080931001AD +:1045D00084E180930F0188E080930E0188E280934C +:1045E0000D018FEF95E00E946D05BFC0C33149F109 +:1045F000C431C1F0B7C0CB3409F4A9C028F4C93222 +:1046000089F0C83361F0AEC0C13509F49EC0C2352F +:1046100009F499C0CE3409F0A5C06AE09EC00E949A +:104620000220A3C08091E801882319F01092E801CC +:104630009CC08CE096E00E946D0581E08093E901CA +:10464000B1C086EE95E00E946D0584ED95E00E9474 +:104650006D05809112011F928F9381ED95E09F93DC +:104660008F930E9406068FEC95E00E946D058DEBFE +:1046700095E00E946D05809111011F928F938AEB46 +:1046800095E09F938F930E94060688EB95E00E9429 +:104690006D0589EA95E00E946D05809110011F92D9 +:1046A0008F9386EA95E09F938F930E94060684EA93 +:1046B00095E00E946D0583E995E00E946D0580916B +:1046C0000F011F928F9380E995E09F938F930E9433 +:1046D00006068EE895E00E946D0589E795E00E9448 +:1046E0006D0580910E011F928F9386E795E09F9351 +:1046F0008F930E94060684E795E00E946D058DE584 +:1047000095E00E946D0580910D011F928F938AE5BF +:1047100095E09F938F930E94060688E595E00E949E +:104720006D058DB79EB748960FB6F8949EBF0FBE25 +:104730008DBF1BC0CE51EC2FF0E0E95DFE4F8081B4 +:104740008093E80112C061E003C061E006C06AE046 +:104750008091E8010E94192008C08091E8010E9420 +:10476000BC2003C08DEF95E013C08091E801882341 +:1047700069F01F928F9387EF95E09F938F930E942C +:1047800006060F900F900F900F9004C084EF95E0F5 +:104790000E946D0581E006C01092E90180E002C030 +:1047A00080E000CFCF9108950E94DB236894B1117F +:1047B0000C946A2408950E944F2488F09F5798F023 +:1047C000B92F9927B751B0F0E1F0660F771F881F16 +:1047D000991F1AF0BA95C9F714C0B13091F00E9430 +:1047E0006924B1E008950C946924672F782F8827F5 +:1047F000B85F39F0B93FCCF3869577956795B39557 +:10480000D9F73EF490958095709561957F4F8F4FC5 +:104810009F4F0895E89409C097FB3EF490958095CA +:10482000709561957F4F8F4F9F4F9923A9F0F92F76 +:1048300096E9BB279395F695879577956795B795F4 +:10484000F111F8CFFAF4BB0F11F460FF1BC06F5FDA +:104850007F4F8F4F9F4F16C0882311F096E911C0EC +:10486000772321F09EE8872F762F05C0662371F00D +:1048700096E8862F70E060E02AF09A95660F771F21 +:10488000881FDAF7880F9695879597F9089557FD51 +:104890009058440F551F59F05F3F71F04795880FAE +:1048A00097FB991F61F09F3F79F087950895121645 +:1048B00013061406551FF2CF4695F1DF08C01616F1 +:1048C00017061806991FF1CF8695710561050894A2 +:1048D0000895E894BB2766277727CB0197F90895B9 +:1048E0000E9483240C94F4240E94E62438F00E9451 +:1048F000ED2420F0952311F00C94DD240C94E32496 +:1049000011240C946A240E94472470F3959FC1F3EC +:10491000950F50E0551F629FF001729FBB27F00D6D +:10492000B11D639FAA27F00DB11DAA1F649F6627C2 +:10493000B00DA11D661F829F2227B00DA11D621F11 +:10494000739FB00DA11D621F839FA00D611D221FCB +:10495000749F3327A00D611D231F849F600D211DAF +:10496000822F762F6A2F11249F5750409AF0F1F032 +:1049700088234AF0EE0FFF1FBB1F661F771F881F9B +:1049800091505040A9F79E3F510580F00C94DD24D2 +:104990000C946A245F3FE4F3983ED4F386957795B0 +:1049A0006795B795F795E7959F5FC1F7FE2B880F41 +:1049B000911D9695879597F9089597F99F6780E8D7 +:1049C00070E060E008959FEF80EC089500240A9461 +:1049D0001616170618060906089500240A941216DA +:1049E0001306140605060895092E0394000C11F40D +:1049F000882352F0BB0F40F4BF2B11F460FF04C0BA +:104A00006F5F7F4F8F4F9F4F0895991B79E004C0D0 +:104A1000991F961708F0961B881F7A95C9F78095FD +:104A2000089597FB072E16F4009407D077FD09D060 +:104A30000E942B2507FC05D03EF4909581959F4F51 +:104A40000895709561957F4F0895EE0FFF1F0590B3 +:104A5000F491E02D0994AA1BBB1B51E107C0AA1FCA +:104A6000BB1FA617B70710F0A61BB70B881F991F0F +:104A70005A95A9F780959095BC01CD010895F894B9 +:024A8000FFCF66 +:104A82000A09FB09D809A409700901CF01280814F1 +:104A92000A321E404D3622AF0362032C030A0396EC +:104AA20002AF02C802E10201020304050607080977 +:024AB200000002 +:106800008800EA44E944E244040005000600070069 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031003200330034003500360037008C +:10687000380039003A003B003C003D003E003F003C +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530054005500560057004C +:1068B000580059005A005B005C005D005E005F00FC +:1068C000600061006200630064006500850067008D +:1068D000680069006A006B006C006D006E006F005C +:1068E0007000710072007300890087008A008B00BD +:1068F000E000E100E200E300F1A1E500E600E700CE +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010035004C0039000100440045005200A0 +:1069600049000100010050004F0029004D004E0079 +:1069700051000100680069006A006B006C006D0046 +:106980006E006F0070007100720073000100010062 +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E0000100010001000100490001000100010057 +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/ibm4704_usb/binary/ibm4704_usb_rev2_alps_unimap.hex b/converter/ibm4704_usb/binary/ibm4704_usb_rev2_alps_unimap.hex new file mode 100644 index 00000000..4bef431d --- /dev/null +++ b/converter/ibm4704_usb/binary/ibm4704_usb_rev2_alps_unimap.hex @@ -0,0 +1,1221 @@ +:100000000C94F8040C943F050C9434080C943F05B0 +:100010000C943F050C943F050C943F050C943F0550 +:100020000C943F050C943F050C943F050C94DC0D9B +:100030000C948B0E0C94F31B0C943F050C943F0511 +:100040000C943F050C943F050C943F050C94671CE1 +:100050000C943F050C943F050C943F050C943F0510 +:100060000C943F050C943F050C943F050C943F0500 +:100070000C943F05F80E1A0F08101A0F08105F0FA6 +:10008000820F0810D70FEA0FD312D31200130013F8 +:100090005B1397138F158F15AF138F15AA14AA141E +:1000A00065158F158F157B15351F202122232425DB +:1000B00026272D2E742A3A1E2B141A0815171C18E1 +:1000C0000C12132F30313B8039041607090A0B0D2F +:1000D0000E0F333432283C7C79781D1B061905112C +:1000E00010363738757D3D7A2C545553494A4B7B31 +:1000F0007F8056808080587E5F6061634C4D4E4F9C +:1001000080805780808080805C5D5E624647485179 +:100110008080806680808080595A5B294452455097 +:100120008080808080808080253032583A20253041 +:1001300038620A000A722F63203031323334353688 +:10014000370A00253032580A00253032580A004557 +:1001500072726F723A20253032580A00456E640A76 +:100160000073253032583A72253032582000456EDF +:1001700061626C6520627265616B3A20004B657943 +:10018000626F6172642049443A20253032580A0077 +:1001900049424D203437303420636F6E7665727477 +:1001A00065720A00726275663A2066756C6C0A00A8 +:1001B000523A25303258253032580A00533A253009 +:1001C000325820005B735D004B6579626F61726429 +:1001D0002073746172742E0A0055534220636F6E4F +:1001E000666967757265642E0A005B575D005B5334 +:1001F0005D005B525D003803490042004D00200065 +:10020000340037003000340020006B0065007900B6 +:1002100062006F00610072006400200063006F00E4 +:100220006E007600650072007400650072000000C8 +:100230000E0374002E006D002E006B002E000000D7 +:100240000403090409027400040100A03209040037 +:1002500000010301010009211101000122400007F2 +:1002600005810308000A09040100010301020009D5 +:100270002111010001224D000705820308000A092F +:1002800004020001030000000921110100012236CF +:10029000000705830308000A0904030002030000A5 +:1002A000000921110100012222000705840320001A +:1002B00001070504032000011201100100000008DD +:1002C000EDFE07470100010200010631FF0974A19C +:1002D000010975150026FF00952075088102097631 +:1002E000150026FF00952075089102C005010980C0 +:1002F000A101850216810026B7001A81002AB700E5 +:10030000751095018100C0050C0901A10185031636 +:100310000100269C021A01002A9C02751095018199 +:1003200000C005010902A1010901A1000509190187 +:1003300029051500250195057501810295017503B3 +:1003400081010501093009311581257F9502750864 +:10035000810609381581257F950175088106050CF0 +:100360000A38021581257F950175088106C0C005F0 +:10037000010906A101050719E029E71500250195E6 +:100380000875018102950175088101050819012987 +:1003900005950575019102950175039101050719F0 +:1003A0000029FF150026FF00950675088100C00A88 +:1003B000002530325820006B6579626F6172645F8E +:1003C0007265706F72743A20004C45443A202530B3 +:1003D00032580A00290A002575002F002575005D96 +:1003E00028002564002000256400200025640020EA +:1003F000002564007C0025303258006D6F757365F0 +:100400006B6579205B62746E7C7820792076206839 +:100410005D287265702F61636C293A205B006D6BFB +:100420005F776865656C5F74696D655F746F5F6D3C +:100430006178203D2025640A006D6B5F77686565F3 +:100440006C5F6D61785F7370656564203D20256425 +:100450000A006D6B5F74696D655F746F5F6D6178C5 +:10046000203D2025640A006D6B5F6D61785F7370BD +:10047000656564203D2025640A006D6B5F696E74BC +:10048000657276616C203D2025640A006D6B5F64A7 +:10049000656C6179203D2025640A006D6B5F77688B +:1004A00065656C5F74696D655F746F5F6D61782001 +:1004B0003D2025640A006D6B5F776865656C5F6D34 +:1004C00061785F7370656564203D2025640A006D66 +:1004D0006B5F74696D655F746F5F6D6178203D203F +:1004E00025640A006D6B5F6D61785F73706565648C +:1004F000203D2025640A006D6B5F696E746572761D +:10050000616C203D2025640A006D6B5F64656C6141 +:1005100079203D2025640A000A00257500363A201E +:10052000776865656C5F74696D655F746F5F6D6139 +:10053000783A20000A00257500353A20776865650D +:100540006C5F6D61785F73706565643A20000A00C6 +:10055000257500343A2074696D655F746F5F6D6155 +:10056000783A20000A00257500333A206D61785FE3 +:1005700073706565643A20000A00257500323A20E0 +:10058000696E74657276616C286D73293A20000A71 +:1005900000257500313A2064656C6179282A313074 +:1005A0006D73293A20000A092D2056616C75657318 +:1005B000202D0A004D3E004D25643E20003F007373 +:1005C00065742064656661756C740A00433E2000A2 +:1005D00077686572652064656C74613A2063757232 +:1005E000736F723D25642C20776865656C3D2564CA +:1005F0000A53656520687474703A2F2F656E2E77E4 +:10060000696B6970656469612E6F72672F77696BBA +:10061000692F4D6F7573655F6B6579730A000A0901 +:100620002D204D6F7573656B6579202D0A455343F9 +:100630002F713A09717569740A313A0964656C6100 +:1006400079282A31306D73290A323A09696E746546 +:100650007276616C286D73290A333A096D61785F8F +:1006600073706565640A343A0974696D655F746F07 +:100670005F6D61780A353A09776865656C5F6D6111 +:10068000785F73706565640A363A09776865656CEA +:100690005F74696D655F746F5F6D61780A0A703AA7 +:1006A000097072696E742076616C7565730A643ABC +:1006B000097365742064656661756C74730A75707E +:1006C0003A092B310A646F776E3A092D310A706747 +:1006D00075703A092B31300A7067646F776E3A098A +:1006E0002D31300A0A7370656564203D2064656CA5 +:1006F0007461202A206D61785F7370656564202ABB +:100700002028726570656174202F2074696D655FA3 +:10071000746F5F6D6178290A003F004D3E200043F1 +:100720003E20004C25640A000A092D20436F6E7399 +:100730006F6C65202D0A4553432F713A0971756915 +:10074000740A6D3A096D6F7573656B65790A000AF5 +:10075000092D204D61676963202D0A643A0964659B +:100760006275670A783A096465627567206D61741D +:100770007269780A6B3A096465627567206B6579FE +:10078000626F6172640A6D3A096465627567206D13 +:100790006F7573650A763A0976657273696F6E0ACA +:1007A000733A097374617475730A633A09636F6EFF +:1007B000736F6C65206D6F64650A302D343A096C77 +:1007C00061796572302D34284631302D4634290A3E +:1007D000506175733A09626F6F746C6F6164657212 +:1007E0000A003F0074696D65725F7265616433323F +:1007F00028293A202530346C580A006B6579626FDD +:100800006172645F69646C653A2025580A006B6503 +:1008100079626F6172645F70726F746F636F6C3A4C +:100820002025580A00686F73745F6B6579626F6189 +:1008300072645F6C65647328293A2025580A000A9F +:10084000092D20537461747573202D0A00474343AA +:100850003A20342E392E32204156522D4C494243F3 +:100860003A20312E382E3073766E204156525F4139 +:100870005243483A2061767233350A004F5054494A +:100880004F4E533A204C554641204D4F5553454B02 +:1008900045592045585452414B455920434F4E53DA +:1008A0004F4C4520434F4D4D414E44204B45594DF3 +:1008B00041505F53454354494F4E20343039360A36 +:1008C000004255494C443A20363663613335612D38 +:1008D0006469727479202831323A30303A303020ED +:1008E0005365702033302032303136290A005649A2 +:1008F000443A2030784645454428742E6D2E6B2EA0 +:1009000029205049443A203078343730372849423A +:100910004D2034373034206B6579626F617264200A +:10092000636F6E76657274657229205645523A205F +:100930003078303030310A00444553433A20636FF9 +:100940006E766572742049424D2034373034206B06 +:100950006579626F61726420746F205553420A009A +:100960000A092D2056657273696F6E202D0A000AE0 +:100970006D6F7573653A206F66660A000A6D6F7554 +:1009800073653A206F6E0A000A6B6579626F617257 +:10099000643A206F66660A000A6B6579626F61725D +:1009A000643A206F6E0A000A6D61747269783A20A9 +:1009B0006F66660A000A6D61747269783A206F6E1C +:1009C0000A000A64656275673A206F6E0A000A645D +:1009D000656275673A206F66660A000A0A626F6F81 +:1009E000746C6F616465722E2E2E2000433E2000D1 +:1009F00011241FBECFEFD4E0DEBFCDBF04B603FE8F +:100A000027C08091F7019091F801A091F901B09170 +:100A1000FA018730904BA740B04BD1F41092F70108 +:100A20001092F8011092F9011092FA0114BE84B7E5 +:100A3000877F84BF0FB6F894A89580916000886185 +:100A400080936000109260000FBEE0E0F8E309952B +:100A500011E0A0E0B1E0EAEFF9E402C005900D92E8 +:100A6000A233B107D9F721E0A2E3B1E001C01D92A2 +:100A7000A73FB207E1F70E94290B0C94FB240C94CA +:100A80000000FF93EF93E0913201F0913301309732 +:100A900009F00995EF91FF910895FC01859180304F +:100AA00011F0EFDFFBCF0895FF27E0E230E247FFD0 +:100AB0000CC0419597FF09C0EDE260957095809557 +:100AC0009095611D711D811D911D27FF02C021950B +:100AD00030E350E2AA27660F771F881F991FAA1FCD +:100AE000A41710F0A41B63955A95A9F7AA3008F033 +:100AF000A95FA05DAF93F39561157105810591051F +:100B000041F7ED3211F4EF93F395F21718F43F9398 +:100B1000F395FBCF8F91B5DFFA95E1F70895E99151 +:100B2000F9918591803021F0853219F0AADFF9CF53 +:100B3000089520E0E89455915532C1F3503311F4F3 +:100B4000689455915A3348F4505390F3220F022E73 +:100B5000220F220F200D250FF4CF0EF4219589913D +:100B60009991533619F3533729F1533559F1BC0193 +:100B700088279927E8945C3621F4899199916894A3 +:100B80005591543639F446EF7EF077FF0DC08FEF64 +:100B90009FEF0AC055374AE039F0583540E121F05F +:100BA000523642E009F00895FF93EF937DDFEF9115 +:100BB000FF91B7CFFF93EF93FC0181918030B9F3A0 +:100BC00060DFFBCFFF93EF9368DFF1CFDF93CF932D +:100BD000CDB7DEB72596A3DFCF91DF9108950C94B2 +:100BE0005307FF920F931F93CF93DF938091D90107 +:100BF00081608093D90180E991E00E944D05E4E392 +:100C0000F1E080E18E0F11928E13FDCF2FEF87EA76 +:100C100091E6215080409040E1F700C000000E9422 +:100C200028081F928F938DE791E09F938F930E94E6 +:100C3000E6058EE691E00E944D050F900F900F9013 +:100C40000F908CEF0E946207882339F08FE39CE9B4 +:100C50000197F1F700C00000F4CFC0E0D0E001E65A +:100C600011E08C2F8068F82E8F2D0E946207882358 +:100C700039F08FE39CE90197F1F700C00000F4CF51 +:100C80008FE19EE40197F1F700C000000E94280860 +:100C90001F928F93DF93CF931F930F930E94E605CC +:100CA00021960F900F900F900F900F900F90CF37CD +:100CB000D105B9F68FEF0E946207882339F08FE3E0 +:100CC0009CE90197F1F700C00000F4CF8CE591E0BA +:100CD000DF91CF911F910F91FF900C944D05CF9311 +:100CE000DF930E9428088F3F11F480E05BC0982FAB +:100CF0009F779C37A0F01F928F938FE491E09F9392 +:100D00008F930E94E6050F900F900F900F90E4E3F1 +:100D1000F1E080E18E0F11928E13FDCFE6CF90911E +:100D2000D901C82FC695C695C695D82FD77087FF0D +:100D30001CC090FF0CC01F928F9389E491E09F9399 +:100D40008F930E94E6050F900F900F900F90EC2F5D +:100D5000EF70F0E0EC5CFE4F81E090E001C0880FA6 +:100D6000DA95EAF79081892B1BC090FF0CC01F9287 +:100D70008F9383E491E09F938F930E94E6050F90F9 +:100D80000F900F900F90EC2FF0E0EC5CFE4F81E0A5 +:100D900090E001C0880FDA95EAF780959081892369 +:100DA000808381E0DF91CF910895E82FF0E0EC5C43 +:100DB000FE4F80810895EF92FF920F931F93CF9380 +:100DC000DF9384E391E00E944D0584E3E82E81E007 +:100DD000F82EC0E0D0E008E211E0F70181917F0138 +:100DE0000E948C1B1F928F93DF93CF931F930F93BF +:100DF0000E94E60521960F900F900F900F900F9094 +:100E00000F90C031D10549F7DF91CF911F910F911C +:100E1000FF90EF90089508959FB7F89420914801AE +:100E200080914901821761F030E0F901E65BFE4FE5 +:100E300080812F5F3F4F2F7133272093480101C0DE +:100E400080E09FBF08955198599A08955898509AF4 +:100E500008955098589A08955198599A85E08A951E +:100E6000F1F7000089B18695817008955098589ADD +:100E700085E08A95F1F7000089B181700895CF93DC +:100E8000DF93C4E6D0E00E942C07811108C02097B0 +:100E900031F085E08A95F1F700002197F4CFCE017B +:100EA000DF91CF9108950E9423070E942607E9E66B +:100EB000F0E080818C608083E19AE99A0E942307A8 +:100EC0000C942907BF92CF92DF92EF92FF920F937B +:100ED0001F93CF93DF93C82E10924701E9980E9489 +:100EE00023070E9429075998519A0CE211E00E94A9 +:100EF000360781110AC00115110549F085E08A9570 +:100F0000F1F7000001501109F2CF012B11F480E339 +:100F100073C000E010E0D1E0D12CBB24B394C02F0B +:100F20000E943F07892B11F4C05C24C0C601002E2B +:100F300002C0959587950A94E2F780FF04C0DB25EF +:100F40000E94290702C00E94260784E6E82EF12CA1 +:100F50000E942C07882359F0E114F10451F085E038 +:100F60008A95F1F7000081E0E81AF108F1CFEF2847 +:100F700021F4C85BC09347014AC00F5F1F4F083080 +:100F8000110569F60E943F07892B11F484E334C0F0 +:100F9000DD2329F00E94290704E610E00CC00E941E +:100FA0002607FACF0115110561F085E08A95F1F762 +:100FB0000000015011090E942C078111F3CF012B71 +:100FC00011F485E319C00E943F07892BF9F20E94B2 +:100FD000290704E610E00E943607882351F0011526 +:100FE000110549F085E08A95F1F7000001501109DB +:100FF000F2CF012B21F486E38093470108C00E94C1 +:1010000023070E942907E19AE99A80E017C00E940D +:1010100023070E94290780914701813360F01F92C6 +:101020008F938CEB91E09F938F930E94E6050F9036 +:101030000F900F900F90E19AE99A8FEFDF91CF9187 +:101040001F910F91FF90EF90DF90CF90BF90089588 +:101050002FB7F89490914901809148012FBF9813C0 +:101060000C940C078FEF08951F920F920FB60F92FA +:1010700011242F933F934F935F936F937F938F939D +:101080009F93AF93BF93CF93DF93EF93FF93109210 +:101090004701809146018830F1F030F0893009F045 +:1010A0005CC0C4E6D0E02EC0809145018695809357 +:1010B00045010E943607882309F449C08091450103 +:1010C00080688093450181E090914401911180E016 +:1010D000809344013CC00E943607882339F081E0A8 +:1010E00090914401911180E08093440180914401EA +:1010F000882399F12CC0209781F185E08A95F1F73A +:10110000000021970E9436078111F5CFCD2B29F1E0 +:1011100040914501CFB7F8948091490190E09C013E +:101120002F5F3F4F2F71332750914801521739F0ED +:10113000FC01E65BFE4F40832093490104C084EA32 +:1011400091E00E944D05CFBF109247012AC08091C7 +:1011500046018F5F809346012AC0809146018093AB +:1011600047018EEF0E946207882339F08FE99FE0E4 +:101170000197F1F700C00000F4CF809145011F9264 +:101180008F93809146011F928F9380EB91E09F9304 +:101190008F930E94E6050F900F900F900F900F9085 +:1011A0000F90109246011092450110924401FF9158 +:1011B000EF91DF91CF91BF91AF919F918F917F91EF +:1011C0006F915F914F913F912F910F900FBE0F90B4 +:1011D0001F9018958091750108959FB7F89410920B +:1011E0006C019FBF9091EE01943009F057C090912F +:1011F000E9009F703091EC00232F217030FD20E832 +:10120000922B24E02093E9002091EB0020FF43C0C3 +:101210002091EE0027FF3FC020916A01222321F098 +:101220002091E80025FF37C010926A0126E0309136 +:10123000E80035FD15C03091EE01343061F5309194 +:10124000EB0035FD28C0215021F481E080936A0134 +:1012500022C0EFE9FFE03197F1F700C00000E7CFCF +:101260008093F1008091E80085FD0AC08091E8003C +:1012700080FFFCCF8091E8008E778093E80006C065 +:101280008FB7F89421E020936C018FBF9F709093EB +:10129000E90080E008959F709093E9008FEF089532 +:1012A000CF93DF9300D01F92CDB7DEB79C01809122 +:1012B000EE01843019F593E099833B832A83909360 +:1012C000E9008FEF9091E800815095FD06C095ED03 +:1012D0009A95F1F700008111F5CF8091E80085FF24 +:1012E0000DC040E050E063E070E0CE0101960E9446 +:1012F000EA0B8091E8008E778093E8000F900F90C2 +:101300000F90DF91CF910895CF93DF9300D01F927C +:10131000CDB7DEB72091EE01243021F522E02983FC +:101320009B838A8383E08093E9008FEF9091E800AC +:10133000815095FD06C095ED9A95F1F70000811159 +:10134000F5CF8091E80085FF0DC040E050E063E0FC +:1013500070E0CE0101960E94EA0B8091E8008E7742 +:101360008093E8000F900F900F90DF91CF91089538 +:101370002091EE012430F1F422E02093E9002FEFD8 +:101380003091E800215035FD06C035ED3A95F1F772 +:1013900000002111F5CF2091E80025FF0BC040E0AF +:1013A00050E065E070E00E94EA0B8091E8008E77E3 +:1013B0008093E8000895CF93DF932091EE012430CD +:1013C00039F521E02093E9002FEF3091E80021501A +:1013D00035FD06C035ED3A95F1F700002111F5CF46 +:1013E0002091E80025FF14C0EC0140E050E068E0E7 +:1013F00070E00E94EA0B8091E8008E778093E8000D +:1014000088E0FE01ADE6B1E001900D928A95E1F72A +:10141000DF91CF91089582EF91E00C944D052091DA +:101420006B012F5F822F62E30E94C124992319F080 +:1014300020936B01089510926B0180916C018823B9 +:1014400071F18091EE01843041F58091E9008F7057 +:101450002091EC00922F917020FD90E8892B94E070 +:101460009093E9009091EB0090FF14C09091EE00F2 +:1014700097FF10C09091E80095FF03C01092F10013 +:10148000F9CF9091E80090FF05C09091E8009E7719 +:101490009093E8008F708093E90010926C0108959A +:1014A00042E061EC81E00E94F30C42E061EC82E0FA +:1014B0000E94F30C42E061EC83E00E94F30C42E2F4 +:1014C00061EC84E00C94F30C8091F001833009F41A +:1014D00053C030F4813071F0823009F48CC008952B +:1014E0008A3009F478C08B3009F45EC0893009F085 +:1014F0009AC020C08091EF01813A09F094C0809198 +:10150000E800877F8093E8008091F3019091F401D7 +:10151000892B21F468E08DE691E003C060E080E073 +:1015200090E070E00E94350C8091E8008B7780930A +:10153000E80008958091EF01813209F074C0809134 +:10154000F3019091F401892B09F06DC08091E800BE +:10155000877F8093E8008091E80082FD05C080913C +:10156000EE018111F8CF5FC08091F1008093750189 +:101570008091E8008B7753C08091EF01813A09F0A8 +:1015800052C08091F3019091F401892B09F04BC076 +:101590008091E800877F8093E8008091E80080FFD9 +:1015A000FCCF80910A0136C08091EF018132D9F5DC +:1015B0008091F3019091F401892BA9F58091E800C5 +:1015C000877F8093E8000E94280D8091F10180932D +:1015D0000A010C94B0158091EF01813221F58091C0 +:1015E000E800877F8093E8000E94280D8091F20137 +:1015F0008093760108958091EF01813AA1F4809162 +:10160000E800877F8093E8008091E80080FFFCCFAE +:10161000809176018093F1008091E8008E7780932D +:10162000E8000C94280D08950895089508958EEE0D +:1016300091E00E944D050C94160B0E94B21B809104 +:10164000EC01882329F00E94DD1B81110C94D40B3E +:10165000089584B7877F84BF0FB6F894A8958091CA +:101660006000886180936000109260000FBE90E07F +:1016700080E80FB6F89480936100909361000FBEEC +:101680000E94140B0E94B1100E94790D0E94CC0D93 +:101690008091E20084608093E2008DEE98E00E94E9 +:1016A000871B78948091EE018430E1F789ED91E019 +:1016B0000E944D050E94B31080E091E00E9420102E +:1016C00088EC91E00E944D050E94150B8091EE017F +:1016D000853039F484EC91E00E944D050E941D0B89 +:1016E000F5CF0E94B710F2CF0C94F11B8AEE91E077 +:1016F0000E944D050C94740B292F3327233031059C +:10170000C9F064F42130310581F02230310509F04F +:1017100043C084E790E024E432E042C02132310546 +:10172000F1F02232310541F137C082E190E028EB3F +:1017300032E036C099278130910541F08230910521 +:1017400041F0892B49F5E0E4F2E005C0E0E3F2E086 +:1017500002C0E6EFF1E0849190E09F0121C0643087 +:10176000D8F4E62FF0E0EE0FFF1FE15EFE4F208180 +:10177000318189E090E014C0643070F470E0FB01C6 +:10178000EE0FFF1FE95EFE4F20813181FB01ED5E10 +:10179000FE4F808190E004C080E090E020E030E0E7 +:1017A000FA0131832083089584E089BD86E089BDF4 +:1017B00009B400FEFDCF8091D8008F7D8093D800C2 +:1017C0008091E00082608093E0008091E00081FDE4 +:1017D000FCCF0895CF92DF92EF92FF920F931F9369 +:1017E000CF93DF93EC018B016A010E94470D8111B9 +:1017F00033C0C114D10439F0F60180819181081BF6 +:10180000190BC80FD91FE12CF12C0115110519F185 +:101810008091E80085FD16C08091E8008E77809366 +:10182000E800C114D10449F0F60180819181E80EED +:10183000F91EF182E08285E00FC00E94470D8823E7 +:1018400021F30AC089918093F10001501109FFEF43 +:10185000EF1AFF0ADACF80E0DF91CF911F910F914D +:10186000FF90EF90DF90CF9008952091F501309197 +:10187000F6012617370748F06115710539F42091F4 +:10188000E8002E772093E80001C0B90140E061151F +:10189000710591F12091EE01222309F440C0253019 +:1018A00009F43FC02091E80023FD3DC02091E800ED +:1018B00022FD2FC02091E80020FFE9CF2091F20007 +:1018C00030E0FC01CF016115710559F02830310578 +:1018D00040F481918093F100615071092F5F3F4F77 +:1018E000F1CF41E02830310509F040E02091E800D7 +:1018F0002E772093E800CBCF4111CCCF0AC0809146 +:10190000EE01882361F0853061F08091E80083FD6D +:101910000AC08091E80082FFF2CF80E0089582E063 +:10192000089583E0089581E008952091F5013091B4 +:10193000F6012617370748F06115710539F4209133 +:10194000E8002E772093E80001C0B901FC0120E0F7 +:101950006115710579F18091EE01882309F43DC08C +:10196000853009F43CC08091E80083FD3AC0809145 +:10197000E80082FD2CC08091E80080FFE9CF8091D3 +:10198000F20090E06115710559F08830910540F43E +:1019900024912093F1003196615071090196F2CFA4 +:1019A00021E0089709F020E08091E8008E7780938D +:1019B000E800CECF2111CFCF0AC08091EE0188235D +:1019C00061F0853061F08091E80083FD0AC080916C +:1019D000E80082FFF2CF80E0089582E0089583E07E +:1019E000089581E00895982F953058F59093E90077 +:1019F000981739F07091EC002091ED005091F000B3 +:101A000003C0242F762F50E021FF19C03091EB0046 +:101A10003E7F3093EB003091ED003D7F3093ED0041 +:101A20003091EB0031603093EB007093EC00209329 +:101A3000ED005093F0002091EE0027FF07C09F5F5C +:101A4000D3CF8F708093E90081E0089580E00895FE +:101A50008091EF0187FF11C08091E80082FD05C0F1 +:101A60008091EE018111F8CF11C08091E8008B7751 +:101A70000BC08091EE01882349F08091E80080FF3F +:101A8000F8CF8091E8008E778093E8000895209148 +:101A9000E4003091E50095E64091EC00842F8170E0 +:101AA00040FF22C08091E80080FD1CC08091EE01C3 +:101AB000882391F0853091F08091EB0085FD10C076 +:101AC0004091E4005091E5004217530729F39A0131 +:101AD000915011F784E0089582E0089583E008951D +:101AE00081E0089580E008954091E80042FFDECF54 +:101AF00008950E94D60D0E94D90DE0EEF0E080819D +:101B000081608083E8EDF0E080818F77808319BC6D +:101B1000E3E6F0E08081816080831092ED0108951A +:101B20000E94D60D0E94D90D8091D8008F778093A6 +:101B3000D8008091D80080688093D8008091D80028 +:101B40008F7D8093D80084E089BD86E089BD09B48B +:101B500000FEFDCF1092EE011092EA011092EC010E +:101B60001092EB0142E060E080E00E94F30C809173 +:101B7000E1008E7F8093E1008091E200816080939C +:101B8000E2008091E20088608093E2008091E000B2 +:101B90008E7F8093E0000895E3E6F0E080818E7F01 +:101BA000808381E08093ED010C94900D1092E2000F +:101BB00008951092E10008951F920F920FB60F92B0 +:101BC00011242F933F934F935F936F937F938F9342 +:101BD0009F93AF93BF93EF93FF938091E10082FFB8 +:101BE0000BC08091E20082FF07C08091E1008B7FF3 +:101BF0008093E1000E940F0A8091E10080FF19C0EC +:101C00008091E20080FF15C08091E2008E7F80937A +:101C1000E2008091E20080618093E2008091D80030 +:101C200080628093D80019BC85E08093EE010E9409 +:101C3000170B8091E10084FF30C08091E20084FFA7 +:101C40002CC084E089BD86E089BD09B400FEFDCFCB +:101C50008091D8008F7D8093D8008091E1008F7EA5 +:101C60008093E1008091E2008F7E8093E20080917A +:101C7000E20081608093E2008091EA01882311F004 +:101C800084E007C08091E30087FD02C081E001C0CD +:101C900083E08093EE010E94760B8091E10083FF48 +:101CA00029C08091E20083FF25C08091E100877FF9 +:101CB0008093E10082E08093EE011092EA0180912E +:101CC000E1008E7F8093E1008091E2008E7F80931F +:101CD000E2008091E20080618093E20042E060E0F7 +:101CE00080E00E94F30C8091F00088608093F00007 +:101CF0000E940B0AFF91EF91BF91AF919F918F913D +:101D00007F916F915F914F913F912F910F900FBEF7 +:101D10000F901F9018951F920F920FB60F921124DB +:101D20002F933F934F935F936F937F938F939F93E3 +:101D3000AF93BF93CF93DF93EF93FF93C091E900ED +:101D4000CF708091EC00D82FD17080FDD0E8109238 +:101D5000E9008091F000877F8093F00078940E94E2 +:101D6000CF0E1092E9008091F00088608093F0001F +:101D7000CD2BCF70C093E900FF91EF91DF91CF9110 +:101D8000BF91AF919F918F917F916F915F914F9193 +:101D90003F912F910F900FBE0F901F9018951F939A +:101DA000CF93DF93CDB7DEB7AA970FB6F894DEBF17 +:101DB0000FBECDBFEFEEF1E088E08E0F9091F10005 +:101DC00091938E13FBCF0E94640A8091E80083FFF9 +:101DD0001FC18091EF019091F001492F50E04A30EE +:101DE000510508F015C1FA01E65CFF4F0C94E1249F +:101DF000803881F0823809F00BC18091F3018F7037 +:101E00008093E9008091EB0085FB882780F9109290 +:101E1000E90006C08091EB019091EC019111826084 +:101E20009091E800977F9093E8008093F1001092E2 +:101E3000F100C8C0282F2D7F09F0EAC0882319F0CF +:101E4000823061F0E5C08091F101813009F0E0C09D +:101E5000933009F080E08093EC012BC08091F10178 +:101E6000811127C08091F3018F7009F4D1C0809354 +:101E7000E9002091EB0020FF1CC0933021F48091F9 +:101E8000EB00806214C09091EB0090619093EB00A6 +:101E900021E030E0A90102C0440F551F8A95E2F706 +:101EA0004093EA001092EA008091EB0088608093F2 +:101EB000EB001092E9008091E800877F86C08111D5 +:101EC000A7C01091F1011F778091E3008078812BEA +:101ED0008093E3008091E800877F8093E8000E9470 +:101EE000280D8091E80080FFFCCF8091E30080689E +:101EF0008093E300111102C082E001C083E080936F +:101F0000EE0186C08058823008F082C08091F101D5 +:101F10009091F2018C3D53E0950779F583E08A8337 +:101F20008AE289834FB7F894DE01139620E03EE001 +:101F300051E2E32FF0E050935700E49120FF03C0FB +:101F4000E295EF703F5FEF708E2F90E0EA3010F077 +:101F5000C79601C0C0968D939D932F5F243149F79A +:101F60004FBF8091E800877F8093E8006AE270E0CD +:101F7000CE0101960E94350C14C0AE014F5F5F4F39 +:101F80006091F3010E947C0BBC01892B09F440C0D5 +:101F90009091E800977F9093E80089819A810E9450 +:101FA000950C8091E8008B778093E80031C08038F1 +:101FB00079F58091E800877F8093E8008091EA01BD +:101FC0008093F1008091E8008E778093E8000E9472 +:101FD000280D1EC081111CC09091F1019230C0F4F7 +:101FE0008091E800877F8093E8009093EA010E9447 +:101FF000280D8091EA01811106C08091E30087FDE0 +:1020000002C081E001C084E08093EE010E94500A8A +:102010008091E80083FF0AC08091E800877F809369 +:10202000E8008091EB0080628093EB00AA960FB6E7 +:10203000F894DEBF0FBECDBFDF91CF911F91089501 +:1020400090937C0180937B010895E0917B01F09156 +:102050007C01309721F00190F081E02D099480E01F +:102060000895EF92FF920F931F93CF93DF93E09128 +:102070007B01F0917C013097B1F18C010280F381FA +:10208000E02D09958091D90182FF2DC080FF04C009 +:1020900087EB93E00E944D05E80118E081EBE82E04 +:1020A00083E0F82E8091D90180FF0BC088811F92B8 +:1020B0008F93FF92EF920E94E6050F900F900F9082 +:1020C0000F90115021961111EDCF8091D90180FF11 +:1020D0000AC08FEA93E0DF91CF911F910F91FF909B +:1020E000EF900C944D05DF91CF911F910F91FF90D0 +:1020F000EF900895E0917B01F0917C01309721F001 +:102100000480F581E02D09940895209179013091A2 +:102110007A018217930771F090937A018093790185 +:10212000E0917B01F0917C01309721F00680F781EE +:10213000E02D09940895209177013091780182175C +:10214000930771F09093780180937701E0917B0180 +:10215000F0917C01309721F00084F185E02D099405 +:1021600008950C94EF050E941C1C0C94F105CF926D +:10217000DF92EF92FF920F931F93CF93DF9300D0E4 +:1021800000D000D0CDB7DEB70E946F068EE7C82E14 +:1021900081E0D82E00E010E0E02E802F0E94D506CE +:1021A000F60141916F01F42EF826B1F40F5F1F4F35 +:1021B0000031110589F78FEF89838A831B820E9482 +:1021C000251C8160782F9D838C8349815A816B8186 +:1021D0008D810E94761147C09091D90191FF04C072 +:1021E0008E830E94DB068E8120E030E04F2D50E090 +:1021F000922FBA01022E02C0759567950A94E2F7F4 +:1022000060FF2BC02983EA8221E030E0690102C02F +:10221000CC0CDD1C9A95E2F790E08C219D21892B56 +:1022200009F420E02B830E94251C8160782F9D8378 +:102230008C8349815A816B818D810E9476114981FD +:102240005A816B817C818D810E949F1BF801E2582D +:10225000FE4F8081C826C08206C02F5F3F4F2830C6 +:10226000310531F6A3CF0E949E1B0E94F21E1091F1 +:102270007D010E942510181741F10E9425108093BE +:102280007D019091D90192FF0EC090FF0CC01F926A +:102290008F9389EC93E09F938F930E94E6050F90B4 +:1022A0000F900F900F9080917D0126960FB6F894B5 +:1022B000DEBF0FBECDBFDF91CF911F910F91FF9079 +:1022C000EF90DF90CF900C94B01B26960FB6F89449 +:1022D000DEBF0FBECDBFDF91CF911F910F91FF9059 +:1022E000EF90DF90CF9008950C940B07CF93DF937E +:1022F000CDB7DEB72B970FB6F894DEBF0FBECDBFBC +:10230000942F4F83252F588769877A878B874A8533 +:102310005B85452B21F02F3F09F59F3FF9F4DE0146 +:10232000119686E0FD0111928A95E9F785E0FE019C +:10233000379601900D928A95E1F749815A816B8118 +:102340007C818D819E810E9459182B960FB6F8943E +:10235000DEBF0FBECDBFDF91CF9108954F8158856D +:1023600069857A858B850E949F1BD9CFCF9388235F +:1023700009F4A4C0C82F8CEF8C0F813A48F48C2F3D +:102380000E941E2281119AC08C2F0E94E81A0CC054 +:1023900080E28C0F883058F4C77081E001C0880F4C +:1023A000CA95EAF70E94271BCF910C94611B8BE51D +:1023B0008C0F833078F4C53A29F0C63A31F083E8BF +:1023C00090E005C081E890E002C082E890E0CF9103 +:1023D0000C94851088E58C0F853108F06FC0C83AE1 +:1023E00061F1C93A69F1CA3A71F1CB3A79F1CC3A63 +:1023F00081F1CD3A89F1CE3A91F1CF3A99F1C13BD1 +:10240000A1F1C03BA9F1C23BB1F1C33BB9F1C43B5F +:10241000C1F1C53BC9F1C63BD1F1C73BD9F1C83BBE +:10242000E1F1C93BE9F1CA3BF1F1CB3BF9F1CC3B1E +:1024300009F43FC080E090E03EC082EE90E03BC0F7 +:1024400089EE90E038C08AEE90E035C085EB90E0F0 +:1024500032C086EB90E02FC083EB90E02CC084EB81 +:1024600090E029C087EB90E026C08CEC90E023C080 +:102470008DEC90E020C083E891E01DC08AE891E0F7 +:102480001AC082E991E017C084E991E014C081E2AA +:1024900092E011C083E292E00EC084E292E00BC0B1 +:1024A00085E292E008C086E292E005C087E292E011 +:1024B00002C08AE292E0CF910C949B10CF910895D4 +:1024C000882329F19CEF980F913A18F40E94051B7C +:1024D0000DC090E2980F983058F4877091E001C0D9 +:1024E000990F8A95EAF7892F0E942D1B0C94611B86 +:1024F0009BE5980F933020F480E090E00C948510D9 +:10250000885A853120F480E090E00C949B10089567 +:10251000882321F00E94271B0C94611B08958823B7 +:1025200021F00E942D1B0C94611B0895CF92DF9225 +:10253000EF92FF920F931F93CF93DF9300D000D0C1 +:1025400000D0CDB7DEB725E0FC01DE011196019089 +:102550000D922A95E1F7FC0140813181F2802581BD +:1025600022952F7063817481672B09F4D8C23F3F95 +:1025700019F44F3F09F4D3C26C0149833A8389812E +:102580009A812E830E94A71A182F092F0E94A61A3B +:102590000E94B619E02FE295EF70F0E0EC5BFF4F80 +:1025A0002E810C94E124802F807F902F9F70092F23 +:1025B000882311F00295007FFF2049F0002309F4E1 +:1025C0005FC2802F0E943A1B0E94611B59C2812F5B +:1025D0000E946012002309F4A2C2802F0E94401BB7 +:1025E00026960FB6F894DEBF0FBECDBFDF91CF9118 +:1025F0001F910F91FF90EF90DF90CF900C94611B93 +:10260000802F807F902F9F70092F803211F00295CC +:10261000007F112319F0113001F129C0FF20A9F02A +:10262000802F222349F1213039F526960FB6F894F0 +:10263000DEBF0FBECDBFDF91CF911F910F91FF90F5 +:10264000EF90DF90CF900C944A1B222319F0213099 +:1026500009F465C20E944D1B2CC0FF20E9F0263012 +:1026600008F05DC20E94241B802329F022C0FF20B5 +:10267000F1F0211115C0802F26960FB6F894DEBF19 +:102680000FBECDBFDF91CF911F910F91FF90EF90C3 +:10269000DF90CF900C948812253008F040C209C01A +:1026A000F601858180FFECC18F708583E4CF211115 +:1026B000FBC1802F69C1202F26952695237030E01D +:1026C0002115310521F021303105C9F028C2FF2044 +:1026D00021F0812F902F937002C080E090E0269629 +:1026E0000FB6F894DEBF0FBECDBFDF91CF911F9123 +:1026F0000F91FF90EF90DF90CF900C948510FF200A +:1027000021F0812F902F937002C080E090E02696F8 +:102710000FB6F894DEBF0FBECDBFDF91CF911F91F2 +:102720000F91FF90EF90DF90CF900C949B10812F32 +:10273000FF2019F00E94781D02C00E94E01D26961D +:102740000FB6F894DEBF0FBECDBFDF91CF911F91C2 +:102750000F91FF90EF90DF90CF900C94651E802F2B +:10276000837009F078C0F110DAC1812F82958695C7 +:102770008770880F880F912F9F70C92ED12CE12C64 +:10278000F12C082E04C0CC0CDD1CEE1CFF1C0A949E +:10279000D2F714FF12C04FE050E060E070E004C0D8 +:1027A000440F551F661F771F8A95D2F7CB01BA01D8 +:1027B000609570958095909503C060E070E0CB01C6 +:1027C000202F269526952370422F50E04230510548 +:1027D000D1F04330510559F16C297D298E299F296B +:1027E0004130510541F126960FB6F894DEBF0FBE79 +:1027F000CDBFDF91CF911F910F91FF90EF90DF90B0 +:10280000CF900C94CB196C297D298E299F2926966F +:102810000FB6F894DEBF0FBECDBFDF91CF911F91F1 +:102820000F91FF90EF90DF90CF900C94DD190E94F4 +:10283000CB19C701B60126960FB6F894DEBF0FBEBE +:10284000CDBFDF91CF911F910F91FF90EF90DF905F +:10285000CF900C94B919FF2019F0802F817001C01E +:102860008695882309F45BC1812F829586958770B0 +:10287000880F880F912F9F70C92ED12CE12CF12C3D +:10288000082E04C0CC0CDD1CEE1CFF1C0A94D2F7F1 +:1028900014FF12C04FE050E060E070E004C0440F4D +:1028A000551F661F771F8A95D2F7CB01BA01609535 +:1028B00070958095909503C060E070E0CB01202F6B +:1028C000269526952370422F50E042305105D1F0D5 +:1028D0004330510559F16C297D298E299F294130BA +:1028E000510541F126960FB6F894DEBF0FBECDBF5D +:1028F000DF91CF911F910F91FF90EF90DF90CF90DC +:102900000C94821A6C297D298E299F2926960FB650 +:10291000F894DEBF0FBECDBFDF91CF911F910F9115 +:10292000FF90EF90DF90CF900C94941A0E94821A3F +:10293000C701B60126960FB6F894DEBF0FBECDBF15 +:10294000DF91CF911F910F91FF90EF90DF90CF908B +:102950000C94701A103F41F118F4103E48F48BC0EB +:10296000123F09F450C0D8F1133F09F460C083C08E +:102970001F70802F8F71FF2021F00E94091A812F74 +:102980007BCE0E942A1A812F26960FB6F894DEBFBE +:102990000FBECDBFDF91CF911F910F91FF90EF90B0 +:1029A000DF90CF900C948F12FF20A9F0253008F013 +:1029B000B6C0802F8F7126960FB6F894DEBF0FBE7B +:1029C000CDBFDF91CF911F910F91FF90EF90DF90DE +:1029D000CF900C944F1A263008F0A1C0EACFFF2008 +:1029E000A1F0802F8F7126960FB6F894DEBF0FBE30 +:1029F000CDBFDF91CF911F910F91FF90EF90DF90AE +:102A0000CF900C94091AFF2061F3802F8F712696C6 +:102A10000FB6F894DEBF0FBECDBFDF91CF911F91EF +:102A20000F91FF90EF90DF90CF900C942A1AFF2027 +:102A300091F0802F8F7126960FB6F894DEBF0FBEEF +:102A4000CDBFDF91CF911F910F91FF90EF90DF905D +:102A5000CF900C94F41926960FB6F894DEBF0FBEF3 +:102A6000CDBFDF91CF911F910F91FF90EF90DF903D +:102A7000CF900C94EF19FF20A1F0222309F4B1CFDD +:102A8000812F26960FB6F894DEBF0FBECDBFDF9123 +:102A9000CF911F910F91FF90EF90DF90CF900C940A +:102AA000B611222309F4B1CF812F26960FB6F894E0 +:102AB000DEBF0FBECDBFDF91CF911F910F91FF9071 +:102AC000EF90DF90CF900C946012402F4F70612FE9 +:102AD000C6010E94EE1C26960FB6F894DEBF0FBE0C +:102AE000CDBFDF91CF911F910F91FF90EF90DF90BD +:102AF000CF900C940119402F4F70612FC60126967C +:102B00000FB6F894DEBF0FBECDBFDF91CF911F91FE +:102B10000F91FF90EF90DF90CF900C94F11C2696D0 +:102B20000FB6F894DEBF0FBECDBFDF91CF911F91DE +:102B30000F91FF90EF90DF90CF9008950E94471B78 +:102B40000E94161B0E94611B0E94991F0E94651E15 +:102B500080E090E00E94851080E090E00C949B1053 +:102B60000E94371B0C949E150E94A71A292F2295AC +:102B70002F7030E02C3031054CF42A3031056CF4E4 +:102B8000225031092230310588F407C02C3031053C +:102B900049F02F30310531F009C0803E48F0803FC8 +:102BA00029F406C093FB882780F9089580E00895F2 +:102BB00081E00895CF93DF9300D000D01F92CDB76E +:102BC000DEB70F900F900F900F900F90DF91CF9185 +:102BD0000895CF93DF9300D000D000D0CDB7DEB7FB +:102BE00026960FB6F894DEBF0FBECDBFDF91CF9112 +:102BF0000895CF93DF93C0918E0180918F01C81704 +:102C0000A1F0D0E0CE0166E070E00E94B024FC01AB +:102C1000E057FE4F408151816281738184819581AB +:102C20000E94E9152196C770E8CFDF91CF910895F2 +:102C30004091C0015091C1016091C2017091C301E6 +:102C40008091C4019091C5010C94E915CF93DF9355 +:102C50008091C50182958F7009F05CC08091C2019E +:102C6000882309F457C020918E01D0918F014091A3 +:102C7000C001C091C101E091C301F091C4012D17C1 +:102C800009F448C030E0309709F440C0CF3F11F458 +:102C90004F3FE1F1C90166E070E00E94B024DC0121 +:102CA000A057BE4F11968C911197C8132FC08C91CD +:102CB00048132CC012968C911297811127C013963D +:102CC0008D919C9114978E179F0708F401978E1B86 +:102CD0009F0B883C9105D0F48091C5018F70806175 +:102CE0008093C501C90166E070E00E94B024FC0138 +:102CF000EB56FE4F90819F709061908380EC91E045 +:102D00000E949612DF91CF910C94F9152F5F3F4FDF +:102D10002770B5CFDF91CF910895BF92CF92DF9208 +:102D2000EF92FF920F931F93CF93DF93CDB7DEB750 +:102D300061970FB6F894DEBF0FBECDBF8C0185E062 +:102D4000F801DE011D9601900D928A95E1F7D801F8 +:102D50004C9111962C9111971296EC901297139614 +:102D6000CD90DC9014975091C0016091C101809189 +:102D7000C3019091C401009709F46EC16F3F19F42B +:102D80005F3F09F469C1B090C201BB2009F4C3C020 +:102D90003091C501C816D90628F0F601E81BF90BD9 +:102DA000CF0104C0809590958C0D9D1DFF24F39458 +:102DB000883C910588F0F12C307F09F0CBC07C2D48 +:102DC000D98AC88A522F6E2D89890E94DA1580EC23 +:102DD00091E00E949612B4C0832F807F09F049C011 +:102DE000621314C0541312C0E11010C03F70306160 +:102DF0003093C5010E94181680EC91E00E94961253 +:102E00008091C501D80115968C9331C0CD2831F140 +:102E10002F3F11F44F3F11F1FE2CE1101FC0E09144 +:102E20008E0130918F01E31709F45CC0F0E0CF010F +:102E300066E070E00E94B024DC01A057BE4F1196FE +:102E40008C911197281307C08C91481304C01296D7 +:102E50008C91811103C03196E770E5CFFE2CEE20F6 +:102E600009F416C18091C50181608093C501F12CE0 +:102E70000FC1621308C0541306C0E11004C0809152 +:102E8000C501D801C1C04D872E878D859E850E94C2 +:102E9000B4158823E1F1EE20D1F12091C501822FF4 +:102EA00082958F7090E0029774F08091C0019091AC +:102EB000C10198878F831986DB86CA862C87CE014D +:102EC00007960E94961286E0F801A0ECB1E001900E +:102ED0000D928A95E1F70E9426160E941816FF248B +:102EE000F394D6C04D872E878D859E850E94A71AA4 +:102EF000292F22952F7030E0223031050CF0BCC014 +:102F00009F7009F0B6C0805E883008F4C1C0C80167 +:102F10000E949612E4CFC816D90608F453C0F601F1 +:102F2000E81BF90BCF01883C910508F450C0F12C47 +:102F30007C2DD98AC88A522F6E2D89890E94DA1574 +:102F4000E0ECF1E086E0DF011D928A95E9F70E944E +:102F500018169EC0621314C0541312C0E11010C0A2 +:102F60008091C501F8018583C8010E94961286E010 +:102F7000E0ECF1E0DF011D928A95E9F7FB2C88C0B7 +:102F80004D872E878D859E850E94B415882309F470 +:102F9000BECFEE2009F4BBCF2091C501822F8295D0 +:102FA0008F7090E002970CF48ECF8091C0019091C9 +:102FB000C1019A8389831B82DD82CC822E83CE015C +:102FC00001967FCF809590958C0D9D1DACCFFE2CEA +:102FD000EE2009F49CCF62132EC054132CC0209114 +:102FE000C50120FD1FC0822F82958F70D9F0D801B6 +:102FF00015962C9315978F3049F08F5F982F9295E7 +:10300000907F822F8F70892B15968C93C8010E9418 +:10301000961286E0F801A0ECB1E001900D928A953D +:10302000E1F795CF86E0F801A0ECB1E001900D92B8 +:103030008A95E1F72DC04D872E878D859E850E944C +:10304000B415811140CF8091C50181608093C50185 +:10305000C8010E9496121CC0EE2009F458CF4D877B +:103060002E878D859E850E94B415882309F44FCF45 +:103070002ACF811148CF0CC0243031050CF047CF46 +:103080009F7009F440CFF8019581907F09F03BCF04 +:103090008F2D61960FB6F894DEBF0FBECDBFDF91C6 +:1030A000CF911F910F91FF90EF90DF90CF90BF9045 +:1030B0000895CF93DF93CDB7DEB72C970FB6F89472 +:1030C000DEBF0FBECDBF4F83588769877A878B8756 +:1030D0009C87CE0107960E948D16882371F08F8100 +:1030E00098852A853B85232B09F43FC09F3F09F033 +:1030F00068C08F3F09F065C038C086E0FE01379692 +:10310000DE01119601900D928A95E1F76F81788525 +:10311000EA85FB85309749F17F3F11F46F3F29F134 +:1031200080918F0190E09C012F5F3F4F27703327E4 +:1031300040918E0150E02417350709F44BC0698394 +:103140007A83FD83EC8366E070E00E94B024DC01AA +:10315000A057BE4F96E0FE01319601900D929A95D0 +:10316000E1F720938F010E94F91580918E019091D3 +:103170008F018917E9F190E066E070E00E94B024C9 +:1031800080579E4F0E948D16882391F180918E0169 +:1031900090E066E070E00E94B024FC01E057FE4F32 +:1031A0004081518162817381848195810E94E915FA +:1031B00080918E0190E001968770992780938E010F +:1031C000D4CF4F81588569857A858B859C850E94EF +:1031D000E915CBCF0E94B01510928F0110928E018D +:1031E000E0ECF1E086E0DF011D928A95E9F7BDCFC2 +:1031F0002C960FB6F894DEBF0FBECDBFDF91CF91F6 +:103200000895DF92EF92FF920F931F93CF93DF9376 +:10321000FC01892B09F48AC0E12CF12CDD24D39424 +:10322000EF0121968491853709F461C058F4843701 +:1032300008F04EC0843008F06AC08130D1F082308E +:1032400071F174C0883709F45DC050F4863709F411 +:1032500055C0873709F06AC08E2D0E94341B54C0B8 +:103260009CE7980F903708F061C08F770E9460123A +:1032700050C08F010E5F1F4FFE01849190E2980FA6 +:10328000983050F48770FD2D01C0FF0F8A95EAF742 +:103290008F2F0E943A1B14C00E94B61113C08F01D9 +:1032A0000E5F1F4FFE01C49180E28C0F883060F4E6 +:1032B000C7708D2D01C0880FCA95EAF70E94401B88 +:1032C0000E94611BE80125C08C2F0E946012FACF7A +:1032D0009F012E5F3F4FFE01C491CC2369F08FE91F +:1032E0009FE00197F1F700C00000C150F6CF9F01A9 +:1032F0002E5F3F4FFE01F490E9010BC00E94241B9A +:10330000E82E07C00E94371B0E94611B02C00E946A +:10331000B6118F2D882341F0EFE9FFE03197F1F7E7 +:1033200000C000008150F6CFFE017ACFDF91CF912F +:103330001F910F91FF90EF90DF9008956093CA0165 +:103340007093CB018093CC019093CD010E94AE1B72 +:103350000C949E156093C6017093C7018093C801B9 +:103360009093C9010E94AF1B0C949E1508950C9474 +:103370009E190F931F930091CA011091CB012091C8 +:10338000CC013091CD01602B712B822B932B1F919F +:103390000F910C949E190F931F930091CA011091E5 +:1033A000CB012091CC013091CD0160237123822388 +:1033B00093231F910F910C949E190F931F930091CB +:1033C000CA011091CB012091CC013091CD01602731 +:1033D0007127822793271F910F910C949E1960E00B +:1033E00070E0CB010C94AA190F931F9341E050E0B9 +:1033F00060E070E08A019B0104C0000F111F221FD2 +:10340000331F8A95D2F7C901B8011F910F910C940F +:10341000AA190F931F9341E050E060E070E004C0F0 +:10342000440F551F661F771F8A95D2F78091C601FA +:103430009091C701A091C801B091C9018A019B0177 +:10344000082B192B2A2B3B2BC901B8011F910F9177 +:103450000C94AA190F931F9341E050E060E070E0D4 +:1034600004C0440F551F661F771F8A95D2F74095F9 +:103470005095609570958091C6019091C701A0917B +:10348000C801B091C9018A019B01082319232A238D +:103490003B23C901B8011F910F910C94AA190F93F6 +:1034A0001F9341E050E060E070E004C0440F551FFE +:1034B000661F771F8A95D2F78091C6019091C70148 +:1034C000A091C801B091C9018A019B010827192761 +:1034D0002A273B27C901B8011F910F910C94AA1903 +:1034E0000F931F930091C6011091C7012091C8014D +:1034F0003091C901602B712B822B932B1F910F915F +:103500000C94AA190F931F930091C6011091C70143 +:103510002091C8013091C901602371238223932334 +:103520001F910F910C94AA190F931F930091C6013C +:103530001091C7012091C8013091C90160277127FE +:10354000822793271F910F910C94AA190895CF9267 +:10355000DF92EF92FF920F931F93CF93DF938C0133 +:10356000C090CA01D090CB01E090CC01F090CD0189 +:103570004091C6015091C7016091C8017091C90185 +:10358000C42AD52AE62AF72ACFE1D0E0D701C6011E +:103590000C2E04C0B695A795979587950A94D2F7F7 +:1035A00080FF07C0B8018C2F0E94BF1C813091059D +:1035B00031F4219758F7B80180E00E94BF1CDF91D9 +:1035C000CF911F910F91FF90EF90DF90CF900895D2 +:1035D00020910B0130910C01F90132969FEF40E0F0 +:1035E0005191581789F09F3F19F4511101C0942F40 +:1035F0004F5F4630A9F79F3F39F0F901E90FF11D00 +:1036000097FDFA9582830895089520910B013091DA +:103610000C01F9013296285F3F4F9081981301C049 +:1036200010823196E217F307C1F7089581E090E028 +:10363000E0910B01F0910C01E80FF91F1082019647 +:1036400088309105A9F708958091D8010895909147 +:10365000D801892B8093D801089580959091D80145 +:1036600089238093D80108958093D80108951092FA +:10367000D80108959091D701892B8093D70108959F +:1036800080959091D70189238093D7010895109256 +:10369000D70108958093CE0108951092CE01089528 +:1036A00080910B0190910C01FC0131969C01285FE7 +:1036B0003F4F80E0919191118F5FE217F307D1F7AF +:1036C0000895E0910B01F0910C018091D801808365 +:1036D000E0910B01F0910C0190818091D701892B31 +:1036E00080838091CE01882361F0E0910B01F091FD +:1036F0000C019081892B80830E94501B81111092B4 +:10370000CE0180910B0190910C010C94311090939B +:1037100033018093320108958295982F9C7C292F44 +:1037200026952695982F9373990F990F922B892F91 +:103730008A7A86959575990F892B08950895CF9368 +:10374000DF9300D000D01F92CDB7DEB70F900F905F +:103750000F900F900F90DF91CF91089508950895E5 +:103760000C9474118091EE01843021F11092DA01F1 +:1037700020E488E190E00FB6F894A895809360006B +:103780000FBE2093600083B7817F846083BF83B7BF +:10379000816083BF7894889583B78E7F83BF0FB68F +:1037A000F894A895809160008861809360001092E1 +:1037B00060000FBE089508950895CF930E94DB1B0B +:1037C0000E946F060E94DC1BC0E08C2F0E94D50671 +:1037D000811104C0CF5FC031C1F701C081E0CF913A +:1037E00008950C94B0151F920F920FB60F921124EA +:1037F0008F939F93AF93BF938091DA01811113C090 +:103800008091DB019091DC01A091DD01B091DE019E +:103810004196A11DB11D8093DB019093DC01A09323 +:10382000DD01B093DE01BF91AF919F918F910F9019 +:103830000FBE0F901F90189582E084BD93E095BD58 +:103840009AEF97BD80936E0008952FB7F8948091FA +:10385000DB019091DC01A091DD01B091DE012FBF71 +:1038600008952FB7F8946091DB017091DC0180918D +:10387000DD019091DE012FBF0895CF92DF92EF928C +:10388000FF920F931F932FB7F8944091DB01509153 +:10389000DC016091DD017091DE012FBF6A017B01C7 +:1038A000EE24FF248C0120E030E0C016D106E206B1 +:1038B000F30610F4415051099A01281B390BC90134 +:1038C0001F910F91FF90EF90DF90CF9008951F927E +:1038D0000F920FB60F9211248F939F93AF93BF93C4 +:1038E0008091DB019091DC01A091DD01B091DE01BE +:1038F0000196A11DB11D8093DB019093DC01A09383 +:10390000DD01B093DE01BF91AF919F918F910F9038 +:103910000FBE0F901F9018950E94790DF8942FEF0D +:1039200087EA91E6215080409040E1F700C0000016 +:1039300087E090EBDC018093F7019093F801A0936E +:10394000F901B093FA019CE088E10FB6F894A895CC +:10395000809360000FBE90936000FFCFE92FF0E0EE +:1039600093E0EE0FFF1F9A95E1F7E80FF11DE85580 +:10397000FF4F9491892F8F7092959F700895CF93E8 +:10398000C82FCB010E94AE1C492F90E0242F30E0BD +:1039900054E0220F331F5A95E1F7282B392B20389A +:1039A000310519F480E090E017C0EC2FF0E023E03F +:1039B000EE0FFF1F2A95E1F74770E40FF11D34E089 +:1039C000EE0FFF1F3A95E1F7E80FF91FEE0FFF1F0B +:1039D000E050F84985919491CF91089580E090E06E +:1039E000089508958091E10180FF0CC0809110013D +:1039F00090E065E070E00E94B024959587959595DC +:103A000087952EC081FF0AC08091100190E065E08B +:103A100070E00E94B0249595879522C082FF08C06F +:103A20008091100190E065E070E00E94B02418C021 +:103A30002091E2012223D1F030910F01231780F76A +:103A40008091100190E065E070E00E94B024622F48 +:103A500070E00E94B024632F70E00E94CD24CB015F +:103A60008038910530F4009731F0089585E090E0BA +:103A700008958FE7089581E008958091E10180FF26 +:103A800008C060910E0170E0759567957595679512 +:103A900023C081FF06C060910E0170E075956795A7 +:103AA0001BC082FF04C060910E0170E012C06091E3 +:103AB000E2016623D1F020910D016217A0F78091F9 +:103AC0000E0170E090E00E94B024622F70E00E942E +:103AD000CD246038710528F46115710521F0862F19 +:103AE00008958FE7089581E0089561E070E0F4CFD4 +:103AF000803F21F40E94F21C819504C0813F29F48B +:103B00000E94F21C8093E5010895823F21F40E94F7 +:103B1000F21C819504C0833F29F40E94F21C80931B +:103B2000E4010895893F19F40E943D1D05C08A3FB4 +:103B300031F40E943D1D81958093E60108958B3FED +:103B400021F40E943D1D819504C08C3F29F40E9400 +:103B50003D1D8093E7010895843F21F48091E301A6 +:103B6000816017C0853F21F48091E301826011C01C +:103B7000863F21F48091E30184600BC0873F21F4EC +:103B80008091E301886005C0883F31F48091E301B2 +:103B900080618093E30108958D3F21F48091E101DC +:103BA00081600BC08E3F21F48091E101826005C0ED +:103BB0008F3F29F48091E10184608093E1010895B1 +:103BC000803F39F48091E50187FF6CC01092E501D8 +:103BD00069C0813F29F48091E5011816BCF362C0E9 +:103BE0009091E401823F29F497FF5CC01092E401B8 +:103BF00059C0833F19F41916CCF354C0893F41F4DE +:103C00008091E60118160CF04DC01092E6014AC0F2 +:103C10008A3F29F48091E60187FF44C0F6CF8B3FAD +:103C200039F48091E70187FF3DC01092E7013AC067 +:103C30008C3F29F48091E7011816BCF333C0843F10 +:103C400021F48091E3018E7F17C0853F21F480919C +:103C5000E3018D7F11C0863F21F48091E3018B7FCA +:103C60000BC0873F21F48091E301877F05C0883F27 +:103C700031F48091E3018F7E8093E30113C08D3F87 +:103C800021F48091E1018E7F0BC08E3F21F4809161 +:103C9000E1018D7F05C08F3F29F48091E1018B7F89 +:103CA0008093E1018091E40181110EC08091E501D2 +:103CB00081110AC08091E601811106C08091E7015F +:103CC000811102C01092E20108958091D90183FF11 +:103CD0007EC08BEF93E00E944D058091E3011F921F +:103CE0008F9386EF93E09F938F930E94E60584EF76 +:103CF00093E00E944D058091E401282F082E000CCE +:103D0000330B3F938F9381EF93E09F938F930E94A8 +:103D1000E6058FEE93E00E944D058091E501282F86 +:103D2000082E000C330B3F938F938CEE93E09F9300 +:103D30008F930E94E6058AEE93E00E944D058091E4 +:103D4000E601282F082E000C330B3F938F9387EE4C +:103D500093E09F938F930E94E60585EE93E00E9487 +:103D60004D058091E701282F082E000C330B3F935F +:103D70008F9382EE93E09F938F930E94E6058FEDE1 +:103D800093E00E944D058091E2011F928F938CED8C +:103D900093E09F938F930E94E6058AED93E00E9443 +:103DA0004D058091E1011F928F9387ED93E09F93E2 +:103DB0008F930E94E60584ED93E00E944D058DB738 +:103DC0009EB74C960FB6F8949EBF0FBE8DBF83EE84 +:103DD00091E00E947A100E94251C9093E00180934C +:103DE000DF0108951F93CF93DF938091DF019091BE +:103DF000E0010E943D1CFC012091E201222329F0F8 +:103E000090911101892F90E007C08091120190E0FC +:103E10006AE070E00E94B024E817F90708F485C052 +:103E20008091E401C091E501D091E6011091E70194 +:103E3000811107C0C11175C0D11173C0111171C0BA +:103E400074C02F3F19F02F5F2093E201181624F45D +:103E50000E94F21C8093E4018091E40187FF05C079 +:103E60000E94F21C81958093E4011C1624F40E94A8 +:103E7000F21C8093E5018091E50187FF05C00E9457 +:103E8000F21C81958093E5016091E401662331F194 +:103E9000C091E501CC2311F1062E000C770B880BA5 +:103EA000990B0E94AF2323E333E343E35FE30E94D4 +:103EB00013240E9477236093E4016C2FCC0F770BBF +:103EC000880B990B0E94AF2323E333E343E35FE3C3 +:103ED0000E9413240E9477236093E5011D1624F4A9 +:103EE0000E943D1D8093E6018091E60187FF05C099 +:103EF0000E943D1D81958093E601111624F40E94D5 +:103F00003D1D8093E7018091E70187FF05C00E9476 +:103F10003D1D81958093E701DF91CF911F910C9416 +:103F2000651E2F3F09F08FCF97CFDF91CF911F9163 +:103F30000895E3EEF1E085E0DF011D928A95E9F74F +:103F40001092E2011092E10108958EE196E00E9444 +:103F50004D051F9281E08F931F9285E08F9380ED36 +:103F600095E09F938F930E94E6050F900F900F901E +:103F70000F900F900F9008958330E9F128F481306D +:103F800061F0823009F10895853009F462C008F4C7 +:103F900049C0863009F474C0089580911201262F1B +:103FA00030E0280F311D2F3F310524F4680F609356 +:103FB000120103C08FEF80931201809112011F92B2 +:103FC0008F9389E095E072C080911101262F30E037 +:103FD000280F311D2F3F310524F4680F6093110124 +:103FE00003C08FEF80931101809111011F928F9375 +:103FF00087EF94E05BC080911001262F30E0280FFE +:10400000311D2F3F310524F4680F6093100103C068 +:104010008FEF80931001809110011F928F9384EE97 +:1040200094E044C080910F01262F30E0280F311D0D +:104030002F3F310524F4680F60930F0103C08FEF09 +:1040400080930F0180910F011F928F938FEC94E06A +:104050002DC080910E01262F30E0280F311D2F3FFB +:10406000310524F4680F60930E0103C08FEF809335 +:104070000E0180910E011F928F9386EB94E016C083 +:1040800080910D01262F30E0280F311D2F3F310583 +:1040900024F4680F60930D0103C08FEF80930D012E +:1040A00080910D011F928F938BE994E09F938F93E2 +:1040B0000E94E6050F900F900F900F9008958330A7 +:1040C00081F128F4813059F08230D1F008958530A3 +:1040D00009F449C0B8F1863009F456C008958091BA +:1040E0001201681720F4861B8093120102C01092FF +:1040F0001201809112011F928F938CE894E054C0BA +:1041000080911101681720F4861B8093110102C071 +:1041100010921101809111011F928F938AE794E010 +:1041200043C080911001681720F4861B8093100112 +:1041300002C010921001809110011F928F9387E6A8 +:1041400094E032C080910F01681720F4861B8093A1 +:104150000F0102C010920F0180910F011F928F93E7 +:1041600082E594E021C080910E01681720F4861B3F +:1041700080930E0102C010920E0180910E011F92D9 +:104180008F9389E394E010C080910D01681720F4AB +:10419000861B80930D0102C010920D0180910D01CC +:1041A0001F928F938EE194E09F938F930E94E60578 +:1041B0000F900F900F900F900895CF93C82F1F92DC +:1041C0008F9383E297E09F938F930E94E60581E0AF +:1041D00090E0A0E0B0E0BC01CD0104C0660F771F05 +:1041E000881F991FCA95D2F70E94B7190F900F9098 +:1041F0000F900F90CF910C94B015CF93873288F524 +:104200008E3108F00BC18E3009F487C0D8F48730A6 +:1042100009F460C08B3009F44FC0863009F002C148 +:104220008091D901817F8E7F8093D90188E297E0C8 +:104230000E944D058CEE99E00E944D0581E080932F +:10424000E90146C0863109F4B0C020F4803109F498 +:104250007AC0E8C0893109F491C08B3109F449C0B2 +:10426000E1C0883349F150F4893209F4D5C085336F +:1042700009F4D2C0873209F0D5C0CEC0833409F426 +:10428000CBC028F48A3308F4CDC08953C8C0883421 +:1042900009F0C8C00E94B0158BED99E00E944D0551 +:1042A0002FEF83ED90E3215080409040E1F700C074 +:1042B00000000E948C1C0CC08FE497E041C082EC8F +:1042C00099E00E944D058091D90181608093D901C8 +:1042D000C1E0ADC08091D901C82FC17080FFEFCF80 +:1042E0008EEC99E00E944D058091D901817F8E7FEF +:1042F0003FC09091D90191FBCC27C0F981E0C8273C +:10430000892FC0FB81F98093D901CC2319F085EB6B +:1043100099E029C087EA99E013C09091D90192FBF6 +:10432000CC27C0F981E0C827892FC0FB82F9809390 +:10433000D901CC2319F088E999E015C088E899E003 +:104340000E944D05C5CF9091D90193FBCC27C0F9B0 +:1043500081E0C827892FC0FB83F98093D901CC2342 +:1043600051F08CE799E00E944D058091D901816060 +:104370008093D9015CC08FE699E0E2CF80E699E0B6 +:104380000E944D0588E399E00E944D058EEE98E06D +:104390000E944D0581EC98E00E944D058CE798E065 +:1043A0000E944D058DE498E0CBCF8FE398E00E940A +:1043B0004D050E9425101F928F9385E298E09F93F0 +:1043C0008F930E94E60580910A011F928F938EE0E1 +:1043D00098E09F938F930E94E605809176011F924B +:1043E0008F938BEF97E09F938F930E94E6050E9437 +:1043F000311C9F938F937F936F9384EE97E09F93ED +:104400008F930E94E6058DB79EB742960FB6F8943B +:104410009EBF0FBE8DBF5CCF80E001C08D510E945A +:10442000DD2056CF82EE97E00E944D05C0E08C2F34 +:10443000CF91089580E0089580E00895CF93C82F2C +:104440008091E901813081F020F0823009F44FC081 +:1044500046C1E0910B01F0910C018081813169F03E +:10446000823209F03EC109C0E0910B01F0910C01CC +:104470008081813111F0823261F48C2F0E941A22E6 +:10448000811104C08C2F0E94FD202FC081E090E09C +:104490002CC08C2F0E941C22811126C0C431E1F057 +:1044A00070F4CB3081F0C031D1F40E94A51F8BE1B4 +:1044B00097E00E944D0582E08093E90115C0C93262 +:1044C00059F0C83361F488E297E00E944D058FE10E +:1044D00097E00E944D0508C01092E90104C189E1EE +:1044E00097E00E944D05FFC081E08170FEC0C4329C +:1044F00028F5CE3108F0C1C0CB30A1F1D0F4C730DF +:1045000009F0D3C08EE18093120182E38093110100 +:104510008AE08093100184E180930F0188E080930A +:104520000E0188E280930D018FEB95E00E944D050E +:10453000BFC0C33149F1C431C1F0B7C0CB3409F4B5 +:10454000A9C028F4C93289F0C83361F0AEC0C135C2 +:1045500009F49EC0C23509F499C0CE3409F0A5C053 +:104560006AE09EC00E94A51FA3C08091E801882335 +:1045700019F01092E8019CC08CEC95E00E944D056A +:1045800081E08093E901B1C086EA95E00E944D0583 +:1045900084E995E00E944D05809112011F928F934E +:1045A00081E995E09F938F930E94E6058FE895E05F +:1045B0000E944D058DE795E00E944D058091110107 +:1045C0001F928F938AE795E09F938F930E94E60551 +:1045D00088E795E00E944D0589E695E00E944D052B +:1045E000809110011F928F9386E695E09F938F93A1 +:1045F0000E94E60584E695E00E944D0583E595E07E +:104600000E944D0580910F011F928F9380E595E0E8 +:104610009F938F930E94E6058EE495E00E944D05DE +:1046200089E395E00E944D0580910E011F928F93C2 +:1046300086E395E09F938F930E94E60584E395E0DF +:104640000E944D058DE195E00E944D0580910D0180 +:104650001F928F938AE195E09F938F930E94E605C6 +:1046600088E195E00E944D058DB79EB748960FB63C +:10467000F8949EBF0FBE8DBF1BC0CE51EC2FF0E053 +:10468000E95DFE4F80818093E80112C061E003C0C4 +:1046900061E006C06AE08091E8010E94BC1F08C08A +:1046A0008091E8010E945F2003C08DEB95E013C06C +:1046B0008091E801882369F01F928F9387EB95E042 +:1046C0009F938F930E94E6050F900F900F900F908D +:1046D00004C084EB95E00E944D0581E006C0109275 +:1046E000E90180E002C080E000CFCF9108950E94F0 +:1046F0007E236894B1110C940D2408950E94F22336 +:1047000088F09F5798F0B92F9927B751B0F0E1F092 +:10471000660F771F881F991F1AF0BA95C9F714C042 +:10472000B13091F00E940C24B1E008950C940C2457 +:10473000672F782F8827B85F39F0B93FCCF386957B +:1047400077956795B395D9F73EF4909580957095D8 +:1047500061957F4F8F4F9F4F0895E89409C097FB55 +:104760003EF490958095709561957F4F8F4F9F4F48 +:104770009923A9F0F92F96E9BB279395F69587958C +:1047800077956795B795F111F8CFFAF4BB0F11F44F +:1047900060FF1BC06F5F7F4F8F4F9F4F16C08823F6 +:1047A00011F096E911C0772321F09EE8872F762F2C +:1047B00005C0662371F096E8862F70E060E02AF06D +:1047C0009A95660F771F881FDAF7880F9695879559 +:1047D00097F9089557FD9058440F551F59F05F3FC2 +:1047E00071F04795880F97FB991F61F09F3F79F013 +:1047F00087950895121613061406551FF2CF469595 +:10480000F1DF08C0161617061806991FF1CF869516 +:104810007105610508940895E894BB2766277727FA +:10482000CB0197F908950E9425240C949F240E949F +:10483000912438F00E94982420F0952311F00C94D4 +:1048400088240C948E240C940D240E94EA2378F37F +:104850009923C9F35523B9F3950F50E0551FAA27A3 +:10486000EE27FF27BB2700240894679520F4E20F6A +:10487000F31FB41F0A1E220F331F441FAA1F669581 +:10488000A9F7779530F4F30FB41F0A1E121E08F42F +:104890006395330F441FAA1F221F769599F78795BA +:1048A00020F4B40F0A1E121E631F440FAA1F221FFA +:1048B000331F8695A9F7862F712D602D11249F57E0 +:1048C00050409AF0F1F088234AF0EE0FFF1FBB1F13 +:1048D000661F771F881F91505040A9F79E3F5105D2 +:1048E00080F00C9488240C940D245F3FE4F3983EF0 +:1048F000D4F3869577956795B795F795E7959F5F7C +:10490000C1F7FE2B880F911D9695879597F908950D +:1049100097F99F6780E870E060E008959FEF80EC72 +:10492000089500240A941616170618060906089515 +:1049300000240A9412161306140605060895092E7B +:104940000394000C11F4882352F0BB0F40F4BF2BEA +:1049500011F460FF04C06F5F7F4F8F4F9F4F08952A +:104960000024552704C0080E591F880F991F00976F +:1049700029F076956795B8F37105B9F7802D952FD5 +:104980000895991B79E004C0991F961708F0961BAB +:10499000881F7A95C9F78095089597FB072E16F41E +:1049A000009407D077FD09D00E94E72407FC05D0CA +:1049B0003EF4909581959F4F0895709561957F4F36 +:1049C0000895EE0FFF1F0590F491E02D0994AA1BA6 +:1049D000BB1B51E107C0AA1FBB1FA617B70710F0EA +:1049E000A61BB70B881F991F5A95A9F7809590951C +:0A49F000BC01CD010895F894FFCF3B +:1049FA00EA08DB09B8098409500901CF012808141B +:104A0A000A321E404D36226F032203EC02CA0256B6 +:104A1A00026F028802A102010203040506070809BF +:024A2A0000008A +:106800008800EA44E944E244040005000600070069 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031003200330034003500360037008C +:10687000380039003A003B003C003D003E003F003C +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530054005500560057004C +:1068B000580059005A005B005C005D005E005F00FC +:1068C000600061006200630064006500850067008D +:1068D000680069006A006B006C006D006E006F005C +:1068E0007000710072007300890087008A008B00BD +:1068F000E000E100E200E300F1A1E500E600E700CE +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010035004C0039000100440045005200A0 +:1069600049000100010050004F0029004D004E0079 +:1069700051000100680069006A006B006C006D0046 +:106980006E006F0070007100720073000100010062 +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E0000100010001000100490001000100010057 +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/ibm4704_usb/binary/ibm4704_usb_rev2_unimap.hex b/converter/ibm4704_usb/binary/ibm4704_usb_rev2_unimap.hex new file mode 100644 index 00000000..222d9945 --- /dev/null +++ b/converter/ibm4704_usb/binary/ibm4704_usb_rev2_unimap.hex @@ -0,0 +1,1221 @@ +:100000000C94F8040C943F050C9434080C943F05B0 +:100010000C943F050C943F050C943F050C943F0550 +:100020000C943F050C943F050C943F050C94DC0D9B +:100030000C948B0E0C94F31B0C943F050C943F0511 +:100040000C943F050C943F050C943F050C94671CE1 +:100050000C943F050C943F050C943F050C943F0510 +:100060000C943F050C943F050C943F050C943F0500 +:100070000C943F05F80E1A0F08101A0F08105F0FA6 +:10008000820F0810D70FEA0FD312D31200130013F8 +:100090005B1397138F158F15AF138F15AA14AA141E +:1000A00065158F158F157B15350C12132B141A80BF +:1000B00024252680742E2A272122230815171C1890 +:1000C0001E1F202F3031802D39041607090A0B0D11 +:1000D0000E0F33343228807C79781D1B06190511E8 +:1000E00010363738757D647A2C7B7F8040413A53D7 +:1000F0005455565F606157805C5D5E6642433C5874 +:100100005A5B672962635980808080803B473D51FC +:100110008080494A4B4C4D4E463E48804452453FB4 +:10012000504F808080808080253032583A202530A2 +:1001300038620A000A722F63203031323334353688 +:10014000370A00253032580A00253032580A004557 +:1001500072726F723A20253032580A00456E640A76 +:100160000073253032583A72253032582000456EDF +:1001700061626C6520627265616B3A20004B657943 +:10018000626F6172642049443A20253032580A0077 +:1001900049424D203437303420636F6E7665727477 +:1001A00065720A00726275663A2066756C6C0A00A8 +:1001B000523A25303258253032580A00533A253009 +:1001C000325820005B735D004B6579626F61726429 +:1001D0002073746172742E0A0055534220636F6E4F +:1001E000666967757265642E0A005B575D005B5334 +:1001F0005D005B525D003803490042004D00200065 +:10020000340037003000340020006B0065007900B6 +:1002100062006F00610072006400200063006F00E4 +:100220006E007600650072007400650072000000C8 +:100230000E0374002E006D002E006B002E000000D7 +:100240000403090409027400040100A03209040037 +:1002500000010301010009211101000122400007F2 +:1002600005810308000A09040100010301020009D5 +:100270002111010001224D000705820308000A092F +:1002800004020001030000000921110100012236CF +:10029000000705830308000A0904030002030000A5 +:1002A000000921110100012222000705840320001A +:1002B00001070504032000011201100100000008DD +:1002C000EDFE07470100010200010631FF0974A19C +:1002D000010975150026FF00952075088102097631 +:1002E000150026FF00952075089102C005010980C0 +:1002F000A101850216810026B7001A81002AB700E5 +:10030000751095018100C0050C0901A10185031636 +:100310000100269C021A01002A9C02751095018199 +:1003200000C005010902A1010901A1000509190187 +:1003300029051500250195057501810295017503B3 +:1003400081010501093009311581257F9502750864 +:10035000810609381581257F950175088106050CF0 +:100360000A38021581257F950175088106C0C005F0 +:10037000010906A101050719E029E71500250195E6 +:100380000875018102950175088101050819012987 +:1003900005950575019102950175039101050719F0 +:1003A0000029FF150026FF00950675088100C00A88 +:1003B000002530325820006B6579626F6172645F8E +:1003C0007265706F72743A20004C45443A202530B3 +:1003D00032580A00290A002575002F002575005D96 +:1003E00028002564002000256400200025640020EA +:1003F000002564007C0025303258006D6F757365F0 +:100400006B6579205B62746E7C7820792076206839 +:100410005D287265702F61636C293A205B006D6BFB +:100420005F776865656C5F74696D655F746F5F6D3C +:100430006178203D2025640A006D6B5F77686565F3 +:100440006C5F6D61785F7370656564203D20256425 +:100450000A006D6B5F74696D655F746F5F6D6178C5 +:10046000203D2025640A006D6B5F6D61785F7370BD +:10047000656564203D2025640A006D6B5F696E74BC +:10048000657276616C203D2025640A006D6B5F64A7 +:10049000656C6179203D2025640A006D6B5F77688B +:1004A00065656C5F74696D655F746F5F6D61782001 +:1004B0003D2025640A006D6B5F776865656C5F6D34 +:1004C00061785F7370656564203D2025640A006D66 +:1004D0006B5F74696D655F746F5F6D6178203D203F +:1004E00025640A006D6B5F6D61785F73706565648C +:1004F000203D2025640A006D6B5F696E746572761D +:10050000616C203D2025640A006D6B5F64656C6141 +:1005100079203D2025640A000A00257500363A201E +:10052000776865656C5F74696D655F746F5F6D6139 +:10053000783A20000A00257500353A20776865650D +:100540006C5F6D61785F73706565643A20000A00C6 +:10055000257500343A2074696D655F746F5F6D6155 +:10056000783A20000A00257500333A206D61785FE3 +:1005700073706565643A20000A00257500323A20E0 +:10058000696E74657276616C286D73293A20000A71 +:1005900000257500313A2064656C6179282A313074 +:1005A0006D73293A20000A092D2056616C75657318 +:1005B000202D0A004D3E004D25643E20003F007373 +:1005C00065742064656661756C740A00433E2000A2 +:1005D00077686572652064656C74613A2063757232 +:1005E000736F723D25642C20776865656C3D2564CA +:1005F0000A53656520687474703A2F2F656E2E77E4 +:10060000696B6970656469612E6F72672F77696BBA +:10061000692F4D6F7573655F6B6579730A000A0901 +:100620002D204D6F7573656B6579202D0A455343F9 +:100630002F713A09717569740A313A0964656C6100 +:1006400079282A31306D73290A323A09696E746546 +:100650007276616C286D73290A333A096D61785F8F +:1006600073706565640A343A0974696D655F746F07 +:100670005F6D61780A353A09776865656C5F6D6111 +:10068000785F73706565640A363A09776865656CEA +:100690005F74696D655F746F5F6D61780A0A703AA7 +:1006A000097072696E742076616C7565730A643ABC +:1006B000097365742064656661756C74730A75707E +:1006C0003A092B310A646F776E3A092D310A706747 +:1006D00075703A092B31300A7067646F776E3A098A +:1006E0002D31300A0A7370656564203D2064656CA5 +:1006F0007461202A206D61785F7370656564202ABB +:100700002028726570656174202F2074696D655FA3 +:10071000746F5F6D6178290A003F004D3E200043F1 +:100720003E20004C25640A000A092D20436F6E7399 +:100730006F6C65202D0A4553432F713A0971756915 +:10074000740A6D3A096D6F7573656B65790A000AF5 +:10075000092D204D61676963202D0A643A0964659B +:100760006275670A783A096465627567206D61741D +:100770007269780A6B3A096465627567206B6579FE +:10078000626F6172640A6D3A096465627567206D13 +:100790006F7573650A763A0976657273696F6E0ACA +:1007A000733A097374617475730A633A09636F6EFF +:1007B000736F6C65206D6F64650A302D343A096C77 +:1007C00061796572302D34284631302D4634290A3E +:1007D000506175733A09626F6F746C6F6164657212 +:1007E0000A003F0074696D65725F7265616433323F +:1007F00028293A202530346C580A006B6579626FDD +:100800006172645F69646C653A2025580A006B6503 +:1008100079626F6172645F70726F746F636F6C3A4C +:100820002025580A00686F73745F6B6579626F6189 +:1008300072645F6C65647328293A2025580A000A9F +:10084000092D20537461747573202D0A00474343AA +:100850003A20342E392E32204156522D4C494243F3 +:100860003A20312E382E3073766E204156525F4139 +:100870005243483A2061767233350A004F5054494A +:100880004F4E533A204C554641204D4F5553454B02 +:1008900045592045585452414B455920434F4E53DA +:1008A0004F4C4520434F4D4D414E44204B45594DF3 +:1008B00041505F53454354494F4E20343039360A36 +:1008C000004255494C443A20383030653963612D37 +:1008D0006469727479202831303A35303A353220E3 +:1008E0005365702033302032303136290A005649A2 +:1008F000443A2030784645454428742E6D2E6B2EA0 +:1009000029205049443A203078343730372849423A +:100910004D2034373034206B6579626F617264200A +:10092000636F6E76657274657229205645523A205F +:100930003078303030310A00444553433A20636FF9 +:100940006E766572742049424D2034373034206B06 +:100950006579626F61726420746F205553420A009A +:100960000A092D2056657273696F6E202D0A000AE0 +:100970006D6F7573653A206F66660A000A6D6F7554 +:1009800073653A206F6E0A000A6B6579626F617257 +:10099000643A206F66660A000A6B6579626F61725D +:1009A000643A206F6E0A000A6D61747269783A20A9 +:1009B0006F66660A000A6D61747269783A206F6E1C +:1009C0000A000A64656275673A206F6E0A000A645D +:1009D000656275673A206F66660A000A0A626F6F81 +:1009E000746C6F616465722E2E2E2000433E2000D1 +:1009F00011241FBECFEFD4E0DEBFCDBF04B603FE8F +:100A000027C08091F7019091F801A091F901B09170 +:100A1000FA018730904BA740B04BD1F41092F70108 +:100A20001092F8011092F9011092FA0114BE84B7E5 +:100A3000877F84BF0FB6F894A89580916000886185 +:100A400080936000109260000FBEE0E0F8E309952B +:100A500011E0A0E0B1E0EAEFF9E402C005900D92E8 +:100A6000A233B107D9F721E0A2E3B1E001C01D92A2 +:100A7000A73FB207E1F70E94290B0C94FB240C94CA +:100A80000000FF93EF93E0913201F0913301309732 +:100A900009F00995EF91FF910895FC01859180304F +:100AA00011F0EFDFFBCF0895FF27E0E230E247FFD0 +:100AB0000CC0419597FF09C0EDE260957095809557 +:100AC0009095611D711D811D911D27FF02C021950B +:100AD00030E350E2AA27660F771F881F991FAA1FCD +:100AE000A41710F0A41B63955A95A9F7AA3008F033 +:100AF000A95FA05DAF93F39561157105810591051F +:100B000041F7ED3211F4EF93F395F21718F43F9398 +:100B1000F395FBCF8F91B5DFFA95E1F70895E99151 +:100B2000F9918591803021F0853219F0AADFF9CF53 +:100B3000089520E0E89455915532C1F3503311F4F3 +:100B4000689455915A3348F4505390F3220F022E73 +:100B5000220F220F200D250FF4CF0EF4219589913D +:100B60009991533619F3533729F1533559F1BC0193 +:100B700088279927E8945C3621F4899199916894A3 +:100B80005591543639F446EF7EF077FF0DC08FEF64 +:100B90009FEF0AC055374AE039F0583540E121F05F +:100BA000523642E009F00895FF93EF937DDFEF9115 +:100BB000FF91B7CFFF93EF93FC0181918030B9F3A0 +:100BC00060DFFBCFFF93EF9368DFF1CFDF93CF932D +:100BD000CDB7DEB72596A3DFCF91DF9108950C94B2 +:100BE0005307FF920F931F93CF93DF938091D90107 +:100BF00081608093D90180E991E00E944D05E4E392 +:100C0000F1E080E18E0F11928E13FDCF2FEF87EA76 +:100C100091E6215080409040E1F700C000000E9422 +:100C200028081F928F938DE791E09F938F930E94E6 +:100C3000E6058EE691E00E944D050F900F900F9013 +:100C40000F908CEF0E946207882339F08FE39CE9B4 +:100C50000197F1F700C00000F4CFC0E0D0E001E65A +:100C600011E08C2F8068F82E8F2D0E946207882358 +:100C700039F08FE39CE90197F1F700C00000F4CF51 +:100C80008FE19EE40197F1F700C000000E94280860 +:100C90001F928F93DF93CF931F930F930E94E605CC +:100CA00021960F900F900F900F900F900F90CF37CD +:100CB000D105B9F68FEF0E946207882339F08FE3E0 +:100CC0009CE90197F1F700C00000F4CF8CE591E0BA +:100CD000DF91CF911F910F91FF900C944D05CF9311 +:100CE000DF930E9428088F3F11F480E05BC0982FAB +:100CF0009F779C37A0F01F928F938FE491E09F9392 +:100D00008F930E94E6050F900F900F900F90E4E3F1 +:100D1000F1E080E18E0F11928E13FDCFE6CF90911E +:100D2000D901C82FC695C695C695D82FD77087FF0D +:100D30001CC090FF0CC01F928F9389E491E09F9399 +:100D40008F930E94E6050F900F900F900F90EC2F5D +:100D5000EF70F0E0EC5CFE4F81E090E001C0880FA6 +:100D6000DA95EAF79081892B1BC090FF0CC01F9287 +:100D70008F9383E491E09F938F930E94E6050F90F9 +:100D80000F900F900F90EC2FF0E0EC5CFE4F81E0A5 +:100D900090E001C0880FDA95EAF780959081892369 +:100DA000808381E0DF91CF910895E82FF0E0EC5C43 +:100DB000FE4F80810895EF92FF920F931F93CF9380 +:100DC000DF9384E391E00E944D0584E3E82E81E007 +:100DD000F82EC0E0D0E008E211E0F70181917F0138 +:100DE0000E948C1B1F928F93DF93CF931F930F93BF +:100DF0000E94E60521960F900F900F900F900F9094 +:100E00000F90C031D10549F7DF91CF911F910F911C +:100E1000FF90EF90089508959FB7F89420914801AE +:100E200080914901821761F030E0F901E65BFE4FE5 +:100E300080812F5F3F4F2F7133272093480101C0DE +:100E400080E09FBF08955198599A08955898509AF4 +:100E500008955098589A08955198599A85E08A951E +:100E6000F1F7000089B18695817008955098589ADD +:100E700085E08A95F1F7000089B181700895CF93DC +:100E8000DF93C4E6D0E00E942C07811108C02097B0 +:100E900031F085E08A95F1F700002197F4CFCE017B +:100EA000DF91CF9108950E9423070E942607E9E66B +:100EB000F0E080818C608083E19AE99A0E942307A8 +:100EC0000C942907BF92CF92DF92EF92FF920F937B +:100ED0001F93CF93DF93C82E10924701E9980E9489 +:100EE00023070E9429075998519A0CE211E00E94A9 +:100EF000360781110AC00115110549F085E08A9570 +:100F0000F1F7000001501109F2CF012B11F480E339 +:100F100073C000E010E0D1E0D12CBB24B394C02F0B +:100F20000E943F07892B11F4C05C24C0C601002E2B +:100F300002C0959587950A94E2F780FF04C0DB25EF +:100F40000E94290702C00E94260784E6E82EF12CA1 +:100F50000E942C07882359F0E114F10451F085E038 +:100F60008A95F1F7000081E0E81AF108F1CFEF2847 +:100F700021F4C85BC09347014AC00F5F1F4F083080 +:100F8000110569F60E943F07892B11F484E334C0F0 +:100F9000DD2329F00E94290704E610E00CC00E941E +:100FA0002607FACF0115110561F085E08A95F1F762 +:100FB0000000015011090E942C078111F3CF012B71 +:100FC00011F485E319C00E943F07892BF9F20E94B2 +:100FD000290704E610E00E943607882351F0011526 +:100FE000110549F085E08A95F1F7000001501109DB +:100FF000F2CF012B21F486E38093470108C00E94C1 +:1010000023070E942907E19AE99A80E017C00E940D +:1010100023070E94290780914701813360F01F92C6 +:101020008F938CEB91E09F938F930E94E6050F9036 +:101030000F900F900F90E19AE99A8FEFDF91CF9187 +:101040001F910F91FF90EF90DF90CF90BF90089588 +:101050002FB7F89490914901809148012FBF9813C0 +:101060000C940C078FEF08951F920F920FB60F92FA +:1010700011242F933F934F935F936F937F938F939D +:101080009F93AF93BF93CF93DF93EF93FF93109210 +:101090004701809146018830F1F030F0893009F045 +:1010A0005CC0C4E6D0E02EC0809145018695809357 +:1010B00045010E943607882309F449C08091450103 +:1010C00080688093450181E090914401911180E016 +:1010D000809344013CC00E943607882339F081E0A8 +:1010E00090914401911180E08093440180914401EA +:1010F000882399F12CC0209781F185E08A95F1F73A +:10110000000021970E9436078111F5CFCD2B29F1E0 +:1011100040914501CFB7F8948091490190E09C013E +:101120002F5F3F4F2F71332750914801521739F0ED +:10113000FC01E65BFE4F40832093490104C084EA32 +:1011400091E00E944D05CFBF109247012AC08091C7 +:1011500046018F5F809346012AC0809146018093AB +:1011600047018EEF0E946207882339F08FE99FE0E4 +:101170000197F1F700C00000F4CF809145011F9264 +:101180008F93809146011F928F9380EB91E09F9304 +:101190008F930E94E6050F900F900F900F900F9085 +:1011A0000F90109246011092450110924401FF9158 +:1011B000EF91DF91CF91BF91AF919F918F917F91EF +:1011C0006F915F914F913F912F910F900FBE0F90B4 +:1011D0001F9018958091750108959FB7F89410920B +:1011E0006C019FBF9091EE01943009F057C090912F +:1011F000E9009F703091EC00232F217030FD20E832 +:10120000922B24E02093E9002091EB0020FF43C0C3 +:101210002091EE0027FF3FC020916A01222321F098 +:101220002091E80025FF37C010926A0126E0309136 +:10123000E80035FD15C03091EE01343061F5309194 +:10124000EB0035FD28C0215021F481E080936A0134 +:1012500022C0EFE9FFE03197F1F700C00000E7CFCF +:101260008093F1008091E80085FD0AC08091E8003C +:1012700080FFFCCF8091E8008E778093E80006C065 +:101280008FB7F89421E020936C018FBF9F709093EB +:10129000E90080E008959F709093E9008FEF089532 +:1012A000CF93DF9300D01F92CDB7DEB79C01809122 +:1012B000EE01843019F593E099833B832A83909360 +:1012C000E9008FEF9091E800815095FD06C095ED03 +:1012D0009A95F1F700008111F5CF8091E80085FF24 +:1012E0000DC040E050E063E070E0CE0101960E9446 +:1012F000EA0B8091E8008E778093E8000F900F90C2 +:101300000F90DF91CF910895CF93DF9300D01F927C +:10131000CDB7DEB72091EE01243021F522E02983FC +:101320009B838A8383E08093E9008FEF9091E800AC +:10133000815095FD06C095ED9A95F1F70000811159 +:10134000F5CF8091E80085FF0DC040E050E063E0FC +:1013500070E0CE0101960E94EA0B8091E8008E7742 +:101360008093E8000F900F900F90DF91CF91089538 +:101370002091EE012430F1F422E02093E9002FEFD8 +:101380003091E800215035FD06C035ED3A95F1F772 +:1013900000002111F5CF2091E80025FF0BC040E0AF +:1013A00050E065E070E00E94EA0B8091E8008E77E3 +:1013B0008093E8000895CF93DF932091EE012430CD +:1013C00039F521E02093E9002FEF3091E80021501A +:1013D00035FD06C035ED3A95F1F700002111F5CF46 +:1013E0002091E80025FF14C0EC0140E050E068E0E7 +:1013F00070E00E94EA0B8091E8008E778093E8000D +:1014000088E0FE01ADE6B1E001900D928A95E1F72A +:10141000DF91CF91089582EF91E00C944D052091DA +:101420006B012F5F822F62E30E94C124992319F080 +:1014300020936B01089510926B0180916C018823B9 +:1014400071F18091EE01843041F58091E9008F7057 +:101450002091EC00922F917020FD90E8892B94E070 +:101460009093E9009091EB0090FF14C09091EE00F2 +:1014700097FF10C09091E80095FF03C01092F10013 +:10148000F9CF9091E80090FF05C09091E8009E7719 +:101490009093E8008F708093E90010926C0108959A +:1014A00042E061EC81E00E94F30C42E061EC82E0FA +:1014B0000E94F30C42E061EC83E00E94F30C42E2F4 +:1014C00061EC84E00C94F30C8091F001833009F41A +:1014D00053C030F4813071F0823009F48CC008952B +:1014E0008A3009F478C08B3009F45EC0893009F085 +:1014F0009AC020C08091EF01813A09F094C0809198 +:10150000E800877F8093E8008091F3019091F401D7 +:10151000892B21F468E08DE691E003C060E080E073 +:1015200090E070E00E94350C8091E8008B7780930A +:10153000E80008958091EF01813209F074C0809134 +:10154000F3019091F401892B09F06DC08091E800BE +:10155000877F8093E8008091E80082FD05C080913C +:10156000EE018111F8CF5FC08091F1008093750189 +:101570008091E8008B7753C08091EF01813A09F0A8 +:1015800052C08091F3019091F401892B09F04BC076 +:101590008091E800877F8093E8008091E80080FFD9 +:1015A000FCCF80910A0136C08091EF018132D9F5DC +:1015B0008091F3019091F401892BA9F58091E800C5 +:1015C000877F8093E8000E94280D8091F10180932D +:1015D0000A010C94B0158091EF01813221F58091C0 +:1015E000E800877F8093E8000E94280D8091F20137 +:1015F0008093760108958091EF01813AA1F4809162 +:10160000E800877F8093E8008091E80080FFFCCFAE +:10161000809176018093F1008091E8008E7780932D +:10162000E8000C94280D08950895089508958EEE0D +:1016300091E00E944D050C94160B0E94B21B809104 +:10164000EC01882329F00E94DD1B81110C94D40B3E +:10165000089584B7877F84BF0FB6F894A8958091CA +:101660006000886180936000109260000FBE90E07F +:1016700080E80FB6F89480936100909361000FBEEC +:101680000E94140B0E94B1100E94790D0E94CC0D93 +:101690008091E20084608093E2008DEE98E00E94E9 +:1016A000871B78948091EE018430E1F789ED91E019 +:1016B0000E944D050E94B31080E091E00E9420102E +:1016C00088EC91E00E944D050E94150B8091EE017F +:1016D000853039F484EC91E00E944D050E941D0B89 +:1016E000F5CF0E94B710F2CF0C94F11B8AEE91E077 +:1016F0000E944D050C94740B292F3327233031059C +:10170000C9F064F42130310581F02230310509F04F +:1017100043C084E790E024E432E042C02132310546 +:10172000F1F02232310541F137C082E190E028EB3F +:1017300032E036C099278130910541F08230910521 +:1017400041F0892B49F5E0E4F2E005C0E0E3F2E086 +:1017500002C0E6EFF1E0849190E09F0121C0643087 +:10176000D8F4E62FF0E0EE0FFF1FE15EFE4F208180 +:10177000318189E090E014C0643070F470E0FB01C6 +:10178000EE0FFF1FE95EFE4F20813181FB01ED5E10 +:10179000FE4F808190E004C080E090E020E030E0E7 +:1017A000FA0131832083089584E089BD86E089BDF4 +:1017B00009B400FEFDCF8091D8008F7D8093D800C2 +:1017C0008091E00082608093E0008091E00081FDE4 +:1017D000FCCF0895CF92DF92EF92FF920F931F9369 +:1017E000CF93DF93EC018B016A010E94470D8111B9 +:1017F00033C0C114D10439F0F60180819181081BF6 +:10180000190BC80FD91FE12CF12C0115110519F185 +:101810008091E80085FD16C08091E8008E77809366 +:10182000E800C114D10449F0F60180819181E80EED +:10183000F91EF182E08285E00FC00E94470D8823E7 +:1018400021F30AC089918093F10001501109FFEF43 +:10185000EF1AFF0ADACF80E0DF91CF911F910F914D +:10186000FF90EF90DF90CF9008952091F501309197 +:10187000F6012617370748F06115710539F42091F4 +:10188000E8002E772093E80001C0B90140E061151F +:10189000710591F12091EE01222309F440C0253019 +:1018A00009F43FC02091E80023FD3DC02091E800ED +:1018B00022FD2FC02091E80020FFE9CF2091F20007 +:1018C00030E0FC01CF016115710559F02830310578 +:1018D00040F481918093F100615071092F5F3F4F77 +:1018E000F1CF41E02830310509F040E02091E800D7 +:1018F0002E772093E800CBCF4111CCCF0AC0809146 +:10190000EE01882361F0853061F08091E80083FD6D +:101910000AC08091E80082FFF2CF80E0089582E063 +:10192000089583E0089581E008952091F5013091B4 +:10193000F6012617370748F06115710539F4209133 +:10194000E8002E772093E80001C0B901FC0120E0F7 +:101950006115710579F18091EE01882309F43DC08C +:10196000853009F43CC08091E80083FD3AC0809145 +:10197000E80082FD2CC08091E80080FFE9CF8091D3 +:10198000F20090E06115710559F08830910540F43E +:1019900024912093F1003196615071090196F2CFA4 +:1019A00021E0089709F020E08091E8008E7780938D +:1019B000E800CECF2111CFCF0AC08091EE0188235D +:1019C00061F0853061F08091E80083FD0AC080916C +:1019D000E80082FFF2CF80E0089582E0089583E07E +:1019E000089581E00895982F953058F59093E90077 +:1019F000981739F07091EC002091ED005091F000B3 +:101A000003C0242F762F50E021FF19C03091EB0046 +:101A10003E7F3093EB003091ED003D7F3093ED0041 +:101A20003091EB0031603093EB007093EC00209329 +:101A3000ED005093F0002091EE0027FF07C09F5F5C +:101A4000D3CF8F708093E90081E0089580E00895FE +:101A50008091EF0187FF11C08091E80082FD05C0F1 +:101A60008091EE018111F8CF11C08091E8008B7751 +:101A70000BC08091EE01882349F08091E80080FF3F +:101A8000F8CF8091E8008E778093E8000895209148 +:101A9000E4003091E50095E64091EC00842F8170E0 +:101AA00040FF22C08091E80080FD1CC08091EE01C3 +:101AB000882391F0853091F08091EB0085FD10C076 +:101AC0004091E4005091E5004217530729F39A0131 +:101AD000915011F784E0089582E0089583E008951D +:101AE00081E0089580E008954091E80042FFDECF54 +:101AF00008950E94D60D0E94D90DE0EEF0E080819D +:101B000081608083E8EDF0E080818F77808319BC6D +:101B1000E3E6F0E08081816080831092ED0108951A +:101B20000E94D60D0E94D90D8091D8008F778093A6 +:101B3000D8008091D80080688093D8008091D80028 +:101B40008F7D8093D80084E089BD86E089BD09B48B +:101B500000FEFDCF1092EE011092EA011092EC010E +:101B60001092EB0142E060E080E00E94F30C809173 +:101B7000E1008E7F8093E1008091E200816080939C +:101B8000E2008091E20088608093E2008091E000B2 +:101B90008E7F8093E0000895E3E6F0E080818E7F01 +:101BA000808381E08093ED010C94900D1092E2000F +:101BB00008951092E10008951F920F920FB60F92B0 +:101BC00011242F933F934F935F936F937F938F9342 +:101BD0009F93AF93BF93EF93FF938091E10082FFB8 +:101BE0000BC08091E20082FF07C08091E1008B7FF3 +:101BF0008093E1000E940F0A8091E10080FF19C0EC +:101C00008091E20080FF15C08091E2008E7F80937A +:101C1000E2008091E20080618093E2008091D80030 +:101C200080628093D80019BC85E08093EE010E9409 +:101C3000170B8091E10084FF30C08091E20084FFA7 +:101C40002CC084E089BD86E089BD09B400FEFDCFCB +:101C50008091D8008F7D8093D8008091E1008F7EA5 +:101C60008093E1008091E2008F7E8093E20080917A +:101C7000E20081608093E2008091EA01882311F004 +:101C800084E007C08091E30087FD02C081E001C0CD +:101C900083E08093EE010E94760B8091E10083FF48 +:101CA00029C08091E20083FF25C08091E100877FF9 +:101CB0008093E10082E08093EE011092EA0180912E +:101CC000E1008E7F8093E1008091E2008E7F80931F +:101CD000E2008091E20080618093E20042E060E0F7 +:101CE00080E00E94F30C8091F00088608093F00007 +:101CF0000E940B0AFF91EF91BF91AF919F918F913D +:101D00007F916F915F914F913F912F910F900FBEF7 +:101D10000F901F9018951F920F920FB60F921124DB +:101D20002F933F934F935F936F937F938F939F93E3 +:101D3000AF93BF93CF93DF93EF93FF93C091E900ED +:101D4000CF708091EC00D82FD17080FDD0E8109238 +:101D5000E9008091F000877F8093F00078940E94E2 +:101D6000CF0E1092E9008091F00088608093F0001F +:101D7000CD2BCF70C093E900FF91EF91DF91CF9110 +:101D8000BF91AF919F918F917F916F915F914F9193 +:101D90003F912F910F900FBE0F901F9018951F939A +:101DA000CF93DF93CDB7DEB7AA970FB6F894DEBF17 +:101DB0000FBECDBFEFEEF1E088E08E0F9091F10005 +:101DC00091938E13FBCF0E94640A8091E80083FFF9 +:101DD0001FC18091EF019091F001492F50E04A30EE +:101DE000510508F015C1FA01E65CFF4F0C94E1249F +:101DF000803881F0823809F00BC18091F3018F7037 +:101E00008093E9008091EB0085FB882780F9109290 +:101E1000E90006C08091EB019091EC019111826084 +:101E20009091E800977F9093E8008093F1001092E2 +:101E3000F100C8C0282F2D7F09F0EAC0882319F0CF +:101E4000823061F0E5C08091F101813009F0E0C09D +:101E5000933009F080E08093EC012BC08091F10178 +:101E6000811127C08091F3018F7009F4D1C0809354 +:101E7000E9002091EB0020FF1CC0933021F48091F9 +:101E8000EB00806214C09091EB0090619093EB00A6 +:101E900021E030E0A90102C0440F551F8A95E2F706 +:101EA0004093EA001092EA008091EB0088608093F2 +:101EB000EB001092E9008091E800877F86C08111D5 +:101EC000A7C01091F1011F778091E3008078812BEA +:101ED0008093E3008091E800877F8093E8000E9470 +:101EE000280D8091E80080FFFCCF8091E30080689E +:101EF0008093E300111102C082E001C083E080936F +:101F0000EE0186C08058823008F082C08091F101D5 +:101F10009091F2018C3D53E0950779F583E08A8337 +:101F20008AE289834FB7F894DE01139620E03EE001 +:101F300051E2E32FF0E050935700E49120FF03C0FB +:101F4000E295EF703F5FEF708E2F90E0EA3010F077 +:101F5000C79601C0C0968D939D932F5F243149F79A +:101F60004FBF8091E800877F8093E8006AE270E0CD +:101F7000CE0101960E94350C14C0AE014F5F5F4F39 +:101F80006091F3010E947C0BBC01892B09F440C0D5 +:101F90009091E800977F9093E80089819A810E9450 +:101FA000950C8091E8008B778093E80031C08038F1 +:101FB00079F58091E800877F8093E8008091EA01BD +:101FC0008093F1008091E8008E778093E8000E9472 +:101FD000280D1EC081111CC09091F1019230C0F4F7 +:101FE0008091E800877F8093E8009093EA010E9447 +:101FF000280D8091EA01811106C08091E30087FDE0 +:1020000002C081E001C084E08093EE010E94500A8A +:102010008091E80083FF0AC08091E800877F809369 +:10202000E8008091EB0080628093EB00AA960FB6E7 +:10203000F894DEBF0FBECDBFDF91CF911F91089501 +:1020400090937C0180937B010895E0917B01F09156 +:102050007C01309721F00190F081E02D099480E01F +:102060000895EF92FF920F931F93CF93DF93E09128 +:102070007B01F0917C013097B1F18C010280F381FA +:10208000E02D09958091D90182FF2DC080FF04C009 +:1020900087EB93E00E944D05E80118E081EBE82E04 +:1020A00083E0F82E8091D90180FF0BC088811F92B8 +:1020B0008F93FF92EF920E94E6050F900F900F9082 +:1020C0000F90115021961111EDCF8091D90180FF11 +:1020D0000AC08FEA93E0DF91CF911F910F91FF909B +:1020E000EF900C944D05DF91CF911F910F91FF90D0 +:1020F000EF900895E0917B01F0917C01309721F001 +:102100000480F581E02D09940895209179013091A2 +:102110007A018217930771F090937A018093790185 +:10212000E0917B01F0917C01309721F00680F781EE +:10213000E02D09940895209177013091780182175C +:10214000930771F09093780180937701E0917B0180 +:10215000F0917C01309721F00084F185E02D099405 +:1021600008950C94EF050E941C1C0C94F105CF926D +:10217000DF92EF92FF920F931F93CF93DF9300D0E4 +:1021800000D000D0CDB7DEB70E946F068EE7C82E14 +:1021900081E0D82E00E010E0E02E802F0E94D506CE +:1021A000F60141916F01F42EF826B1F40F5F1F4F35 +:1021B0000031110589F78FEF89838A831B820E9482 +:1021C000251C8160782F9D838C8349815A816B8186 +:1021D0008D810E94761147C09091D90191FF04C072 +:1021E0008E830E94DB068E8120E030E04F2D50E090 +:1021F000922FBA01022E02C0759567950A94E2F7F4 +:1022000060FF2BC02983EA8221E030E0690102C02F +:10221000CC0CDD1C9A95E2F790E08C219D21892B56 +:1022200009F420E02B830E94251C8160782F9D8378 +:102230008C8349815A816B818D810E9476114981FD +:102240005A816B817C818D810E949F1BF801E2582D +:10225000FE4F8081C826C08206C02F5F3F4F2830C6 +:10226000310531F6A3CF0E949E1B0E94F21E1091F1 +:102270007D010E942510181741F10E9425108093BE +:102280007D019091D90192FF0EC090FF0CC01F926A +:102290008F9389EC93E09F938F930E94E6050F90B4 +:1022A0000F900F900F9080917D0126960FB6F894B5 +:1022B000DEBF0FBECDBFDF91CF911F910F91FF9079 +:1022C000EF90DF90CF900C94B01B26960FB6F89449 +:1022D000DEBF0FBECDBFDF91CF911F910F91FF9059 +:1022E000EF90DF90CF9008950C940B07CF93DF937E +:1022F000CDB7DEB72B970FB6F894DEBF0FBECDBFBC +:10230000942F4F83252F588769877A878B874A8533 +:102310005B85452B21F02F3F09F59F3FF9F4DE0146 +:10232000119686E0FD0111928A95E9F785E0FE019C +:10233000379601900D928A95E1F749815A816B8118 +:102340007C818D819E810E9459182B960FB6F8943E +:10235000DEBF0FBECDBFDF91CF9108954F8158856D +:1023600069857A858B850E949F1BD9CFCF9388235F +:1023700009F4A4C0C82F8CEF8C0F813A48F48C2F3D +:102380000E941E2281119AC08C2F0E94E81A0CC054 +:1023900080E28C0F883058F4C77081E001C0880F4C +:1023A000CA95EAF70E94271BCF910C94611B8BE51D +:1023B0008C0F833078F4C53A29F0C63A31F083E8BF +:1023C00090E005C081E890E002C082E890E0CF9103 +:1023D0000C94851088E58C0F853108F06FC0C83AE1 +:1023E00061F1C93A69F1CA3A71F1CB3A79F1CC3A63 +:1023F00081F1CD3A89F1CE3A91F1CF3A99F1C13BD1 +:10240000A1F1C03BA9F1C23BB1F1C33BB9F1C43B5F +:10241000C1F1C53BC9F1C63BD1F1C73BD9F1C83BBE +:10242000E1F1C93BE9F1CA3BF1F1CB3BF9F1CC3B1E +:1024300009F43FC080E090E03EC082EE90E03BC0F7 +:1024400089EE90E038C08AEE90E035C085EB90E0F0 +:1024500032C086EB90E02FC083EB90E02CC084EB81 +:1024600090E029C087EB90E026C08CEC90E023C080 +:102470008DEC90E020C083E891E01DC08AE891E0F7 +:102480001AC082E991E017C084E991E014C081E2AA +:1024900092E011C083E292E00EC084E292E00BC0B1 +:1024A00085E292E008C086E292E005C087E292E011 +:1024B00002C08AE292E0CF910C949B10CF910895D4 +:1024C000882329F19CEF980F913A18F40E94051B7C +:1024D0000DC090E2980F983058F4877091E001C0D9 +:1024E000990F8A95EAF7892F0E942D1B0C94611B86 +:1024F0009BE5980F933020F480E090E00C948510D9 +:10250000885A853120F480E090E00C949B10089567 +:10251000882321F00E94271B0C94611B08958823B7 +:1025200021F00E942D1B0C94611B0895CF92DF9225 +:10253000EF92FF920F931F93CF93DF9300D000D0C1 +:1025400000D0CDB7DEB725E0FC01DE011196019089 +:102550000D922A95E1F7FC0140813181F2802581BD +:1025600022952F7063817481672B09F4D8C23F3F95 +:1025700019F44F3F09F4D3C26C0149833A8389812E +:102580009A812E830E94A71A182F092F0E94A61A3B +:102590000E94B619E02FE295EF70F0E0EC5BFF4F80 +:1025A0002E810C94E124802F807F902F9F70092F23 +:1025B000882311F00295007FFF2049F0002309F4E1 +:1025C0005FC2802F0E943A1B0E94611B59C2812F5B +:1025D0000E946012002309F4A2C2802F0E94401BB7 +:1025E00026960FB6F894DEBF0FBECDBFDF91CF9118 +:1025F0001F910F91FF90EF90DF90CF900C94611B93 +:10260000802F807F902F9F70092F803211F00295CC +:10261000007F112319F0113001F129C0FF20A9F02A +:10262000802F222349F1213039F526960FB6F894F0 +:10263000DEBF0FBECDBFDF91CF911F910F91FF90F5 +:10264000EF90DF90CF900C944A1B222319F0213099 +:1026500009F465C20E944D1B2CC0FF20E9F0263012 +:1026600008F05DC20E94241B802329F022C0FF20B5 +:10267000F1F0211115C0802F26960FB6F894DEBF19 +:102680000FBECDBFDF91CF911F910F91FF90EF90C3 +:10269000DF90CF900C948812253008F040C209C01A +:1026A000F601858180FFECC18F708583E4CF211115 +:1026B000FBC1802F69C1202F26952695237030E01D +:1026C0002115310521F021303105C9F028C2FF2044 +:1026D00021F0812F902F937002C080E090E0269629 +:1026E0000FB6F894DEBF0FBECDBFDF91CF911F9123 +:1026F0000F91FF90EF90DF90CF900C948510FF200A +:1027000021F0812F902F937002C080E090E02696F8 +:102710000FB6F894DEBF0FBECDBFDF91CF911F91F2 +:102720000F91FF90EF90DF90CF900C949B10812F32 +:10273000FF2019F00E94781D02C00E94E01D26961D +:102740000FB6F894DEBF0FBECDBFDF91CF911F91C2 +:102750000F91FF90EF90DF90CF900C94651E802F2B +:10276000837009F078C0F110DAC1812F82958695C7 +:102770008770880F880F912F9F70C92ED12CE12C64 +:10278000F12C082E04C0CC0CDD1CEE1CFF1C0A949E +:10279000D2F714FF12C04FE050E060E070E004C0D8 +:1027A000440F551F661F771F8A95D2F7CB01BA01D8 +:1027B000609570958095909503C060E070E0CB01C6 +:1027C000202F269526952370422F50E04230510548 +:1027D000D1F04330510559F16C297D298E299F296B +:1027E0004130510541F126960FB6F894DEBF0FBE79 +:1027F000CDBFDF91CF911F910F91FF90EF90DF90B0 +:10280000CF900C94CB196C297D298E299F2926966F +:102810000FB6F894DEBF0FBECDBFDF91CF911F91F1 +:102820000F91FF90EF90DF90CF900C94DD190E94F4 +:10283000CB19C701B60126960FB6F894DEBF0FBEBE +:10284000CDBFDF91CF911F910F91FF90EF90DF905F +:10285000CF900C94B919FF2019F0802F817001C01E +:102860008695882309F45BC1812F829586958770B0 +:10287000880F880F912F9F70C92ED12CE12CF12C3D +:10288000082E04C0CC0CDD1CEE1CFF1C0A94D2F7F1 +:1028900014FF12C04FE050E060E070E004C0440F4D +:1028A000551F661F771F8A95D2F7CB01BA01609535 +:1028B00070958095909503C060E070E0CB01202F6B +:1028C000269526952370422F50E042305105D1F0D5 +:1028D0004330510559F16C297D298E299F294130BA +:1028E000510541F126960FB6F894DEBF0FBECDBF5D +:1028F000DF91CF911F910F91FF90EF90DF90CF90DC +:102900000C94821A6C297D298E299F2926960FB650 +:10291000F894DEBF0FBECDBFDF91CF911F910F9115 +:10292000FF90EF90DF90CF900C94941A0E94821A3F +:10293000C701B60126960FB6F894DEBF0FBECDBF15 +:10294000DF91CF911F910F91FF90EF90DF90CF908B +:102950000C94701A103F41F118F4103E48F48BC0EB +:10296000123F09F450C0D8F1133F09F460C083C08E +:102970001F70802F8F71FF2021F00E94091A812F74 +:102980007BCE0E942A1A812F26960FB6F894DEBFBE +:102990000FBECDBFDF91CF911F910F91FF90EF90B0 +:1029A000DF90CF900C948F12FF20A9F0253008F013 +:1029B000B6C0802F8F7126960FB6F894DEBF0FBE7B +:1029C000CDBFDF91CF911F910F91FF90EF90DF90DE +:1029D000CF900C944F1A263008F0A1C0EACFFF2008 +:1029E000A1F0802F8F7126960FB6F894DEBF0FBE30 +:1029F000CDBFDF91CF911F910F91FF90EF90DF90AE +:102A0000CF900C94091AFF2061F3802F8F712696C6 +:102A10000FB6F894DEBF0FBECDBFDF91CF911F91EF +:102A20000F91FF90EF90DF90CF900C942A1AFF2027 +:102A300091F0802F8F7126960FB6F894DEBF0FBEEF +:102A4000CDBFDF91CF911F910F91FF90EF90DF905D +:102A5000CF900C94F41926960FB6F894DEBF0FBEF3 +:102A6000CDBFDF91CF911F910F91FF90EF90DF903D +:102A7000CF900C94EF19FF20A1F0222309F4B1CFDD +:102A8000812F26960FB6F894DEBF0FBECDBFDF9123 +:102A9000CF911F910F91FF90EF90DF90CF900C940A +:102AA000B611222309F4B1CF812F26960FB6F894E0 +:102AB000DEBF0FBECDBFDF91CF911F910F91FF9071 +:102AC000EF90DF90CF900C946012402F4F70612FE9 +:102AD000C6010E94EE1C26960FB6F894DEBF0FBE0C +:102AE000CDBFDF91CF911F910F91FF90EF90DF90BD +:102AF000CF900C940119402F4F70612FC60126967C +:102B00000FB6F894DEBF0FBECDBFDF91CF911F91FE +:102B10000F91FF90EF90DF90CF900C94F11C2696D0 +:102B20000FB6F894DEBF0FBECDBFDF91CF911F91DE +:102B30000F91FF90EF90DF90CF9008950E94471B78 +:102B40000E94161B0E94611B0E94991F0E94651E15 +:102B500080E090E00E94851080E090E00C949B1053 +:102B60000E94371B0C949E150E94A71A292F2295AC +:102B70002F7030E02C3031054CF42A3031056CF4E4 +:102B8000225031092230310588F407C02C3031053C +:102B900049F02F30310531F009C0803E48F0803FC8 +:102BA00029F406C093FB882780F9089580E00895F2 +:102BB00081E00895CF93DF9300D000D01F92CDB76E +:102BC000DEB70F900F900F900F900F90DF91CF9185 +:102BD0000895CF93DF9300D000D000D0CDB7DEB7FB +:102BE00026960FB6F894DEBF0FBECDBFDF91CF9112 +:102BF0000895CF93DF93C0918E0180918F01C81704 +:102C0000A1F0D0E0CE0166E070E00E94B024FC01AB +:102C1000E057FE4F408151816281738184819581AB +:102C20000E94E9152196C770E8CFDF91CF910895F2 +:102C30004091C0015091C1016091C2017091C301E6 +:102C40008091C4019091C5010C94E915CF93DF9355 +:102C50008091C50182958F7009F05CC08091C2019E +:102C6000882309F457C020918E01D0918F014091A3 +:102C7000C001C091C101E091C301F091C4012D17C1 +:102C800009F448C030E0309709F440C0CF3F11F458 +:102C90004F3FE1F1C90166E070E00E94B024DC0121 +:102CA000A057BE4F11968C911197C8132FC08C91CD +:102CB00048132CC012968C911297811127C013963D +:102CC0008D919C9114978E179F0708F401978E1B86 +:102CD0009F0B883C9105D0F48091C5018F70806175 +:102CE0008093C501C90166E070E00E94B024FC0138 +:102CF000EB56FE4F90819F709061908380EC91E045 +:102D00000E949612DF91CF910C94F9152F5F3F4FDF +:102D10002770B5CFDF91CF910895BF92CF92DF9208 +:102D2000EF92FF920F931F93CF93DF93CDB7DEB750 +:102D300061970FB6F894DEBF0FBECDBF8C0185E062 +:102D4000F801DE011D9601900D928A95E1F7D801F8 +:102D50004C9111962C9111971296EC901297139614 +:102D6000CD90DC9014975091C0016091C101809189 +:102D7000C3019091C401009709F46EC16F3F19F42B +:102D80005F3F09F469C1B090C201BB2009F4C3C020 +:102D90003091C501C816D90628F0F601E81BF90BD9 +:102DA000CF0104C0809590958C0D9D1DFF24F39458 +:102DB000883C910588F0F12C307F09F0CBC07C2D48 +:102DC000D98AC88A522F6E2D89890E94DA1580EC23 +:102DD00091E00E949612B4C0832F807F09F049C011 +:102DE000621314C0541312C0E11010C03F70306160 +:102DF0003093C5010E94181680EC91E00E94961253 +:102E00008091C501D80115968C9331C0CD2831F140 +:102E10002F3F11F44F3F11F1FE2CE1101FC0E09144 +:102E20008E0130918F01E31709F45CC0F0E0CF010F +:102E300066E070E00E94B024DC01A057BE4F1196FE +:102E40008C911197281307C08C91481304C01296D7 +:102E50008C91811103C03196E770E5CFFE2CEE20F6 +:102E600009F416C18091C50181608093C501F12CE0 +:102E70000FC1621308C0541306C0E11004C0809152 +:102E8000C501D801C1C04D872E878D859E850E94C2 +:102E9000B4158823E1F1EE20D1F12091C501822FF4 +:102EA00082958F7090E0029774F08091C0019091AC +:102EB000C10198878F831986DB86CA862C87CE014D +:102EC00007960E94961286E0F801A0ECB1E001900E +:102ED0000D928A95E1F70E9426160E941816FF248B +:102EE000F394D6C04D872E878D859E850E94A71AA4 +:102EF000292F22952F7030E0223031050CF0BCC014 +:102F00009F7009F0B6C0805E883008F4C1C0C80167 +:102F10000E949612E4CFC816D90608F453C0F601F1 +:102F2000E81BF90BCF01883C910508F450C0F12C47 +:102F30007C2DD98AC88A522F6E2D89890E94DA1574 +:102F4000E0ECF1E086E0DF011D928A95E9F70E944E +:102F500018169EC0621314C0541312C0E11010C0A2 +:102F60008091C501F8018583C8010E94961286E010 +:102F7000E0ECF1E0DF011D928A95E9F7FB2C88C0B7 +:102F80004D872E878D859E850E94B415882309F470 +:102F9000BECFEE2009F4BBCF2091C501822F8295D0 +:102FA0008F7090E002970CF48ECF8091C0019091C9 +:102FB000C1019A8389831B82DD82CC822E83CE015C +:102FC00001967FCF809590958C0D9D1DACCFFE2CEA +:102FD000EE2009F49CCF62132EC054132CC0209114 +:102FE000C50120FD1FC0822F82958F70D9F0D801B6 +:102FF00015962C9315978F3049F08F5F982F9295E7 +:10300000907F822F8F70892B15968C93C8010E9418 +:10301000961286E0F801A0ECB1E001900D928A953D +:10302000E1F795CF86E0F801A0ECB1E001900D92B8 +:103030008A95E1F72DC04D872E878D859E850E944C +:10304000B415811140CF8091C50181608093C50185 +:10305000C8010E9496121CC0EE2009F458CF4D877B +:103060002E878D859E850E94B415882309F44FCF45 +:103070002ACF811148CF0CC0243031050CF047CF46 +:103080009F7009F440CFF8019581907F09F03BCF04 +:103090008F2D61960FB6F894DEBF0FBECDBFDF91C6 +:1030A000CF911F910F91FF90EF90DF90CF90BF9045 +:1030B0000895CF93DF93CDB7DEB72C970FB6F89472 +:1030C000DEBF0FBECDBF4F83588769877A878B8756 +:1030D0009C87CE0107960E948D16882371F08F8100 +:1030E00098852A853B85232B09F43FC09F3F09F033 +:1030F00068C08F3F09F065C038C086E0FE01379692 +:10310000DE01119601900D928A95E1F76F81788525 +:10311000EA85FB85309749F17F3F11F46F3F29F134 +:1031200080918F0190E09C012F5F3F4F27703327E4 +:1031300040918E0150E02417350709F44BC0698394 +:103140007A83FD83EC8366E070E00E94B024DC01AA +:10315000A057BE4F96E0FE01319601900D929A95D0 +:10316000E1F720938F010E94F91580918E019091D3 +:103170008F018917E9F190E066E070E00E94B024C9 +:1031800080579E4F0E948D16882391F180918E0169 +:1031900090E066E070E00E94B024FC01E057FE4F32 +:1031A0004081518162817381848195810E94E915FA +:1031B00080918E0190E001968770992780938E010F +:1031C000D4CF4F81588569857A858B859C850E94EF +:1031D000E915CBCF0E94B01510928F0110928E018D +:1031E000E0ECF1E086E0DF011D928A95E9F7BDCFC2 +:1031F0002C960FB6F894DEBF0FBECDBFDF91CF91F6 +:103200000895DF92EF92FF920F931F93CF93DF9376 +:10321000FC01892B09F48AC0E12CF12CDD24D39424 +:10322000EF0121968491853709F461C058F4843701 +:1032300008F04EC0843008F06AC08130D1F082308E +:1032400071F174C0883709F45DC050F4863709F411 +:1032500055C0873709F06AC08E2D0E94341B54C0B8 +:103260009CE7980F903708F061C08F770E9460123A +:1032700050C08F010E5F1F4FFE01849190E2980FA6 +:10328000983050F48770FD2D01C0FF0F8A95EAF742 +:103290008F2F0E943A1B14C00E94B61113C08F01D9 +:1032A0000E5F1F4FFE01C49180E28C0F883060F4E6 +:1032B000C7708D2D01C0880FCA95EAF70E94401B88 +:1032C0000E94611BE80125C08C2F0E946012FACF7A +:1032D0009F012E5F3F4FFE01C491CC2369F08FE91F +:1032E0009FE00197F1F700C00000C150F6CF9F01A9 +:1032F0002E5F3F4FFE01F490E9010BC00E94241B9A +:10330000E82E07C00E94371B0E94611B02C00E946A +:10331000B6118F2D882341F0EFE9FFE03197F1F7E7 +:1033200000C000008150F6CFFE017ACFDF91CF912F +:103330001F910F91FF90EF90DF9008956093CA0165 +:103340007093CB018093CC019093CD010E94AE1B72 +:103350000C949E156093C6017093C7018093C801B9 +:103360009093C9010E94AF1B0C949E1508950C9474 +:103370009E190F931F930091CA011091CB012091C8 +:10338000CC013091CD01602B712B822B932B1F919F +:103390000F910C949E190F931F930091CA011091E5 +:1033A000CB012091CC013091CD0160237123822388 +:1033B00093231F910F910C949E190F931F930091CB +:1033C000CA011091CB012091CC013091CD01602731 +:1033D0007127822793271F910F910C949E1960E00B +:1033E00070E0CB010C94AA190F931F9341E050E0B9 +:1033F00060E070E08A019B0104C0000F111F221FD2 +:10340000331F8A95D2F7C901B8011F910F910C940F +:10341000AA190F931F9341E050E060E070E004C0F0 +:10342000440F551F661F771F8A95D2F78091C601FA +:103430009091C701A091C801B091C9018A019B0177 +:10344000082B192B2A2B3B2BC901B8011F910F9177 +:103450000C94AA190F931F9341E050E060E070E0D4 +:1034600004C0440F551F661F771F8A95D2F74095F9 +:103470005095609570958091C6019091C701A0917B +:10348000C801B091C9018A019B01082319232A238D +:103490003B23C901B8011F910F910C94AA190F93F6 +:1034A0001F9341E050E060E070E004C0440F551FFE +:1034B000661F771F8A95D2F78091C6019091C70148 +:1034C000A091C801B091C9018A019B010827192761 +:1034D0002A273B27C901B8011F910F910C94AA1903 +:1034E0000F931F930091C6011091C7012091C8014D +:1034F0003091C901602B712B822B932B1F910F915F +:103500000C94AA190F931F930091C6011091C70143 +:103510002091C8013091C901602371238223932334 +:103520001F910F910C94AA190F931F930091C6013C +:103530001091C7012091C8013091C90160277127FE +:10354000822793271F910F910C94AA190895CF9267 +:10355000DF92EF92FF920F931F93CF93DF938C0133 +:10356000C090CA01D090CB01E090CC01F090CD0189 +:103570004091C6015091C7016091C8017091C90185 +:10358000C42AD52AE62AF72ACFE1D0E0D701C6011E +:103590000C2E04C0B695A795979587950A94D2F7F7 +:1035A00080FF07C0B8018C2F0E94BF1C813091059D +:1035B00031F4219758F7B80180E00E94BF1CDF91D9 +:1035C000CF911F910F91FF90EF90DF90CF900895D2 +:1035D00020910B0130910C01F90132969FEF40E0F0 +:1035E0005191581789F09F3F19F4511101C0942F40 +:1035F0004F5F4630A9F79F3F39F0F901E90FF11D00 +:1036000097FDFA9582830895089520910B013091DA +:103610000C01F9013296285F3F4F9081981301C049 +:1036200010823196E217F307C1F7089581E090E028 +:10363000E0910B01F0910C01E80FF91F1082019647 +:1036400088309105A9F708958091D8010895909147 +:10365000D801892B8093D801089580959091D80145 +:1036600089238093D80108958093D80108951092FA +:10367000D80108959091D701892B8093D70108959F +:1036800080959091D70189238093D7010895109256 +:10369000D70108958093CE0108951092CE01089528 +:1036A00080910B0190910C01FC0131969C01285FE7 +:1036B0003F4F80E0919191118F5FE217F307D1F7AF +:1036C0000895E0910B01F0910C018091D801808365 +:1036D000E0910B01F0910C0190818091D701892B31 +:1036E00080838091CE01882361F0E0910B01F091FD +:1036F0000C019081892B80830E94501B81111092B4 +:10370000CE0180910B0190910C010C94311090939B +:1037100033018093320108958295982F9C7C292F44 +:1037200026952695982F9373990F990F922B892F91 +:103730008A7A86959575990F892B08950895CF9368 +:10374000DF9300D000D01F92CDB7DEB70F900F905F +:103750000F900F900F90DF91CF91089508950895E5 +:103760000C9474118091EE01843021F11092DA01F1 +:1037700020E488E190E00FB6F894A895809360006B +:103780000FBE2093600083B7817F846083BF83B7BF +:10379000816083BF7894889583B78E7F83BF0FB68F +:1037A000F894A895809160008861809360001092E1 +:1037B00060000FBE089508950895CF930E94DB1B0B +:1037C0000E946F060E94DC1BC0E08C2F0E94D50671 +:1037D000811104C0CF5FC031C1F701C081E0CF913A +:1037E00008950C94B0151F920F920FB60F921124EA +:1037F0008F939F93AF93BF938091DA01811113C090 +:103800008091DB019091DC01A091DD01B091DE019E +:103810004196A11DB11D8093DB019093DC01A09323 +:10382000DD01B093DE01BF91AF919F918F910F9019 +:103830000FBE0F901F90189582E084BD93E095BD58 +:103840009AEF97BD80936E0008952FB7F8948091FA +:10385000DB019091DC01A091DD01B091DE012FBF71 +:1038600008952FB7F8946091DB017091DC0180918D +:10387000DD019091DE012FBF0895CF92DF92EF928C +:10388000FF920F931F932FB7F8944091DB01509153 +:10389000DC016091DD017091DE012FBF6A017B01C7 +:1038A000EE24FF248C0120E030E0C016D106E206B1 +:1038B000F30610F4415051099A01281B390BC90134 +:1038C0001F910F91FF90EF90DF90CF9008951F927E +:1038D0000F920FB60F9211248F939F93AF93BF93C4 +:1038E0008091DB019091DC01A091DD01B091DE01BE +:1038F0000196A11DB11D8093DB019093DC01A09383 +:10390000DD01B093DE01BF91AF919F918F910F9038 +:103910000FBE0F901F9018950E94790DF8942FEF0D +:1039200087EA91E6215080409040E1F700C0000016 +:1039300087E090EBDC018093F7019093F801A0936E +:10394000F901B093FA019CE088E10FB6F894A895CC +:10395000809360000FBE90936000FFCFE92FF0E0EE +:1039600093E0EE0FFF1F9A95E1F7E80FF11DE85580 +:10397000FF4F9491892F8F7092959F700895CF93E8 +:10398000C82FCB010E94AE1C492F90E0242F30E0BD +:1039900054E0220F331F5A95E1F7282B392B20389A +:1039A000310519F480E090E017C0EC2FF0E023E03F +:1039B000EE0FFF1F2A95E1F74770E40FF11D34E089 +:1039C000EE0FFF1F3A95E1F7E80FF91FEE0FFF1F0B +:1039D000E050F84985919491CF91089580E090E06E +:1039E000089508958091E10180FF0CC0809110013D +:1039F00090E065E070E00E94B024959587959595DC +:103A000087952EC081FF0AC08091100190E065E08B +:103A100070E00E94B0249595879522C082FF08C06F +:103A20008091100190E065E070E00E94B02418C021 +:103A30002091E2012223D1F030910F01231780F76A +:103A40008091100190E065E070E00E94B024622F48 +:103A500070E00E94B024632F70E00E94CD24CB015F +:103A60008038910530F4009731F0089585E090E0BA +:103A700008958FE7089581E008958091E10180FF26 +:103A800008C060910E0170E0759567957595679512 +:103A900023C081FF06C060910E0170E075956795A7 +:103AA0001BC082FF04C060910E0170E012C06091E3 +:103AB000E2016623D1F020910D016217A0F78091F9 +:103AC0000E0170E090E00E94B024622F70E00E942E +:103AD000CD246038710528F46115710521F0862F19 +:103AE00008958FE7089581E0089561E070E0F4CFD4 +:103AF000803F21F40E94F21C819504C0813F29F48B +:103B00000E94F21C8093E5010895823F21F40E94F7 +:103B1000F21C819504C0833F29F40E94F21C80931B +:103B2000E4010895893F19F40E943D1D05C08A3FB4 +:103B300031F40E943D1D81958093E60108958B3FED +:103B400021F40E943D1D819504C08C3F29F40E9400 +:103B50003D1D8093E7010895843F21F48091E301A6 +:103B6000816017C0853F21F48091E301826011C01C +:103B7000863F21F48091E30184600BC0873F21F4EC +:103B80008091E301886005C0883F31F48091E301B2 +:103B900080618093E30108958D3F21F48091E101DC +:103BA00081600BC08E3F21F48091E101826005C0ED +:103BB0008F3F29F48091E10184608093E1010895B1 +:103BC000803F39F48091E50187FF6CC01092E501D8 +:103BD00069C0813F29F48091E5011816BCF362C0E9 +:103BE0009091E401823F29F497FF5CC01092E401B8 +:103BF00059C0833F19F41916CCF354C0893F41F4DE +:103C00008091E60118160CF04DC01092E6014AC0F2 +:103C10008A3F29F48091E60187FF44C0F6CF8B3FAD +:103C200039F48091E70187FF3DC01092E7013AC067 +:103C30008C3F29F48091E7011816BCF333C0843F10 +:103C400021F48091E3018E7F17C0853F21F480919C +:103C5000E3018D7F11C0863F21F48091E3018B7FCA +:103C60000BC0873F21F48091E301877F05C0883F27 +:103C700031F48091E3018F7E8093E30113C08D3F87 +:103C800021F48091E1018E7F0BC08E3F21F4809161 +:103C9000E1018D7F05C08F3F29F48091E1018B7F89 +:103CA0008093E1018091E40181110EC08091E501D2 +:103CB00081110AC08091E601811106C08091E7015F +:103CC000811102C01092E20108958091D90183FF11 +:103CD0007EC08BEF93E00E944D058091E3011F921F +:103CE0008F9386EF93E09F938F930E94E60584EF76 +:103CF00093E00E944D058091E401282F082E000CCE +:103D0000330B3F938F9381EF93E09F938F930E94A8 +:103D1000E6058FEE93E00E944D058091E501282F86 +:103D2000082E000C330B3F938F938CEE93E09F9300 +:103D30008F930E94E6058AEE93E00E944D058091E4 +:103D4000E601282F082E000C330B3F938F9387EE4C +:103D500093E09F938F930E94E60585EE93E00E9487 +:103D60004D058091E701282F082E000C330B3F935F +:103D70008F9382EE93E09F938F930E94E6058FEDE1 +:103D800093E00E944D058091E2011F928F938CED8C +:103D900093E09F938F930E94E6058AED93E00E9443 +:103DA0004D058091E1011F928F9387ED93E09F93E2 +:103DB0008F930E94E60584ED93E00E944D058DB738 +:103DC0009EB74C960FB6F8949EBF0FBE8DBF83EE84 +:103DD00091E00E947A100E94251C9093E00180934C +:103DE000DF0108951F93CF93DF938091DF019091BE +:103DF000E0010E943D1CFC012091E201222329F0F8 +:103E000090911101892F90E007C08091120190E0FC +:103E10006AE070E00E94B024E817F90708F485C052 +:103E20008091E401C091E501D091E6011091E70194 +:103E3000811107C0C11175C0D11173C0111171C0BA +:103E400074C02F3F19F02F5F2093E201181624F45D +:103E50000E94F21C8093E4018091E40187FF05C079 +:103E60000E94F21C81958093E4011C1624F40E94A8 +:103E7000F21C8093E5018091E50187FF05C00E9457 +:103E8000F21C81958093E5016091E401662331F194 +:103E9000C091E501CC2311F1062E000C770B880BA5 +:103EA000990B0E94AF2323E333E343E35FE30E94D4 +:103EB00013240E9477236093E4016C2FCC0F770BBF +:103EC000880B990B0E94AF2323E333E343E35FE3C3 +:103ED0000E9413240E9477236093E5011D1624F4A9 +:103EE0000E943D1D8093E6018091E60187FF05C099 +:103EF0000E943D1D81958093E601111624F40E94D5 +:103F00003D1D8093E7018091E70187FF05C00E9476 +:103F10003D1D81958093E701DF91CF911F910C9416 +:103F2000651E2F3F09F08FCF97CFDF91CF911F9163 +:103F30000895E3EEF1E085E0DF011D928A95E9F74F +:103F40001092E2011092E10108958EE196E00E9444 +:103F50004D051F9281E08F931F9285E08F9380ED36 +:103F600095E09F938F930E94E6050F900F900F901E +:103F70000F900F900F9008958330E9F128F481306D +:103F800061F0823009F10895853009F462C008F4C7 +:103F900049C0863009F474C0089580911201262F1B +:103FA00030E0280F311D2F3F310524F4680F609356 +:103FB000120103C08FEF80931201809112011F92B2 +:103FC0008F9389E095E072C080911101262F30E037 +:103FD000280F311D2F3F310524F4680F6093110124 +:103FE00003C08FEF80931101809111011F928F9375 +:103FF00087EF94E05BC080911001262F30E0280FFE +:10400000311D2F3F310524F4680F6093100103C068 +:104010008FEF80931001809110011F928F9384EE97 +:1040200094E044C080910F01262F30E0280F311D0D +:104030002F3F310524F4680F60930F0103C08FEF09 +:1040400080930F0180910F011F928F938FEC94E06A +:104050002DC080910E01262F30E0280F311D2F3FFB +:10406000310524F4680F60930E0103C08FEF809335 +:104070000E0180910E011F928F9386EB94E016C083 +:1040800080910D01262F30E0280F311D2F3F310583 +:1040900024F4680F60930D0103C08FEF80930D012E +:1040A00080910D011F928F938BE994E09F938F93E2 +:1040B0000E94E6050F900F900F900F9008958330A7 +:1040C00081F128F4813059F08230D1F008958530A3 +:1040D00009F449C0B8F1863009F456C008958091BA +:1040E0001201681720F4861B8093120102C01092FF +:1040F0001201809112011F928F938CE894E054C0BA +:1041000080911101681720F4861B8093110102C071 +:1041100010921101809111011F928F938AE794E010 +:1041200043C080911001681720F4861B8093100112 +:1041300002C010921001809110011F928F9387E6A8 +:1041400094E032C080910F01681720F4861B8093A1 +:104150000F0102C010920F0180910F011F928F93E7 +:1041600082E594E021C080910E01681720F4861B3F +:1041700080930E0102C010920E0180910E011F92D9 +:104180008F9389E394E010C080910D01681720F4AB +:10419000861B80930D0102C010920D0180910D01CC +:1041A0001F928F938EE194E09F938F930E94E60578 +:1041B0000F900F900F900F900895CF93C82F1F92DC +:1041C0008F9383E297E09F938F930E94E60581E0AF +:1041D00090E0A0E0B0E0BC01CD0104C0660F771F05 +:1041E000881F991FCA95D2F70E94B7190F900F9098 +:1041F0000F900F90CF910C94B015CF93873288F524 +:104200008E3108F00BC18E3009F487C0D8F48730A6 +:1042100009F460C08B3009F44FC0863009F002C148 +:104220008091D901817F8E7F8093D90188E297E0C8 +:104230000E944D058CEE99E00E944D0581E080932F +:10424000E90146C0863109F4B0C020F4803109F498 +:104250007AC0E8C0893109F491C08B3109F449C0B2 +:10426000E1C0883349F150F4893209F4D5C085336F +:1042700009F4D2C0873209F0D5C0CEC0833409F426 +:10428000CBC028F48A3308F4CDC08953C8C0883421 +:1042900009F0C8C00E94B0158BED99E00E944D0551 +:1042A0002FEF83ED90E3215080409040E1F700C074 +:1042B00000000E948C1C0CC08FE497E041C082EC8F +:1042C00099E00E944D058091D90181608093D901C8 +:1042D000C1E0ADC08091D901C82FC17080FFEFCF80 +:1042E0008EEC99E00E944D058091D901817F8E7FEF +:1042F0003FC09091D90191FBCC27C0F981E0C8273C +:10430000892FC0FB81F98093D901CC2319F085EB6B +:1043100099E029C087EA99E013C09091D90192FBF6 +:10432000CC27C0F981E0C827892FC0FB82F9809390 +:10433000D901CC2319F088E999E015C088E899E003 +:104340000E944D05C5CF9091D90193FBCC27C0F9B0 +:1043500081E0C827892FC0FB83F98093D901CC2342 +:1043600051F08CE799E00E944D058091D901816060 +:104370008093D9015CC08FE699E0E2CF80E699E0B6 +:104380000E944D0588E399E00E944D058EEE98E06D +:104390000E944D0581EC98E00E944D058CE798E065 +:1043A0000E944D058DE498E0CBCF8FE398E00E940A +:1043B0004D050E9425101F928F9385E298E09F93F0 +:1043C0008F930E94E60580910A011F928F938EE0E1 +:1043D00098E09F938F930E94E605809176011F924B +:1043E0008F938BEF97E09F938F930E94E6050E9437 +:1043F000311C9F938F937F936F9384EE97E09F93ED +:104400008F930E94E6058DB79EB742960FB6F8943B +:104410009EBF0FBE8DBF5CCF80E001C08D510E945A +:10442000DD2056CF82EE97E00E944D05C0E08C2F34 +:10443000CF91089580E0089580E00895CF93C82F2C +:104440008091E901813081F020F0823009F44FC081 +:1044500046C1E0910B01F0910C018081813169F03E +:10446000823209F03EC109C0E0910B01F0910C01CC +:104470008081813111F0823261F48C2F0E941A22E6 +:10448000811104C08C2F0E94FD202FC081E090E09C +:104490002CC08C2F0E941C22811126C0C431E1F057 +:1044A00070F4CB3081F0C031D1F40E94A51F8BE1B4 +:1044B00097E00E944D0582E08093E90115C0C93262 +:1044C00059F0C83361F488E297E00E944D058FE10E +:1044D00097E00E944D0508C01092E90104C189E1EE +:1044E00097E00E944D05FFC081E08170FEC0C4329C +:1044F00028F5CE3108F0C1C0CB30A1F1D0F4C730DF +:1045000009F0D3C08EE18093120182E38093110100 +:104510008AE08093100184E180930F0188E080930A +:104520000E0188E280930D018FEB95E00E944D050E +:10453000BFC0C33149F1C431C1F0B7C0CB3409F4B5 +:10454000A9C028F4C93289F0C83361F0AEC0C135C2 +:1045500009F49EC0C23509F499C0CE3409F0A5C053 +:104560006AE09EC00E94A51FA3C08091E801882335 +:1045700019F01092E8019CC08CEC95E00E944D056A +:1045800081E08093E901B1C086EA95E00E944D0583 +:1045900084E995E00E944D05809112011F928F934E +:1045A00081E995E09F938F930E94E6058FE895E05F +:1045B0000E944D058DE795E00E944D058091110107 +:1045C0001F928F938AE795E09F938F930E94E60551 +:1045D00088E795E00E944D0589E695E00E944D052B +:1045E000809110011F928F9386E695E09F938F93A1 +:1045F0000E94E60584E695E00E944D0583E595E07E +:104600000E944D0580910F011F928F9380E595E0E8 +:104610009F938F930E94E6058EE495E00E944D05DE +:1046200089E395E00E944D0580910E011F928F93C2 +:1046300086E395E09F938F930E94E60584E395E0DF +:104640000E944D058DE195E00E944D0580910D0180 +:104650001F928F938AE195E09F938F930E94E605C6 +:1046600088E195E00E944D058DB79EB748960FB63C +:10467000F8949EBF0FBE8DBF1BC0CE51EC2FF0E053 +:10468000E95DFE4F80818093E80112C061E003C0C4 +:1046900061E006C06AE08091E8010E94BC1F08C08A +:1046A0008091E8010E945F2003C08DEB95E013C06C +:1046B0008091E801882369F01F928F9387EB95E042 +:1046C0009F938F930E94E6050F900F900F900F908D +:1046D00004C084EB95E00E944D0581E006C0109275 +:1046E000E90180E002C080E000CFCF9108950E94F0 +:1046F0007E236894B1110C940D2408950E94F22336 +:1047000088F09F5798F0B92F9927B751B0F0E1F092 +:10471000660F771F881F991F1AF0BA95C9F714C042 +:10472000B13091F00E940C24B1E008950C940C2457 +:10473000672F782F8827B85F39F0B93FCCF386957B +:1047400077956795B395D9F73EF4909580957095D8 +:1047500061957F4F8F4F9F4F0895E89409C097FB55 +:104760003EF490958095709561957F4F8F4F9F4F48 +:104770009923A9F0F92F96E9BB279395F69587958C +:1047800077956795B795F111F8CFFAF4BB0F11F44F +:1047900060FF1BC06F5F7F4F8F4F9F4F16C08823F6 +:1047A00011F096E911C0772321F09EE8872F762F2C +:1047B00005C0662371F096E8862F70E060E02AF06D +:1047C0009A95660F771F881FDAF7880F9695879559 +:1047D00097F9089557FD9058440F551F59F05F3FC2 +:1047E00071F04795880F97FB991F61F09F3F79F013 +:1047F00087950895121613061406551FF2CF469595 +:10480000F1DF08C0161617061806991FF1CF869516 +:104810007105610508940895E894BB2766277727FA +:10482000CB0197F908950E9425240C949F240E949F +:10483000912438F00E94982420F0952311F00C94D4 +:1048400088240C948E240C940D240E94EA2378F37F +:104850009923C9F35523B9F3950F50E0551FAA27A3 +:10486000EE27FF27BB2700240894679520F4E20F6A +:10487000F31FB41F0A1E220F331F441FAA1F669581 +:10488000A9F7779530F4F30FB41F0A1E121E08F42F +:104890006395330F441FAA1F221F769599F78795BA +:1048A00020F4B40F0A1E121E631F440FAA1F221FFA +:1048B000331F8695A9F7862F712D602D11249F57E0 +:1048C00050409AF0F1F088234AF0EE0FFF1FBB1F13 +:1048D000661F771F881F91505040A9F79E3F5105D2 +:1048E00080F00C9488240C940D245F3FE4F3983EF0 +:1048F000D4F3869577956795B795F795E7959F5F7C +:10490000C1F7FE2B880F911D9695879597F908950D +:1049100097F99F6780E870E060E008959FEF80EC72 +:10492000089500240A941616170618060906089515 +:1049300000240A9412161306140605060895092E7B +:104940000394000C11F4882352F0BB0F40F4BF2BEA +:1049500011F460FF04C06F5F7F4F8F4F9F4F08952A +:104960000024552704C0080E591F880F991F00976F +:1049700029F076956795B8F37105B9F7802D952FD5 +:104980000895991B79E004C0991F961708F0961BAB +:10499000881F7A95C9F78095089597FB072E16F41E +:1049A000009407D077FD09D00E94E72407FC05D0CA +:1049B0003EF4909581959F4F0895709561957F4F36 +:1049C0000895EE0FFF1F0590F491E02D0994AA1BA6 +:1049D000BB1B51E107C0AA1FBB1FA617B70710F0EA +:1049E000A61BB70B881F991F5A95A9F7809590951C +:0A49F000BC01CD010895F894FFCF3B +:1049FA00EA08DB09B8098409500901CF012808141B +:104A0A000A321E404D36226F032203EC02CA0256B6 +:104A1A00026F028802A102010203040506070809BF +:024A2A0000008A +:106800008800EA44E944E244040005000600070069 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031003200330034003500360037008C +:10687000380039003A003B003C003D003E003F003C +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530054005500560057004C +:1068B000580059005A005B005C005D005E005F00FC +:1068C000600061006200630064006500850067008D +:1068D000680069006A006B006C006D006E006F005C +:1068E0007000710072007300890087008A008B00BD +:1068F000E000E100E200E300F1A1E500E600E700CE +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010035004C0039000100440045005200A0 +:1069600049000100010050004F0029004D004E0079 +:1069700051000100680069006A006B006C006D0046 +:106980006E006F0070007100720073000100010062 +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E0000100010001000100490001000100010057 +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/ibm4704_usb/keymap_50key.c b/converter/ibm4704_usb/keymap_50key.c index 97294fb4..c589ce05 100644 --- a/converter/ibm4704_usb/keymap_50key.c +++ b/converter/ibm4704_usb/keymap_50key.c @@ -11,7 +11,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/ibm4704_usb/keymap_alps102key.c b/converter/ibm4704_usb/keymap_alps102key.c index f3dda718..aac8a423 100644 --- a/converter/ibm4704_usb/keymap_alps102key.c +++ b/converter/ibm4704_usb/keymap_alps102key.c @@ -45,6 +45,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/converter/ibm4704_usb/keymap_common.c b/converter/ibm4704_usb/keymap_common.c deleted file mode 100644 index 55a13793..00000000 --- a/converter/ibm4704_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/ibm4704_usb/keymap_common.h b/converter/ibm4704_usb/keymap_common.h index 9cb23b0b..ea0ec942 100644 --- a/converter/ibm4704_usb/keymap_common.h +++ b/converter/ibm4704_usb/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -29,11 +28,6 @@ along with this program. If not, see . #include "keymap.h" -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* 107-key */ #define KEYMAP( \ K46,K64, K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, K6A,K6B,K6C, K47,K48,K49,K4A, \ diff --git a/converter/ibm4704_usb/keymap_hasu.c b/converter/ibm4704_usb/keymap_hasu.c index 14c17117..e235ce80 100644 --- a/converter/ibm4704_usb/keymap_hasu.c +++ b/converter/ibm4704_usb/keymap_hasu.c @@ -60,7 +60,7 @@ enum macro_id { ALT_TAB, }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_TAP_KEY(2, KC_SCLN), [2] = ACTION_LAYER_TAP_KEY(3, KC_SLASH), diff --git a/converter/ibm4704_usb/keymap_plain.c b/converter/ibm4704_usb/keymap_plain.c index 4aed684e..9e78b021 100644 --- a/converter/ibm4704_usb/keymap_plain.c +++ b/converter/ibm4704_usb/keymap_plain.c @@ -45,6 +45,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/converter/ibm4704_usb/matrix.c b/converter/ibm4704_usb/matrix.c index f25452d5..c02d9e50 100644 --- a/converter/ibm4704_usb/matrix.c +++ b/converter/ibm4704_usb/matrix.c @@ -29,7 +29,6 @@ along with this program. If not, see . static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -static void matrix_clear(void); /* @@ -53,18 +52,6 @@ static uint8_t matrix[MATRIX_ROWS]; #define COL(code) (code&0x07) -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - static void enable_break(void) { print("Enable break: "); @@ -121,28 +108,12 @@ uint8_t matrix_scan(void) return 1; } -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_FN0 ACTION_LAYER_MOMENTARY(1) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, + LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, FN0, LEFT,DOWN,RGHT, P0, PDOT,PEQL + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + GRV, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; diff --git a/converter/ibm4704_usb/unimap_trans.h b/converter/ibm4704_usb/unimap_trans.h new file mode 100644 index 00000000..276083a9 --- /dev/null +++ b/converter/ibm4704_usb/unimap_trans.h @@ -0,0 +1,113 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_TRNAS_H +#define UNIMAP_TRNAS_H + +#include +#include +#include "unimap.h" + + +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { // 16*8 +#ifndef IBM4704_ALPS + /* IBM4740 Capcitive models(62-key/77-key/107-key) + * ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. + * | F1| F2| | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|BSp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | F3| F4| |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| +| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | F5| F6| |Caps | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| |PrS|ScL|Pau| | 4| 5| 6|KP,| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | F7| F8| |Shif| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |F11| Up|F12| | 1| 2| 3|Ent| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | F9|F10| |Ctrl |Gui|Alt | Space |Alt* |Gui|Ctrl | |Lef|Dow|Rig| |Esc| 0|KP.|KP=| + * `-------' `-----------------------------------------------------------' `-----------' `---------------' + * scan codes + * ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. + * | 46| 64| | 00| 18| 19| 1A| 10| 11| 12| 08| 09| 0A| 0F| 1F| 0D| 0C| 0E| | 6A| 6B| 6C| | 47| 48| 49| 4A| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | 56| 66| | 04 | 05| 06| 13| 14| 15| 16| 17| 01| 02| 03| 1B| 1C| 1D| | 6D| 6E| 6F| | 4B| 4C| 4D| 4E| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | 71| 77| | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D| | 70| 65| 72| | 50| 51| 52| 53| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | 44| 45| | 30 | 3E| 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D| | 74| 75| 76| | 5E| 58| 59| 5A| + * |-------| |-----------------------------------------------------------| |-----------| |---------------| + * | 54| 55| | 31 | 41| 3F | 40 | *3F | 42| 2F | | 78| 67| 79| | 5B| 5C| 5D| 57| + * `-------' `-----------------------------------------------------------' `-----------' `---------------' + * Both Alt keys spit same scan code 3F. + */ + { UNIMAP_GRV, UNIMAP_I, UNIMAP_O, UNIMAP_P, UNIMAP_TAB, UNIMAP_Q, UNIMAP_W, UNIMAP_NO }, // 00-07 + { UNIMAP_7, UNIMAP_8, UNIMAP_9, UNIMAP_NO, UNIMAP_JYEN, UNIMAP_EQL, UNIMAP_BSPC, UNIMAP_0 }, // 08-0F + { UNIMAP_4, UNIMAP_5, UNIMAP_6, UNIMAP_E, UNIMAP_R, UNIMAP_T, UNIMAP_Y, UNIMAP_U }, // 10-17 + { UNIMAP_1, UNIMAP_2, UNIMAP_3, UNIMAP_LBRC, UNIMAP_RBRC, UNIMAP_BSLS, UNIMAP_NO, UNIMAP_MINS }, // 18-1F + { UNIMAP_CAPS, UNIMAP_A, UNIMAP_S, UNIMAP_D, UNIMAP_F, UNIMAP_G, UNIMAP_H, UNIMAP_J }, // 20-27 + { UNIMAP_K, UNIMAP_L, UNIMAP_SCLN, UNIMAP_QUOT, UNIMAP_NUHS, UNIMAP_ENT, UNIMAP_NO, UNIMAP_RCTL }, // 28-2F + { UNIMAP_LSFT, UNIMAP_LCTL, UNIMAP_Z, UNIMAP_X, UNIMAP_C, UNIMAP_V, UNIMAP_B, UNIMAP_N, }, // 30-37 + { UNIMAP_M, UNIMAP_COMM, UNIMAP_DOT, UNIMAP_SLSH, UNIMAP_RO, UNIMAP_RSFT, UNIMAP_NUBS, UNIMAP_LALT }, // 38-3F + { UNIMAP_SPC, UNIMAP_LGUI, UNIMAP_RGUI, UNIMAP_NO, UNIMAP_F7, UNIMAP_F8, UNIMAP_F1, UNIMAP_NLCK }, // 40-47 + { UNIMAP_PSLS, UNIMAP_PAST, UNIMAP_PMNS, UNIMAP_P7, UNIMAP_P8, UNIMAP_P9, UNIMAP_PPLS, UNIMAP_NO }, // 48-4F + { UNIMAP_P4, UNIMAP_P5, UNIMAP_P6, UNIMAP_PCMM, UNIMAP_F9, UNIMAP_F10, UNIMAP_F3, UNIMAP_PEQL }, // 50-57 + { UNIMAP_P2, UNIMAP_P3, UNIMAP_PENT, UNIMAP_ESC, UNIMAP_P0, UNIMAP_PDOT, UNIMAP_P1, UNIMAP_NO }, // 58-5F + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_F2, UNIMAP_SLCK, UNIMAP_F4, UNIMAP_DOWN }, // 60-67 + { UNIMAP_NO, UNIMAP_NO, UNIMAP_INS, UNIMAP_HOME, UNIMAP_PGUP, UNIMAP_DEL, UNIMAP_END, UNIMAP_PGDN }, // 68-6F + { UNIMAP_PSCR, UNIMAP_F5, UNIMAP_PAUS, UNIMAP_NO, UNIMAP_F11, UNIMAP_UP, UNIMAP_F12, UNIMAP_F6 }, // 70-77 + { UNIMAP_LEFT, UNIMAP_RGHT, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO } // 78-7F +#else + /* IBM4740 Alps models(102-key) + * ,---------------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|BSp| F1| |Ins|Hom|PgU| |NmL| /| *| -| + * |---------------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| F2| |Del|End|PgD| | 7| 8| 9| +| + * |---------------------------------------------------------------| |-----------| |---------------| + * |Caps | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| F3| |PrS|ScL|Pau| | 4| 5| 6|KP,| + * |---------------------------------------------------------------| |-----------| |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /| RO|Shift | F4| |F11| Up|F12| | 1| 2| 3|Ent| + * |---------------------------------------------------------------| |-----------| |---------------| + * |Ctrl |Gui|Alt | Space |Alt |Gui| Ctrl | |Lef|Dow|Rig| |Esc| 0|KP.|KP=| + * `---------------------------------------------------------------' `-----------' `---------------' + * ,---------------------------------------------------------------. ,-----------. ,---------------. + * | 00| 0F| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| | 44| 45| 46| | 43| 41| 42| 4A| + * |---------------------------------------------------------------| |-----------| |---------------| + * | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| 1D | 1E| | 54| 55| 56| | 50| 51| 52| 5A| + * |---------------------------------------------------------------| |-----------| |---------------| + * | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D | 2E| | 64| 65| 66| | 60| 61| 62| 6B| + * |---------------------------------------------------------------| |-----------| |---------------| + * | 30 | 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D | 3E| | 74| 75| 76| | 70| 71| 72| 7B| + * |---------------------------------------------------------------| |-----------| |---------------| + * | 31 | 47| 3F | 40 | 4F | 48| 2F | | 77| 67| 57| | 73| 63| 53| 4E| + * `---------------------------------------------------------------' `-----------' `---------------' + */ + { UNIMAP_GRV, UNIMAP_2, UNIMAP_3, UNIMAP_4, UNIMAP_5, UNIMAP_6, UNIMAP_7, UNIMAP_8 }, // 00-07 + { UNIMAP_9, UNIMAP_0, UNIMAP_MINS, UNIMAP_EQL, UNIMAP_JYEN, UNIMAP_BSPC, UNIMAP_F1, UNIMAP_1 }, // 08-0F + { UNIMAP_TAB, UNIMAP_Q, UNIMAP_W, UNIMAP_E, UNIMAP_R, UNIMAP_T, UNIMAP_Y, UNIMAP_U }, // 10-17 + { UNIMAP_I, UNIMAP_O, UNIMAP_P, UNIMAP_LBRC, UNIMAP_RBRC, UNIMAP_BSLS, UNIMAP_F2, UNIMAP_NO }, // 18-1F + { UNIMAP_CAPS, UNIMAP_A, UNIMAP_S, UNIMAP_D, UNIMAP_F, UNIMAP_G, UNIMAP_H, UNIMAP_J }, // 20-27 + { UNIMAP_K, UNIMAP_L, UNIMAP_SCLN, UNIMAP_QUOT, UNIMAP_NUHS, UNIMAP_ENT, UNIMAP_F3, UNIMAP_RCTL }, // 28-2F + { UNIMAP_LSFT, UNIMAP_LCTL, UNIMAP_Z, UNIMAP_X, UNIMAP_C, UNIMAP_V, UNIMAP_B, UNIMAP_N }, // 30-37 + { UNIMAP_M, UNIMAP_COMM, UNIMAP_DOT, UNIMAP_SLSH, UNIMAP_RO, UNIMAP_RSFT, UNIMAP_F4, UNIMAP_LALT }, // 38-3F + { UNIMAP_SPC, UNIMAP_PSLS, UNIMAP_PAST, UNIMAP_NLCK, UNIMAP_INS, UNIMAP_HOME, UNIMAP_PGUP, UNIMAP_LGUI }, // 40-47 + { UNIMAP_RGUI, UNIMAP_NO, UNIMAP_PMNS, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_PEQL, UNIMAP_RALT }, // 48-4F + { UNIMAP_P7, UNIMAP_P8, UNIMAP_P9, UNIMAP_PDOT, UNIMAP_DEL, UNIMAP_END, UNIMAP_PGDN, UNIMAP_RGHT }, // 50-57 + { UNIMAP_NO, UNIMAP_NO, UNIMAP_PPLS, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, }, // 58-5F + { UNIMAP_P4, UNIMAP_P5, UNIMAP_P6, UNIMAP_P0, UNIMAP_PSCR, UNIMAP_SLCK, UNIMAP_PAUS, UNIMAP_DOWN }, // 60-67 + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_PCMM, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, }, // 68-6F + { UNIMAP_P1, UNIMAP_P2, UNIMAP_P3, UNIMAP_ESC, UNIMAP_F11, UNIMAP_UP, UNIMAP_F12, UNIMAP_LEFT }, // 70-77 + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_PENT, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, } // 78-7F +#endif +}; + +#endif diff --git a/converter/m0110_usb/Makefile b/converter/m0110_usb/Makefile index e8364563..71d675ac 100644 --- a/converter/m0110_usb/Makefile +++ b/converter/m0110_usb/Makefile @@ -1,32 +1,41 @@ # Target file name (without extension). -TARGET = m0110_lufa +TARGET ?= m0110_usb # Directory common source filess exist -TMK_DIR = ../../tmk_core +TMK_DIR ?= ../../tmk_core # Directory keyboard dependent files exist -TARGET_DIR = . +TARGET_DIR ?= . # keyboard dependent files -SRC = matrix.c \ +SRC ?= matrix.c \ led.c \ - keymap_common.c \ m0110.c -# To use own keymap file run make like: make keymap=hasu -ifdef KEYMAP - SRC += keymap_$(KEYMAP).c +# +# Keymap file +# +ifdef UNIMAP_ENABLE + KEYMAP_FILE = unimap else - SRC += keymap_default.c + ifdef ACTIONMAP_ENABLE + KEYMAP_FILE = actionmap + else + KEYMAP_FILE = keymap + endif +endif +ifdef KEYMAP + SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) +else + SRC := $(KEYMAP_FILE).c $(SRC) endif -CONFIG_H = config.h +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 = atmega32u2 # TMK converter rev2 -#MCU = atmega32u4 # TMK converter rev1 +MCU ?= atmega32u2 # Processor frequency. @@ -34,14 +43,14 @@ MCU = atmega32u2 # TMK converter rev2 # 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 +F_CPU ?= 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). -ARCH = AVR8 +ARCH ?= AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the @@ -54,7 +63,7 @@ ARCH = AVR8 # # 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) +F_USB ?= $(F_CPU) # Interrupt driven control endpoint task OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -70,19 +79,19 @@ 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 -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA -#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor +#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 +#SLEEP_LED_ENABLE ?= yes # Breathing sleep LED during USB suspend +#NKRO_ENABLE ?= yes # USB Nkey Rollover +#KEYMAP_SECTION_ENABLE ?= yes # fixed address keymap for keymap editor #---------------- Programming Options -------------------------- -PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex +PROGRAM_CMD ?= teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex # Search Path diff --git a/converter/m0110_usb/Makefile.rev1 b/converter/m0110_usb/Makefile.rev1 new file mode 100644 index 00000000..54eae183 --- /dev/null +++ b/converter/m0110_usb/Makefile.rev1 @@ -0,0 +1,3 @@ +TARGET = m0110_usb_rev1 +MCU = atmega32u4 +include Makefile diff --git a/converter/m0110_usb/Makefile.rev2 b/converter/m0110_usb/Makefile.rev2 new file mode 100644 index 00000000..0897c711 --- /dev/null +++ b/converter/m0110_usb/Makefile.rev2 @@ -0,0 +1,3 @@ +TARGET = m0110_usb_rev2 +MCU = atmega32u2 +include Makefile diff --git a/converter/m0110_usb/Makefile.teensy b/converter/m0110_usb/Makefile.teensy deleted file mode 100644 index 394b6605..00000000 --- a/converter/m0110_usb/Makefile.teensy +++ /dev/null @@ -1,98 +0,0 @@ -# Target file name (without extension). -TARGET = m0110_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = matrix.c \ - led.c \ - keymap_common.c \ - m0110.c - -# To use own keymap file run make like: make keymap=hasu -ifdef KEYMAP - SRC += keymap_$(KEYMAP).c -else - SRC += keymap_default.c -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 = at90usb162 # Teensy 1.0 -MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 - - -# 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 - - -# -# 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 -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in bytes -# Teensy halfKay 512 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -OPT_DEFS += -DBOOTLOADER_SIZE=512 - - -# 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 -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA -#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor - - - -#---------------- Programming Options -------------------------- -PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/m0110_usb/Makefile.tmk_rev1 b/converter/m0110_usb/Makefile.tmk_rev1 deleted file mode 100644 index f36fcc4b..00000000 --- a/converter/m0110_usb/Makefile.tmk_rev1 +++ /dev/null @@ -1,96 +0,0 @@ -# Target file name (without extension). -TARGET = m0110_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = matrix.c \ - led.c \ - keymap_common.c \ - m0110.c - -# To use own keymap file run make like: make keymap=hasu -ifdef KEYMAP - SRC += keymap_$(KEYMAP).c -else - SRC += keymap_default.c -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 = atmega32u2 # TMK converter rev2 -MCU = atmega32u4 # TMK converter rev1 - - -# 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 - - -# -# 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 -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# 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(+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 -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA -#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor - - - -#---------------- Programming Options -------------------------- -PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/m0110_usb/Makefile.tmk_rev2 b/converter/m0110_usb/Makefile.tmk_rev2 deleted file mode 100644 index e8364563..00000000 --- a/converter/m0110_usb/Makefile.tmk_rev2 +++ /dev/null @@ -1,96 +0,0 @@ -# Target file name (without extension). -TARGET = m0110_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# keyboard dependent files -SRC = matrix.c \ - led.c \ - keymap_common.c \ - m0110.c - -# To use own keymap file run make like: make keymap=hasu -ifdef KEYMAP - SRC += keymap_$(KEYMAP).c -else - SRC += keymap_default.c -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 = atmega32u2 # TMK converter rev2 -#MCU = atmega32u4 # TMK converter rev1 - - -# 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 - - -# -# 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 -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# 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(+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 -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA -#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor - - - -#---------------- Programming Options -------------------------- -PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex - - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk diff --git a/converter/m0110_usb/Makefile.unimap.rev1 b/converter/m0110_usb/Makefile.unimap.rev1 new file mode 100644 index 00000000..b1cd9678 --- /dev/null +++ b/converter/m0110_usb/Makefile.unimap.rev1 @@ -0,0 +1,6 @@ +TARGET = m0110_usb_rev1_unimap +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +MCU = atmega32u4 +#OPT_DEFS = -DM0110_INTL +include Makefile diff --git a/converter/m0110_usb/Makefile.unimap.rev2 b/converter/m0110_usb/Makefile.unimap.rev2 new file mode 100644 index 00000000..1416155c --- /dev/null +++ b/converter/m0110_usb/Makefile.unimap.rev2 @@ -0,0 +1,6 @@ +TARGET = m0110_usb_rev2_unimap +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +MCU = atmega32u2 +#OPT_DEFS = -DM0110_INTL +include Makefile diff --git a/converter/m0110_usb/README.md b/converter/m0110_usb/README.md index bfd3261d..668c8526 100644 --- a/converter/m0110_usb/README.md +++ b/converter/m0110_usb/README.md @@ -4,7 +4,7 @@ This firmware converts the protocol of Apple Macintosh keyboard **M0110**, **M01 Read README of top directory too. -Pictures of **M0110 + M0120** and **M0110A**. +Pictures of **M0110 + M0120** and **M0110A** with [TMK converter]. ![M0110+M0120](http://i.imgur.com/dyvXb2Tm.jpg) ![M0110A](http://i.imgur.com/HuHOEoHm.jpg) @@ -21,25 +21,25 @@ Update - 2013/09: Change port again, it uses inversely `PD0` for data and `PD1` for clock line now. - 2014/06: Change keymaps - 2015/03: Add support for "International"(ISO) keyboard(keymap_intl.c) +- 2016/09: Unimap support - keymap editor on web browser -Building Hardware ------------------ -You need [TMK converter] or AVR dev board like PJRC [Teensy]. Port of the MCU `PD1` is assigned to `CLOCK` line and `PD0` to `DATA` by default, you can change pin configuration with editing `config.h`. +Hardware +-------- +You can buy preassembled [TMK converter] or make yourown with AVR dev board like PJRC [Teensy]. -[![M0110 Converter](http://i.imgur.com/4G2ZOegm.jpg)](http://i.imgur.com/4G2ZOeg.jpg) +Port of the MCU `PD1` is assigned to `CLOCK` line and `PD0` to `DATA` by default, you can change pin configuration with editing `config.h`. + +[![M0110 Converter](http://i.imgur.com/yEp2eRim.jpg)](http://i.imgur.com/yEp2eRi.jpg) ### 4P4C phone handset cable Note that original cable used with Mac is **straight** while phone handset cable is **crossover**. -Close-up picture of handset cable. You can see one end of plug has reverse color codes against the other. Click to enlarge. -[![4P4C cable](http://i.imgur.com/3S9P1mYm.jpg?1)](http://i.imgur.com/3S9P1mY.jpg?1) - [Teensy]: http://www.pjrc.com/teensy/ -[TMK converter]: https://github.com/tmk/keyboard_converter +[TMK converter]: https://geekhack.org/index.php?topic=72052.0 ### Socket Pinout @@ -60,16 +60,19 @@ To compile firmware you need AVR GCC. You can edit *Makefile* and *config.h* to $ git clone git://github.com/tmk/tmk_keyboard.git (or download source) $ cd m0110_usb $ make -f Makefile.rev2 clean - $ make -f Makefile.rev2 [KEYMAP={default|intl|spacefn|hasu}] + $ make -f Makefile.rev2 [KEYMAP={intl|spacefn}] -Use `Maefile.tmk_rev1` for TMK converter Rev.1, `Makefile.teensy` for Teensy instead. +Use `Maefile.rev1` for TMK converter rev.1 and Teensy(ATMega32u4), instead. Keymap ------ -To create your own keymap copy existent keymap file to `keymap_name.c` and edit it. +To create your own keymap copy existent keymap file to `keymap_.c` and edit it. You can build with `make -f Makefile.rev2 KEYMAP=`. +Or you can edit keymap on web browser and download firmware. + +http://www.tmk-kbd.com/tmk_keyboard/editor/ Debug diff --git a/converter/m0110_usb/binary/m0110_usb_rev1_unimap.hex b/converter/m0110_usb/binary/m0110_usb_rev1_unimap.hex new file mode 100644 index 00000000..722f02ae --- /dev/null +++ b/converter/m0110_usb/binary/m0110_usb_rev1_unimap.hex @@ -0,0 +1,1223 @@ +:100000000C94F5040C943C050C943C050C943C05B4 +:100010000C943C050C943C050C943C050C943C055C +:100020000C943C050C943C050C94AE0D0C94800E85 +:100030000C942A1C0C943C050C943C050C943C0537 +:100040000C943C050C943C050C943C050C943C052C +:100050000C943C050C949E1C0C943C050C943C05A3 +:100060000C943C050C943C050C943C050C943C050C +:100070000C943C050C943C050C943C050C943C05FC +:100080000C943C050C943C050C943C050C943C05EC +:100090000C943C050C943C050C943C050C943C05DC +:1000A0000C943C050C943C050C943C05ED0E0F0F94 +:1000B000FD0F0F0FFD0F540F770FFD0FCC0FDF0F4C +:1000C0001913191346134613A113DD13D515D515AE +:1000D000F513D515F014F014AB15D515D515C115BC +:1000E000041607090B0A1D1B06198005141A0815AA +:1000F0001C171E1F202123222E26242D25273012D7 +:10010000182F0C13280F0D340E33313638111037D9 +:100110002B2C352A7F80807B79397A808080808083 +:1001200080634F8080805053518080805852578028 +:10013000808062595A5B5C5D5E5F80606180808018 +:10014000808056808080668054808080805580804A +:100150000A0025303862003A200025303258000A63 +:10016000722F632030313233343536370A005D0A5E +:100170000025303258005B0020002530325800281E +:1001800031290A002832290A002833290A00283494 +:10019000290A000A0025303258006D303131305FB5 +:1001A00072656376206572723A20000A002530324B +:1001B00058006D303131305F73656E642065727246 +:1001C0003A20005B735D004B6579626F6172642059 +:1001D00073746172742E0A0055534220636F6E6609 +:1001E0006967757265642E0A005B575D005B535D3D +:1001F000005B525D005B445D005B435D0032034D7C +:1002000000300031003100300020006B00650079C3 +:100210000062006F00610072006400200063006FE4 +:10022000006E0076006500720074006500720000C8 +:10023000000E0374002E006D002E006B002E0000D7 +:10024000000403090409027400040100A032090437 +:1002500000000103010100092111010001224000F9 +:100260000705810308000A090401000103010200D7 +:10027000092111010001224D000705820308000A2F +:1002800009040200010300000009211101000122FC +:1002900036000705830308000A090403000203006F +:1002A000000009211101000122220007058403201A +:1002B00000010705040320000112011001000000E5 +:1002C00008EDFE10010101010200010631FF097471 +:1002D000A1010975150026FF009520750881020906 +:1002E00076150026FF00952075089102C0050109CA +:1002F00080A101850216810026B7001A81002AB765 +:1003000000751095018100C0050C0901A10185034C +:10031000160100269C021A01002A9C027510950104 +:100320008100C005010902A1010901A10005091907 +:1003300001290515002501950575018102950175B5 +:100340000381010501093009311581257F95027569 +:1003500008810609381581257F95017508810605F4 +:100360000C0A38021581257F950175088106C0C0E9 +:1003700005010906A101050719E029E71500250176 +:10038000950875018102950175088101050819011B +:1003900029059505750191029501750391010507E0 +:1003A000190029FF150026FF00950675088100C079 +:1003B0000A002530325820006B6579626F617264E3 +:1003C0005F7265706F72743A20004C45443A202584 +:1003D0003032580A00290A002575002F00257500C3 +:1003E0005D280025640020002564002000256400AD +:1003F00020002564007C0025303258006D6F757335 +:10040000656B6579205B62746E7C7820792076203C +:10041000685D287265702F61636C293A205B006DFE +:100420006B5F776865656C5F74696D655F746F5F3E +:100430006D6178203D2025640A006D6B5F776865EB +:10044000656C5F6D61785F7370656564203D202524 +:10045000640A006D6B5F74696D655F746F5F6D61D9 +:1004600078203D2025640A006D6B5F6D61785F73B5 +:1004700070656564203D2025640A006D6B5F696EC0 +:1004800074657276616C203D2025640A006D6B5F97 +:1004900064656C6179203D2025640A006D6B5F778F +:1004A0006865656C5F74696D655F746F5F6D6178B9 +:1004B000203D2025640A006D6B5F776865656C5F81 +:1004C0006D61785F7370656564203D2025640A0066 +:1004D0006D6B5F74696D655F746F5F6D6178203DF2 +:1004E0002025640A006D6B5F6D61785F73706565D0 +:1004F00064203D2025640A006D6B5F696E7465722F +:1005000076616C203D2025640A006D6B5F64656C2C +:100510006179203D2025640A000A00257500363ADD +:1005200020776865656C5F74696D655F746F5F6D7A +:1005300061783A20000A00257500353A2077686511 +:10054000656C5F6D61785F73706565643A20000A61 +:1005500000257500343A2074696D655F746F5F6DB6 +:1005600061783A20000A00257500333A206D6178E1 +:100570005F73706565643A20000A00257500323AA1 +:1005800020696E74657276616C286D73293A20005B +:100590000A00257500313A2064656C6179282A319A +:1005A000306D73293A20000A092D2056616C75655B +:1005B00073202D0A004D3E004D25643E20003F0073 +:1005C0007365742064656661756C740A00433E202F +:1005D0000077686572652064656C74613A206375A4 +:1005E00072736F723D25642C20776865656C3D25BC +:1005F000640A53656520687474703A2F2F656E2EF7 +:1006000077696B6970656469612E6F72672F7769AE +:100610006B692F4D6F7573655F6B6579730A000A9F +:10062000092D204D6F7573656B6579202D0A455333 +:10063000432F713A09717569740A313A0964656C1E +:100640006179282A31306D73290A323A09696E744A +:10065000657276616C286D73290A333A096D617889 +:100660005F73706565640A343A0974696D655F7417 +:100670006F5F6D61780A353A09776865656C5F6D03 +:1006800061785F73706565640A363A0977686565F5 +:100690006C5F74696D655F746F5F6D61780A0A7075 +:1006A0003A097072696E742076616C7565730A64BC +:1006B0003A097365742064656661756C74730A75B4 +:1006C000703A092B310A646F776E3A092D310A703E +:1006D0006775703A092B31300A7067646F776E3A2C +:1006E000092D31300A0A7370656564203D20646508 +:1006F0006C7461202A206D61785F73706565642079 +:100700002A2028726570656174202F2074696D65D8 +:100710005F746F5F6D6178290A003F004D3E2000D5 +:10072000433E20004C25640A000A092D20436F6EC9 +:10073000736F6C65202D0A4553432F713A0971750B +:1007400069740A6D3A096D6F7573656B65790A0096 +:100750000A092D204D61676963202D0A643A0964F6 +:10076000656275670A783A096465627567206D612C +:10077000747269780A6B3A096465627567206B6503 +:1007800079626F6172640A6D3A0964656275672007 +:100790006D6F7573650A763A0976657273696F6E67 +:1007A0000A733A097374617475730A633A09636F63 +:1007B0006E736F6C65206D6F64650A302D343A0975 +:1007C0006C61796572302D34284631302D463429DC +:1007D0000A506175733A09626F6F746C6F6164657A +:1007E000720A003F0074696D65725F7265616433FF +:1007F0003228293A202530346C580A006B6579621A +:100800006F6172645F69646C653A2025580A006BF9 +:100810006579626F6172645F70726F746F636F6C21 +:100820003A2025580A00686F73745F6B6579626FB0 +:100830006172645F6C65647328293A2025580A0048 +:100840000A092D20537461747573202D0A004743E3 +:10085000433A20342E392E32204156522D4C4942F3 +:10086000433A20312E382E3073766E204156525F37 +:10087000415243483A20617672350A004F5054493C +:100880004F4E533A204C554641204D4F5553454B02 +:1008900045592045585452414B455920434F4E53DA +:1008A0004F4C4520434F4D4D414E44204B45594DF3 +:1008B00041505F53454354494F4E20343039360A36 +:1008C000004255494C443A20633766643566632DCF +:1008D0006469727479202830343A31393A353120DC +:1008E0005365702031332032303136290A005649A1 +:1008F000443A2030784645454428742E6D2E6B2EA0 +:1009000029205049443A20307830313130284D3058 +:10091000313130206B6579626F61726420636F6E74 +:1009200076657274657229205645523A20307830C7 +:100930003130310A00444553433A20636F6E766587 +:100940007274204D30313130206B6579626F617285 +:100950006420746F205553420A000A092D20566501 +:100960007273696F6E202D0A000A6D6F7573653A98 +:10097000206F66660A000A6D6F7573653A206F6EA8 +:100980000A000A6B6579626F6172643A206F66666D +:100990000A000A6B6579626F6172643A206F6E0AB1 +:1009A000000A6D61747269783A206F66660A000AFF +:1009B0006D61747269783A206F6E0A000A6465622C +:1009C00075673A206F6E0A000A64656275673A209F +:1009D0006F66660A000A0A626F6F746C6F61646505 +:1009E000722E2E2E2000433E200011241FBECFEF7A +:1009F000DAE0DEBFCDBF04B603FE27C08091D4018C +:100A00009091D501A091D601B091D7018730904B3C +:100A1000A740B04BD1F41092D4011092D50110929E +:100A2000D6011092D70114BE84B7877F84BF0FB65A +:100A3000F894A8958091600088618093600010927E +:100A400060000FBEE0E0F8E3099511E0A0E0B1E03E +:100A5000EAE1FAE402C005900D92A233B107D9F79A +:100A600021E0A2E3B1E001C01D92A43DB207E1F78D +:100A70000E94DD0A0C940B250C940000FF93EF9369 +:100A8000E0913201F0913301309709F00995EF912F +:100A9000FF910895FC018591803011F0EFDFFBCFCD +:100AA0000895FF27E0E230E247FF0CC0419597FF31 +:100AB00009C0EDE26095709580959095611D711D5E +:100AC000811D911D27FF02C0219530E350E2AA2726 +:100AD000660F771F881F991FAA1FA41710F0A41B69 +:100AE00063955A95A9F7AA3008F0A95FA05DAF9366 +:100AF000F395611571058105910541F7ED3211F40A +:100B0000EF93F395F21718F43F93F395FBCF8F9182 +:100B1000B5DFFA95E1F70895E991F9918591803073 +:100B200021F0853219F0AADFF9CF089520E0E8948A +:100B300055915532C1F3503311F4689455915A339D +:100B400048F4505390F3220F022E220F220F200D53 +:100B5000250FF4CF0EF4219589919991533619F30D +:100B6000533729F1533559F1BC0188279927E89467 +:100B70005C3621F48991999168945591543639F4F1 +:100B800046EF7EF077FF0DC08FEF9FEF0AC055371D +:100B90004AE039F0583540E121F0523642E009F0A0 +:100BA0000895FF93EF937DDFEF91FF91B7CFFF9310 +:100BB000EF93FC0181918030B9F360DFFBCFFF93AD +:100BC000EF9368DFF1CFDF93CF93CDB7DEB72596F4 +:100BD000A3DFCF91DF9108950E94E106E4E3F1E005 +:100BE0008EE08E0F11928E13FDCF84E391E09093EF +:100BF000430180934201569A5E9A2FEF89E698E16D +:100C0000215080409040E1F700C00000569A5E9865 +:100C10000895CF93109244010E94FB07C82F8B3791 +:100C200009F444C08F3F09F441C081E0809344013E +:100C30008C2F869586958695E0914201F09143012F +:100C40004C2F4770C7FF0EC08F70E80FF11D21E0D9 +:100C500030E001C0220F4A95EAF7209580812823D1 +:100C600020830BC0E80FF11D81E090E001C0880FE8 +:100C70004A95EAF79081892B80838091B60180FFA5 +:100C800017C086E791E00E944A051F92CF9381E743 +:100C900091E09F938F930E94E3058EE691E00E947E +:100CA0004A050F900F900F900F9002C080E001C096 +:100CB00081E0CF9108952091420130914301F901E3 +:100CC000E80FF11D80810895EF92FF920F931F931B +:100CD000CF93DF938FE591E00E944A05C0E0D0E01A +:100CE0008AE5E82E81E0F82E02E511E0DF93CF934C +:100CF000FF92EF920E94E30587E591E00E944A058A +:100D0000E0914201F0914301EC0FFD1F80810E94B0 +:100D1000BF1B1F928F931F930F930E94E30580E5E3 +:100D200091E00E944A0521968DB79EB708960FB6AE +:100D3000F8949EBF0FBE8DBFCE30D105B9F6DF91BE +:100D4000CF911F910F91FF90EF900895569A81FFD8 +:100D500002C05E9A08955E9808955198599A089530 +:100D60005898509A08955098589A08955198599AB9 +:100D700085E08A95F1F7000089B186958170089524 +:100D8000CF93DF93EC010E94B606882341F02097B1 +:100D900031F085E08A95F1F700002197F4CFCE017C +:100DA000DF91CF9108958B3741F08F3F41F0982F1D +:100DB0009F7796958078892B08958BE708958FEF1C +:100DC00008950E94AD060E94B3062FEF83ED90E3D5 +:100DD000215080409040E1F700C000000895EF925C +:100DE000FF920F931F93CF93DF93E82E1092480149 +:100DF0000E94AD060E94B006CAEFD0E088EE93E0F4 +:100E00000E94C006892B21F42197C1F781E036C0EA +:100E100008E010E080E8F82E8AEF90E00E94C0061B +:100E2000892B11F483E02AC08F2D8E2129F00E9496 +:100E3000B306C8ECD0E00AC00E94B006FACF2097F3 +:100E400059F025E02A95F1F7000021970E94B60697 +:100E50008823A9F3CD2B11F484E010C0F69401503F +:100E60001109D1F68FE891E00197F1F700C0000079 +:100E70000E94AD060E94B30681E026C0809348011F +:100E800082EB91E00E944A05809148011F928F9366 +:100E90008DEA91E09F938F930E94E3058BEA91E0A6 +:100EA0000E944A059FEF29E688E19150204080404A +:100EB000E1F700C000000E94AD060E94B3060F904B +:100EC0000F900F900F9080E0DF91CF911F910F91C5 +:100ED000FF90EF9008950F931F93CF93DF9310929D +:100EE0004801CAEFD0E088EE93E00E94C006892B4B +:100EF00021F42197C1F781E02FC0D8E0C0E0CC0FEA +:100F000088EC90E00E94C006892B11F482E024C096 +:100F100008EC10E00E94B60681110AC00115110507 +:100F200049F025E02A95F1F7000001501109F2CFB0 +:100F3000012B11F483E010C05098589A85E08A95EF +:100F4000F1F700004899C160D150C9F60E94AD0682 +:100F50000E94B3068C2F26C0809348018AE991E055 +:100F60000E944A05809148011F928F9385E991E084 +:100F70009F938F930E94E30583E991E00E944A05C5 +:100F80009FEF29E688E1915020408040E1F700C0C2 +:100F900000000E94AD060E94B3060F900F900F90C4 +:100FA0000F908FEFDF91CF911F910F910895CF9305 +:100FB00084E10E94EF060E946B07C82F8B37C1F0B7 +:100FC0008091B60180FF0CC01F92CF938AE791E019 +:100FD0009F938F930E94E3050F900F900F900F90B7 +:100FE0008091B60180FF04C088E791E00E944A0525 +:100FF0008C2FCF910895CF93DF9380914701882361 +:1010000019F0109247017EC080914601882319F0A3 +:101010001092460177C0C0914501CC2319F010927F +:10102000450103C00E94D707C82F8C2F8F778137C7 +:10103000B1F0893709F061C00E94D707982F9F77D8 +:101040009D3041F018F4953039F404C0913111F01D +:101050009B3111F487FD37C00E94D3063AC00E942D +:10106000D707982F9F77913719F0993721F041C012 +:101070008093450142C00E94D707D82F8F778D30CB +:1010800041F018F4853081F504C0813111F08B31C5 +:1010900059F5C7FF11C0D7FF0AC08EE891E00E9442 +:1010A0004A058C2F0E94D306809346010BC089E825 +:1010B00091E00E944A0521C0D7FF0DC084E891E06D +:1010C0000E944A058D2F0E94D306982F9066909318 +:1010D0004701806417C08FE791E00E944A058D2F79 +:1010E0000E94D30680660EC08D2F0E94D3068064B6 +:1010F00002C00E94D306809347018C2FDF91CF91CD +:101100000C94D306DF91CF910895809154010895F6 +:101110009FB7F89410924B019FBF9091CB019430F0 +:1011200009F057C09091E9009F703091EC00232F97 +:10113000217030FD20E8922B24E02093E9002091DB +:10114000EB0020FF43C02091EE0027FF3FC020911D +:101150004901222321F02091E80025FF37C0109299 +:10116000490126E03091E80035FD15C03091CB01F2 +:10117000343061F53091EB0035FD28C0215021F469 +:1011800081E08093490122C0EFE9FFE03197F1F758 +:1011900000C00000E7CF8093F1008091E80085FD5A +:1011A0000AC08091E80080FFFCCF8091E8008E7734 +:1011B0008093E80006C08FB7F89421E020934B019C +:1011C0008FBF9F709093E90080E008959F70909387 +:1011D000E9008FEF0895CF93DF9300D01F92CDB732 +:1011E000DEB79C018091CB01843019F593E099839F +:1011F0003B832A839093E9008FEF9091E800815020 +:1012000095FD06C095ED9A95F1F700008111F5CF97 +:101210008091E80085FF0DC040E050E063E070E0A1 +:10122000CE0101960E949E0B8091E8008E778093FC +:10123000E8000F900F900F90DF91CF910895CF931A +:10124000DF9300D01F92CDB7DEB72091CB012430C1 +:1012500021F522E029839B838A8383E08093E90040 +:101260008FEF9091E800815095FD06C095ED9A951D +:10127000F1F700008111F5CF8091E80085FF0DC0E6 +:1012800040E050E063E070E0CE0101960E949E0BCA +:101290008091E8008E778093E8000F900F900F9078 +:1012A000DF91CF9108952091CB012430F1F422E019 +:1012B0002093E9002FEF3091E800215035FD06C062 +:1012C00035ED3A95F1F700002111F5CF2091E800B6 +:1012D00025FF0BC040E050E065E070E00E949E0BEF +:1012E0008091E8008E778093E8000895CF93DF9394 +:1012F0002091CB01243039F521E02093E9002FEF34 +:101300003091E800215035FD06C035ED3A95F1F7F2 +:1013100000002111F5CF2091E80025FF14C0EC0159 +:1013200040E050E068E070E00E949E0B8091E80091 +:101330008E778093E80088E0FE01ACE4B1E0019094 +:101340000D928A95E1F7DF91CF91089589EF91E0B1 +:101350000E944A058091CA01811109C00E94330D83 +:101360000E94900D8091E20084608093E2000895D5 +:1013700085EF91E00E944A051092CA01089581EF1D +:1013800091E00C944A0520914A012F5F822F62E37D +:101390000E94D124992319F020934A0108951092B4 +:1013A0004A0180914B01882371F18091CB018430F7 +:1013B00041F58091E9008F702091EC00922F91709F +:1013C00020FD90E8892B94E09093E9009091EB0048 +:1013D00090FF14C09091EE0097FF10C09091E8002C +:1013E00095FF03C01092F100F9CF9091E80090FFB3 +:1013F00005C09091E8009E779093E8008F708093ED +:10140000E90010924B01089542E061EC81E00E94F6 +:10141000AD0C42E061EC82E00E94AD0C42E061EC78 +:1014200083E00E94AD0C42E261EC84E00C94AD0CD0 +:101430008091CD01833009F453C030F4813071F0D4 +:10144000823009F48CC008958A3009F478C08B305A +:1014500009F45EC0893009F09AC020C08091CC01A7 +:10146000813A09F094C08091E800877F8093E8007A +:101470008091D0019091D101892B21F468E08CE416 +:1014800091E003C060E080E090E070E00E94E90B32 +:101490008091E8008B778093E80008958091CC01DB +:1014A000813209F074C08091D0019091D101892BD3 +:1014B00009F06DC08091E800877F8093E8008091FB +:1014C000E80082FD05C08091CB018111F8CF5FC09B +:1014D0008091F100809354018091E8008B7753C094 +:1014E0008091CC01813A09F052C08091D001909155 +:1014F000D101892B09F04BC08091E800877F809350 +:10150000E8008091E80080FFFCCF80910A0136C09E +:101510008091CC018132D9F58091D0019091D10197 +:10152000892BA9F58091E800877F8093E8000E94CD +:10153000E20C8091CE0180930A010C94F615809103 +:10154000CC01813221F58091E800877F8093E8000B +:101550000E94E20C8091CF01809355010895809103 +:10156000CC01813AA1F48091E800877F8093E80064 +:101570008091E80080FFFCCF809155018093F100BD +:101580008091E8008E778093E8000C94E20C089537 +:101590000895089508958DEE91E00E944A050C94F7 +:1015A000CA0A0E94E91B8091C901882329F00E9480 +:1015B000141C81110C94880B089584B7877F84BF15 +:1015C0000FB6F894A89580916000886180936000C0 +:1015D000109260000FBE90E080E80FB6F894809300 +:1015E0006100909361000FBE0E94C80A0E94A7107C +:1015F0000E94330D0E94900D8091E20084608093E0 +:10160000E20088E898E00E94BA1B78948091CB01B0 +:101610008430E1F788ED91E00E944A050E94A9100C +:1016200080E091E00E94151087EC91E00E944A054D +:101630000E94C90A8091CB01853039F483EC91E096 +:101640000E944A050E94D10AF5CF0E94AD10F2CF48 +:101650000C94281C89EE91E00E944A050C94280BFA +:10166000292F332723303105C9F064F421303105A7 +:1016700081F02230310509F043C084E790E025E491 +:1016800032E042C021323105F1F02232310541F120 +:1016900037C082E190E029EB32E036C099278130F3 +:1016A000910541F08230910541F0892B49F5E1E443 +:1016B000F2E005C0E1E3F2E002C0EDEFF1E0849179 +:1016C00090E09F0121C06430D8F4E62FF0E0EE0FE7 +:1016D000FF1FE15EFE4F2081318189E090E014C060 +:1016E000643070F470E0FB01EE0FFF1FE95EFE4F07 +:1016F00020813181FB01ED5EFE4F808190E004C0CE +:1017000080E090E020E030E0FA013183208308950A +:1017100080E189BD82E189BD09B400FEFDCF8091E1 +:10172000D8008F7D8093D8008091E0008260809304 +:10173000E0008091E00081FDFCCF0895CF92DF9220 +:10174000EF92FF920F931F93CF93DF93EC018B01E6 +:101750006A010E94010D811133C0C114D10439F016 +:10176000F60180819181081B190BC80FD91FE12C4C +:10177000F12C0115110519F18091E80085FD16C0C5 +:101780008091E8008E778093E800C114D10449F07D +:10179000F60180819181E80EF91EF182E08285E0F8 +:1017A0000FC00E94010D882321F30AC08991809304 +:1017B000F10001501109FFEFEF1AFF0ADACF80E0C4 +:1017C000DF91CF911F910F91FF90EF90DF90CF901D +:1017D00008952091D2013091D3012617370748F0A0 +:1017E0006115710539F42091E8002E772093E80007 +:1017F00001C0B90140E061157105A9F12091CB014B +:10180000222309F443C0253009F442C02091E800A6 +:1018100023FD40C02091E80022FD32C02091E80065 +:1018200020FFE9CF4091F3002091F20030E0342B0B +:10183000FC01CF016115710559F02830310540F4E4 +:1018400081918093F100615071092F5F3F4FF1CF7B +:1018500041E02830310509F040E02091E8002E7782 +:101860002093E800C8CF4111C9CF0AC08091CB01B5 +:10187000882361F0853061F08091E80083FD0AC023 +:101880008091E80082FFF2CF80E0089582E0089521 +:1018900083E0089581E008952091D2013091D30131 +:1018A0002617370748F06115710539F42091E800D3 +:1018B0002E772093E80001C0B901FC0120E06115FA +:1018C000710591F18091CB01882309F440C08530E6 +:1018D00009F43FC08091E80083FD3DC08091E8009D +:1018E00082FD2FC08091E80080FFE9CF2091F300B6 +:1018F0008091F20090E0922B6115710559F08830CB +:10190000910540F424912093F100319661507109C2 +:101910000196F2CF21E0089709F020E08091E800DD +:101920008E778093E800CBCF2111CCCF0AC0809175 +:10193000CB01882361F0853061F08091E80083FD60 +:101940000AC08091E80082FFF2CF80E0089582E033 +:10195000089583E0089581E00895982F973058F511 +:101960009093E900981739F07091EC002091ED0008 +:101970005091F00003C0242F762F50E021FF19C0B2 +:101980003091EB003E7F3093EB003091ED003D7FD6 +:101990003093ED003091EB0031603093EB007093A9 +:1019A000EC002093ED005093F0002091EE0027FF13 +:1019B00007C09F5FD3CF8F708093E90081E00895C7 +:1019C00080E008958091CC0187FF11C08091E800EC +:1019D00082FD05C08091CB018111F8CF11C08091AB +:1019E000E8008B770BC08091CB01882349F0809170 +:1019F000E80080FFF8CF8091E8008E778093E800C0 +:101A000008952091E4003091E50095E64091EC00C6 +:101A1000842F817040FF22C08091E80080FD1CC0AF +:101A20008091CB01882391F0853091F08091EB007B +:101A300085FD10C04091E4005091E5004217530726 +:101A400029F39A01915011F784E0089582E00895F6 +:101A500083E0089581E0089580E008954091E800D2 +:101A600042FFDECF08950E94A10D0E94A90DE0EE75 +:101A7000F0E0808181608083E8EDF0E080818F7705 +:101A8000808319BCA7EDB0E08C918E7F8C93808110 +:101A90008F7E80831092CA0108950F931F93CF9376 +:101AA000DF930E94A10D0E94A90DC8EDD0E08881AE +:101AB0008F77888388818068888388818F7D8883F9 +:101AC00019BC1092CB011092C7011092C90110925B +:101AD000C80100EE10E0F80180818B7F808388814F +:101AE0008160888342E060E080E00E94AD0CE1EE1E +:101AF000F0E080818E7F8083E2EEF0E08081816083 +:101B00008083808188608083F80180818E7F8083DC +:101B1000888180618883DF91CF911F910F91089513 +:101B2000E8EDF0E080818F7E8083E7EDF0E080815A +:101B30008160808384E082BF81E08093CA010C943D +:101B40004D0DE8EDF0E080818E7F80831092E20001 +:101B500008951092DA001092E10008951F920F92FA +:101B60000FB60F9211242F933F934F935F936F9370 +:101B70007F938F939F93AF93BF93EF93FF93809146 +:101B8000E10082FF0BC08091E20082FF07C08091DC +:101B9000E1008B7F8093E1000E94C3098091DA000D +:101BA00080FF1FC08091D80080FF1BC08091DA00A9 +:101BB0008E7F8093DA008091D90080FF0DC080E194 +:101BC00089BD82E189BD09B400FEFDCF81E080932B +:101BD000CB010E94A60905C019BC1092CB010E943E +:101BE000B8098091E10080FF19C08091E20080FF78 +:101BF00015C08091E2008E7F8093E2008091E20028 +:101C000080618093E2008091D80080628093D80048 +:101C100019BC85E08093CB010E94CB0A8091E10042 +:101C200084FF30C08091E20084FF2CC080E189BD38 +:101C300082E189BD09B400FEFDCF8091D8008F7D7F +:101C40008093D8008091E1008F7E8093E1008091A5 +:101C5000E2008F7E8093E2008091E20081608093B9 +:101C6000E2008091C701882311F084E007C08091D1 +:101C7000E30087FD02C081E001C083E08093CB01D7 +:101C80000E942A0B8091E10083FF29C08091E2002D +:101C900083FF25C08091E100877F8093E10082E08F +:101CA0008093CB011092C7018091E1008E7F8093D9 +:101CB000E1008091E2008E7F8093E2008091E2005B +:101CC00080618093E20042E060E080E00E94AD0C21 +:101CD0008091F00088608093F0000E94BF09FF911E +:101CE000EF91BF91AF919F918F917F916F915F9194 +:101CF0004F913F912F910F900FBE0F901F9018950D +:101D00001F920F920FB60F9211242F933F934F9370 +:101D10005F936F937F938F939F93AF93BF93CF9373 +:101D2000DF93EF93FF93C091E900CF708091EC00B7 +:101D3000D82FD17080FDD0E81092E9008091F0009A +:101D4000877F8093F00078940E94C40E1092E9007F +:101D50008091F00088608093F000CD2BCF70C0930D +:101D6000E900FF91EF91DF91CF91BF91AF919F91EA +:101D70008F917F916F915F914F913F912F910F9034 +:101D80000FBE0F901F9018951F93CF93DF93CDB781 +:101D9000DEB7AA970FB6F894DEBF0FBECDBFECEC4E +:101DA000F1E088E08E0F9091F10091938E13FBCFBC +:101DB0000E94180A8091E80083FF1FC18091CC0126 +:101DC0009091CD01492F50E04A30510508F015C1DE +:101DD000FA01EA5AFF4F0C94F124803881F08238DE +:101DE00009F00BC18091D0018F708093E900809140 +:101DF000EB0085FB882780F91092E90006C08091EE +:101E0000C8019091C901911182609091E800977F7B +:101E10009093E8008093F1001092F100C8C0282F41 +:101E20002D7F09F0EAC0882319F0823061F0E5C007 +:101E30008091CE01813009F0E0C0933009F080E05C +:101E40008093C9012BC08091CE01811127C0809160 +:101E5000D0018F7009F4D1C08093E9002091EB008C +:101E600020FF1CC0933021F48091EB00806214C0ED +:101E70009091EB0090619093EB0021E030E0A9019C +:101E800002C0440F551F8A95E2F74093EA00109272 +:101E9000EA008091EB0088608093EB001092E900EB +:101EA0008091E800877F86C08111A7C01091CE0184 +:101EB0001F778091E3008078812B8093E3008091ED +:101EC000E800877F8093E8000E94E20C8091E800A0 +:101ED00080FFFCCF8091E30080688093E3001111C4 +:101EE00002C082E001C083E08093CB0186C08058AD +:101EF000823008F082C08091CE019091CF018C3D5C +:101F000053E0950779F583E08A838AE289834FB7A6 +:101F1000F894DE01139620E03EE051E2E32FF0E07A +:101F200050935700E49120FF03C0E295EF703F5FAC +:101F3000EF708E2F90E0EA3010F0C79601C0C09687 +:101F40008D939D932F5F243149F74FBF8091E80017 +:101F5000877F8093E8006AE270E0CE0101960E94DC +:101F6000E90B14C0AE014F5F5F4F6091D0010E943A +:101F7000300BBC01892B09F440C09091E800977F99 +:101F80009093E80089819A810E944C0C8091E8002E +:101F90008B778093E80031C0803879F58091E80034 +:101FA000877F8093E8008091C7018093F100809142 +:101FB000E8008E778093E8000E94E20C1EC0811139 +:101FC0001CC09091CE019230C0F48091E800877FD0 +:101FD0008093E8009093C7010E94E20C8091C701B2 +:101FE000811106C08091E30087FD02C081E001C03D +:101FF00084E08093CB010E94040A8091E80083FF73 +:102000000AC08091E800877F8093E8008091EB0010 +:1020100080628093EB00AA960FB6F894DEBF0FBEE5 +:10202000CDBFDF91CF911F91089590935B01809375 +:102030005A010895E0915A01F0915B01309721F027 +:102040000190F081E02D099480E00895EF92FF92D5 +:102050000F931F93CF93DF93E0915A01F0915B01AF +:102060003097B1F18C010280F381E02D09958091C8 +:10207000B60182FF2DC080FF04C088EB93E00E9470 +:102080004A05E80118E082EBE82E83E0F82E809103 +:10209000B60180FF0BC088811F928F93FF92EF9251 +:1020A0000E94E3050F900F900F900F901150219612 +:1020B0001111EDCF8091B60180FF0AC080EB93E053 +:1020C000DF91CF911F910F91FF90EF900C944A05F3 +:1020D000DF91CF911F910F91FF90EF900895E091C4 +:1020E0005A01F0915B01309721F00480F581E02DD9 +:1020F000099408952091580130915901821793074E +:1021000071F09093590180935801E0915A01F09138 +:102110005B01309721F00680F781E02D0994089546 +:1021200020915601309157018217930771F09093D7 +:10213000570180935601E0915A01F0915B0130976D +:1021400021F00084F185E02D0994089508950C9400 +:10215000A6100E94531C0C94EC05CF92DF92EF92D4 +:10216000FF920F931F93CF93DF9300D000D000D046 +:10217000CDB7DEB70E9409068DE5C82E81E0D82EC6 +:1021800000E010E0E02E802F0E945B06F6014191F6 +:102190006F01F42EF826B1F40F5F1F4F0E301105BA +:1021A00089F78FEF89838A831B820E945C1C816080 +:1021B000782F9D838C8349815A816B818D810E9408 +:1021C0006C1147C09091B60191FF04C08E830E94AC +:1021D00064068E8120E030E04F2D50E0922FBA014E +:1021E000022E02C0759567950A94E2F760FF2BC036 +:1021F0002983EA8221E030E0690102C0CC0CDD1CB9 +:102200009A95E2F790E08C219D21892B09F420E03A +:102210002B830E945C1C8160782F9D838C83498175 +:102220005A816B818D810E946C1149815A816B8129 +:102230007C818D810E94D61BF801E35AFE4F80817C +:10224000C826C08206C02F5F3F4F2830310531F6C7 +:10225000A3CF0E94D51B0E941D1F10915C010E94FC +:102260001A10181741F10E941A1080935C01909186 +:10227000B60192FF0EC090FF0CC01F928F938AECA4 +:1022800093E09F938F930E94E3050F900F900F9020 +:102290000F9080915C0126960FB6F894DEBF0FBEBA +:1022A000CDBFDF91CF911F910F91FF90EF90DF9005 +:1022B000CF900C94E71B26960FB6F894DEBF0FBEA6 +:1022C000CDBFDF91CF911F910F91FF90EF90DF90E5 +:1022D000CF9008950C94A606CF93DF93CDB7DEB7C9 +:1022E0002B970FB6F894DEBF0FBECDBF942F4F8350 +:1022F000252F588769877A878B874A855B85452B89 +:1023000021F02F3F09F59F3FF9F4DE01119686E099 +:10231000FD0111928A95E9F785E0FE01379601905B +:102320000D928A95E1F749815A816B817C818D817B +:102330009E810E9490182B960FB6F894DEBF0FBEB8 +:10234000CDBFDF91CF9108954F81588569857A85FA +:102350008B850E94D61BD9CFCF93882309F4CDC09B +:10236000C82F823859F40E941A1081FDC6C089E333 +:102370000E941B1B0E94941B89E30CC0833879F4D4 +:102380000E941A1080FDB9C083E50E941B1B0E94A9 +:10239000941B83E50E94381BCF910C94941B8438C6 +:1023A00059F40E941A1082FDA8C087E40E941B1BEA +:1023B0000E94941B87E4EECF8CEF8C0F813A48F497 +:1023C0008C2F0E944722811198C08C2F0E941B1BCA +:1023D000E3CF80E28C0F883048F4C77081E001C001 +:1023E000880FCA95EAF70E945A1BD6CF8BE58C0F4F +:1023F000833078F4C53A29F0C63A31F083E890E0AA +:1024000005C081E890E002C082E890E0CF910C9492 +:102410007A1088E58C0F853108F06FC0C83A61F1F9 +:10242000C93A69F1CA3A71F1CB3A79F1CC3A81F102 +:10243000CD3A89F1CE3A91F1CF3A99F1C13BA1F170 +:10244000C03BA9F1C23BB1F1C33BB9F1C43BC1F1FF +:10245000C53BC9F1C63BD1F1C73BD9F1C83BE1F15E +:10246000C93BE9F1CA3BF1F1CB3BF9F1CC3B09F4B3 +:102470003FC080E090E03EC082EE90E03BC089EE3D +:1024800090E038C08AEE90E035C085EB90E032C035 +:1024900086EB90E02FC083EB90E02CC084EB90E0C3 +:1024A00029C087EB90E026C08CEC90E023C08DEC37 +:1024B00090E020C083E891E01DC08AE891E01AC056 +:1024C00082E991E017C084E991E014C081E292E0D2 +:1024D00011C083E292E00EC084E292E00BC085E27C +:1024E00092E008C086E292E005C087E292E002C076 +:1024F0008AE292E0CF910C949010CF9108958823B6 +:1025000009F44BC0823859F40E941A1081FF45C06B +:1025100089E30E941B1B0E94941B89E30CC0833833 +:1025200071F40E941A1080FF38C083E50E941B1BC3 +:102530000E94941B83E50E94381B0C94941B8438E2 +:1025400059F40E941A1082FF28C087E40E941B1BC6 +:102550000E94941B87E4EFCF9CEF980F913A58F3B9 +:1025600090E2980F983050F4877091E001C0990F75 +:102570008A95EAF7892F0E94601BDFCF9BE5980FB1 +:10258000933020F480E090E00C947A10885A8531E2 +:1025900020F480E090E00C9490100895882321F0BE +:1025A0000E945A1B0C94941B0895882321F00E94CA +:1025B000601B0C94941B0895CF92DF92EF92FF92D0 +:1025C0000F931F93CF93DF9300D000D000D0CDB7EF +:1025D000DEB725E0FC01DE01119601900D922A95EF +:1025E000E1F7FC0140813181F280258122952F7035 +:1025F00063817481672B09F4D8C23F3F19F44F3FC0 +:1026000009F4D3C26C0149833A8389819A812E836C +:102610000E94DA1A182F092F0E94D91A0E94E9196C +:10262000E02FE295EF70F0E0E05AFF4F2E810C941E +:10263000F124802F807F902F9F70092F882311F025 +:102640000295007FFF2049F0002309F45FC2802F2C +:102650000E946D1B0E94941B59C2812F0E947F1201 +:10266000002309F4A2C2802F0E94731B26960FB686 +:10267000F894DEBF0FBECDBFDF91CF911F910F91B8 +:10268000FF90EF90DF90CF900C94941B802F807F71 +:10269000902F9F70092F803211F00295007F112337 +:1026A00019F0113001F129C0FF20A9F0802F222359 +:1026B00049F1213039F526960FB6F894DEBF0FBEEA +:1026C000CDBFDF91CF911F910F91FF90EF90DF90E1 +:1026D000CF900C947D1B222319F0213009F465C2A0 +:1026E0000E94801B2CC0FF20E9F0263008F05DC25C +:1026F0000E94571B802329F022C0FF20F1F02111F6 +:1027000015C0802F26960FB6F894DEBF0FBECDBF42 +:10271000DF91CF911F910F91FF90EF90DF90CF90BD +:102720000C94CE12253008F040C209C0F601858114 +:1027300080FFECC18F708583E4CF2111FBC1802F16 +:1027400069C1202F26952695237030E0211531058B +:1027500021F021303105C9F028C2FF2021F0812F5E +:10276000902F937002C080E090E026960FB6F89408 +:10277000DEBF0FBECDBFDF91CF911F910F91FF90B4 +:10278000EF90DF90CF900C947A10FF2021F0812FF2 +:10279000902F937002C080E090E026960FB6F894D8 +:1027A000DEBF0FBECDBFDF91CF911F910F91FF9084 +:1027B000EF90DF90CF900C949010812FFF2019F0B4 +:1027C0000E94A31D02C00E940B1E26960FB6F8940D +:1027D000DEBF0FBECDBFDF91CF911F910F91FF9054 +:1027E000EF90DF90CF900C94901E802F837009F0B3 +:1027F00078C0F110DAC1812F829586958770880F95 +:10280000880F912F9F70C92ED12CE12CF12C082E0E +:1028100004C0CC0CDD1CEE1CFF1C0A94D2F714FF84 +:1028200012C04FE050E060E070E004C0440F551F5C +:10283000661F771F8A95D2F7CB01BA016095709514 +:102840008095909503C060E070E0CB01202F269525 +:1028500026952370422F50E042305105D1F043308D +:10286000510559F16C297D298E299F294130510547 +:1028700041F126960FB6F894DEBF0FBECDBFDF91B3 +:10288000CF911F910F91FF90EF90DF90CF900C941C +:10289000FE196C297D298E299F2926960FB6F8945A +:1028A000DEBF0FBECDBFDF91CF911F910F91FF9083 +:1028B000EF90DF90CF900C94101A0E94FE19C70180 +:1028C000B60126960FB6F894DEBF0FBECDBFDF91DE +:1028D000CF911F910F91FF90EF90DF90CF900C94CC +:1028E000EC19FF2019F0802F817001C08695882394 +:1028F00009F45BC1812F829586958770880F880FB8 +:10290000912F9F70C92ED12CE12CF12C082E04C0E0 +:10291000CC0CDD1CEE1CFF1C0A94D2F714FF12C075 +:102920004FE050E060E070E004C0440F551F661FA8 +:10293000771F8A95D2F7CB01BA0160957095809583 +:10294000909503C060E070E0CB01202F269526957E +:102950002370422F50E042305105D1F043305105F1 +:1029600059F16C297D298E299F294130510541F16A +:1029700026960FB6F894DEBF0FBECDBFDF91CF9184 +:102980001F910F91FF90EF90DF90CF900C94B51AAC +:102990006C297D298E299F2926960FB6F894DEBFD3 +:1029A0000FBECDBFDF91CF911F910F91FF90EF90A0 +:1029B000DF90CF900C94C71A0E94B51AC701B601D8 +:1029C00026960FB6F894DEBF0FBECDBFDF91CF9134 +:1029D0001F910F91FF90EF90DF90CF900C94A31A6E +:1029E000103F41F118F4103E48F48BC0123F09F437 +:1029F00050C0D8F1133F09F460C083C01F70802F0E +:102A00008F71FF2021F00E943C1A812F7BCE0E9403 +:102A10005D1A812F26960FB6F894DEBF0FBECDBF8C +:102A2000DF91CF911F910F91FF90EF90DF90CF90AA +:102A30000C94D512FF20A9F0253008F0B6C0802FE5 +:102A40008F7126960FB6F894DEBF0FBECDBFDF9113 +:102A5000CF911F910F91FF90EF90DF90CF900C944A +:102A6000821A263008F0A1C0EACFFF20A1F0802F03 +:102A70008F7126960FB6F894DEBF0FBECDBFDF91E3 +:102A8000CF911F910F91FF90EF90DF90CF900C941A +:102A90003C1AFF2061F3802F8F7126960FB6F894B1 +:102AA000DEBF0FBECDBFDF91CF911F910F91FF9081 +:102AB000EF90DF90CF900C945D1AFF2091F0802F63 +:102AC0008F7126960FB6F894DEBF0FBECDBFDF9193 +:102AD000CF911F910F91FF90EF90DF90CF900C94CA +:102AE000271A26960FB6F894DEBF0FBECDBFDF9132 +:102AF000CF911F910F91FF90EF90DF90CF900C94AA +:102B0000221AFF20A1F0222309F4B1CF812F2696AB +:102B10000FB6F894DEBF0FBECDBFDF91CF911F91EE +:102B20000F91FF90EF90DF90CF900C94AC11222387 +:102B300009F4B1CF812F26960FB6F894DEBF0FBEF1 +:102B4000CDBFDF91CF911F910F91FF90EF90DF905C +:102B5000CF900C947F12402F4F70612FC6010E94BE +:102B60001D1D26960FB6F894DEBF0FBECDBFDF91B8 +:102B7000CF911F910F91FF90EF90DF90CF900C9429 +:102B80003419402F4F70612FC60126960FB6F89466 +:102B9000DEBF0FBECDBFDF91CF911F910F91FF9090 +:102BA000EF90DF90CF900C94201D26960FB6F894EE +:102BB000DEBF0FBECDBFDF91CF911F910F91FF9070 +:102BC000EF90DF90CF9008950E947A1B0E94491BDE +:102BD0000E94941B0E94C21F0E94901E80E090E001 +:102BE0000E947A1080E090E00C9490100E946A1B82 +:102BF0000C94E4150E94DA1A292F22952F7030E0E8 +:102C00002C3031054CF42A3031056CF42250310956 +:102C10002230310588F407C02C30310549F02F30BF +:102C2000310531F009C0803E48F0803F29F406C0EC +:102C300093FB882780F9089580E0089581E0089546 +:102C4000CF93DF9300D000D01F92CDB7DEB70F90A7 +:102C50000F900F900F900F90DF91CF910895CF9329 +:102C6000DF9300D000D000D0CDB7DEB726960FB6E8 +:102C7000F894DEBF0FBECDBFDF91CF9108951F93B3 +:102C8000CF93DF93C0916B0116E080916C01C81760 +:102C900099F0D0E01C9FF0011D9FF00D1124E35925 +:102CA000FE4F4081518162817381848195810E94B0 +:102CB0002F162196C770E9CFDF91CF911F9108950C +:102CC00040919D0150919E0160919F017091A001E2 +:102CD0008091A1019091A2010C942F168091A201E4 +:102CE00082958F7009F054C080919F01882309F468 +:102CF0004FC080916B01A0916C0160919D0170911A +:102D00009E014091A0015091A101B6E08A1709F4FB +:102D10003FC090E041155105C1F17F3F11F46F3F75 +:102D2000A1F1B89FF001B99FF00D1124E359FE4FB6 +:102D3000218172132AC02081621327C022812111B0 +:102D400024C0238134812417350710F42150310920 +:102D5000241B350B283C3105C0F42091A2012F70B3 +:102D600020612093A20126E0289FF001299FF00D09 +:102D70001124EE58FE4F80818F70806180838DE931 +:102D800091E00E94DC120C943F1601968770BECF32 +:102D90000895CF92DF92EF92FF920F931F93CF93FC +:102DA000DF93CDB7DEB762970FB6F894DEBF0FBEE4 +:102DB000CDBF8C0185E0F801DE011D9601900D92DA +:102DC0008A95E1F7D8014C9111965C911197129672 +:102DD0006C9112971396CD90DC90149730919D01D1 +:102DE00070919E018091A0019091A101009709F43A +:102DF0006BC17F3F19F43F3F09F466C1E0909F012A +:102E0000EE2009F4C0C02091A201C816D90628F00E +:102E1000F601E81BF90BCF0104C0809590958C0D4D +:102E20009D1DFF24F394883C910578F0F12C207FC0 +:102E300009F0C6C07C2DD98AC88A89890E942016CB +:102E40008DE991E00E94DC12B1C0822F807F09F0F1 +:102E500046C0751314C0341312C0611110C02F7016 +:102E600020612093A2010E9460168DE991E00E94EA +:102E7000DC128091A201D80115968C932EC0CD282A +:102E800019F15F3F11F44F3FF9F0F62E61111CC0AC +:102E900080916B0120916C0136E0821709F45AC0D1 +:102EA00090E0389FF001399FF00D1124E359FE4F57 +:102EB0007181571306C07081471303C0728171116D +:102EC00003C001968770E9CFF62E662309F418C176 +:102ED0008091A20181608093A201F12C11C1751330 +:102EE00008C0341306C0611104C08091A201D8014A +:102EF000C3C04D875E878D859E856A8B0E94FA15BB +:102F00006A898823E1F16623D1F12091A201822F01 +:102F100082958F7090E0029774F080919D0190915E +:102F20009E0198878F831986DB86CA862C87CE01FF +:102F300007960E94DC1286E0F801ADE9B1E001904D +:102F40000D928A95E1F70E946E160E946016FF248A +:102F5000F394D6C04D875E878D859E850E94DA1AD0 +:102F6000292F22952F7030E0223031050CF0BCC0A3 +:102F70009F7009F0B6C0805E883008F4C1C0C801F7 +:102F80000E94DC12E4CFC816D90608F453C0F6013B +:102F9000E81BF90BCF01883C910508F450C0F12CD7 +:102FA0007C2DD98AC88A89890E942016EDE9F1E032 +:102FB00086E0DF011D928A95E9F70E946016A0C0A5 +:102FC000751314C0341312C0611110C08091A20196 +:102FD000F8018583C8010E94DC1286E0EDE9F1E08A +:102FE000DF011D928A95E9F7FE2C8AC04D875E8726 +:102FF0008D859E856A8B0E94FA156A89882309F45B +:10300000BECF662309F4BBCF2091A201822F829507 +:103010008F7090E002970CF48ECF80919D0190917B +:103020009E019A8389831B82DD82CC822E83CE010E +:1030300001967FCF809590958C0D9D1DACCFF62E7F +:10304000662309F49CCF75132EC034132CC0209135 +:10305000A20120FD1FC0822F82958F70D9F0D80168 +:1030600015962C9315978F3049F08F5F982F929576 +:10307000907F822F8F70892B15968C93C8010E94A8 +:10308000DC1286E0F801ADE9B1E001900D928A957D +:10309000E1F793CF86E0F801ADE9B1E001900D9240 +:1030A0008A95E1F72DC04D875E878D859E850E94AC +:1030B000FA15811140CF8091A20181608093A20115 +:1030C000C8010E94DC121CC0662309F458CF4D874A +:1030D0005E878D859E850E94FA15882309F44FCF5F +:1030E0002ACF811148CF0CC0243031050CF047CFD6 +:1030F0009F7009F440CFF8019581907F09F03BCF94 +:103100008F2D62960FB6F894DEBF0FBECDBFDF9154 +:10311000CF911F910F91FF90EF90DF90CF90089586 +:103120001F93CF93DF93CDB7DEB72C970FB6F894EC +:10313000DEBF0FBECDBF4F83588769877A878B87E5 +:103140009C87CE0107960E94C916882369F08F815B +:1031500098852A853B85232BF1F19F3F09F063C0B9 +:103160008F3F09F060C037C086E0FE013796DE0170 +:10317000119601900D928A95E1F76F817885EA8525 +:10318000FB85309741F17F3F11F46F3F21F1209192 +:103190006C0130E0C90101968770992740916B015D +:1031A00050E08417950709F447C069837A83FD834B +:1031B000EC8396E0929FD001939FB00D1124A35908 +:1031C000BE4FFE01319601900D929A95E1F78093E2 +:1031D0006C010E943F1616E080916B0190916C018A +:1031E0008917C1F1189FC001112483599E4F0E9475 +:1031F000C916882379F1E0916B011E9FF00111241B +:10320000E359FE4F408151816281738184819581B0 +:103210000E942F1680916B0190E00196877099278C +:1032200080936B01D9CF4F81588569857A858B85CD +:103230009C850E942F16CFCF0E94F61510926C012C +:1032400010926B01EDE9F1E086E0DF011D928A95B5 +:10325000E9F7C1CF2C960FB6F894DEBF0FBECDBFF5 +:10326000DF91CF911F910895DF92EF92FF920F931C +:103270001F93CF93DF93FC01892B09F48AC0E12CC3 +:10328000F12CDD24D394EF0121968491853709F444 +:1032900061C058F4843708F04EC0843008F06AC02A +:1032A0008130D1F0823071F174C0883709F45DC08B +:1032B00050F4863709F455C0873709F06AC08E2D5F +:1032C0000E94671B54C09CE7980F903708F061C0BC +:1032D0008F770E947F1250C08F010E5F1F4FFE013B +:1032E000849190E2980F983050F48770FD2D01C0C2 +:1032F000FF0F8A95EAF78F2F0E946D1B14C00E9462 +:10330000AC1113C08F010E5F1F4FFE01C49180E20C +:103310008C0F883060F4C7708D2D01C0880FCA955E +:10332000EAF70E94731B0E94941BE80125C08C2FB2 +:103330000E947F12FACF9F012E5F3F4FFE01C49182 +:10334000CC2369F08FE99FE00197F1F700C00000FE +:10335000C150F6CF9F012E5F3F4FFE01F490E9016F +:103360000BC00E94571BE82E07C00E946A1B0E94D8 +:10337000941B02C00E94AC118F2D882341F0EFE90D +:10338000FFE03197F1F700C000008150F6CFFE0159 +:103390007ACFDF91CF911F910F91FF90EF90DF9047 +:1033A00008956093A7017093A8018093A901909359 +:1033B000AA010E94E51B0C94E4156093A30170938D +:1033C000A4018093A5019093A6010E94E61B0C9492 +:1033D000E41508950C94D1190F931F930091A70140 +:1033E0001091A8012091A9013091AA01602B712BA5 +:1033F000822B932B1F910F910C94D1190F931F9334 +:103400000091A7011091A8012091A9013091AA0172 +:1034100060237123822393231F910F910C94D11960 +:103420000F931F930091A7011091A8012091A9016A +:103430003091AA0160277127822793271F910F914E +:103440000C94D11960E070E0CB010C94DD190F935E +:103450001F9341E050E060E070E08A019B0104C0EE +:10346000000F111F221F331F8A95D2F7C901B8011F +:103470001F910F910C94DD190F931F9341E050E0C1 +:1034800060E070E004C0440F551F661F771F8A95E7 +:10349000D2F78091A3019091A401A091A501B091D0 +:1034A000A6018A019B01082B192B2A2B3B2BC90152 +:1034B000B8011F910F910C94DD190F931F9341E0F8 +:1034C00050E060E070E004C0440F551F661F771F96 +:1034D0008A95D2F740955095609570958091A3019B +:1034E0009091A401A091A501B091A6018A019B0130 +:1034F000082319232A233B23C901B8011F910F91E7 +:103500000C94DD190F931F9341E050E060E070E0F0 +:1035100004C0440F551F661F771F8A95D2F780910C +:10352000A3019091A401A091A501B091A6018A01E7 +:103530009B01082719272A273B27C901B8011F919A +:103540000F910C94DD190F931F930091A30110911B +:10355000A4012091A5013091A601602B712B822B33 +:10356000932B1F910F910C94DD190F931F930091D2 +:10357000A3011091A4012091A5013091A60160231F +:103580007123822393231F910F910C94DD190F93C4 +:103590001F930091A3011091A4012091A5013091E6 +:1035A000A60160277127822793271F910F910C9402 +:1035B000DD190895CF92DF92EF92FF920F931F9340 +:1035C000CF93DF938C01C090A701D090A801E09029 +:1035D000A901F090AA014091A3015091A40160912A +:1035E000A5017091A601C42AD52AE62AF72ACFE1BF +:1035F000D0E0D701C6010C2E04C0B695A7959795CB +:1036000087950A94D2F780FF07C0B8018C2F0E94DB +:10361000F31C8130910531F4219758F7B80180E00F +:103620000E94F31CDF91CF911F910F91FF90EF90BB +:10363000DF90CF90089520910B0130910C01F9019A +:1036400032969FEF40E05191581789F09F3F19F44F +:10365000511101C0942F4F5F4630A9F79F3F39F0B9 +:10366000F901E90FF11D97FDFA95828308950895F8 +:1036700020910B0130910C01F9013296285F3F4FE8 +:103680009081981301C010823196E217F307C1F7B9 +:10369000089581E090E0E0910B01F0910C01E80FBA +:1036A000F91F1082019688309105A9F7089580913D +:1036B000B50108959091B501892B8093B5010895C6 +:1036C00080959091B50189238093B50108958093E9 +:1036D000B50108951092B50108959091B401892B18 +:1036E0008093B401089580959091B40189238093CB +:1036F000B40108951092B40108958093AB01089528 +:103700001092AB01089580910B0190910C01FC0186 +:1037100031969C01285F3F4F80E0919191118F5F1E +:10372000E217F307D1F70895E0910B01F0910C0136 +:103730008091B5018083E0910B01F0910C019081A3 +:103740008091B401892B80838091AB01882361F043 +:10375000E0910B01F0910C019081892B80830E94F4 +:10376000831B81111092AB0180910B0190910C0190 +:103770000C94261090933301809332010895829522 +:10378000982F9C7C392F36953695282F237344E04B +:10379000249FC0011124932F982B292F2A7A269534 +:1037A000892F8575880F822B08950895CF93DF9315 +:1037B00000D000D01F92CDB7DEB70F900F900F90C2 +:1037C0000F900F90DF91CF910895089508950C9474 +:1037D0006A118091CB01843021F11092B70120E46D +:1037E00088E190E00FB6F894A895809360000FBE32 +:1037F0002093600083B7817F846083BF83B781603B +:1038000083BF7894889583B78E7F83BF0FB6F89473 +:10381000A89580916000886180936000109260009C +:103820000FBE089508950895CF930E94121C0E9420 +:1038300009060E94131CC0E08C2F0E945B068111B8 +:1038400004C0CF5FCE30C1F701C081E0CF910895B1 +:103850000C94F6151F920F920FB60F9211248F93AE +:103860009F93AF93BF938091B701811113C0809153 +:10387000B8019091B901A091BA01B091BB014196F4 +:10388000A11DB11D8093B8019093B901A093BA0115 +:10389000B093BB01BF91AF919F918F910F900FBEDD +:1038A0000F901F90189582E084BD93E095BD9AEF2C +:1038B00097BD80936E0008952FB7F8948091B8015A +:1038C0009091B901A091BA01B091BB012FBF0895A9 +:1038D0002FB7F8946091B8017091B9018091BA0145 +:1038E0009091BB012FBF0895CF92DF92EF92FF928C +:1038F0000F931F932FB7F8944091B8015091B901DD +:103900006091BA017091BB012FBF6A017B01EE2467 +:10391000FF248C0120E030E0C016D106E206F30659 +:1039200010F4415051099A01281B390BC9011F910C +:103930000F91FF90EF90DF90CF9008951F920F921C +:103940000FB60F9211248F939F93AF93BF938091E3 +:10395000B8019091B901A091BA01B091BB01019653 +:10396000A11DB11D8093B8019093B901A093BA0134 +:10397000B093BB01BF91AF919F918F910F900FBEFC +:103980000F901F9018950E94330DF8942FEF87EA3F +:1039900091E6215080409040E1F700C0000087E0B0 +:1039A00090EBDC018093D4019093D501A093D601D4 +:1039B000B093D7019CE088E10FB6F894A895809366 +:1039C00060000FBE90936000FFCF28E0929FF0014F +:1039D0001124E80FF11DE052FF4F9491892F8F7051 +:1039E00092959F700895CF93C82FCB010E94E51C3C +:1039F000282F30E080E1989FA0011124422B532B07 +:103A00004038510519F480E090E015C09770E92F17 +:103A1000F0E088E0C89FE00DF11D112484E0EE0F76 +:103A2000FF1F8A95E1F7E20FF31FEE0FFF1FE05033 +:103A3000F84985919491CF91089580E090E00895A0 +:103A400008958091BE0180FF0BC06091100185E058 +:103A5000689FB001112475956795759567952BC082 +:103A600081FF09C06091100185E0689FB0011124B9 +:103A70007595679520C082FF07C06091100185E0B1 +:103A8000689FB001112417C09091BF019923D1F014 +:103A900060910F01961788F72091100185E0289F0B +:103AA00090011124929FA001939F500D112470E06A +:103AB000CA010E94DD246038710540F4611571056A +:103AC00039F002C065E070E0862F08958FE7089511 +:103AD00081E008958091BE0180FF08C060910E01D1 +:103AE00070E0759567957595679521C081FF06C053 +:103AF00060910E0170E07595679519C082FF04C052 +:103B000060910E0170E010C09091BF019923C1F047 +:103B100060910D019617A0F780910E01899FC00159 +:103B2000112470E00E94DD246038710528F46115CD +:103B3000710521F0862F08958FE7089581E008959B +:103B400061E070E0F4CF803F21F40E94211D819557 +:103B500004C0813F29F40E94211D8093C201089571 +:103B6000823F21F40E94211D819504C0833F29F4E6 +:103B70000E94211D8093C1010895893F19F40E947C +:103B80006A1D05C08A3F31F40E946A1D81958093A9 +:103B9000C30108958B3F21F40E946A1D819504C0E2 +:103BA0008C3F29F40E946A1D8093C4010895843FCC +:103BB00021F48091C001816017C0853F21F480917C +:103BC000C001826011C0863F21F48091C0018460F1 +:103BD0000BC0873F21F48091C001886005C0883FF9 +:103BE00031F48091C00180618093C00108958D3FC0 +:103BF00021F48091BE0181600BC08E3F21F4809141 +:103C0000BE01826005C08F3F29F48091BE018460AF +:103C10008093BE010895803F39F48091C20187FFEF +:103C20006CC01092C20169C0813F29F48091C20129 +:103C30001816BCF362C09091C101823F29F497FF2E +:103C40005CC01092C10159C0833F19F41916CCF31E +:103C500054C0893F41F48091C30118160CF04DC047 +:103C60001092C3014AC08A3F29F48091C30187FFA3 +:103C700044C0F6CF8B3F39F48091C40187FF3DC02B +:103C80001092C4013AC08C3F29F48091C4011816E7 +:103C9000BCF333C0843F21F48091C0018E7F17C0F4 +:103CA000853F21F48091C0018D7F11C0863F21F4B2 +:103CB0008091C0018B7F0BC0873F21F48091C001B0 +:103CC000877F05C0883F31F48091C0018F7E80934B +:103CD000C00113C08D3F21F48091BE018E7F0BC0C7 +:103CE0008E3F21F48091BE018D7F05C08F3F29F466 +:103CF0008091BE018B7F8093BE018091C1018111B3 +:103D00000EC08091C20181110AC08091C30181114E +:103D100006C08091C401811102C01092BF010895B4 +:103D20008091B60183FF7EC08CEF93E00E944A052C +:103D30008091C0011F928F9387EF93E09F938F93A1 +:103D40000E94E30585EF93E00E944A058091C1013E +:103D5000282F082E000C330B3F938F9382EF93E0B4 +:103D60009F938F930E94E30580EF93E00E944A05A2 +:103D70008091C201282F082E000C330B3F938F93A4 +:103D80008DEE93E09F938F930E94E3058BEE93E07B +:103D90000E944A058091C301282F082E000C330B86 +:103DA0003F938F9388EE93E09F938F930E94E30558 +:103DB00086EE93E00E944A058091C401282F082EC8 +:103DC000000C330B3F938F9383EE93E09F938F937D +:103DD0000E94E30580EE93E00E944A058091BF01B6 +:103DE0001F928F938DED93E09F938F930E94E30535 +:103DF0008BED93E00E944A058091BE011F928F9344 +:103E000088ED93E09F938F930E94E30585ED93E007 +:103E10000E944A058DB79EB74C960FB6F8949EBF88 +:103E20000FBE8DBF80EC91E00E946F100E945C1C61 +:103E30009093BD018093BC0108951F93CF93DF93AE +:103E40008091BC019091BD010E94741CAC019091C5 +:103E5000BF01992321F02091110130E006C020918B +:103E600012018AE0289F900111244217530708F499 +:103E700085C08091C101C091C201D091C301109150 +:103E8000C401811107C0C11175C0D11173C01111D6 +:103E900071C074C09F3F19F09F5F9093BF011816C7 +:103EA00024F40E94211D8093C1018091C10187FFEC +:103EB00005C00E94211D81958093C1011C1624F428 +:103EC0000E94211D8093C2018091C20187FF05C01D +:103ED0000E94211D81958093C2016091C1016623DA +:103EE00031F1C091C201CC2311F1062E000C770BE9 +:103EF000880B990B0E94D82323E333E343E35FE36A +:103F00000E943C240E94A0236093C1016C2FCC0F1F +:103F1000770B880B990B0E94D82323E333E343E309 +:103F20005FE30E943C240E94A0236093C2011D16FF +:103F300024F40E946A1D8093C3018091C30187FF0E +:103F400005C00E946A1D81958093C301111624F457 +:103F50000E946A1D8093C4018091C40187FF05C03F +:103F60000E946A1D81958093C401DF91CF911F91BA +:103F70000C94901E9F3F09F08FCF97CFDF91CF9188 +:103F80001F910895E0ECF1E085E0DF011D928A9534 +:103F9000E9F71092BF011092BE0108958FE196E0FB +:103FA0000E944A051F9281E08F931F9285E08F93B4 +:103FB00081ED95E09F938F930E94E3050F900F9002 +:103FC0000F900F900F900F9008958330E9F128F42F +:103FD000813061F0823009F10895853009F462C0C2 +:103FE00008F449C0863009F474C008958091120124 +:103FF000262F30E0280F311D2F3F310524F4680FA4 +:104000006093120103C08FEF80931201809112011F +:104010001F928F938AE095E072C080911101262F44 +:1040200030E0280F311D2F3F310524F4680F6093D5 +:10403000110103C08FEF80931101809111011F9234 +:104040008F9388EF94E05BC080911001262F30E0C1 +:10405000280F311D2F3F310524F4680F60931001A4 +:1040600003C08FEF80931001809110011F928F93F6 +:1040700085EE94E044C080910F01262F30E0280F98 +:10408000311D2F3F310524F4680F60930F0103C0E9 +:104090008FEF80930F0180910F011F928F9380ED1E +:1040A00094E02DC080910E01262F30E0280F311DA5 +:1040B0002F3F310524F4680F60930E0103C08FEF8A +:1040C00080930E0180910E011F928F9387EB94E0F5 +:1040D00016C080910D01262F30E0280F311D2F3F93 +:1040E000310524F4680F60930D0103C08FEF8093B6 +:1040F0000D0180910D011F928F938CE994E09F93A5 +:104100008F930E94E3050F900F900F900F900895EA +:10411000833081F128F4813059F08230D1F0089554 +:10412000853009F449C0B8F1863009F456C00895C5 +:1041300080911201681720F4861B8093120102C03F +:1041400010921201809112011F928F938DE894E0DA +:1041500054C080911101681720F4861B80931101CF +:1041600002C010921101809111011F928F938BE771 +:1041700094E043C080911001681720F4861B80935F +:10418000100102C010921001809110011F928F93B4 +:1041900088E694E032C080910F01681720F4861BF6 +:1041A00080930F0102C010920F0180910F011F92A6 +:1041B0008F9383E594E021C080910E01681720F46D +:1041C000861B80930E0102C010920E0180910E0199 +:1041D0001F928F938AE394E010C080910D016817BD +:1041E00020F4861B80930D0102C010920D01809176 +:1041F0000D011F928F938FE194E09F938F930E9404 +:10420000E3050F900F900F900F900895CF93C82F54 +:104210001F928F9384E297E09F938F930E94E30510 +:1042200081E090E0A0E0B0E0BC01CD0104C0660FE9 +:10423000771F881F991FCA95D2F70E94EA190F901D +:104240000F900F900F90CF910C94F615CF9387326B +:1042500088F58E3108F00BC18E3009F487C0D8F490 +:10426000873009F460C08B3009F44FC0863009F004 +:1042700002C18091B601817F8E7F8093B60189E271 +:1042800097E00E944A0586EE99E00E944A0581E087 +:104290008093C60146C0863109F4B0C020F4803155 +:1042A00009F47AC0E8C0893109F491C08B3109F46E +:1042B00049C0E1C0883349F150F4893209F4D5C0CE +:1042C000853309F4D2C0873209F0D5C0CEC083341B +:1042D00009F4CBC028F48A3308F4CDC08953C8C090 +:1042E000883409F0C8C00E94F61585ED99E00E9457 +:1042F0004A052FEF83ED90E3215080409040E1F795 +:1043000000C000000E94C31C0CC080E597E041C0C3 +:104310008CEB99E00E944A058091B6018160809300 +:10432000B601C1E0ADC08091B601C82FC17080FF59 +:10433000EFCF88EC99E00E944A058091B601817F19 +:104340008E7F3FC09091B60191FBCC27C0F981E0F0 +:10435000C827892FC0FB81F98093B601CC2319F0BF +:104360008FEA99E029C081EA99E013C09091B601E3 +:1043700092FBCC27C0F981E0C827892FC0FB82F9C6 +:104380008093B601CC2319F082E999E015C082E848 +:1043900099E00E944A05C5CF9091B60193FBCC27C6 +:1043A000C0F981E0C827892FC0FB83F98093B6014B +:1043B000CC2351F086E799E00E944A058091B6012E +:1043C00081608093B6015CC089E699E0E2CF8AE51E +:1043D00099E00E944A0585E399E00E944A058EEE25 +:1043E00098E00E944A0581EC98E00E944A058CE71B +:1043F00098E00E944A058EE498E0CBCF80E498E0F4 +:104400000E944A050E941A101F928F9386E298E03C +:104410009F938F930E94E30580910A011F928F93CF +:104420008FE098E09F938F930E94E3058091550160 +:104430001F928F938CEF97E09F938F930E94E305D9 +:104440000E94681C9F938F937F936F9385EE97E0F4 +:104450009F938F930E94E3058DB79EB742960FB648 +:10446000F8949EBF0FBE8DBF5CCF80E001C08D5120 +:104470000E94062156CF83EE97E00E944A05C0E0D5 +:104480008C2FCF91089580E0089580E00895CF9318 +:10449000C82F8091C601813081F020F0823009F46C +:1044A0004FC046C1E0910B01F0910C0180818E302C +:1044B00069F0873009F03EC109C0E0910B01F0912D +:1044C0000C0180818E3011F0873061F48C2F0E94B6 +:1044D0004322811104C08C2F0E9426212FC081E02D +:1044E00090E02CC08C2F0E944522811126C0C4313F +:1044F000E1F070F4CB3081F0C031D1F40E94CE1FD6 +:104500008CE197E00E944A0582E08093C60115C0C5 +:10451000C93259F0C83361F489E297E00E944A0534 +:1045200080E297E00E944A0508C01092C60104C1CB +:104530008AE197E00E944A05FFC081E08170FEC0D9 +:10454000C43228F5CE3108F0C1C0CB30A1F1D0F48F +:10455000C73009F0D3C08EE18093120182E38093CB +:1045600011018AE08093100184E180930F0188E0BB +:1045700080930E0188E280930D0180EC95E00E940B +:104580004A05BFC0C33149F1C431C1F0B7C0CB3413 +:1045900009F4A9C028F4C93289F0C83361F0AEC06B +:1045A000C13509F49EC0C23509F499C0CE3409F072 +:1045B000A5C06AE09EC00E94CE1FA3C08091C50125 +:1045C000882319F01092C5019CC08DEC95E00E94E3 +:1045D0004A0581E08093C601B1C087EA95E00E9458 +:1045E0004A0585E995E00E944A05809112011F92D3 +:1045F0008F9382E995E09F938F930E94E30580E972 +:1046000095E00E944A058EE795E00E944A05809158 +:1046100011011F928F938BE795E09F938F930E94D8 +:10462000E30589E795E00E944A058AE695E00E9445 +:104630004A05809110011F928F9387E695E09F9322 +:104640008F930E94E30585E695E00E944A0584E584 +:1046500095E00E944A0580910F011F928F9381E59A +:1046600095E09F938F930E94E3058FE495E00E946D +:104670004A058AE395E00E944A0580910E011F9247 +:104680008F9387E395E09F938F930E94E30585E3E3 +:1046900095E00E944A058EE195E00E944A058091CE +:1046A0000D011F928F938BE195E09F938F930E9452 +:1046B000E30589E195E00E944A058DB79EB74896CB +:1046C0000FB6F8949EBF0FBE8DBF1BC0CE51EC2F0E +:1046D000F0E0E95DFE4F80818093C50112C061E08A +:1046E00003C061E006C06AE08091C5010E94E51F39 +:1046F00008C08091C5010E94882003C08EEB95E020 +:1047000013C08091C501882369F01F928F9388EBB5 +:1047100095E09F938F930E94E3050F900F900F9069 +:104720000F9004C085EB95E00E944A0581E006C029 +:104730001092C60180E002C080E000CFCF910895C2 +:104740000E94A7236894B1110C94362408950E9406 +:104750001B2488F09F5798F0B92F9927B751B0F0D4 +:10476000E1F0660F771F881F991F1AF0BA95C9F7F5 +:1047700014C0B13091F00E943524B1E008950C943A +:104780003524672F782F8827B85F39F0B93FCCF3ED +:10479000869577956795B395D9F73EF49095809572 +:1047A000709561957F4F8F4F9F4F0895E89409C092 +:1047B00097FB3EF490958095709561957F4F8F4F54 +:1047C0009F4F9923A9F0F92F96E9BB279395F6956A +:1047D000879577956795B795F111F8CFFAF4BB0FE8 +:1047E00011F460FF1BC06F5F7F4F8F4F9F4F16C04C +:1047F000882311F096E911C0772321F09EE8872FD6 +:10480000762F05C0662371F096E8862F70E060E091 +:104810002AF09A95660F771F881FDAF7880F96950A +:10482000879597F9089557FD9058440F551F59F0F3 +:104830005F3F71F04795880F97FB991F61F09F3F8D +:1048400079F087950895121613061406551FF2CFB6 +:104850004695F1DF08C0161617061806991FF1CF06 +:1048600086957105610508940895E894BB2766272D +:104870007727CB0197F908950E944F240C94C02408 +:104880000E94B22438F00E94B92420F0952311F040 +:104890000C94A9240C94AF2411240C9436240E9467 +:1048A000132470F3959FC1F3950F50E0551F629F3D +:1048B000F001729FBB27F00DB11D639FAA27F00D79 +:1048C000B11DAA1F649F6627B00DA11D661F829FA0 +:1048D0002227B00DA11D621F739FB00DA11D621F85 +:1048E000839FA00D611D221F749F3327A00D611DA2 +:1048F000231F849F600D211D822F762F6A2F112484 +:104900009F5750409AF0F1F088234AF0EE0FFF1FB6 +:10491000BB1F661F771F881F91505040A9F79E3F0D +:10492000510580F00C94A9240C9436245F3FE4F3E5 +:10493000983ED4F3869577956795B795F795E79563 +:104940009F5FC1F7FE2B880F911D9695879597F96C +:10495000089597F99F6780E870E060E008959FEF01 +:1049600080EC089500240A94161617061806090606 +:10497000089500240A9412161306140605060895D5 +:10498000092E0394000C11F4882352F0BB0F40F45D +:10499000BF2B11F460FF04C06F5F7F4F8F4F9F4F9D +:1049A0000895991B79E004C0991F961708F0961B8B +:1049B000881F7A95C9F78095089597FB072E16F4FE +:1049C000009407D077FD09D00E94F72407FC05D09A +:1049D0003EF4909581959F4F0895709561957F4F16 +:1049E0000895EE0FFF1F0590F491E02D0994AA1B86 +:1049F000BB1B51E107C0AA1FBB1FA617B70710F0CA +:104A0000A61BB70B881F991F5A95A9F780959095FB +:0A4A1000BC01CD010895F894FFCF1A +:104A1A008508760953091F09EB0801AC0128081417 +:104A2A000A321E404D362270032303ED02CB025791 +:104A3A000270028902A2020102030405060708099C +:024A4A0000006A +:106800000000000000000000040005000600070072 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280000002A002B002C002D002E002F0005 +:10686000300031A1320033003400350036003700EB +:106870003800E00000000000000000000000000000 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000004F00A9 +:1068A000500051005200530067005400550056003C +:1068B000580059005A005B005C005D005E005F00FC +:1068C0006000610062006300640000005700000087 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000E100E200E300000000000000F1A160 +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010000004C00010001004400450052000D +:1069600049000100010050004F0029004D004E0079 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E000010001000100010001000100010001009F +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/m0110_usb/binary/m0110_usb_rev2_unimap.hex b/converter/m0110_usb/binary/m0110_usb_rev2_unimap.hex new file mode 100644 index 00000000..fd7f83f2 --- /dev/null +++ b/converter/m0110_usb/binary/m0110_usb_rev2_unimap.hex @@ -0,0 +1,1215 @@ +:100000000C94D6040C941D050C941D050C941D0530 +:100010000C941D050C941D050C941D050C941D05D8 +:100020000C941D050C941D050C941D050C94580D85 +:100030000C94070E0C94C01B0C941D050C941D050C +:100040000C941D050C941D050C941D050C94341C7A +:100050000C941D050C941D050C941D050C941D0598 +:100060000C941D050C941D050C941D050C941D0588 +:100070000C941D05740E960E840F960E840FDB0EE5 +:10008000FE0E840F530F660FA012A012CD12CD12D8 +:10009000281364135C155C157C135C1577147714B6 +:1000A00032155C155C154815041607090B0A1D1B53 +:1000B00006198005141A08151C171E1F202123225B +:1000C0002E26242D25273012182F0C13280F0D341F +:1000D0000E333136381110372B2C352A7F80807B38 +:1000E00079397A808080808080634F80808050530F +:1000F0005180808058525780808062595A5B5C5D85 +:100100005E5F8060618080808080568080806680B5 +:1001100054808080805580800A0025303862003A03 +:10012000200025303258000A722F632030313233DC +:10013000343536370A005D0A0025303258005B003E +:10014000200025303258002831290A002832290A97 +:10015000002833290A002834290A000A00253032F1 +:1001600058006D303131305F726563762065727290 +:100170003A20000A0025303258006D303131305FAE +:1001800073656E64206572723A20005B735D004B8C +:100190006579626F6172642073746172742E0A00F3 +:1001A00055534220636F6E666967757265642E0AE7 +:1001B000005B575D005B535D005B525D0032034D99 +:1001C00000300031003100300020006B0065007904 +:1001D0000062006F00610072006400200063006F25 +:1001E000006E007600650072007400650072000009 +:1001F000000E0374002E006D002E006B002E000018 +:10020000000403090409027400040100A032090477 +:100210000000010301010009211101000122400039 +:100220000705810308000A09040100010301020017 +:10023000092111010001224D000705820308000A6F +:10024000090402000103000000092111010001223C +:1002500036000705830308000A09040300020300AF +:10026000000009211101000122220007058403205A +:100270000001070504032000011201100100000025 +:1002800008EDFE10010101010200010631FF0974B1 +:10029000A1010975150026FF009520750881020946 +:1002A00076150026FF00952075089102C00501090A +:1002B00080A101850216810026B7001A81002AB7A5 +:1002C00000751095018100C0050C0901A10185038D +:1002D000160100269C021A01002A9C027510950145 +:1002E0008100C005010902A1010901A10005091948 +:1002F00001290515002501950575018102950175F6 +:100300000381010501093009311581257F950275A9 +:1003100008810609381581257F9501750881060534 +:100320000C0A38021581257F950175088106C0C029 +:1003300005010906A101050719E029E715002501B6 +:10034000950875018102950175088101050819015B +:100350002905950575019102950175039101050720 +:10036000190029FF150026FF00950675088100C0B9 +:100370000A002530325820006B6579626F61726423 +:100380005F7265706F72743A20004C45443A2025C4 +:100390003032580A00290A002575002F0025750003 +:1003A0005D280025640020002564002000256400ED +:1003B00020002564007C0025303258006D6F757375 +:1003C000656B6579205B62746E7C7820792076207D +:1003D000685D287265702F61636C293A205B006D3F +:1003E0006B5F776865656C5F74696D655F746F5F7F +:1003F0006D6178203D2025640A006D6B5F7768652C +:10040000656C5F6D61785F7370656564203D202564 +:10041000640A006D6B5F74696D655F746F5F6D6119 +:1004200078203D2025640A006D6B5F6D61785F73F5 +:1004300070656564203D2025640A006D6B5F696E00 +:1004400074657276616C203D2025640A006D6B5FD7 +:1004500064656C6179203D2025640A006D6B5F77CF +:100460006865656C5F74696D655F746F5F6D6178F9 +:10047000203D2025640A006D6B5F776865656C5FC1 +:100480006D61785F7370656564203D2025640A00A6 +:100490006D6B5F74696D655F746F5F6D6178203D32 +:1004A0002025640A006D6B5F6D61785F7370656510 +:1004B00064203D2025640A006D6B5F696E7465726F +:1004C00076616C203D2025640A006D6B5F64656C6D +:1004D0006179203D2025640A000A00257500363A1E +:1004E00020776865656C5F74696D655F746F5F6DBB +:1004F00061783A20000A00257500353A2077686552 +:10050000656C5F6D61785F73706565643A20000AA1 +:1005100000257500343A2074696D655F746F5F6DF6 +:1005200061783A20000A00257500333A206D617821 +:100530005F73706565643A20000A00257500323AE1 +:1005400020696E74657276616C286D73293A20009B +:100550000A00257500313A2064656C6179282A31DA +:10056000306D73293A20000A092D2056616C75659B +:1005700073202D0A004D3E004D25643E20003F00B3 +:100580007365742064656661756C740A00433E206F +:100590000077686572652064656C74613A206375E4 +:1005A00072736F723D25642C20776865656C3D25FC +:1005B000640A53656520687474703A2F2F656E2E37 +:1005C00077696B6970656469612E6F72672F7769EF +:1005D0006B692F4D6F7573655F6B6579730A000AE0 +:1005E000092D204D6F7573656B6579202D0A455374 +:1005F000432F713A09717569740A313A0964656C5F +:100600006179282A31306D73290A323A09696E748A +:10061000657276616C286D73290A333A096D6178C9 +:100620005F73706565640A343A0974696D655F7457 +:100630006F5F6D61780A353A09776865656C5F6D43 +:1006400061785F73706565640A363A097768656535 +:100650006C5F74696D655F746F5F6D61780A0A70B5 +:100660003A097072696E742076616C7565730A64FC +:100670003A097365742064656661756C74730A75F4 +:10068000703A092B310A646F776E3A092D310A707E +:100690006775703A092B31300A7067646F776E3A6C +:1006A000092D31300A0A7370656564203D20646548 +:1006B0006C7461202A206D61785F737065656420B9 +:1006C0002A2028726570656174202F2074696D6519 +:1006D0005F746F5F6D6178290A003F004D3E200016 +:1006E000433E20004C25640A000A092D20436F6E0A +:1006F000736F6C65202D0A4553432F713A0971754C +:1007000069740A6D3A096D6F7573656B65790A00D6 +:100710000A092D204D61676963202D0A643A096436 +:10072000656275670A783A096465627567206D616C +:10073000747269780A6B3A096465627567206B6543 +:1007400079626F6172640A6D3A0964656275672047 +:100750006D6F7573650A763A0976657273696F6EA7 +:100760000A733A097374617475730A633A09636FA3 +:100770006E736F6C65206D6F64650A302D343A09B5 +:100780006C61796572302D34284631302D4634291C +:100790000A506175733A09626F6F746C6F616465BA +:1007A000720A003F0074696D65725F72656164333F +:1007B0003228293A202530346C580A006B6579625A +:1007C0006F6172645F69646C653A2025580A006B3A +:1007D0006579626F6172645F70726F746F636F6C62 +:1007E0003A2025580A00686F73745F6B6579626FF1 +:1007F0006172645F6C65647328293A2025580A0089 +:100800000A092D20537461747573202D0A00474323 +:10081000433A20342E392E32204156522D4C494233 +:10082000433A20312E382E3073766E204156525F77 +:10083000415243483A2061767233350A004F505492 +:10084000494F4E533A204C554641204D4F55534544 +:100850004B45592045585452414B455920434F4E22 +:10086000534F4C4520434F4D4D414E44204B45592D +:100870004D41505F53454354494F4E203430393633 +:100880000A004255494C443A206337666435666332 +:100890002D6469727479202830343A31393A31390B +:1008A000205365702031332032303136290A00560A +:1008B00049443A2030784645454428742E6D2E6BC5 +:1008C0002E29205049443A20307830313130284D9B +:1008D00030313130206B6579626F61726420636FF3 +:1008E0006E76657274657229205645523A203078CA +:1008F000303130310A00444553433A20636F6E76FD +:10090000657274204D30313130206B6579626F61D2 +:10091000726420746F205553420A000A092D205634 +:10092000657273696F6E202D0A000A6D6F757365AD +:100930003A206F66660A000A6D6F7573653A206F1C +:100940006E0A000A6B6579626F6172643A206F66A5 +:10095000660A000A6B6579626F6172643A206F6E95 +:100960000A000A6D61747269783A206F66660A003F +:100970000A6D61747269783A206F6E0A000A6465C4 +:100980006275673A206F6E0A000A64656275673A9D +:10099000206F66660A000A0A626F6F746C6F61648A +:1009A00065722E2E2E2000433E20000011241FBE13 +:1009B000CFEFD4E0DEBFCDBF04B603FE27C08091E9 +:1009C000D4019091D501A091D601B091D701873083 +:1009D000904BA740B04BD1F41092D4011092D501A6 +:1009E0001092D6011092D70114BE84B7877F84BFBE +:1009F0000FB6F894A895809160008861809360009C +:100A0000109260000FBEE0E0F8E3099511E0A0E06D +:100A1000B1E0E4E9F9E402C005900D92A233B10718 +:100A2000D9F721E0A2E3B1E001C01D92A43DB207D5 +:100A3000E1F70E94A50A0C94C8240C940000FF93CF +:100A4000EF93E0913201F0913301309709F009956D +:100A5000EF91FF910895FC018591803011F0EFDF57 +:100A6000FBCF0895FF27E0E230E247FF0CC041953D +:100A700097FF09C0EDE26095709580959095611D96 +:100A8000711D811D911D27FF02C0219530E350E2A9 +:100A9000AA27660F771F881F991FAA1FA41710F097 +:100AA000A41B63955A95A9F7AA3008F0A95FA05D29 +:100AB000AF93F395611571058105910541F7ED320D +:100AC00011F4EF93F395F21718F43F93F395FBCFDE +:100AD0008F91B5DFFA95E1F70895E991F991859144 +:100AE000803021F0853219F0AADFF9CF089520E097 +:100AF000E89455915532C1F3503311F468945591EF +:100B00005A3348F4505390F3220F022E220F220F33 +:100B1000200D250FF4CF0EF421958991999153362C +:100B200019F3533729F1533559F1BC018827992717 +:100B3000E8945C3621F489919991689455915436E2 +:100B400039F446EF7EF077FF0DC08FEF9FEF0AC0BC +:100B500055374AE039F0583540E121F0523642E04D +:100B600009F00895FF93EF937DDFEF91FF91B7CFE9 +:100B7000FF93EF93FC0181918030B9F360DFFBCFED +:100B8000FF93EF9368DFF1CFDF93CF93CDB7DEB75D +:100B90002596A3DFCF91DF9108950E94C206E4E37A +:100BA000F1E08EE08E0F11928E13FDCF84E391E081 +:100BB0009093430180934201569A5E9A2FEF89E603 +:100BC00098E1215080409040E1F700C00000569A23 +:100BD0005E980895CF93109244010E94DC07C82FBD +:100BE0008B3709F444C08F3F09F441C081E0809302 +:100BF00044018C2F869586958695E0914201F0916F +:100C000043014C2F4770C7FF0EC08F70E80FF11DD6 +:100C100021E030E001C0220F4A95EAF7209580815B +:100C2000282320830BC0E80FF11D81E090E001C074 +:100C3000880F4A95EAF79081892B80838091B601CD +:100C400080FF17C08EE391E00E942B051F92CF9387 +:100C500089E391E09F938F930E94C40586E391E01E +:100C60000E942B050F900F900F900F9002C080E014 +:100C700001C081E0CF91089520914201309143015C +:100C8000F901E80FF11D80810895EF92FF920F9313 +:100C90001F93CF93DF9387E291E00E942B05C0E082 +:100CA000D0E082E2E82E81E0F82E0AE111E0DF9345 +:100CB000CF93FF92EF920E94C4058FE191E00E94D2 +:100CC0002B05E0914201F0914301EC0FFD1F808163 +:100CD0000E94591B1F928F931F930F930E94C4056C +:100CE00088E191E00E942B0521968DB79EB708966A +:100CF0000FB6F8949EBF0FBE8DBFCE30D105B9F6AA +:100D0000DF91CF911F910F91FF90EF900895569A28 +:100D100081FF02C05E9A08955E9808955198599A8D +:100D200008955898509A08955098589A089551984F +:100D3000599A85E08A95F1F7000089B1869581700E +:100D40000895CF93DF93EC010E949706882341F02A +:100D5000209731F085E08A95F1F700002197F4CFD4 +:100D6000CE01DF91CF9108958B3741F08F3F41F055 +:100D7000982F9F7796958078892B08958BE7089513 +:100D80008FEF08950E948E060E9494062FEF83ED48 +:100D900090E3215080409040E1F700C000000895AA +:100DA000EF92FF920F931F93CF93DF93E82E109251 +:100DB00048010E948E060E949106CAEFD0E088EE9C +:100DC00093E00E94A106892B21F42197C1F781E0CD +:100DD00036C008E010E080E8F82E8AEF90E00E942C +:100DE000A106892B11F483E02AC08F2D8E2129F0D2 +:100DF0000E949406C8ECD0E00AC00E949106FACF87 +:100E0000209759F025E02A95F1F7000021970E94DC +:100E100097068823A9F3CD2B11F484E010C0F69433 +:100E200001501109D1F68FE891E00197F1F700C068 +:100E300000000E948E060E94940681E026C08093E6 +:100E400048018AE791E00E942B05809148011F929A +:100E50008F9385E791E09F938F930E94C40583E76A +:100E600091E00E942B059FEF29E688E191502040F8 +:100E70008040E1F700C000000E948E060E949406A8 +:100E80000F900F900F900F9080E0DF91CF911F9106 +:100E90000F91FF90EF9008950F931F93CF93DF93DF +:100EA00010924801CAEFD0E088EE93E00E94A106BC +:100EB000892B21F42197C1F781E02FC0D8E0C0E051 +:100EC000CC0F88EC90E00E94A106892B11F482E0FF +:100ED00024C008EC10E00E94970681110AC0011599 +:100EE000110549F025E02A95F1F70000015011099C +:100EF000F2CF012B11F483E010C05098589A85E08E +:100F00008A95F1F700004899C160D150C9F60E9456 +:100F10008E060E9494068C2F26C08093480182E69C +:100F200091E00E942B05809148011F928F938DE5DF +:100F300091E09F938F930E94C4058BE591E00E94FE +:100F40002B059FEF29E688E1915020408040E1F792 +:100F500000C000000E948E060E9494060F900F9021 +:100F60000F900F908FEFDF91CF911F910F91089508 +:100F7000CF9384E10E94D0060E944C07C82F8B3784 +:100F8000C1F08091B60180FF0CC01F92CF9382E424 +:100F900091E09F938F930E94C4050F900F900F9044 +:100FA0000F908091B60180FF04C080E491E00E9420 +:100FB0002B058C2FCF910895CF93DF93809147011C +:100FC000882319F0109247017EC080914601882342 +:100FD00019F01092460177C0C0914501CC2319F059 +:100FE0001092450103C00E94B807C82F8C2F8F773D +:100FF0008137B1F0893709F061C00E94B807982F96 +:101000009F779D3041F018F4953039F404C0913148 +:1010100011F09B3111F487FD37C00E94B4063AC02D +:101020000E94B807982F9F77913719F0993721F0D0 +:1010300041C08093450142C00E94B807D82F8F77E6 +:101040008D3041F018F4853081F504C0813111F004 +:101050008B3159F5C7FF11C0D7FF0AC086E591E073 +:101060000E942B058C2F0E94B406809346010BC072 +:1010700081E591E00E942B0521C0D7FF0DC08CE4D3 +:1010800091E00E942B058D2F0E94B406982F906648 +:1010900090934701806417C087E491E00E942B057C +:1010A0008D2F0E94B40680660EC08D2F0E94B4065C +:1010B000806402C00E94B406809347018C2FDF91A8 +:1010C000CF910C94B406DF91CF9108958091540193 +:1010D00008959FB7F89410924B019FBF9091CB0158 +:1010E000943009F057C09091E9009F703091EC0066 +:1010F000232F217030FD20E8922B24E02093E9007B +:101100002091EB0020FF43C02091EE0027FF3FC05D +:1011100020914901222321F02091E80025FF37C0CA +:101120001092490126E03091E80035FD15C030915C +:10113000CB01343061F53091EB0035FD28C02150F2 +:1011400021F481E08093490122C0EFE9FFE031976B +:10115000F1F700C00000E7CF8093F1008091E80034 +:1011600085FD0AC08091E80080FFFCCF8091E800F7 +:101170008E778093E80006C08FB7F89421E0209323 +:101180004B018FBF9F709093E90080E008959F709E +:101190009093E9008FEF0895CF93DF9300D01F92D3 +:1011A000CDB7DEB79C018091CB01843019F593E077 +:1011B00099833B832A839093E9008FEF9091E80015 +:1011C000815095FD06C095ED9A95F1F700008111CB +:1011D000F5CF8091E80085FF0DC040E050E063E06E +:1011E00070E0CE0101960E94660B8091E8008E7738 +:1011F0008093E8000F900F900F90DF91CF910895AA +:10120000CF93DF9300D01F92CDB7DEB72091CB01F3 +:10121000243021F522E029839B838A8383E0809315 +:10122000E9008FEF9091E800815095FD06C095EDA3 +:101230009A95F1F700008111F5CF8091E80085FFC4 +:101240000DC040E050E063E070E0CE0101960E94E6 +:10125000660B8091E8008E778093E8000F900F90E6 +:101260000F90DF91CF9108952091CB012430F1F4BC +:1012700022E02093E9002FEF3091E800215035FD66 +:1012800006C035ED3A95F1F700002111F5CF209118 +:10129000E80025FF0BC040E050E065E070E00E94F0 +:1012A000660B8091E8008E778093E8000895CF93D5 +:1012B000DF932091CB01243039F521E02093E90020 +:1012C0002FEF3091E800215035FD06C035ED3A95FD +:1012D000F1F700002111F5CF2091E80025FF14C09F +:1012E000EC0140E050E068E070E00E94660B809105 +:1012F000E8008E778093E80088E0FE01ACE4B1E07E +:1013000001900D928A95E1F7DF91CF91089589EBD5 +:1013100091E00C942B0520914A012F5F822F62E30C +:101320000E948E24992319F020934A010895109267 +:101330004A0180914B01882371F18091CB01843067 +:1013400041F58091E9008F702091EC00922F91700F +:1013500020FD90E8892B94E09093E9009091EB00B8 +:1013600090FF14C09091EE0097FF10C09091E8009C +:1013700095FF03C01092F100F9CF9091E80090FF23 +:1013800005C09091E8009E779093E8008F7080935D +:10139000E90010924B01089542E061EC81E00E9467 +:1013A0006F0C42E061EC82E00E946F0C42E061EC65 +:1013B00083E00E946F0C42E261EC84E00C946F0CBD +:1013C0008091CD01833009F453C030F4813071F045 +:1013D000823009F48CC008958A3009F478C08B30CB +:1013E00009F45EC0893009F09AC020C08091CC0118 +:1013F000813A09F094C08091E800877F8093E800EB +:101400008091D0019091D101892B21F468E08CE486 +:1014100091E003C060E080E090E070E00E94B10BDA +:101420008091E8008B778093E80008958091CC014B +:10143000813209F074C08091D0019091D101892B43 +:1014400009F06DC08091E800877F8093E80080916B +:10145000E80082FD05C08091CB018111F8CF5FC00B +:101460008091F100809354018091E8008B7753C004 +:101470008091CC01813A09F052C08091D0019091C5 +:10148000D101892B09F04BC08091E800877F8093C0 +:10149000E8008091E80080FFFCCF80910A0136C00F +:1014A0008091CC018132D9F58091D0019091D10108 +:1014B000892BA9F58091E800877F8093E8000E943E +:1014C000A40C8091CE0180930A010C947D1580912B +:1014D000CC01813221F58091E800877F8093E8007C +:1014E0000E94A40C8091CF018093550108958091B2 +:1014F000CC01813AA1F48091E800877F8093E800D5 +:101500008091E80080FFFCCF809155018093F1002D +:101510008091E8008E778093E8000C94A40C0895E5 +:1015200008950895089585EB91E00E942B050C9491 +:10153000920A0E947F1B8091C901882329F00E9492 +:10154000AA1B81110C94500B089584B7877F84BF28 +:101550000FB6F894A8958091600088618093600030 +:10156000109260000FBE90E080E80FB6F894809370 +:101570006100909361000FBE0E94900A0E942E109D +:101580000E94F50C0E94480D8091E20084608093D7 +:10159000E20089E698E00E94541B78948091CB0188 +:1015A0008430E1F780EA91E00E942B050E94301020 +:1015B00080E091E00E949C0F8FE891E00E942B0553 +:1015C0000E94910A8091CB01853039F48BE891E03B +:1015D0000E942B050E94990AF5CF0E943410F2CF89 +:1015E0000C94BE1B81EB91E00E942B050C94F00A39 +:1015F000292F332723303105C9F064F42130310518 +:1016000081F02230310509F043C084E790E025E005 +:1016100032E042C021323105F1F02232310541F190 +:1016200037C082E190E029E732E036C09927813067 +:10163000910541F08230910541F0892B49F5E1E0B7 +:10164000F2E005C0E1EFF1E002C0EDEBF1E08491E2 +:1016500090E09F0121C06430D8F4E62FF0E0EE0F57 +:10166000FF1FE15EFE4F2081318189E090E014C0D0 +:10167000643070F470E0FB01EE0FFF1FE95EFE4F77 +:1016800020813181FB01ED5EFE4F808190E004C03E +:1016900080E090E020E030E0FA013183208308957B +:1016A00084E089BD86E089BD09B400FEFDCF80914C +:1016B000D8008F7D8093D8008091E0008260809375 +:1016C000E0008091E00081FDFCCF0895CF92DF9291 +:1016D000EF92FF920F931F93CF93DF93EC018B0157 +:1016E0006A010E94C30C811133C0C114D10439F0C6 +:1016F000F60180819181081B190BC80FD91FE12CBD +:10170000F12C0115110519F18091E80085FD16C035 +:101710008091E8008E778093E800C114D10449F0ED +:10172000F60180819181E80EF91EF182E08285E068 +:101730000FC00E94C30C882321F30AC089918093B3 +:10174000F10001501109FFEFEF1AFF0ADACF80E034 +:10175000DF91CF911F910F91FF90EF90DF90CF908D +:1017600008952091D2013091D3012617370748F010 +:101770006115710539F42091E8002E772093E80077 +:1017800001C0B90140E06115710591F12091CB01D3 +:10179000222309F440C0253009F43FC02091E8001D +:1017A00023FD3DC02091E80022FD2FC02091E800DC +:1017B00020FFE9CF2091F20030E0FC01CF0161155C +:1017C000710559F02830310540F481918093F10082 +:1017D000615071092F5F3F4FF1CF41E02830310553 +:1017E00009F040E02091E8002E772093E800CBCF6D +:1017F0004111CCCF0AC08091CB01882361F08530A4 +:1018000061F08091E80083FD0AC08091E80082FFCA +:10181000F2CF80E0089582E0089583E0089581E0AA +:1018200008952091D2013091D3012617370748F04F +:101830006115710539F42091E8002E772093E800B6 +:1018400001C0B901FC0120E06115710579F18091B9 +:10185000CB01882309F43DC0853009F43CC0809158 +:10186000E80083FD3AC08091E80082FD2CC08091A1 +:10187000E80080FFE9CF8091F20090E061157105EA +:1018800059F08830910540F424912093F10031966D +:10189000615071090196F2CF21E0089709F020E02C +:1018A0008091E8008E778093E800CECF2111CFCFD2 +:1018B0000AC08091CB01882361F0853061F080916E +:1018C000E80083FD0AC08091E80082FFF2CF80E04B +:1018D000089582E0089583E0089581E00895982FA7 +:1018E000953058F59093E900981739F07091EC0015 +:1018F0002091ED005091F00003C0242F762F50E08E +:1019000021FF19C03091EB003E7F3093EB00309106 +:10191000ED003D7F3093ED003091EB00316030936E +:10192000EB007093EC002093ED005093F0002091B9 +:10193000EE0027FF07C09F5FD3CF8F708093E90031 +:1019400081E0089580E008958091CC0187FF11C067 +:101950008091E80082FD05C08091CB018111F8CF14 +:1019600011C08091E8008B770BC08091CB01882358 +:1019700049F08091E80080FFF8CF8091E8008E77F1 +:101980008093E80008952091E4003091E50095E609 +:101990004091EC00842F817040FF22C08091E800CC +:1019A00080FD1CC08091CB01882391F0853091F09F +:1019B0008091EB0085FD10C04091E4005091E5005E +:1019C0004217530729F39A01915011F784E00895C3 +:1019D00082E0089583E0089581E0089580E008950D +:1019E0004091E80042FFDECF08950E94520D0E9410 +:1019F000550DE0EEF0E0808181608083E8EDF0E05D +:101A000080818F77808319BCE3E6F0E0808181607C +:101A100080831092CA0108950E94520D0E94550DB4 +:101A20008091D8008F778093D8008091D80080680B +:101A30008093D8008091D8008F7D8093D80084E077 +:101A400089BD86E089BD09B400FEFDCF1092CB01AF +:101A50001092C7011092C9011092C80142E060E0E3 +:101A600080E00E946F0C8091E1008E7F8093E10006 +:101A70008091E20081608093E2008091E2008860C2 +:101A80008093E2008091E0008E7F8093E0000895D3 +:101A9000E3E6F0E080818E7F808381E08093CA015D +:101AA0000C940C0D1092E20008951092E10008953C +:101AB0001F920F920FB60F9211242F933F934F93C3 +:101AC0005F936F937F938F939F93AF93BF93EF93A6 +:101AD000FF938091E10082FF0BC08091E20082FFC2 +:101AE00007C08091E1008B7F8093E1000E948B0909 +:101AF0008091E10080FF19C08091E20080FF15C055 +:101B00008091E2008E7F8093E2008091E20080610C +:101B10008093E2008091D80080628093D80019BC45 +:101B200085E08093CB010E94930A8091E10084FFBD +:101B300030C08091E20084FF2CC084E089BD86E043 +:101B400089BD09B400FEFDCF8091D8008F7D8093C0 +:101B5000D8008091E1008F7E8093E1008091E200C7 +:101B60008F7E8093E2008091E20081608093E200AA +:101B70008091C701882311F084E007C08091E300C1 +:101B800087FD02C081E001C083E08093CB010E9409 +:101B9000F20A8091E10083FF29C08091E20083FF77 +:101BA00025C08091E100877F8093E10082E08093EF +:101BB000CB011092C7018091E1008E7F8093E100FC +:101BC0008091E2008E7F8093E2008091E20080614C +:101BD0008093E20042E060E080E00E946F0C809120 +:101BE000F00088608093F0000E948709FF91EF91D8 +:101BF000BF91AF919F918F917F916F915F914F9125 +:101C00003F912F910F900FBE0F901F9018951F922C +:101C10000F920FB60F9211242F933F934F935F9320 +:101C20006F937F938F939F93AF93BF93CF93DF93E4 +:101C3000EF93FF93C091E900CF708091EC00D82F13 +:101C4000D17080FDD0E81092E9008091F000877F8C +:101C50008093F00078940E944B0E1092E9008091DE +:101C6000F00088608093F000CD2BCF70C093E90026 +:101C7000FF91EF91DF91CF91BF91AF919F918F91A4 +:101C80007F916F915F914F913F912F910F900FBE78 +:101C90000F901F9018951F93CF93DF93CDB7DEB7AA +:101CA000AA970FB6F894DEBF0FBECDBFECECF1E003 +:101CB00088E08E0F9091F10091938E13FBCF0E94DC +:101CC000E0098091E80083FF1FC18091CC019091D1 +:101CD000CD01492F50E04A30510508F015C1FA01F5 +:101CE000E65CFF4F0C94AE24803881F0823809F016 +:101CF0000BC18091D0018F708093E9008091EB003F +:101D000085FB882780F91092E90006C08091C80100 +:101D10009091C901911182609091E800977F909312 +:101D2000E8008093F1001092F100C8C0282F2D7FA9 +:101D300009F0EAC0882319F0823061F0E5C0809193 +:101D4000CE01813009F0E0C0933009F080E080934B +:101D5000C9012BC08091CE01811127C08091D00193 +:101D60008F7009F4D1C08093E9002091EB0020FF2F +:101D70001CC0933021F48091EB00806214C09091DC +:101D8000EB0090619093EB0021E030E0A90102C0EC +:101D9000440F551F8A95E2F74093EA001092EA003B +:101DA0008091EB0088608093EB001092E9008091B5 +:101DB000E800877F86C08111A7C01091CE011F77F0 +:101DC0008091E3008078812B8093E3008091E8008C +:101DD000877F8093E8000E94A40C8091E80080FF38 +:101DE000FCCF8091E30080688093E300111102C072 +:101DF00082E001C083E08093CB0186C080588230AE +:101E000008F082C08091CE019091CF018C3D53E0CB +:101E1000950779F583E08A838AE289834FB7F8943E +:101E2000DE01139620E03EE051E2E32FF0E0509314 +:101E30005700E49120FF03C0E295EF703F5FEF7021 +:101E40008E2F90E0EA3010F0C79601C0C0968D93B7 +:101E50009D932F5F243149F74FBF8091E800877F22 +:101E60008093E8006AE270E0CE0101960E94B10B17 +:101E700014C0AE014F5F5F4F6091D0010E94F80A1D +:101E8000BC01892B09F440C09091E800977F9093A2 +:101E9000E80089819A810E94110C8091E8008B777B +:101EA0008093E80031C0803879F58091E800877F21 +:101EB0008093E8008091C7018093F1008091E80051 +:101EC0008E778093E8000E94A40C1EC081111CC074 +:101ED0009091CE019230C0F48091E800877F80938A +:101EE000E8009093C7010E94A40C8091C701811162 +:101EF00006C08091E30087FD02C081E001C084E05C +:101F00008093CB010E94CC098091E80083FF0AC036 +:101F10008091E800877F8093E8008091EB008062E9 +:101F20008093EB00AA960FB6F894DEBF0FBECDBF2C +:101F3000DF91CF911F91089590935B0180935A0197 +:101F40000895E0915A01F0915B01309721F00190E2 +:101F5000F081E02D099480E00895EF92FF920F93B5 +:101F60001F93CF93DF93E0915A01F0915B0130977B +:101F7000B1F18C010280F381E02D09958091B601C9 +:101F800082FF2DC080FF04C088E793E00E942B05EC +:101F9000E80118E082E7E82E83E0F82E8091B60190 +:101FA00080FF0BC088811F928F93FF92EF920E9457 +:101FB000C4050F900F900F900F90115021961111A2 +:101FC000EDCF8091B60180FF0AC080E793E0DF91FA +:101FD000CF911F910F91FF90EF900C942B05DF9103 +:101FE000CF911F910F91FF90EF900895E0915A01CA +:101FF000F0915B01309721F00480F581E02D099488 +:10200000089520915801309159018217930771F07A +:102010009093590180935801E0915A01F0915B012E +:10202000309721F00680F781E02D099408952091E2 +:102030005601309157018217930771F09093570121 +:1020400080935601E0915A01F0915B01309721F0A5 +:102050000084F185E02D0994089508950C942D10C5 +:102060000E94E91B0C94CD05CF92DF92EF92FF9274 +:102070000F931F93CF93DF9300D000D000D0CDB744 +:10208000DEB70E94EA058DE5C82E81E0D82E00E07B +:1020900010E0E02E802F0E943C06F60141916F0176 +:1020A000F42EF826B1F40F5F1F4F0E30110589F79B +:1020B0008FEF89838A831B820E94F21B8160782FB5 +:1020C0009D838C8349815A816B818D810E94F3109D +:1020D00047C09091B60191FF04C08E830E944506CF +:1020E0008E8120E030E04F2D50E0922FBA01022E79 +:1020F00002C0759567950A94E2F760FF2BC02983AB +:10210000EA8221E030E0690102C0CC0CDD1C9A9526 +:10211000E2F790E08C219D21892B09F420E02B83AC +:102120000E94F21B8160782F9D838C8349815A81A4 +:102130006B818D810E94F31049815A816B817C8172 +:102140008D810E946C1BF801E35AFE4F8081C826E6 +:10215000C08206C02F5F3F4F2830310531F6A3CF34 +:102160000E946B1B0E94BF1E10915C010E94A10F78 +:10217000181741F10E94A10F80935C019091B60164 +:1021800092FF0EC090FF0CC01F928F938AE893E0DD +:102190009F938F930E94C4050F900F900F900F9004 +:1021A00080915C0126960FB6F894DEBF0FBECDBFBE +:1021B000DF91CF911F910F91FF90EF90DF90CF9023 +:1021C0000C947D1B26960FB6F894DEBF0FBECDBFD4 +:1021D000DF91CF911F910F91FF90EF90DF90CF9003 +:1021E00008950C948706CF93DF93CDB7DEB72B9776 +:1021F0000FB6F894DEBF0FBECDBF942F4F83252FAF +:10220000588769877A878B874A855B85452B21F0BC +:102210002F3F09F59F3FF9F4DE01119686E0FD019D +:1022200011928A95E9F785E0FE01379601900D92AB +:102230008A95E1F749815A816B817C818D819E81EC +:102240000E9426182B960FB6F894DEBF0FBECDBFA6 +:10225000DF91CF9108954F81588569857A858B8567 +:102260000E946C1BD9CFCF93882309F4CDC0C82F0F +:10227000823859F40E94A10F81FDC6C089E30E94F3 +:10228000B51A0E942E1B89E30CC0833879F40E9492 +:10229000A10F80FDB9C083E50E94B51A0E942E1BD4 +:1022A00083E50E94D21ACF910C942E1B843859F4E6 +:1022B0000E94A10F82FDA8C087E40E94B51A0E9467 +:1022C0002E1B87E4EECF8CEF8C0F813A48F48C2FD5 +:1022D0000E94EB21811198C08C2F0E94B51AE3CF88 +:1022E00080E28C0F883048F4C77081E001C0880F0D +:1022F000CA95EAF70E94F41AD6CF8BE58C0F83308B +:1023000078F4C53A29F0C63A31F083E890E005C088 +:1023100081E890E002C082E890E0CF910C94011037 +:1023200088E58C0F853108F06FC0C83A61F1C93A71 +:1023300069F1CA3A71F1CB3A79F1CC3A81F1CD3AEF +:1023400089F1CE3A91F1CF3A99F1C13BA1F1C03B6D +:10235000A9F1C23BB1F1C33BB9F1C43BC1F1C53BEB +:10236000C9F1C63BD1F1C73BD9F1C83BE1F1C93B4B +:10237000E9F1CA3BF1F1CB3BF9F1CC3B09F43FC0A9 +:1023800080E090E03EC082EE90E03BC089EE90E0BD +:1023900038C08AEE90E035C085EB90E032C086EB25 +:1023A00090E02FC083EB90E02CC084EB90E029C03C +:1023B00087EB90E026C08CEC90E023C08DEC90E0A1 +:1023C00020C083E891E01DC08AE891E01AC082E94C +:1023D00091E017C084E991E014C081E292E011C05D +:1023E00083E292E00EC084E292E00BC085E292E0CC +:1023F00008C086E292E005C087E292E002C08AE26D +:1024000092E0CF910C941710CF910895882309F48E +:102410004BC0823859F40E94A10F81FF45C089E367 +:102420000E94B51A0E942E1B89E30CC0833871F4F8 +:102430000E94A10F80FF38C083E50E94B51A0E9458 +:102440002E1B83E50E94D21A0C942E1B843859F45B +:102450000E94A10F82FF28C087E40E94B51A0E9443 +:102460002E1B87E4EFCF9CEF980F913A58F390E240 +:10247000980F983050F4877091E001C0990F8A95B9 +:10248000EAF7892F0E94FA1ADFCF9BE5980F933065 +:1024900020F480E090E00C940110885A853120F4FB +:1024A00080E090E00C9417100895882321F00E949A +:1024B000F41A0C942E1B0895882321F00E94FA1A16 +:1024C0000C942E1B0895CF92DF92EF92FF920F9300 +:1024D0001F93CF93DF9300D000D000D0CDB7DEB7ED +:1024E00025E0FC01DE01119601900D922A95E1F79D +:1024F000FC0140813181F280258122952F7063811A +:102500007481672B09F4D8C23F3F19F44F3F09F497 +:10251000D3C26C0149833A8389819A812E830E94B8 +:10252000741A182F092F0E94731A0E948319E02F22 +:10253000E295EF70F0E0EC5BFF4F2E810C94AE243F +:10254000802F807F902F9F70092F882311F0029594 +:10255000007FFF2049F0002309F45FC2802F0E9412 +:10256000071B0E942E1B59C2812F0E9406120023B6 +:1025700009F4A2C2802F0E940D1B26960FB6F89474 +:10258000DEBF0FBECDBFDF91CF911F910F91FF90A6 +:10259000EF90DF90CF900C942E1B802F807F902F98 +:1025A0009F70092F803211F00295007F112319F0DE +:1025B000113001F129C0FF20A9F0802F222349F119 +:1025C000213039F526960FB6F894DEBF0FBECDBF89 +:1025D000DF91CF911F910F91FF90EF90DF90CF90FF +:1025E0000C94171B222319F0213009F465C20E94B4 +:1025F0001A1B2CC0FF20E9F0263008F05DC20E94B3 +:10260000F11A802329F022C0FF20F1F0211115C01A +:10261000802F26960FB6F894DEBF0FBECDBFDF9198 +:10262000CF911F910F91FF90EF90DF90CF900C947E +:102630005512253008F040C209C0F601858180FF9F +:10264000ECC18F708583E4CF2111FBC1802F69C15C +:10265000202F26952695237030E02115310521F095 +:1026600021303105C9F028C2FF2021F0812F902FA1 +:10267000937002C080E090E026960FB6F894DEBF1B +:102680000FBECDBFDF91CF911F910F91FF90EF90C3 +:10269000DF90CF900C940110FF2021F0812F902F1C +:1026A000937002C080E090E026960FB6F894DEBFEB +:1026B0000FBECDBFDF91CF911F910F91FF90EF9093 +:1026C000DF90CF900C941710812FFF2019F00E94FB +:1026D000451D02C00E94AD1D26960FB6F894DEBFC0 +:1026E0000FBECDBFDF91CF911F910F91FF90EF9063 +:1026F000DF90CF900C94321E802F837009F078C049 +:10270000F110DAC1812F829586958770880F880F26 +:10271000912F9F70C92ED12CE12CF12C082E04C0D2 +:10272000CC0CDD1CEE1CFF1C0A94D2F714FF12C067 +:102730004FE050E060E070E004C0440F551F661F9A +:10274000771F8A95D2F7CB01BA0160957095809575 +:10275000909503C060E070E0CB01202F2695269570 +:102760002370422F50E042305105D1F043305105E3 +:1027700059F16C297D298E299F294130510541F15C +:1027800026960FB6F894DEBF0FBECDBFDF91CF9176 +:102790001F910F91FF90EF90DF90CF900C949819BC +:1027A0006C297D298E299F2926960FB6F894DEBFC5 +:1027B0000FBECDBFDF91CF911F910F91FF90EF9092 +:1027C000DF90CF900C94AA190E949819C701B60106 +:1027D00026960FB6F894DEBF0FBECDBFDF91CF9126 +:1027E0001F910F91FF90EF90DF90CF900C9486197E +:1027F000FF2019F0802F817001C08695882309F48D +:102800005BC1812F829586958770880F880F912FE5 +:102810009F70C92ED12CE12CF12C082E04C0CC0CB9 +:10282000DD1CEE1CFF1C0A94D2F714FF12C04FE00F +:1028300050E060E070E004C0440F551F661F771F32 +:102840008A95D2F7CB01BA016095709580959095E5 +:1028500003C060E070E0CB01202F26952695237001 +:10286000422F50E042305105D1F04330510559F12B +:102870006C297D298E299F294130510541F12696E9 +:102880000FB6F894DEBF0FBECDBFDF91CF911F9181 +:102890000F91FF90EF90DF90CF900C944F1A6C291E +:1028A0007D298E299F2926960FB6F894DEBF0FBE8C +:1028B000CDBFDF91CF911F910F91FF90EF90DF90EF +:1028C000CF900C94611A0E944F1AC701B601269648 +:1028D0000FB6F894DEBF0FBECDBFDF91CF911F9131 +:1028E0000F91FF90EF90DF90CF900C943D1A103F26 +:1028F00041F118F4103E48F48BC0123F09F450C067 +:10290000D8F1133F09F460C083C01F70802F8F710E +:10291000FF2021F00E94D619812F7BCE0E94F7194B +:10292000812F26960FB6F894DEBF0FBECDBFDF9184 +:10293000CF911F910F91FF90EF90DF90CF900C946B +:102940005C12FF20A9F0253008F0B6C0802F8F71EF +:1029500026960FB6F894DEBF0FBECDBFDF91CF91A4 +:102960001F910F91FF90EF90DF90CF900C941C1A65 +:10297000263008F0A1C0EACFFF20A1F0802F8F7190 +:1029800026960FB6F894DEBF0FBECDBFDF91CF9174 +:102990001F910F91FF90EF90DF90CF900C94D6197C +:1029A000FF2061F3802F8F7126960FB6F894DEBF5B +:1029B0000FBECDBFDF91CF911F910F91FF90EF9090 +:1029C000DF90CF900C94F719FF2091F0802F8F713A +:1029D00026960FB6F894DEBF0FBECDBFDF91CF9124 +:1029E0001F910F91FF90EF90DF90CF900C94C11941 +:1029F00026960FB6F894DEBF0FBECDBFDF91CF9104 +:102A00001F910F91FF90EF90DF90CF900C94BC1925 +:102A1000FF20A1F0222309F4B1CF812F26960FB613 +:102A2000F894DEBF0FBECDBFDF91CF911F910F9104 +:102A3000FF90EF90DF90CF900C943311222309F494 +:102A4000B1CF812F26960FB6F894DEBF0FBECDBF53 +:102A5000DF91CF911F910F91FF90EF90DF90CF907A +:102A60000C940612402F4F70612FC6010E94BB1CB0 +:102A700026960FB6F894DEBF0FBECDBFDF91CF9183 +:102A80001F910F91FF90EF90DF90CF900C94CE1894 +:102A9000402F4F70612FC60126960FB6F894DEBF07 +:102AA0000FBECDBFDF91CF911F910F91FF90EF909F +:102AB000DF90CF900C94BE1C26960FB6F894DEBF24 +:102AC0000FBECDBFDF91CF911F910F91FF90EF907F +:102AD000DF90CF9008950E94141B0E94E31A0E9479 +:102AE0002E1B0E94661F0E94321E80E090E00E9412 +:102AF000011080E090E00C9417100E94041B0C94CD +:102B00006B150E94741A292F22952F7030E02C30FB +:102B100031054CF42A3031056CF422503109223051 +:102B2000310588F407C02C30310549F02F303105CC +:102B300031F009C0803E48F0803F29F406C093FB85 +:102B4000882780F9089580E0089581E00895CF9363 +:102B5000DF9300D000D01F92CDB7DEB70F900F905B +:102B60000F900F900F90DF91CF910895CF93DF9347 +:102B700000D000D000D0CDB7DEB726960FB6F894BF +:102B8000DEBF0FBECDBFDF91CF910895CF93DF930E +:102B9000C0916B0180916C01C817A1F0D0E0CE010B +:102BA00066E070E00E947D24FC01E359FE4F408105 +:102BB000518162817381848195810E94B61521962D +:102BC000C770E8CFDF91CF91089540919D0150915A +:102BD0009E0160919F017091A0018091A10190914F +:102BE000A2010C94B615CF93DF938091A201829538 +:102BF0008F7009F05CC080919F01882309F457C051 +:102C000020916B01D0916C0140919D01C0919E017A +:102C1000E091A001F091A1012D1709F448C030E026 +:102C2000309709F440C0CF3F11F44F3FE1F1C901A3 +:102C300066E070E00E947D24DC01A359BE4F11962E +:102C40008C911197C8132FC08C9148132CC01296E9 +:102C50008C911297811127C013968D919C91149796 +:102C60008E179F0708F401978E1B9F0B883C9105D8 +:102C7000D0F48091A2018F7080618093A201C9017C +:102C800066E070E00E947D24FC01EE58FE4F9081CA +:102C90009F70906190838DE991E00E946312DF91B3 +:102CA000CF910C94C6152F5F3F4F2770B5CFDF91A2 +:102CB000CF910895BF92CF92DF92EF92FF920F9340 +:102CC0001F93CF93DF93CDB7DEB761970FB6F8941C +:102CD000DEBF0FBECDBF8C0185E0F801DE011D9681 +:102CE00001900D928A95E1F7D8014C9111962C91A3 +:102CF00011971296EC9012971396CD90DC90149742 +:102D000050919D0160919E018091A0019091A1013F +:102D1000009709F46EC16F3F19F45F3F09F469C170 +:102D2000B0909F01BB2009F4C3C03091A201C81626 +:102D3000D90628F0F601E81BF90BCF0104C08095F5 +:102D400090958C0D9D1DFF24F394883C910588F08F +:102D5000F12C307F09F0CBC07C2DD98AC88A522F44 +:102D60006E2D89890E94A7158DE991E00E9463125A +:102D7000B4C0832F807F09F049C0621314C054137C +:102D800012C0E11010C03F7030613093A2010E9468 +:102D9000E5158DE991E00E9463128091A201D801AE +:102DA00015968C9331C0CD2831F12F3F11F44F3F50 +:102DB00011F1FE2CE1101FC0E0916B0130916C010C +:102DC000E31709F45CC0F0E0CF0166E070E00E9418 +:102DD0007D24DC01A359BE4F11968C9111972813C5 +:102DE00007C08C91481304C012968C91811103C0C6 +:102DF0003196E770E5CFFE2CEE2009F416C18091E4 +:102E0000A20181608093A201F12C0FC1621308C05E +:102E1000541306C0E11004C08091A201D801C1C0C2 +:102E20004D872E878D859E850E9481158823E1F12F +:102E3000EE20D1F12091A201822F82958F7090E037 +:102E4000029774F080919D0190919E0198878F83E5 +:102E50001986DB86CA862C87CE0107960E946312EC +:102E600086E0F801ADE9B1E001900D928A95E1F7B5 +:102E70000E94F3150E94E515FF24F394D6C04D87F8 +:102E80002E878D859E850E94741A292F22952F707A +:102E900030E0223031050CF0BCC09F7009F0B6C0A4 +:102EA000805E883008F4C1C0C8010E946312E4CF7C +:102EB000C816D90608F453C0F601E81BF90BCF0178 +:102EC000883C910508F450C0F12C7C2DD98AC88A21 +:102ED000522F6E2D89890E94A715EDE9F1E086E059 +:102EE000DF011D928A95E9F70E94E5159EC06213E5 +:102EF00014C0541312C0E11010C08091A201F80157 +:102F00008583C8010E94631286E0EDE9F1E0DF01EC +:102F10001D928A95E9F7FB2C88C04D872E878D85F9 +:102F20009E850E948115882309F4BECFEE2009F406 +:102F3000BBCF2091A201822F82958F7090E00297E3 +:102F40000CF48ECF80919D0190919E019A8389838C +:102F50001B82DD82CC822E83CE0101967FCF8095AD +:102F600090958C0D9D1DACCFFE2CEE2009F49CCFCE +:102F700062132EC054132CC02091A20120FD1FC04B +:102F8000822F82958F70D9F0D80115962C931597C2 +:102F90008F3049F08F5F982F9295907F822F8F709E +:102FA000892B15968C93C8010E94631286E0F80164 +:102FB000ADE9B1E001900D928A95E1F795CF86E0F9 +:102FC000F801ADE9B1E001900D928A95E1F72DC0CD +:102FD0004D872E878D859E850E948115811140CF5A +:102FE0008091A20181608093A201C8010E946312B6 +:102FF0001CC0EE2009F458CF4D872E878D859E8505 +:103000000E948115882309F44FCF2ACF811148CF20 +:103010000CC0243031050CF047CF9F7009F440CF2D +:10302000F8019581907F09F03BCF8F2D61960FB607 +:10303000F894DEBF0FBECDBFDF91CF911F910F91EE +:10304000FF90EF90DF90CF90BF900895CF93DF93E4 +:10305000CDB7DEB72C970FB6F894DEBF0FBECDBF4D +:103060004F83588769877A878B879C87CE0107961D +:103070000E945A16882371F08F8198852A853B8596 +:10308000232B09F43FC09F3F09F068C08F3F09F030 +:1030900065C038C086E0FE013796DE0111960190CA +:1030A0000D928A95E1F76F817885EA85FB853097E7 +:1030B00049F17F3F11F46F3F29F180916C0190E05D +:1030C0009C012F5F3F4F2770332740916B0150E0E9 +:1030D0002417350709F44BC069837A83FD83EC8399 +:1030E00066E070E00E947D24DC01A359BE4F96E0AB +:1030F000FE01319601900D929A95E1F720936C01B3 +:103100000E94C61580916B0190916C018917E9F1BD +:1031100090E066E070E00E947D2483599E4F0E94FB +:103120005A16882391F180916B0190E066E070E07F +:103130000E947D24FC01E359FE4F40815181628150 +:103140007381848195810E94B61580916B0190E016 +:1031500001968770992780936B01D4CF4F81588552 +:1031600069857A858B859C850E94B615CBCF0E9498 +:103170007D1510926C0110926B01EDE9F1E086E093 +:10318000DF011D928A95E9F7BDCF2C960FB6F89412 +:10319000DEBF0FBECDBFDF91CF910895DF92EF92DA +:1031A000FF920F931F93CF93DF93FC01892B09F4B8 +:1031B0008AC0E12CF12CDD24D394EF012196849177 +:1031C000853709F461C058F4843708F04EC0843064 +:1031D00008F06AC08130D1F0823071F174C0883754 +:1031E00009F45DC050F4863709F455C0873709F0FB +:1031F0006AC08E2D0E94011B54C09CE7980F903727 +:1032000008F061C08F770E94061250C08F010E5FD8 +:103210001F4FFE01849190E2980F983050F4877010 +:10322000FD2D01C0FF0F8A95EAF78F2F0E94071B23 +:1032300014C00E94331113C08F010E5F1F4FFE0197 +:10324000C49180E28C0F883060F4C7708D2D01C06E +:10325000880FCA95EAF70E940D1B0E942E1BE801F9 +:1032600025C08C2F0E940612FACF9F012E5F3F4F80 +:10327000FE01C491CC2369F08FE99FE00197F1F73B +:1032800000C00000C150F6CF9F012E5F3F4FFE01EE +:10329000F490E9010BC00E94F11AE82E07C00E94C9 +:1032A000041B0E942E1B02C00E9433118F2D882305 +:1032B00041F0EFE9FFE03197F1F700C000008150E5 +:1032C000F6CFFE017ACFDF91CF911F910F91FF9042 +:1032D000EF90DF9008956093A7017093A801809309 +:1032E000A9019093AA010E947B1B0C946B1560931B +:1032F000A3017093A4018093A5019093A6010E945D +:103300007C1B0C946B1508950C946B190F931F93F1 +:103310000091A7011091A8012091A9013091AA0163 +:10332000602B712B822B932B1F910F910C946B1997 +:103330000F931F930091A7011091A8012091A9015B +:103340003091AA0160237123822393231F910F914F +:103350000C946B190F931F930091A7011091A80172 +:103360002091A9013091AA01602771278227932714 +:103370001F910F910C946B1960E070E0CB010C94DD +:1033800077190F931F9341E050E060E070E08A01ED +:103390009B0104C0000F111F221F331F8A95D2F713 +:1033A000C901B8011F910F910C9477190F931F93C6 +:1033B00041E050E060E070E004C0440F551F661F1C +:1033C000771F8A95D2F78091A3019091A401A091D3 +:1033D000A501B091A6018A019B01082B192B2A2B6C +:1033E0003B2BC901B8011F910F910C9477190F93D2 +:1033F0001F9341E050E060E070E004C0440F551FAF +:10340000661F771F8A95D2F7409550956095709505 +:103410008091A3019091A401A091A501B091A60172 +:103420008A019B01082319232A233B23C901B801E0 +:103430001F910F910C9477190F931F9341E050E067 +:1034400060E070E004C0440F551F661F771F8A9527 +:10345000D2F78091A3019091A401A091A501B09110 +:10346000A6018A019B01082719272A273B27C901A2 +:10347000B8011F910F910C9477190F931F9300912E +:10348000A3011091A4012091A5013091A601602B08 +:10349000712B822B932B1F910F910C9477190F9303 +:1034A0001F930091A3011091A4012091A5013091D7 +:1034B000A60160237123822393231F910F910C9403 +:1034C00077190F931F930091A3011091A4012091EC +:1034D000A5013091A60160277127822793271F91AC +:1034E0000F910C9477190895CF92DF92EF92FF928B +:1034F0000F931F93CF93DF938C01C090A701D090BF +:10350000A801E090A901F090AA014091A301509177 +:10351000A4016091A5017091A601C42AD52AE62ACA +:10352000F72ACFE1D0E0D701C6010C2E04C0B69532 +:10353000A795979587950A94D2F780FF07C0B801A1 +:103540008C2F0E948C1C8130910531F4219758F703 +:10355000B80180E00E948C1CDF91CF911F910F91E8 +:10356000FF90EF90DF90CF90089520910B01309164 +:103570000C01F90132969FEF40E05191581789F004 +:103580009F3F19F4511101C0942F4F5F4630A9F7A6 +:103590009F3F39F0F901E90FF11D97FDFA958283FC +:1035A0000895089520910B0130910C01F901329694 +:1035B000285F3F4F9081981301C010823196E21727 +:1035C000F307C1F7089581E090E0E0910B01F091DD +:1035D0000C01E80FF91F1082019688309105A9F7B8 +:1035E00008958091B50108959091B501892B80933C +:1035F000B501089580959091B50189238093B50117 +:1036000008958093B50108951092B50108959091A1 +:10361000B401892B8093B401089580959091B401F1 +:1036200089238093B40108951092B4010895809382 +:10363000AB0108951092AB01089580910B01909118 +:103640000C01FC0131969C01285F3F4F80E0919175 +:1036500091118F5FE217F307D1F70895E0910B0105 +:10366000F0910C018091B5018083E0910B01F09104 +:103670000C0190818091B401892B80838091AB01F2 +:10368000882361F0E0910B01F0910C019081892B6E +:1036900080830E941D1B81111092AB0180910B0150 +:1036A00090910C010C94AD0F9093330180933201F3 +:1036B00008958295982F9C7C292F26952695982FE2 +:1036C0009373990F990F922B892F8A7A8695957506 +:1036D000990F892B08950895CF93DF9300D000D0E0 +:1036E0001F92CDB7DEB70F900F900F900F900F90F5 +:1036F000DF91CF910895089508950C94F110809171 +:10370000CB01843021F11092B70120E488E190E0F0 +:103710000FB6F894A895809360000FBE20936000C8 +:1037200083B7817F846083BF83B7816083BF7894D0 +:10373000889583B78E7F83BF0FB6F894A895809144 +:103740006000886180936000109260000FBE089551 +:1037500008950895CF930E94A81B0E94EA050E9435 +:10376000A91BC0E08C2F0E943C06811104C0CF5FD2 +:10377000CE30C1F701C081E0CF9108950C947D1542 +:103780001F920F920FB60F9211248F939F93AF93B6 +:10379000BF938091B701811113C08091B8019091BE +:1037A000B901A091BA01B091BB014196A11DB11D13 +:1037B0008093B8019093B901A093BA01B093BB0173 +:1037C000BF91AF919F918F910F900FBE0F901F905F +:1037D000189582E084BD93E095BD9AEF97BD8093E4 +:1037E0006E0008952FB7F8948091B8019091B901B7 +:1037F000A091BA01B091BB012FBF08952FB7F894E3 +:103800006091B8017091B9018091BA019091BB01AA +:103810002FBF0895CF92DF92EF92FF920F931F93E5 +:103820002FB7F8944091B8015091B9016091BA0155 +:103830007091BB012FBF6A017B01EE24FF248C0134 +:1038400020E030E0C016D106E206F30610F4415045 +:1038500051099A01281B390BC9011F910F91FF9043 +:10386000EF90DF90CF9008951F920F920FB60F92B6 +:1038700011248F939F93AF93BF938091B801909140 +:10388000B901A091BA01B091BB010196A11DB11D72 +:103890008093B8019093B901A093BA01B093BB0192 +:1038A000BF91AF919F918F910F900FBE0F901F907E +:1038B00018950E94F50CF8942FEF87EA91E62150B5 +:1038C00080409040E1F700C0000087E090EBDC0111 +:1038D0008093D4019093D501A093D601B093D701E2 +:1038E0009CE088E10FB6F894A895809360000FBE25 +:1038F00090936000FFCFE92FF0E093E0EE0FFF1F01 +:103900009A95E1F7E80FF11DE855FF4F9491892F43 +:103910008F7092959F700895CF93C82FCB010E940E +:103920007B1C492F90E0242F30E054E0220F331FFE +:103930005A95E1F7282B392B2038310519F480E00E +:1039400090E017C0EC2FF0E023E0EE0FFF1F2A9568 +:10395000E1F74770E40FF11D34E0EE0FFF1F3A95D9 +:10396000E1F7E80FF91FEE0FFF1FE050F8498591CE +:103970009491CF91089580E090E00895089580910A +:10398000BE0180FF0CC08091100190E065E070E006 +:103990000E947D2495958795959587952EC081FFEA +:1039A0000AC08091100190E065E070E00E947D24E3 +:1039B0009595879522C082FF08C08091100190E004 +:1039C00065E070E00E947D2418C02091BF01222391 +:1039D000D1F030910F01231780F78091100190E012 +:1039E00065E070E00E947D24622F70E00E947D24DB +:1039F000632F70E00E949A24CB018038910530F447 +:103A0000009731F0089585E090E008958FE70895DC +:103A100081E008958091BE0180FF08C060910E0191 +:103A200070E0759567957595679523C081FF06C011 +:103A300060910E0170E0759567951BC082FF04C010 +:103A400060910E0170E012C06091BF016623D1F059 +:103A500020910D016217A0F780910E0170E090E0B7 +:103A60000E947D24622F70E00E949A2460387105C4 +:103A700028F46115710521F0862F08958FE70895C8 +:103A800081E0089561E070E0F4CF803F21F40E946E +:103A9000BF1C819504C0813F29F40E94BF1C809304 +:103AA000C2010895823F21F40E94BF1C819504C089 +:103AB000833F29F40E94BF1C8093C1010895893F70 +:103AC00019F40E940A1D05C08A3F31F40E940A1DA4 +:103AD00081958093C30108958B3F21F40E940A1DB4 +:103AE000819504C08C3F29F40E940A1D8093C40173 +:103AF0000895843F21F48091C001816017C0853F03 +:103B000021F48091C001826011C0863F21F4809130 +:103B1000C00184600BC0873F21F48091C0018860A0 +:103B200005C0883F31F48091C00180618093C0015D +:103B300008958D3F21F48091BE0181600BC08E3FBE +:103B400021F48091BE01826005C08F3F29F48091ED +:103B5000BE0184608093BE010895803F39F4809156 +:103B6000C20187FF6CC01092C20169C0813F29F475 +:103B70008091C2011816BCF362C09091C101823FCE +:103B800029F497FF5CC01092C10159C0833F19F41A +:103B90001916CCF354C0893F41F48091C301181623 +:103BA0000CF04DC01092C3014AC08A3F29F48091A5 +:103BB000C30187FF44C0F6CF8B3F39F48091C40125 +:103BC00087FF3DC01092C4013AC08C3F29F4809118 +:103BD000C4011816BCF333C0843F21F48091C001A6 +:103BE0008E7F17C0853F21F48091C0018D7F11C069 +:103BF000863F21F48091C0018B7F0BC0873F21F469 +:103C00008091C001877F05C0883F31F48091C00159 +:103C10008F7E8093C00113C08D3F21F48091BE013F +:103C20008E7F0BC08E3F21F48091BE018D7F05C039 +:103C30008F3F29F48091BE018B7F8093BE018091DC +:103C4000C10181110EC08091C20181110AC0809111 +:103C5000C301811106C08091C401811102C010927C +:103C6000BF0108958091B60183FF7EC08CEB93E085 +:103C70000E942B058091C0011F928F9387EB93E0E8 +:103C80009F938F930E94C40585EB93E00E942B05C0 +:103C90008091C101282F082E000C330B3F938F9386 +:103CA00082EB93E09F938F930E94C40580EB93E097 +:103CB0000E942B058091C201282F082E000C330B87 +:103CC0003F938F938DEA93E09F938F930E94C40557 +:103CD0008BEA93E00E942B058091C301282F082EC8 +:103CE000000C330B3F938F9388EA93E09F938F935D +:103CF0000E94C40586EA93E00E942B058091C401CE +:103D0000282F082E000C330B3F938F9383EA93E008 +:103D10009F938F930E94C40580EA93E00E942B0535 +:103D20008091BF011F928F938DE993E09F938F93B2 +:103D30000E94C4058BE993E00E942B058091BE018F +:103D40001F928F9388E993E09F938F930E94C405FD +:103D500085E993E00E942B058DB79EB74C960FB670 +:103D6000F8949EBF0FBE8DBF80EC91E00E94F60FCD +:103D70000E94F21B9093BD018093BC0108951F9394 +:103D8000CF93DF938091BC019091BD010E940A1CEA +:103D9000FC012091BF01222329F090911101892F6C +:103DA00090E007C08091120190E06AE070E00E940C +:103DB0007D24E817F90708F485C08091C101C091FE +:103DC000C201D091C3011091C401811107C0C1117A +:103DD00075C0D11173C0111171C074C02F3F19F09B +:103DE0002F5F2093BF01181624F40E94BF1C8093FC +:103DF000C1018091C10187FF05C00E94BF1C819550 +:103E00008093C1011C1624F40E94BF1C8093C20140 +:103E10008091C20187FF05C00E94BF1C81958093DD +:103E2000C2016091C101662331F1C091C201CC236E +:103E300011F1062E000C770B880B990B0E947C2346 +:103E400023E333E343E35FE30E94E0230E94442340 +:103E50006093C1016C2FCC0F770B880B990B0E94DC +:103E60007C2323E333E343E35FE30E94E0230E94E8 +:103E700044236093C2011D1624F40E940A1D8093FE +:103E8000C3018091C30187FF05C00E940A1D81956F +:103E90008093C301111624F40E940A1D8093C4016B +:103EA0008091C40187FF05C00E940A1D81958093FF +:103EB000C401DF91CF911F910C94321E2F3F09F066 +:103EC0008FCF97CFDF91CF911F910895E0ECF1E074 +:103ED00085E0DF011D928A95E9F71092BF011092EB +:103EE000BE0108958FED95E00E942B051F9281E0A1 +:103EF0008F931F9285E08F9381E995E09F938F9335 +:103F00000E94C4050F900F900F900F900F900F908C +:103F100008958330E9F128F4813061F0823009F1AD +:103F20000895853009F462C008F449C0863009F468 +:103F300074C0089580911201262F30E0280F311DA2 +:103F40002F3F310524F4680F6093120103C08FEFF7 +:103F500080931201809112011F928F938AEC94E05A +:103F600072C080911101262F30E0280F311D2F3FA4 +:103F7000310524F4680F6093110103C08FEF809323 +:103F80001101809111011F928F9388EB94E05BC027 +:103F900080911001262F30E0280F311D2F3F310571 +:103FA00024F4680F6093100103C08FEF8093100119 +:103FB000809110011F928F9385EA94E044C0809114 +:103FC0000F01262F30E0280F311D2F3F310524F43B +:103FD000680F60930F0103C08FEF80930F018091F2 +:103FE0000F011F928F9380E994E02DC080910E0104 +:103FF000262F30E0280F311D2F3F310524F4680FA4 +:1040000060930E0103C08FEF80930E0180910E012B +:104010001F928F9387E794E016C080910D01262FA1 +:1040200030E0280F311D2F3F310524F4680F6093D5 +:104030000D0103C08FEF80930D0180910D011F9240 +:104040008F938CE594E09F938F930E94C4050F900B +:104050000F900F900F900895833081F128F48130F4 +:1040600059F08230D1F00895853009F449C0B8F193 +:10407000863009F456C0089580911201681720F423 +:10408000861B8093120102C01092120180911201CE +:104090001F928F938DE494E054C0809111016817B2 +:1040A00020F4861B8093110102C0109211018091AF +:1040B00011011F928F938BE394E043C08091100114 +:1040C000681720F4861B8093100102C01092100123 +:1040D000809110011F928F9388E294E032C080910A +:1040E0000F01681720F4861B80930F0102C0109205 +:1040F0000F0180910F011F928F9383E194E021C003 +:1041000080910E01681720F4861B80930E0102C077 +:1041100010920E0180910E011F928F938AEF93E00F +:1041200010C080910D01681720F4861B80930D014B +:1041300002C010920D0180910D011F928F938FED9F +:1041400093E09F938F930E94C4050F900F900F9060 +:104150000F900895CF93C82F1F928F9384EE96E00F +:104160009F938F930E94C40581E090E0A0E0B0E0AF +:10417000BC01CD0104C0660F771F881F991FCA9527 +:10418000D2F70E9484190F900F900F900F90CF914B +:104190000C947D15CF93873288F58E3108F00BC1D2 +:1041A0008E3009F487C0D8F4873009F460C08B30B2 +:1041B00009F44FC0863009F002C18091B601817FB9 +:1041C0008E7F8093B60189EE96E00E942B0587EAE8 +:1041D00099E00E942B0581E08093C60146C086319C +:1041E00009F4B0C020F4803109F47AC0E8C0893104 +:1041F00009F491C08B3109F449C0E1C0883349F119 +:1042000050F4893209F4D5C0853309F4D2C087321D +:1042100009F0D5C0CEC0833409F4CBC028F48A336A +:1042200008F4CDC08953C8C0883409F0C8C00E94C2 +:104230007D1586E999E00E942B052FEF83ED90E331 +:10424000215080409040E1F700C000000E94591CBE +:104250000CC080E197E041C08DE799E00E942B05FA +:104260008091B60181608093B601C1E0ADC08091BC +:10427000B601C82FC17080FFEFCF89E899E00E9496 +:104280002B058091B601817F8E7F3FC09091B60152 +:1042900091FBCC27C0F981E0C827892FC0FB81F9A9 +:1042A0008093B601CC2319F080E799E029C082E61B +:1042B00099E013C09091B60192FBCC27C0F981E040 +:1042C000C827892FC0FB82F98093B601CC2319F04F +:1042D00083E599E015C083E499E00E942B05C5CFE2 +:1042E0009091B60193FBCC27C0F981E0C827892FB4 +:1042F000C0FB83F98093B601CC2351F087E399E0AA +:104300000E942B058091B60181608093B6015CC04C +:104310008AE299E0E2CF8BE199E00E942B0586EFDB +:1043200098E00E942B058FEA98E00E942B0582E816 +:1043300098E00E942B058DE398E00E942B058EE00B +:1043400098E0CBCF80E098E00E942B050E94A10F5F +:104350001F928F9386EE97E09F938F930E94C405E0 +:1043600080910A011F928F938FEC97E09F938F9318 +:104370000E94C405809155011F928F938CEB97E0AA +:104380009F938F930E94C4050E94FE1B9F938F935F +:104390007F936F9385EA97E09F938F930E94C40564 +:1043A0008DB79EB742960FB6F8949EBF0FBE8DBFD5 +:1043B0005CCF80E001C08D510E94AA2056CF83EAD5 +:1043C00097E00E942B05C0E08C2FCF91089580E0EC +:1043D000089580E00895CF93C82F8091C601813061 +:1043E00081F020F0823009F44FC046C1E0910B010A +:1043F000F0910C0180818E3069F0873009F03EC168 +:1044000009C0E0910B01F0910C0180818E3011F018 +:10441000873061F48C2F0E94E721811104C08C2F1A +:104420000E94CA202FC081E090E02CC08C2F0E94F7 +:10443000E921811126C0C431E1F070F4CB3081F064 +:10444000C031D1F40E94721F8CED96E00E942B05C2 +:1044500082E08093C60115C0C93259F0C83361F4B7 +:1044600089EE96E00E942B0580EE96E00E942B05D7 +:1044700008C01092C60104C18AED96E00E942B0587 +:10448000FFC081E08170FEC0C43228F5CE3108F053 +:10449000C1C0CB30A1F1D0F4C73009F0D3C08EE158 +:1044A0008093120182E3809311018AE080931001CE +:1044B00084E180930F0188E080930E0188E280936D +:1044C0000D0180E895E00E942B05BFC0C33149F182 +:1044D000C431C1F0B7C0CB3409F4A9C028F4C93243 +:1044E00089F0C83361F0AEC0C13509F49EC0C23551 +:1044F00009F499C0CE3409F0A5C06AE09EC00E94BC +:10450000721FA3C08091C501882319F01092C501C4 +:104510009CC08DE895E00E942B0581E08093C60148 +:10452000B1C087E695E00E942B0585E595E00E94E5 +:104530002B05809112011F928F9382E595E09F9346 +:104540008F930E94C40580E595E00E942B058EE3C1 +:1045500095E00E942B05809111011F928F938BE3B0 +:1045600095E09F938F930E94C40589E395E00E9494 +:104570002B058AE295E00E942B05809110011F9285 +:104580008F9387E295E09F938F930E94C40585E205 +:1045900095E00E942B0584E195E00E942B05809117 +:1045A0000F011F928F9381E195E09F938F930E945B +:1045B000C4058FE095E00E942B058AEF94E00E94ED +:1045C0002B0580910E011F928F9387EF94E09F93AC +:1045D0008F930E94C40585EF94E00E942B058EED19 +:1045E00094E00E942B0580910D011F928F938BED1B +:1045F00094E09F938F930E94C40589ED94E00E94FC +:104600002B058DB79EB748960FB6F8949EBF0FBE88 +:104610008DBF1BC0CE51EC2FF0E0E95DFE4F8081D5 +:104620008093C50112C061E003C061E006C06AE08A +:104630008091C5010E94891F08C08091C5010E9418 +:104640002C2003C08EE795E013C08091C50188231C +:1046500069F01F928F9388E795E09F938F930E9454 +:10466000C4050F900F900F900F9004C085E795E060 +:104670000E942B0581E006C01092C60180E002C0B6 +:1046800080E000CFCF9108950E944B236894B11130 +:104690000C94DA2308950E94BF2388F09F5798F066 +:1046A000B92F9927B751B0F0E1F0660F771F881F37 +:1046B000991F1AF0BA95C9F714C0B13091F00E9451 +:1046C000D923B1E008950C94D923672F782F882738 +:1046D000B85F39F0B93FCCF3869577956795B39578 +:1046E000D9F73EF490958095709561957F4F8F4FE7 +:1046F0009F4F0895E89409C097FB3EF490958095EC +:10470000709561957F4F8F4F9F4F9923A9F0F92F97 +:1047100096E9BB279395F695879577956795B79515 +:10472000F111F8CFFAF4BB0F11F460FF1BC06F5FFB +:104730007F4F8F4F9F4F16C0882311F096E911C00D +:10474000772321F09EE8872F762F05C0662371F02E +:1047500096E8862F70E060E02AF09A95660F771F42 +:10476000881FDAF7880F9695879597F9089557FD72 +:104770009058440F551F59F05F3F71F04795880FCF +:1047800097FB991F61F09F3F79F087950895121666 +:1047900013061406551FF2CF4695F1DF08C0161612 +:1047A00017061806991FF1CF8695710561050894C3 +:1047B0000895E894BB2766277727CB0197F90895DA +:1047C0000E94F2230C946C240E945E2438F00E9414 +:1047D000652420F0952311F00C9455240C945B244F +:1047E0000C94DA230E94B72378F39923C9F3552355 +:1047F000B9F3950F50E0551FAA27EE27FF27BB27D7 +:1048000000240894679520F4E20FF31FB41F0A1EDA +:10481000220F331F441FAA1F6695A9F7779530F41E +:10482000F30FB41F0A1E121E08F46395330F441FC2 +:10483000AA1F221F769599F7879520F4B40F0A1EB8 +:10484000121E631F440FAA1F221F331F8695A9F74C +:10485000862F712D602D11249F5750409AF0F1F052 +:1048600088234AF0EE0FFF1FBB1F661F771F881FAC +:1048700091505040A9F79E3F510580F00C9455246B +:104880000C94DA235F3FE4F3983ED4F38695779552 +:104890006795B795F795E7959F5FC1F7FE2B880F52 +:1048A000911D9695879597F9089597F99F6780E8E8 +:1048B00070E060E008959FEF80EC089500240A9472 +:1048C0001616170618060906089500240A941216EB +:1048D0001306140605060895092E0394000C11F41E +:1048E000882352F0BB0F40F4BF2B11F460FF04C0CB +:1048F0006F5F7F4F8F4F9F4F08950024552704C04F +:10490000080E591F880F991F009729F07695679513 +:10491000B8F37105B9F7802D952F0895991B79E0AB +:1049200004C0991F961708F0961B881F7A95C9F73F +:104930008095089597FB072E16F4009407D077FD15 +:1049400009D00E94B42407FC05D03EF490958195CF +:104950009F4F0895709561957F4F0895EE0FFF1F4B +:104960000590F491E02D0994AA1BBB1B51E107C0EF +:10497000AA1FBB1FA617B70710F0A61BB70B881FEF +:10498000991F5A95A9F780959095BC01CD0108957E +:04499000F894FFCFC9 +:104994006608570934090009CC0801AC0128081439 +:1049A4000A321E404D36223003E302AD028B021759 +:1049B40002300249026202010203040506070809E3 +:0249C4000000F1 +:106800000000000000000000040005000600070072 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280000002A002B002C002D002E002F0005 +:10686000300031A1320033003400350036003700EB +:106870003800E00000000000000000000000000000 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000004F00A9 +:1068A000500051005200530067005400550056003C +:1068B000580059005A005B005C005D005E005F00FC +:1068C0006000610062006300640000005700000087 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000E100E200E300000000000000F1A160 +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010000004C00010001004400450052000D +:1069600049000100010050004F0029004D004E0079 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E000010001000100010001000100010001009F +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/m0110_usb/keymap_default.c b/converter/m0110_usb/keymap.c similarity index 98% rename from converter/m0110_usb/keymap_default.c rename to converter/m0110_usb/keymap.c index 0f9b8d27..bfe8727d 100644 --- a/converter/m0110_usb/keymap_default.c +++ b/converter/m0110_usb/keymap.c @@ -98,9 +98,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), diff --git a/converter/m0110_usb/keymap_common.c b/converter/m0110_usb/keymap_common.c deleted file mode 100644 index 4ac2d717..00000000 --- a/converter/m0110_usb/keymap_common.c +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2011,2012,2014 Jun Wako - -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 . -*/ -#include -#include -#include "action.h" -#include "keycode.h" -#include "keymap.h" -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn index to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - return action; -} diff --git a/converter/m0110_usb/keymap_common.h b/converter/m0110_usb/keymap_common.h index 925556d9..4a7e7a16 100644 --- a/converter/m0110_usb/keymap_common.h +++ b/converter/m0110_usb/keymap_common.h @@ -15,15 +15,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include -#include #include "keycode.h" #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* Common layout for M0110 and M0110A * This keymap works with both keyboards. As you can see, the M0110A is * a superset of M0110 keyboard, only one exception is 'Enter'(34) of M0110 @@ -45,7 +40,7 @@ extern const uint16_t fn_actions[]; * ,---------------------------------------------------------. ,---------------. * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| * |---------------------------------------------------------| |---------------| - * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| | | 59| 5B| 5C| 4E| + * | 30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| | | 59| 5B| 5C| 4E| * |-----------------------------------------------------' | |---------------| * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66| * |---------------------------------------------------------| |---------------| @@ -58,7 +53,7 @@ extern const uint16_t fn_actions[]; * ,---------------------------------------------------------. ,---------------. * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| * |---------------------------------------------------------| |---------------| - * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| + * | 30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| * |---------------------------------------------------------| |---------------| * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66| * |---------------------------------------------------------| |---------------| @@ -99,7 +94,7 @@ extern const uint16_t fn_actions[]; * ,---------------------------------------------------------. ,---------------. * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| * |---------------------------------------------------------| |---------------| - * | 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| + * | 30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| * |------------------------------------------------------, | |---------------| * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | | 56| 57| 58| 66| * |---------------------------------------------------------| |---------------| diff --git a/converter/m0110_usb/keymap_hasu.c b/converter/m0110_usb/keymap_hasu.c deleted file mode 100644 index 11f1a4f3..00000000 --- a/converter/m0110_usb/keymap_hasu.c +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2014 Jun Wako - -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 . -*/ -#include -#include "keycode.h" -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default: - * M0110 - * ,---------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| - * |---------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| - * |---------------------------------------------------------| - * |Ctrl | A| S| D| F| G| H| J| K| L| Fn| '|Return| - * |---------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| Fn|Shift | - * `---------------------------------------------------------' - * |Fn |alt | Fn |Gui |Fn | - * `-----------------------------------------------' - */ - [0] = KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, NLCK,EQL, PSLS,PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, P7, P8, P9, PMNS, - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN1, UP, P1, P2, P3, PENT, - FN0, LALT, FN2, LGUI,BSLS,LEFT,RGHT,DOWN, P0, PDOT - ), - // IJKL cursor - [1] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,NO, NO, NO, NO, NO, HOME,PGDN,UP, PGUP,END, NO, NO, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, HOME,LEFT,DOWN,RGHT,END, NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, PGUP, P1, P2, P3, PENT, - TRNS,LALT, SPC, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), - // HJKL cursor - [2] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,NO, NO, NO, NO, NO, HOME,PGDN,UP, PGUP,END, NO, NO, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, PGUP, P1, P2, P3, PENT, - TRNS,LALT, SPC, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), - // Mousekey - [3] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,Q, W, E, R, T, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,BTN1,NO, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, BTN2,BTN1,BTN4,BTN5,NO, PGUP, P1, P2, P3, PENT, - NO, LALT, TRNS, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), - // Mousekey - [4] = KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, NLCK,EQL, PSLS,PAST, - CAPS,Q, W, E, R, T, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD, P7, P8, P9, PMNS, - LCTL,VOLD,VOLU,MUTE,NO, NO, BTN2,MS_L,MS_D,MS_R,TRNS,NO, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, BTN2,BTN1,BTN4,BTN5,NO, PGUP, P1, P2, P3, PENT, - NO, LALT, BTN1, LGUI,BSLS,HOME,END, PGDN, P0, PDOT - ), -}; - - -/* - * Fn action definition - */ -const uint16_t fn_actions[] PROGMEM = { - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), - [2] = ACTION_LAYER_TAP_KEY(3, KC_SPACE), - [3] = ACTION_LAYER_TAP_KEY(4, KC_SCOLON), -}; diff --git a/converter/m0110_usb/keymap_intl.c b/converter/m0110_usb/keymap_intl.c index 6cc251a2..547bebca 100644 --- a/converter/m0110_usb/keymap_intl.c +++ b/converter/m0110_usb/keymap_intl.c @@ -68,6 +68,6 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/converter/m0110_usb/keymap_spacefn.c b/converter/m0110_usb/keymap_spacefn.c index 5017861a..d941ea8f 100644 --- a/converter/m0110_usb/keymap_spacefn.c +++ b/converter/m0110_usb/keymap_spacefn.c @@ -65,7 +65,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/converter/m0110_usb/matrix.c b/converter/m0110_usb/matrix.c index 9dcdc0d6..b216aba1 100644 --- a/converter/m0110_usb/matrix.c +++ b/converter/m0110_usb/matrix.c @@ -46,18 +46,6 @@ static uint8_t _matrix0[MATRIX_ROWS]; static void register_key(uint8_t key); -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { m0110_init(); @@ -95,48 +83,12 @@ uint8_t matrix_scan(void) return 1; } -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_FN0 ACTION_LAYER_MOMENTARY(1) +#define AC_FN1 ACTION_LAYER_TAP_KEY(1, KC_BSLS) + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NO, BSPC, NO, NO, NO, NLCK,PEQL,PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, FN1, NO, NO, NO, P7, P8, P9, PMNS, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PPLS, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, NO, NO, UP, P1, P2, P3, PENT, + NO, LGUI,LALT,NO, SPC, NO, NO, NO, FN0, NO, NO, LEFT,DOWN,RGHT, P0, PDOT,NO + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + NO, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; + diff --git a/converter/m0110_usb/unimap_trans.h b/converter/m0110_usb/unimap_trans.h new file mode 100644 index 00000000..cd6682a9 --- /dev/null +++ b/converter/m0110_usb/unimap_trans.h @@ -0,0 +1,244 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_COMMON_H +#define UNIMAP_COMMON_H + +#include +#include +#include "unimap.h" + + +/* M0110A scan codes + * ,---------------------------------------------------------. ,---------------. + * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| + * |---------------------------------------------------------| |---------------| + * | 30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| | | 59| 5B| 5C| 4E| + * |-----------------------------------------------------' | |---------------| + * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66| + * |---------------------------------------------------------| |---------------| + * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 38| 4D| | 53| 54| 55| | + * `---------------------------------------------------------' |-----------| 4C| + * | 3A| 37| 31 | 2A| 46| 42| 48| | 52| 41| | + * `---------------------------------------------------------' `---------------' + * + * M0110 + M0120 scan codes + * ,---------------------------------------------------------. ,---------------. + * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62| + * |---------------------------------------------------------| |---------------| + * | 30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E| + * |---------------------------------------------------------| |---------------| + * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66| + * |---------------------------------------------------------| |---------------| + * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 38| | 53| 54| 55| | + * `---------------------------------------------------------' |-----------| 4C| + * | 3A| 37| 31 | 34| 3A| | 52| 41| | + * `------------------------------------------------' `---------------' + * + * International M0110 + * https://en.wikipedia.org/wiki/File:Apple_Macintosh_Plus_Keyboard.jpg + * Probably International keyboard layout of M0110A doesn't exist. + * ,---------------------------------------------------------. + * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| + * |---------------------------------------------------------| + * | 30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| 2A| + * |------------------------------------------------------, | + * | 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | + * |---------------------------------------------------------| + * | 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 0A| 38| + * `---------------------------------------------------------' + * | 3A| 37| 34 | 31| 3A| + * `------------------------------------------------' + */ +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + // Position(unimap) scan code(matrix) + // --------------------------------------------- + { + UNIMAP_A, // 0x00 + UNIMAP_S, // 0x01 + UNIMAP_D, // 0x02 + UNIMAP_F, // 0x03 + UNIMAP_H, // 0x04 + UNIMAP_G, // 0x05 +#ifdef M0110_INTL + UNIMAP_NONUS_BSLASH, // 0x06 + UNIMAP_Z, // 0x07 + }, + { + UNIMAP_X, // 0x08 + UNIMAP_C, // 0x09 + UNIMAP_SLASH, // 0x0A + UNIMAP_V, // 0x0B +#else + UNIMAP_Z, // 0x06 + UNIMAP_X, // 0x07 + }, + { + UNIMAP_C, // 0x08 + UNIMAP_V, // 0x09 + UNIMAP_NO, // 0x0A + UNIMAP_B, // 0x0B +#endif + UNIMAP_Q, // 0x0C + UNIMAP_W, // 0x0D + UNIMAP_E, // 0x0E + UNIMAP_R, // 0x0F + }, + { + UNIMAP_Y, // 0x10 + UNIMAP_T, // 0x11 + UNIMAP_1, // 0x12 + UNIMAP_2, // 0x13 + UNIMAP_3, // 0x14 + UNIMAP_4, // 0x15 + UNIMAP_6, // 0x16 + UNIMAP_5, // 0x17 + }, + { + UNIMAP_EQUAL, // 0x18 + UNIMAP_9, // 0x19 + UNIMAP_7, // 0x1A + UNIMAP_MINUS, // 0x1B + UNIMAP_8, // 0x1C + UNIMAP_0, // 0x1D + UNIMAP_RBRACKET, // 0x1E + UNIMAP_O, // 0x1F + }, + { + UNIMAP_U, // 0x20 + UNIMAP_LBRACKET, // 0x21 + UNIMAP_I, // 0x22 + UNIMAP_P, // 0x23 +#ifdef M0110_INTL + UNIMAP_NONUS_HASH, // 0x24 +#else + UNIMAP_ENTER, // 0x24 +#endif + UNIMAP_L, // 0x25 + UNIMAP_J, // 0x26 + UNIMAP_QUOTE, // 0x27 + }, + { + UNIMAP_K, // 0x28 + UNIMAP_SCOLON, // 0x29 +#ifdef M0110_INTL + UNIMAP_ENTER, // 0x2A + UNIMAP_M, // 0x2B + UNIMAP_DOT, // 0x2C + UNIMAP_B, // 0x2D + UNIMAP_N, // 0x2E + UNIMAP_COMMA, // 0x2F +#else + UNIMAP_BSLASH, // 0x2A + UNIMAP_COMMA, // 0x2B + UNIMAP_SLASH, // 0x2C + UNIMAP_N, // 0x2D + UNIMAP_M, // 0x2E + UNIMAP_DOT, // 0x2F +#endif + }, + { + UNIMAP_TAB, // 0x30 +#ifdef M0110_INTL + UNIMAP_RGUI, // 0x31 +#else + UNIMAP_SPACE, // 0x31 +#endif + UNIMAP_GRAVE, // 0x32 + UNIMAP_BSPACE, // 0x33 +#ifdef M0110_INTL + UNIMAP_SPACE, // 0x34 +#else + UNIMAP_RGUI, // 0x34 +#endif + UNIMAP_NO, // 0x35 + UNIMAP_NO, // 0x36 + UNIMAP_LGUI, // 0x37 + }, + { + UNIMAP_LSHIFT, // 0x38 + UNIMAP_CAPSLOCK, // 0x39 + UNIMAP_LALT, // 0x3A + UNIMAP_NO, // 0x3B + UNIMAP_NO, // 0x3C + UNIMAP_NO, // 0x3D + UNIMAP_NO, // 0x3E + UNIMAP_NO, // 0x3F + }, + { + UNIMAP_NO, // 0x40 + UNIMAP_KP_DOT, // 0x41 + UNIMAP_RIGHT, // 0x42 + UNIMAP_NO, // 0x43 + UNIMAP_NO, // 0x44 + UNIMAP_NO, // 0x45 + UNIMAP_LEFT, // 0x46 + UNIMAP_NUMLOCK, // 0x47 + }, + { + UNIMAP_DOWN, // 0x48 + UNIMAP_NO, // 0x49 + UNIMAP_NO, // 0x4A + UNIMAP_NO, // 0x4B + UNIMAP_KP_ENTER, // 0x4C + UNIMAP_UP, // 0x4D + UNIMAP_KP_PLUS, // 0x4E keypad minus + UNIMAP_NO, // 0x4F + }, + { + UNIMAP_NO, // 0x50 + UNIMAP_NO, // 0x51 + UNIMAP_KP_0, // 0x52 + UNIMAP_KP_1, // 0x53 + UNIMAP_KP_2, // 0x54 + UNIMAP_KP_3, // 0x55 + UNIMAP_KP_4, // 0x56 + UNIMAP_KP_5, // 0x57 + }, + { + UNIMAP_KP_6, // 0x58 + UNIMAP_KP_7, // 0x59 + UNIMAP_NO, // 0x5A + UNIMAP_KP_8, // 0x5B + UNIMAP_KP_9, // 0x5C + UNIMAP_NO, // 0x5D + UNIMAP_NO, // 0x5E + UNIMAP_NO, // 0x5F + }, + { + UNIMAP_NO, // 0x60 + UNIMAP_NO, // 0x61 + UNIMAP_KP_MINUS, // 0x62 keypad asterisk + UNIMAP_NO, // 0x63 + UNIMAP_NO, // 0x64 + UNIMAP_NO, // 0x65 + UNIMAP_KP_COMMA, // 0x66 + UNIMAP_NO, // 0x67 + }, + { + UNIMAP_KP_SLASH, // 0x68 keypad equal + UNIMAP_NO, // 0x69 + UNIMAP_NO, // 0x6A + UNIMAP_NO, // 0x6B + UNIMAP_NO, // 0x6C + UNIMAP_KP_ASTERISK, // 0x6D keypad slash + UNIMAP_NO, // 0x6E compose + UNIMAP_NO, // 0x6F + }, +}; + +#endif + diff --git a/converter/news_usb/keymap.c b/converter/news_usb/keymap.c index 058f2914..5e6c2b5d 100644 --- a/converter/news_usb/keymap.c +++ b/converter/news_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "util.h" #include "keymap.h" @@ -56,7 +55,7 @@ along with this program. If not, see . // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { +const uint8_t PROGMEM fn_layer[] = { 0, // Fn0 0, // Fn1 0, // Fn2 @@ -69,7 +68,7 @@ static const uint8_t PROGMEM fn_layer[] = { // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { +const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_NO, // Fn2 @@ -81,7 +80,7 @@ static const uint8_t PROGMEM fn_keycode[] = { }; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: default * ,---. ,------------------------, ,------------------------. ,---------. * |Pow| | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10| | F11| F12| ,-----------. @@ -107,19 +106,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LALT,CAPS,LALT, SPC, ERAS, RALT,RGUI,RCTL, PGDN, TAB, LEFT,DOWN,RGHT ), }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/news_usb/matrix.c b/converter/news_usb/matrix.c index f0d5b586..c92a4888 100644 --- a/converter/news_usb/matrix.c +++ b/converter/news_usb/matrix.c @@ -47,20 +47,6 @@ static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) ((code>>3)&0xF) #define COL(code) (code&0x07) -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} void matrix_init(void) { @@ -74,8 +60,6 @@ void matrix_init(void) uint8_t matrix_scan(void) { - is_modified = false; - uint8_t code; code = news_recv(); if (code == 0) { @@ -87,56 +71,18 @@ uint8_t matrix_scan(void) // break code if (matrix_is_on(ROW(code), COL(code))) { matrix[ROW(code)] &= ~(1< #include -#include #include "keycode.h" #include "print.h" #include "debug.h" @@ -59,7 +58,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "keycode.h" // 32*8(256) byte array which converts PS/2 code into USB code -static const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { ACTION_LAYER_MOMENTARY(1), // FN0 - left command key ACTION_LAYER_MOMENTARY(1), // FN1 - right command key ACTION_KEY(KC_BSLS), // FN2 - number pad slash & backslash @@ -116,62 +115,50 @@ static const uint16_t PROGMEM fn_actions[] = { } -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: default * ,-----------------------------------------------------------. ,-----------. ,---------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS | |Ins|Ref|Hom| |` | =| /| *| + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS | |VoU|Mut|PgU| | `| \| /| *| * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |Del| |End| | 7| 8| 9| -| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | |VoD| |PgD| | 7| 8| 9| -| * |-----------------------------------------------------' | `---' `---' |-----------|---| * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +| * |-----------------------------------------------------------| ,---. |---------------| * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| | * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Fn0 |Alt | Space |LGui |Fn1 | |Lef|Dow|Rig| | 0| .| | + * |LAlt |LGui | Space |FN0 |RAlt | |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ KEYMAP( - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, WREF,HOME, GRV, FN3, FN2, PAST, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,NO, DEL, END, P7, P8, P9, PMNS, + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, VOLU,MUTE,PGUP, GRV, BSLS,PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, VOLD, PGDN, P7, P8, P9, PMNS, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - FN0, LALT, SPC, LGUI,FN1, LEFT,DOWN,RGHT, P0, PDOT,PENT + LALT,LGUI, SPC, FN0, RALT, LEFT,DOWN,RGHT, P0, PDOT,PENT ), - /* Layer 1: extra keys + /* Layer 1: HHKB like * ,-----------------------------------------------------------. ,-----------. ,---------------. - * |Grv| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| BS | |VUp|VMu|PgU| |` | =| /| *| + * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Del | | | | | |Num| | | | * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab |Pau| W| E| R| T| Y| U| I| O|PSc| \| ]| | |VDn| |PgD| | 7| 8| 9| -| + * |Caps | \| | | | | | |Psc|Slk|Pau|Up |Ins| | | | | | | | | | | * |-----------------------------------------------------' | `---' `---' |-----------|---| - * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +| + * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig| | | | | | | * |-----------------------------------------------------------| ,---. |---------------| - * |Shift |UND|CUT|COP|PST| B| N| M| ,| .| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------|Ent| - * |Fn0 |Alt | Space |RGui |Fn1 | |Lef|Dow|Rig| | 0| .| | + * | |UND|CUT|COP|PST| | +| -|End|PgD|Dow| | |PgU| | | | | | + * |-----------------------------------------------------------| ,-----------. |-----------| | + * | | | | | | |Hom|PgD|End| | | | | * `-----------------------------------------------------------' `-----------' `---------------' */ KEYMAP( - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, VOLU,MUTE,PGUP, TRNS,TRNS,TRNS,TRNS, - TRNS,PAUS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,FN3, BSLS,TRNS, VOLD, PGDN, BTN1,MS_U,BTN2,WH_U, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, MS_L,MS_D,MS_R,WH_D, - TRNS, FN4, FN5, FN6, FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS,TRNS,TRNS, - TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, TRNS,TRNS,TRNS, NLCK,TRNS,TRNS,TRNS, + CAPS,BSLS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS, FN4, FN5, FN6, FN7, TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS, PGUP, TRNS,TRNS,TRNS, + TRNS,TRNS, TRNS, TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS ) }; - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/next_usb/matrix.c b/converter/next_usb/matrix.c index 524d5784..18395a7e 100644 --- a/converter/next_usb/matrix.c +++ b/converter/next_usb/matrix.c @@ -66,20 +66,6 @@ static uint8_t matrix[MATRIX_ROWS]; static bool is_modified = false; -/* number of matrix rows */ -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -/* number of matrix columns */ -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - #ifndef NEXT_KBD_LED1_ON #define NEXT_KBD_LED1_ON #endif @@ -227,19 +213,6 @@ uint8_t matrix_scan(void) return 1; } -/* whether modified from previous scan. used after matrix_scan. */ -bool matrix_is_modified() -{ - return is_modified; -} - -/* whether a switch is on */ -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_FN0 ACTION_LAYER_MOMENTARY(1) +// Undo, Cut, Copy and Paste +#define AC__UND ACTION_MODS_KEY(MOD_LCTL, KC_Z) +#define AC__CUT ACTION_MODS_KEY(MOD_LCTL, KC_X) +#define AC__CPY ACTION_MODS_KEY(MOD_LCTL, KC_C) +#define AC__PST ACTION_MODS_KEY(MOD_LCTL, KC_V) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NO, BSPC, VOLU,MUTE,PGUP, GRV, BSLS,PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, VOLD,NO, PGDN, P7, P8, P9, PMNS, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NO, ENT, P4, P5, P6, PPLS, + LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH, NO, RSFT, UP, P1, P2, P3, PENT, + LALT,LGUI,NO, NO, SPC, NO, NO, NO, NO, FN0, RALT, LEFT,DOWN,RGHT, P0, PDOT,NO + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, NLCK,TRNS,TRNS,TRNS, + CAPS,BSLS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,_UND,_CUT,_CPY,_PST,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; diff --git a/converter/next_usb/unimap_trans.h b/converter/next_usb/unimap_trans.h new file mode 100644 index 00000000..71b39c2a --- /dev/null +++ b/converter/next_usb/unimap_trans.h @@ -0,0 +1,86 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_COMMON_H +#define UNIMAP_COMMON_H + +#include +#include +#include "unimap.h" + + +/* Mapping to Universal keyboard layout + * + * Universal keyboard layout + * ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|KP=| + * `-----------------------------------------------------------' `-----------' `---------------' + * + * NeXT Matrix(Scan code) + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | 49| 4A| 4B| 4C| 4D| 50| 4F| 4E| 1E| 1F| 20| 1D| 1C| 1B | | 1A| 58| 19| | 26| 27| 28| 25| + * |-----------------------------------------------------------| |-----------| |---------------| + * | 41 | 42| 43| 44| 45| 48| 47| 46| 06| 07| 08| 05| 04| 03 | | 02| | 01| | 21| 22| 23| 24| + * |-----------------------------------------------------------| `---' `---' |-----------|---| + * | 57 | 39| 3A| 3B| 3C| 3D| 40| 3F| 3E| 2D| 2C| 2B| 2A | | 12| 18| 13| 15| + * |-----------------------------------------------------------| ,---. |---------------| + * | 56 | 31| 32| 33| 34| 35| 37| 36| 2E| 2F| 30| 55 | | 16| | 11| 17| 14| | + * |-----------------------------------------------------------| ,-----------. |-----------| | + * | 52 | 54 | 38 | 53 | 51 | | 09| 0F| 10| |0B | 0C| 0D| + * `-----------------------------------------------------------' `-----------' `---------------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BSpc | |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del| |PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `---' `---' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------| | + * |LCtl |Gui | Space | App | RCtl| |Lef|Dow|Rig| | 0 | .|Ent| + * `-----------------------------------------------------------' `-----------' `---------------' + */ + +// Matrix 12 * 8 +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_NO, UNIMAP_PGDN, UNIMAP_DEL, UNIMAP_BSLS, UNIMAP_RBRC, UNIMAP_LBRC, UNIMAP_I, UNIMAP_O }, // 0x00-07 + { UNIMAP_P, UNIMAP_LEFT, UNIMAP_NO, UNIMAP_P0, UNIMAP_PDOT, UNIMAP_PENT, UNIMAP_NO, UNIMAP_DOWN }, // 0x08-0F + { UNIMAP_RGHT, UNIMAP_P1, UNIMAP_P4, UNIMAP_P6, UNIMAP_P3, UNIMAP_PCMM, UNIMAP_UP, UNIMAP_P2 }, // 0x10-17 + { UNIMAP_P5, UNIMAP_PGUP, UNIMAP_INS, UNIMAP_BSPC, UNIMAP_EQL, UNIMAP_MINS, UNIMAP_8, UNIMAP_9 }, // 0x18-1f + { UNIMAP_0, UNIMAP_P7, UNIMAP_P8, UNIMAP_P9, UNIMAP_PPLS, UNIMAP_PMNS, UNIMAP_NLCK, UNIMAP_PSLS }, // 0x20-27 + { UNIMAP_PAST, UNIMAP_NO, UNIMAP_ENT, UNIMAP_QUOT, UNIMAP_SCLN, UNIMAP_L, UNIMAP_COMM, UNIMAP_DOT }, // 0x28-2f + { UNIMAP_SLSH, UNIMAP_Z, UNIMAP_X, UNIMAP_C, UNIMAP_V, UNIMAP_B, UNIMAP_M, UNIMAP_N }, // 0x30-37 + { UNIMAP_SPC, UNIMAP_A, UNIMAP_S, UNIMAP_D, UNIMAP_F, UNIMAP_G, UNIMAP_K, UNIMAP_J }, // 0x38-3f + { UNIMAP_H, UNIMAP_TAB, UNIMAP_Q, UNIMAP_W, UNIMAP_E, UNIMAP_R, UNIMAP_U, UNIMAP_Y }, // 0x40-47 + { UNIMAP_T, UNIMAP_GRV, UNIMAP_1, UNIMAP_2, UNIMAP_3, UNIMAP_4, UNIMAP_7, UNIMAP_6 }, // 0x48-4f + { UNIMAP_5, UNIMAP_RCTL, UNIMAP_LCTL, UNIMAP_APP, UNIMAP_LGUI, UNIMAP_RSFT, UNIMAP_LSFT, UNIMAP_CAPS }, // 0x50-57 + { UNIMAP_HOME, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO } // 0x58-5f +}; + +#endif diff --git a/converter/pc98_usb/keymap.c b/converter/pc98_usb/keymap.c index 8922ea7b..e56a72f1 100644 --- a/converter/pc98_usb/keymap.c +++ b/converter/pc98_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -72,7 +71,7 @@ along with this program. If not, see . -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* ,---------------------------------------------------------------. | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E| @@ -114,7 +113,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT ), }; -static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {}; /* * Macro definition @@ -163,7 +161,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* * Fn actions */ -static const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { ACTION_LAYER_TAP_TOGGLE(0), // FN0 ACTION_LAYER_TAP_KEY(1, KC_SLASH), // FN1 ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN2 @@ -172,37 +170,3 @@ static const uint16_t PROGMEM fn_actions[] = { ACTION_MACRO(RBRACKET), // FN5 ACTION_MACRO(DUMMY), // FN6 }; - - - - - - -/* - * No need to edit. - */ -#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0])) -#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - if (layer < KEYMAPS_SIZE) { - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); - } else { - // fall back to layer 0 - return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]); - } -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - } else { - action.code = ACTION_NO; - } - return action; -} diff --git a/converter/pc98_usb/matrix.c b/converter/pc98_usb/matrix.c index 8833e0a8..19cfb0c0 100644 --- a/converter/pc98_usb/matrix.c +++ b/converter/pc98_usb/matrix.c @@ -46,20 +46,6 @@ static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) ((code>>3)&0xF) #define COL(code) (code&0x07) -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} static void pc98_inhibit_repeat(void) { @@ -128,8 +114,6 @@ void matrix_init(void) uint8_t matrix_scan(void) { - is_modified = false; - uint16_t code; PC98_RDY_PORT |= (1<. /* key combination for command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ + keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \ ) @@ -61,7 +61,7 @@ along with this program. If not, see . * PS/2 Pin interrupt */ #ifdef PS2_USE_INT -#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) +#if defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U2__) /* uses INT1 for clock line(ATMega32U4) */ #define PS2_CLOCK_PORT PORTD #define PS2_CLOCK_PIN PIND diff --git a/converter/ps2_usb/config_tmk_rev1.h b/converter/ps2_usb/config_rev1.h similarity index 98% rename from converter/ps2_usb/config_tmk_rev1.h rename to converter/ps2_usb/config_rev1.h index 75dc97df..ce670f50 100644 --- a/converter/ps2_usb/config_tmk_rev1.h +++ b/converter/ps2_usb/config_rev1.h @@ -36,7 +36,7 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ - keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ + keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \ ) diff --git a/converter/ps2_usb/config_tmk_rev2.h b/converter/ps2_usb/config_rev2.h similarity index 87% rename from converter/ps2_usb/config_tmk_rev2.h rename to converter/ps2_usb/config_rev2.h index 2e91838e..1f42cd49 100644 --- a/converter/ps2_usb/config_tmk_rev2.h +++ b/converter/ps2_usb/config_rev2.h @@ -35,7 +35,8 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ + keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \ ) @@ -82,4 +83,13 @@ along with this program. If not, see . #define PS2_INT_VECT INT1_vect #endif +#ifdef LUFA_DEBUG_SUART +# define SUART_OUT_DDR DDRD +# define SUART_OUT_PORT PORTD +# define SUART_OUT_BIT 4 +# define SUART_IN_DDR DDRD +# define SUART_IN_PIN PIND +# define SUART_IN_BIT 4 +#endif + #endif diff --git a/converter/ps2_usb/keymap_common.c b/converter/ps2_usb/keymap_common.c deleted file mode 100644 index e344fb41..00000000 --- a/converter/ps2_usb/keymap_common.c +++ /dev/null @@ -1,31 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/ps2_usb/keymap_common.h b/converter/ps2_usb/keymap_common.h index d783e01d..4af67522 100644 --- a/converter/ps2_usb/keymap_common.h +++ b/converter/ps2_usb/keymap_common.h @@ -28,25 +28,55 @@ along with this program. If not, see . #include "keymap.h" -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - +/* ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| ^a|Entr| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | #| 0| .|KP=| + * `-----------------------------------------------------------' `-----------' `---------------' + * + * PS/2 scan codes + * http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf + * ,-----------------------------------------------. + * | 08| 10| 18| 20| 28| 30| 38| 40| 48| 50| 57| 5F| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * | 76| | 05| 06| 04| 0C| 03| 0B| 83| 0A| 01| 09| 78| 07| | FC| 7E| FE| | A1| B2| A3| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | 0E| 16| 1E| 26| 25| 2E| 36| 3D| 3E| 46| 45| 4E| 55| 6A| 66| | F0| EC| FD| | 77| CA| 7C| 7B| + * |-----------------------------------------------------------| |-----------| |---------------| + * | 0D | 15| 1D| 24| 2D| 2C| 35| 3C| 43| 44| 4D| 54| 5B| 5D | | F1| E9| FA| | 6C| 75| 7D| 79| + * |-----------------------------------------------------------| `-----------' |---------------| + * | 58 | 1C| 1B| 23| 2B| 34| 33| 3B| 42| 4B| 4C| 52| ^a| 5A | | 6B| 73| 74| 6D| + * |-----------------------------------------------------------| ,---. |---------------| + * | 12 | 61| 1A| 22| 21| 2A| 32| 31| 3A| 41| 49| 4A| 51| 59 | | F5| | 69| 72| 7A| DA| + * |-----------------------------------------------------------| ,-----------. |---------------| + * | 14| 9F| 11| 67 | 29 | 64 | 13 | 91| A7| AF| 94| | EB| F2| F4| | 68|70 | 71| 63| + * `-----------------------------------------------------------' `-----------' `---------------' + * ^a ISO hash key uses identical scancode 5D to US backslash. + * 51, 63, 68, 6D: hidden keys in IBM model M + */ /* All keys */ #define KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ + K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ + K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, KA1,KB2,KA3, \ + K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ + K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5D, KF1,KE9,KFA, K6C,K75,K7D,K79, \ + K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K6D, \ + K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K51,K59, KF5, K69,K72,K7A,KDA, \ + K14,K9F,K11,K67, K29, K64,K13,K91,KA7,KAF,K94, KEB,KF2,KF4, K68,K70,K71,K63, \ \ - K61, /* for European ISO */ \ - K51, K13, K6A, K64, K67, /* for Japanese JIS */ \ - K08, K10, K18, K20, K28, K30, K38, K40, K48, K50, K57, K5F, /* F13-24 */ \ KB7, KBF, KDE, /* System Power, Sleep, Wake */ \ - KA3, KB2, KA1, /* Mute, Volume Up, Volume Down */ \ KCD, K95, KBB, KB4, KD0, /* Next, Previous, Stop, Pause, Media Select */ \ KC8, KAB, KC0, /* Mail, Calculator, My Computer */ \ K90, KBA, KB8, KB0, /* WWW Search, Home, Back, Forward */ \ @@ -64,8 +94,8 @@ extern const uint16_t fn_actions[]; { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_NO }, \ { KC_##K50, KC_##K51, KC_##K52, KC_NO, KC_##K54, KC_##K55, KC_NO, KC_##K57 }, \ { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_##K5D, KC_NO, KC_##K5F }, \ - { KC_NO, KC_##K61, KC_NO, KC_NO, KC_##K64, KC_NO, KC_##K66, KC_##K67 }, \ - { KC_NO, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_##K61, KC_NO, KC_##K63, KC_##K64, KC_NO, KC_##K66, KC_##K67 }, \ + { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_NO, KC_NO }, \ { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_##K7C, KC_##K7D, KC_##K7E, KC_NO }, \ { KC_NO, KC_NO, KC_NO, KC_##K83, KC_NO, KC_NO, KC_NO, KC_NO }, \ @@ -86,6 +116,31 @@ extern const uint16_t fn_actions[]; { KC_NO, KC_NO, KC_##KFA, KC_NO, KC_##KFC, KC_##KFD, KC_##KFE, KC_NO }, \ } +#define KEYMAP_FULL( \ + K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ + K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, KA1,KB2,KA3, \ + K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ + K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5D, KF1,KE9,KFA, K6C,K75,K7D,K79, \ + K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K6D, \ + K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K51,K59, KF5, K69,K72,K7A,KDA, \ + K14,K9F,K11,K67, K29, K64,K13,K91,KA7,KAF,K94, KEB,KF2,KF4, K68,K70,K71,K63 \ +) \ +KEYMAP_ALL( \ + K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ + K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, KA1,KB2,KA3, \ + K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ + K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5D, KF1,KE9,KFA, K6C,K75,K7D,K79, \ + K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K6D, \ + K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K51,K59, KF5, K69,K72,K7A,KDA, \ + K14,K9F,K11,K67, K29, K64,K13,K91,KA7,KAF,K94, KEB,KF2,KF4, K68,K70,K71,K63, \ + \ + SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ + MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ + MAIL, CALCULATOR, MY_COMPUTER, \ + WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ + WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ +) + /* US layout */ #define KEYMAP( \ K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ @@ -95,23 +150,14 @@ extern const uint16_t fn_actions[]; K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ ) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - NUBS, \ - RO, KANA, JYEN, HENK, MHEN, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ +KEYMAP_FULL( \ + F13,F14,F15,F16,F17,F18,F19,F20,F21,F22,F23,F24, \ + K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, VOLD,VOLU,MUTE, \ + K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,JPY,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ + K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5D, KF1,KE9,KFA, K6C,K75,K7D,K79, \ + K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,PCMM,\ + K12,NUBS,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, RO, K59, KF5, K69,K72,K7A,KDA, \ + K14,K9F,K11,MHEN, K29, HENK,KANA,K91,KA7,KAF,K94, KEB,KF2,KF4, PWR,K70,K71,PEQL \ ) /* ISO layout */ @@ -123,23 +169,14 @@ KEYMAP_ALL( \ K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ ) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - K61, \ - RO, KANA, JYEN, HENK, MHEN, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ +KEYMAP_FULL( \ + F13,F14,F15,F16,F17,F18,F19,F20,F21,F22,F23,F24, \ + K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, VOLD,VOLU,MUTE, \ + K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,JPY,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ + K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5D, KF1,KE9,KFA, K6C,K75,K7D,K79, \ + K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,PCMM,\ + K12,K61,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, RO, K59, KF5, K69,K72,K7A,KDA, \ + K14,K9F,K11,MHEN, K29, HENK,KANA,K91,KA7,KAF,K94, KEB,KF2,KF4, PWR,K70,K71,PEQL \ ) /* JIS layout */ @@ -151,23 +188,14 @@ KEYMAP_ALL( \ K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A,K51, K59, KF5, K69,K72,K7A, \ K14,K9F,K11, K67,K29,K64,K13, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA \ ) \ -KEYMAP_ALL( \ - K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ - K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ - K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B,K5D, KF1,KE9,KFA, K6C,K75,K7D, \ - K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,K79, \ - K12,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K59, KF5, K69,K72,K7A, \ - K14,K9F,K11, K29, K91,KA7,KAF,K94, KEB,KF2,KF4, K70, K71,KDA, \ - \ - NUBS, \ - K51, K13, K6A, K64, K67, \ - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, \ - SYSTEM_POWER, SYSTEM_SLEEP, SYSTEM_WAKE, \ - AUDIO_MUTE, AUDIO_VOL_UP, AUDIO_VOL_DOWN, \ - MEDIA_NEXT_TRACK, MEDIA_PREV_TRACK, MEDIA_STOP, MEDIA_PLAY_PAUSE, MEDIA_SELECT, \ - MAIL, CALCULATOR, MY_COMPUTER, \ - WWW_SEARCH, WWW_HOME, WWW_BACK, WWW_FORWARD, \ - WWW_STOP, WWW_REFRESH, WWW_FAVORITES \ +KEYMAP_FULL( \ + F13,F14,F15,F16,F17,F18,F19,F20,F21,F22,F23,F24, \ + K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, VOLD,VOLU,MUTE, \ + K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K6A,K66, KF0,KEC,KFD, K77,KCA,K7C,K7B, \ + K0D,K15,K1D,K24,K2D,K2C,K35,K3C,K43,K44,K4D,K54,K5B, K5D, KF1,KE9,KFA, K6C,K75,K7D,K79, \ + K58,K1C,K1B,K23,K2B,K34,K33,K3B,K42,K4B,K4C,K52, K5A, K6B,K73,K74,PCMM,\ + K12,NUBS,K1A,K22,K21,K2A,K32,K31,K3A,K41,K49,K4A, K51,K59, KF5, K69,K72,K7A,KDA, \ + K14,K9F,K11,K67, K29, K64,K13,K91,KA7,KAF,K94, KEB,KF2,KF4, PWR,K70,K71,PEQL \ ) #endif diff --git a/converter/ps2_usb/keymap_jis.c b/converter/ps2_usb/keymap_jis.c index 02585150..b430b907 100644 --- a/converter/ps2_usb/keymap_jis.c +++ b/converter/ps2_usb/keymap_jis.c @@ -30,5 +30,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/ps2_usb/keymap_plain.c b/converter/ps2_usb/keymap_plain.c index 51b2fddb..ecb13d7d 100644 --- a/converter/ps2_usb/keymap_plain.c +++ b/converter/ps2_usb/keymap_plain.c @@ -28,5 +28,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/ps2_usb/keymap_spacefn.c b/converter/ps2_usb/keymap_spacefn.c index bffd2bc6..8f087a85 100644 --- a/converter/ps2_usb/keymap_spacefn.c +++ b/converter/ps2_usb/keymap_spacefn.c @@ -54,7 +54,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/converter/ps2_usb/matrix.c b/converter/ps2_usb/matrix.c index 45cf2a4a..c441a89b 100644 --- a/converter/ps2_usb/matrix.c +++ b/converter/ps2_usb/matrix.c @@ -22,15 +22,13 @@ along with this program. If not, see . #include "util.h" #include "debug.h" #include "ps2.h" +#include "host.h" +#include "led.h" #include "matrix.h" static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -static void matrix_clear(void); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif /* @@ -69,18 +67,6 @@ static uint8_t matrix[MATRIX_ROWS]; static bool is_modified = false; -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { debug_enable = true; @@ -215,6 +201,12 @@ uint8_t matrix_scan(void) print("Overrun\n"); state = INIT; break; + case 0xAA: // Self-test passed + case 0xFC: // Self-test failed + printf("BAT %s\n", (code == 0xAA) ? "OK" : "NG"); + led_set(host_keyboard_leds()); + state = INIT; + break; default: // normal key make if (code < 0x80) { matrix_make(code); @@ -390,23 +382,6 @@ uint8_t matrix_scan(void) return 1; } -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - inline bool matrix_is_on(uint8_t row, uint8_t col) { @@ -419,21 +394,6 @@ uint8_t matrix_get_row(uint8_t row) return matrix[row]; } -void matrix_print(void) -{ - print("\nr/c 01234567\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - phex(row); print(": "); - pbin_reverse(matrix_get_row(row)); -#ifdef MATRIX_HAS_GHOST - if (matrix_has_ghost_in_row(row)) { - print(" + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_FN0 ACTION_LAYER_MOMENTARY(1) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP_PS2( + F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PCMM, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, + LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,FN0, RCTL, LEFT,DOWN,RGHT, NUHS,P0, PDOT,PEQL + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS,TRNS,TRNS,TRNS + ), +}; diff --git a/converter/ps2_usb/unimap_trans.h b/converter/ps2_usb/unimap_trans.h new file mode 100644 index 00000000..7a444580 --- /dev/null +++ b/converter/ps2_usb/unimap_trans.h @@ -0,0 +1,120 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_TRNAS_H +#define UNIMAP_TRNAS_H + +#include +#include +#include "unimap.h" + + +#define UNIMAP_PS2( \ + K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ + K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K01,K02,K03, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, K5C,K5D,K5E,K66, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K75,K7D, K52, K59,K5A,K5B,K58, \ + K78,K7B,K7A,K77, K2C, K76,K00,K7E,K7F,K65,K7C, K50,K51,K4F, K32,K62,K63,K67 \ +) UNIMAP ( \ + K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ + K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K01,K02,K03, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,K66, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K75,K7D, K52, K59,K5A,K5B,K58, \ + K78,K7B,K7A,K77, K2C, K76,K00,K7E,K7F,K65,K7C, K50,K51,K4F, K62,K63,K67 \ +) + + +/* Mapping to Universal keyboard layout + * + * Universal keyboard layout + * ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| ^a|Retn| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|KP=| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | #| 0| .|Ent| + * `-----------------------------------------------------------' `-----------' `---------------' + * + * PS/2 scan codes + * http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf + * ,-----------------------------------------------. + * | 08| 10| 18| 20| 28| 30| 38| 40| 48| 50| 57| 5F| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * | 76| | 05| 06| 04| 0C| 03| 0B| 83| 0A| 01| 09| 78| 07| | FC| 7E| FE| | A1| B2| A3| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | 0E| 16| 1E| 26| 25| 2E| 36| 3D| 3E| 46| 45| 4E| 55| 6A| 66| | F0| EC| FD| | 77| CA| 7C| 7B| + * |-----------------------------------------------------------| |-----------| |---------------| + * | 0D | 15| 1D| 24| 2D| 2C| 35| 3C| 43| 44| 4D| 54| 5B| 5D | | F1| E9| FA| | 6C| 75| 7D| 79| + * |-----------------------------------------------------------| `-----------' |---------------| + * | 58 | 1C| 1B| 23| 2B| 34| 33| 3B| 42| 4B| 4C| 52| ^a| 5A | | 6B| 73| 74| 6D| + * |-----------------------------------------------------------| ,---. |---------------| + * | 12 | 61| 1A| 22| 21| 2A| 32| 31| 3A| 41| 49| 4A| 51| 59 | | F5| | 69| 72| 7A| DA| + * |-----------------------------------------------------------| ,-----------. |---------------| + * | 14| 9F| 11| 67 | 29 | 64 | 13 | 91| A7| AF| 94| | EB| F2| F4| | 68| 70| 71| 63| + * `-----------------------------------------------------------' `-----------' `---------------' + * ^a: ISO hash key uses identical scancode 5D to US backslash. + * 51, 63, 68, 6D: hidden keys in IBM model M + */ +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_NO, UNIMAP_F9, UNIMAP_NO, UNIMAP_F5, UNIMAP_F3, UNIMAP_F1, UNIMAP_F2, UNIMAP_F12 }, /* 00-07 */ + { UNIMAP_F13, UNIMAP_F10, UNIMAP_F8, UNIMAP_F6, UNIMAP_F4, UNIMAP_TAB, UNIMAP_GRV, UNIMAP_NO }, /* 08-0F */ + { UNIMAP_F14, UNIMAP_LALT, UNIMAP_LSHIFT,UNIMAP_KANA, UNIMAP_LCTL, UNIMAP_Q, UNIMAP_1, UNIMAP_NO }, /* 10-17 */ + { UNIMAP_F15, UNIMAP_NO, UNIMAP_Z, UNIMAP_S, UNIMAP_A, UNIMAP_W, UNIMAP_2, UNIMAP_NO }, /* 18-1F */ + { UNIMAP_F16, UNIMAP_C, UNIMAP_X, UNIMAP_D, UNIMAP_E, UNIMAP_4, UNIMAP_3, UNIMAP_NO }, /* 20-27 */ + { UNIMAP_F17, UNIMAP_SPACE, UNIMAP_V, UNIMAP_F, UNIMAP_T, UNIMAP_R, UNIMAP_5, UNIMAP_NO }, /* 28-2F */ + { UNIMAP_F18, UNIMAP_N, UNIMAP_B, UNIMAP_H, UNIMAP_G, UNIMAP_Y, UNIMAP_6, UNIMAP_NO }, /* 30-37 */ + { UNIMAP_F19, UNIMAP_NO, UNIMAP_M, UNIMAP_J, UNIMAP_U, UNIMAP_7, UNIMAP_8, UNIMAP_NO }, /* 38-3F */ + { UNIMAP_F20, UNIMAP_COMMA, UNIMAP_K, UNIMAP_I, UNIMAP_O, UNIMAP_0, UNIMAP_9, UNIMAP_NO }, /* 40-47 */ + { UNIMAP_F21, UNIMAP_DOT, UNIMAP_SLASH, UNIMAP_L, UNIMAP_SCOLON,UNIMAP_P, UNIMAP_MINUS, UNIMAP_NO }, /* 48-4F */ + { UNIMAP_F22, UNIMAP_RO, UNIMAP_QUOTE, UNIMAP_NO, UNIMAP_LBRC, UNIMAP_EQUAL, UNIMAP_NO, UNIMAP_F23 }, /* 50-57 */ + { UNIMAP_CAPS, UNIMAP_RSHIFT,UNIMAP_ENTER, UNIMAP_RBRC, UNIMAP_NO, UNIMAP_BSLASH,UNIMAP_NO, UNIMAP_F24 }, /* 58-5F */ + { UNIMAP_NO, UNIMAP_NUBS, UNIMAP_NO, UNIMAP_PEQL, UNIMAP_HENK, UNIMAP_NO, UNIMAP_BSPACE,UNIMAP_MHEN }, /* 60-67 */ + { UNIMAP_NUHS, UNIMAP_P1, UNIMAP_JYEN, UNIMAP_P4, UNIMAP_P7, UNIMAP_PCMM, UNIMAP_NO, UNIMAP_NO }, /* 68-6F */ + { UNIMAP_P0, UNIMAP_PDOT, UNIMAP_P2, UNIMAP_P5, UNIMAP_P6, UNIMAP_P8, UNIMAP_ESC, UNIMAP_NLCK }, /* 70-77 */ + { UNIMAP_F11, UNIMAP_PPLS, UNIMAP_P3, UNIMAP_PMNS, UNIMAP_PAST, UNIMAP_P9, UNIMAP_SLCK, UNIMAP_NO }, /* 78-7F */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_F7, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 80-87 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 88-8F */ + { UNIMAP_NO, UNIMAP_RALT, UNIMAP_NO, UNIMAP_NO, UNIMAP_RCTRL, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 90-97 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_LGUI }, /* 98-9F */ + { UNIMAP_NO, UNIMAP_VOLD, UNIMAP_NO, UNIMAP_MUTE, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_RGUI }, /* A0-A7 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_APP }, /* A8-AF */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_VOLU, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* B0-B7 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* B8-BF */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* C0-C7 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_PSLS, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* C8-CF */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* D0-D7 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_PENT, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* D8-DF */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* E0-E7 */ + { UNIMAP_NO, UNIMAP_END, UNIMAP_NO, UNIMAP_LEFT, UNIMAP_HOME, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* E8-EF */ + { UNIMAP_INS, UNIMAP_DEL, UNIMAP_DOWN, UNIMAP_NO, UNIMAP_RIGHT, UNIMAP_UP, UNIMAP_NO, UNIMAP_NO }, /* F0-F7 */ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_PGDOWN,UNIMAP_NO, UNIMAP_PSCR, UNIMAP_PGUP, UNIMAP_PAUSE, UNIMAP_NO }, /* F8-FF */ +}; + +#endif diff --git a/converter/serialmouse_usb/keymap_common.c b/converter/serialmouse_usb/keymap_common.c deleted file mode 100644 index 55a13793..00000000 --- a/converter/serialmouse_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/sun_usb/command_extra.c b/converter/sun_usb/command_extra.c index 08f3a710..807df4d9 100644 --- a/converter/sun_usb/command_extra.c +++ b/converter/sun_usb/command_extra.c @@ -18,7 +18,7 @@ bool command_extra(uint8_t code) print("Home: Toggle Bell\n"); print("End: Toggle Click\n"); print("PgUp: LED all On\n"); - print("PgDown: LED all On\n"); + print("PgDown: LED all Off\n"); print("Insert: Layout\n"); print("Delete: Reset\n"); return false; diff --git a/converter/sun_usb/keymap.c b/converter/sun_usb/keymap.c index 3d724a52..a106d1a3 100644 --- a/converter/sun_usb/keymap.c +++ b/converter/sun_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "util.h" #include "keymap.h" @@ -27,7 +26,7 @@ along with this program. If not, see . /* Sun type 5 keyboard ,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. -| 76 | | | | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| +| 76 | | 0F| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| `-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. | 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| @@ -42,7 +41,7 @@ along with this program. If not, see . `-------' `-----------------------------------------------------------' `-----------' `---------------' */ #define KEYMAP( \ - K76, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ @@ -50,7 +49,7 @@ along with this program. If not, see . K5F,K61, K77,K13, K78, K73, K79, K74, K75, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ ) { \ { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO, }, \ + { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F,}, \ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ @@ -77,17 +76,17 @@ along with this program. If not, see . K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K0D,K14,K6E, \ K77,K13, K78, K79, K7A,K43,K62,K18,K1B,K1C \ ) KEYMAP( \ - HELP, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ + HELP, NO, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,K30, \ K01, AGAIN, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C, K34, K60, K62, PSLS,PAST,PMNS, \ - MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ - SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ - EXECUTE,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \ - FIND, K61, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \ + MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ + SELECT, K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ + EXECUTE,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \ + FIND, K61, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \ ) // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { +const uint8_t PROGMEM fn_layer[] = { 2, // Fn0 3, // Fn1 4, // Fn2 @@ -100,7 +99,7 @@ static const uint8_t PROGMEM fn_layer[] = { // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { +const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_SCLN, // Fn1 KC_SLSH, // Fn2 @@ -112,7 +111,7 @@ static const uint8_t PROGMEM fn_keycode[] = { }; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* KEYMAP( HELP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,F11,F12, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR, @@ -174,19 +173,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT ), }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/sun_usb/keymap_sun3.c b/converter/sun_usb/keymap_sun3.c index 273cd944..217aa79a 100644 --- a/converter/sun_usb/keymap_sun3.c +++ b/converter/sun_usb/keymap_sun3.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "util.h" #include "keymap.h" @@ -155,19 +154,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), */ }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/sun_usb/matrix.c b/converter/sun_usb/matrix.c index 3126bd33..0cea3700 100644 --- a/converter/sun_usb/matrix.c +++ b/converter/sun_usb/matrix.c @@ -24,6 +24,8 @@ along with this program. If not, see . #include "matrix.h" #include "debug.h" #include "protocol/serial.h" +#include "led.h" +#include "host.h" /* @@ -46,20 +48,6 @@ static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) ((code>>3)&0xF) #define COL(code) (code&0x07) -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} void matrix_init(void) { @@ -87,13 +75,13 @@ void matrix_init(void) } } print(" Done\n"); + + PORTD &= ~(1<<6); return; } uint8_t matrix_scan(void) { - is_modified = false; - uint8_t code; code = serial_recv(); if (!code) return 0; @@ -131,56 +119,18 @@ uint8_t matrix_scan(void) // break code if (matrix_is_on(ROW(code), COL(code))) { matrix[ROW(code)] &= ~(1<. #include #include -#include #include "keycode.h" #include "print.h" #include "debug.h" @@ -102,7 +101,7 @@ along with this program. If not, see . } // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { +const uint8_t PROGMEM fn_layer[] = { 0, // Fn0 0, // Fn1 0, // Fn2 @@ -115,7 +114,7 @@ static const uint8_t PROGMEM fn_layer[] = { // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { +const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_NO, // Fn2 @@ -127,7 +126,7 @@ static const uint8_t PROGMEM fn_keycode[] = { }; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: default * ,---. ,---------------. ,---------------. ,---------------. ,-----------. * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| @@ -198,19 +197,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), */ }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/terminal_usb/matrix.c b/converter/terminal_usb/matrix.c index 36901536..5d03e547 100644 --- a/converter/terminal_usb/matrix.c +++ b/converter/terminal_usb/matrix.c @@ -28,9 +28,6 @@ along with this program. If not, see . static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif /* @@ -49,20 +46,6 @@ static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) (code>>3) #define COL(code) (code&0x07) -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} void matrix_init(void) { @@ -93,8 +76,6 @@ uint8_t matrix_scan(void) F0, } state = RESET; - is_modified = false; - uint8_t code; if ((code = ps2_host_recv())) { debug("r"); debug_hex(code); debug(" "); @@ -172,83 +153,17 @@ uint8_t matrix_scan(void) return 1; } -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< - -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 . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/usb_usb/keymap_common.h b/converter/usb_usb/keymap_common.h index ee1c7c4d..3284264f 100644 --- a/converter/usb_usb/keymap_common.h +++ b/converter/usb_usb/keymap_common.h @@ -28,10 +28,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* ,---------------. ,---------------. ,---------------. * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. diff --git a/converter/usb_usb/keymap_editor.c b/converter/usb_usb/keymap_editor.c deleted file mode 100644 index bd63ea23..00000000 --- a/converter/usb_usb/keymap_editor.c +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2016 Jun Wako - -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 . -*/ - -#include "keymap_common.h" - - -#ifndef KEYMAP_SECTION_ENABLE - #error "KEYMAP_SECTION_ENABLE is not defined." -#endif - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".keymap.keymaps"))) = { - /* 0: plain Qwerty without layer switching - * ,---------------. ,---------------. ,---------------. - * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| - * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| | Help | - * `---' `---------------' `---------------' `---------------' `-----------' `---------------' `-------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. ,-------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| |Stp|Agn| - * |-----------------------------------------------------------| |-----------| |---------------| |-------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| |Mnu|Und| - * |-----------------------------------------------------------| `-----------' |---------------| |-------| - * |CapsL | A| S| D| F| G| H| J| K| L| ;| :| #|Retn| | 4| 5| 6|KP,| |Sel|Cpy| - * |-----------------------------------------------------------| ,---. |---------------| |-------| - * |Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| |Exe|Pst| - * |-----------------------------------------------------------| ,-----------. |---------------| |-------| - * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| - * `-----------------------------------------------------------' `-----------' `---------------' `-------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), -}; - -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { - [0] = ACTION_LAYER_MOMENTARY(1), - [1] = ACTION_LAYER_MOMENTARY(2), - [2] = ACTION_LAYER_MOMENTARY(3), - [3] = ACTION_LAYER_MOMENTARY(4), - [4] = ACTION_LAYER_MOMENTARY(5), - [5] = ACTION_LAYER_MOMENTARY(6), - [6] = ACTION_LAYER_MOMENTARY(7), - [7] = ACTION_LAYER_TOGGLE(1), - [8] = ACTION_LAYER_TOGGLE(2), - [9] = ACTION_LAYER_TOGGLE(3), - [10] = ACTION_LAYER_TAP_TOGGLE(1), - [11] = ACTION_LAYER_TAP_TOGGLE(2), - [12] = ACTION_LAYER_TAP_TOGGLE(3), - [13] = ACTION_LAYER_TAP_KEY(1, KC_BSLASH), - [14] = ACTION_LAYER_TAP_KEY(2, KC_TAB), - [15] = ACTION_LAYER_TAP_KEY(3, KC_ENTER), - [16] = ACTION_LAYER_TAP_KEY(4, KC_SPACE), - [17] = ACTION_LAYER_TAP_KEY(5, KC_SCOLON), - [18] = ACTION_LAYER_TAP_KEY(6, KC_QUOTE), - [19] = ACTION_LAYER_TAP_KEY(7, KC_SLASH), - [20] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_SPACE), - [21] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_SPACE), - [22] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_QUOTE), - [23] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENTER), - [24] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_ESC), - [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPACE), - [26] = ACTION_MODS_ONESHOT(MOD_LCTL), - [27] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_ESC), - [28] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPACE), - [29] = ACTION_MODS_ONESHOT(MOD_LSFT), - [30] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRAVE), - [31] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_BSLASH), -}; diff --git a/converter/usb_usb/keymap_hasu.c b/converter/usb_usb/keymap_hasu.c deleted file mode 100644 index de19e230..00000000 --- a/converter/usb_usb/keymap_hasu.c +++ /dev/null @@ -1,158 +0,0 @@ -#include "keymap_common.h" - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* Layer 0: Default Layer - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Fn6 | - * |-----------------------------------------------------------| - * |Fn7 | Z| X| C| V| B| N| M| ,| .|Fn2|Shift |Fn1| - * `-----------------------------------------------------------' - * |Gui|Alt | Fn4 |Fn5 |Gui| - * `-------------------------------------------' - */ - [0] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT, FN6, P4, P5, P6, PPLS, - FN7, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, FN4, RALT,FN5, FN5, FN1, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 1: HHKB mode[HHKB Fn] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [1] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS, UP, NO, BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, TRNS, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 2: Vi mode[Slash] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab |Hom|PgD|Up |PgU|End|Hom|PgD|PgUlEnd| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ - [2] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 3: Mouse mode(IJKL)[Semicolon] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Fn | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 - */ - [3] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, FN8, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, DEL, END, PGDN, P7, P8, P9, - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, BTN1, RALT,TRNS,TRNS,RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* Layer 5: Mouse mode(IJKL)[Space] - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|McU|MwU|MwR|Wbk|Wfr|Alt-T| - * |-----------------------------------------------------------| - * |Contro| | | | | |Mb2|McL|McD|McR|Mb1| |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt | Mb1 |Fn |Fn | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel8 - */ - [4] = \ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, FN8, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - FN8, NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,WBAK,WFWD,FN8, DEL, END, PGDN, P7, P8, P9, - LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, P4, P5, P6, PPLS, - LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, TRNS, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), -}; - - -/* - * Macro definition - */ -enum macro_id { - ALT_TAB, -}; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case ALT_TAB: - return (record->event.pressed ? - MACRO( D(LALT), D(TAB), END ) : - MACRO( U(TAB), END )); - } - return MACRO_NONE; -} - - -/* - * Fn action definition - */ -#ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { -#else -const uint16_t fn_actions[] PROGMEM = { -#endif - [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) - [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) - [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* - [3] = ACTION_LAYER_TAP_KEY(3, KC_SCLN), // Mousekey layer with Semicolon* - [4] = ACTION_LAYER_TAP_KEY(4, KC_SPC), // Mousekey layer with Space - [5] = ACTION_LAYER_MOMENTARY(3), // Mousekey layer - [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT), // RControl with tap Enter - [7] = ACTION_MODS_ONESHOT(MOD_LSFT), // Oneshot Shift - [8] = ACTION_MACRO(ALT_TAB), // Application switching -}; diff --git a/converter/usb_usb/keymap_iso.c b/converter/usb_usb/keymap_iso.c deleted file mode 100644 index f22a8405..00000000 --- a/converter/usb_usb/keymap_iso.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "keymap_common.h" - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* Layer 0: Default Layer - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| ^| Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Retn| |Del|End|PgD| | 7| 8| 9| +| - * |------------------------------------------------------` | `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shft|\ | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|Ent| - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt| Space |HNK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - [0] = \ - KEYMAP_ISO( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT - ), -}; - - -/* - * Fn action definition - */ -const uint16_t fn_actions[] PROGMEM = { -}; diff --git a/converter/usb_usb/keymap_jis.c b/converter/usb_usb/keymap_jis.c deleted file mode 100644 index d164dcec..00000000 --- a/converter/usb_usb/keymap_jis.c +++ /dev/null @@ -1,36 +0,0 @@ -#include "keymap_common.h" - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* Layer 0: Default Layer - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| ^|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| @| [| Retn| |Del|End|PgD| | 7| 8| 9| +| - * |------------------------------------------------------` | `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| :| ]| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shft | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|Ent| - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - [0] = \ - KEYMAP_JIS( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JPY, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, DEL, END, PGDN, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT - ), -}; - - -/* - * Fn action definition - */ -const uint16_t fn_actions[] PROGMEM = { -}; diff --git a/converter/usb_usb/keymap_spacefn.c b/converter/usb_usb/keymap_spacefn.c deleted file mode 100644 index 69f8693e..00000000 --- a/converter/usb_usb/keymap_spacefn.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * SpaceFN layout - * http://geekhack.org/index.php?topic=51069.0 - */ -#include "keymap_common.h" - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: plain Qwerty - * ,---------------. ,---------------. ,---------------. - * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| - * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| | Help | - * `---' `---------------' `---------------' `---------------' `-----------' `---------------' `-------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. ,-------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| |Stp|Agn| - * |-----------------------------------------------------------| |-----------| |---------------| |-------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| |Mnu|Und| - * |-----------------------------------------------------------| `-----------' |---------------| |-------| - * |LCtrl | A| S| D| F| G| H| J| K| L| ;| :| #|Retn| | 4| 5| 6|KP,| |Sel|Cpy| - * |-----------------------------------------------------------| ,---. |---------------| |-------| - * |Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| |Exe|Pst| - * |-----------------------------------------------------------| ,-----------. |---------------| |-------| - * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| - * `-----------------------------------------------------------' `-----------' `---------------' `-------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, FN0, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* 1: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * |Caps | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | |Men| | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - KEYMAP_ALL( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - CAPS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, INS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS - ), -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; - diff --git a/converter/usb_usb/main.cpp b/converter/usb_usb/main.cpp index 652c8057..5b542a75 100644 --- a/converter/usb_usb/main.cpp +++ b/converter/usb_usb/main.cpp @@ -3,17 +3,9 @@ #include #include -// USB HID host -#include "Usb.h" -#include "usbhub.h" -#include "hid.h" -#include "hidboot.h" -#include "parser.h" - // LUFA #include "lufa.h" -#include "timer.h" #include "sendchar.h" #include "debug.h" #include "keyboard.h" @@ -64,22 +56,6 @@ static void LUFA_setup(void) -/* - * USB Host Shield HID keyboard - */ -USB usb_host; -USBHub hub1(&usb_host); -HIDBoot kbd(&usb_host); -KBDReportParser kbd_parser; - - -void led_set(uint8_t usb_led) -{ - kbd.SetReport(0, 0, 2, 0, 1, &usb_led); -} - - - int main(void) { // LED for debug @@ -94,10 +70,6 @@ int main(void) LUFA_setup(); - // USB Host Shield setup - usb_host.Init(); - kbd.SetReportParser(0, (HIDReportParser*)&kbd_parser); - /* NOTE: Don't insert time consuming job here. * It'll cause unclear initialization failure when DFU reset(worm start). */ @@ -111,17 +83,9 @@ int main(void) debug("init: done\n"); -uint16_t timer; for (;;) { keyboard_task(); -timer = timer_read(); - usb_host.Task(); -timer = timer_elapsed(timer); -if (timer > 100) { - debug("host.Task: "); debug_hex16(timer); debug("\n"); -} - #if !defined(INTERRUPT_CONTROL_ENDPOINT) // LUFA Task for control request USB_USBTask(); diff --git a/converter/usb_usb/matrix.c b/converter/usb_usb/matrix.c deleted file mode 100644 index 184933ac..00000000 --- a/converter/usb_usb/matrix.c +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2011 Jun Wako - -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 . -*/ - -#include -#include -#include "usb_hid.h" -#include "keycode.h" -#include "util.h" -#include "print.h" -#include "debug.h" -#include "matrix.h" - -/* KEY CODE to Matrix - * - * HID keycode(1 byte): - * Higher 5 bits indicates ROW and lower 3 bits COL. - * - * 7 6 5 4 3 2 1 0 - * +---------------+ - * | ROW | COL | - * +---------------+ - * - * Matrix space(16 * 16): - * r\c0123456789ABCDEF - * 0 +----------------+ - * : | | - * : | | - * 16 +----------------+ - */ -#define ROW_MASK 0xF0 -#define COL_MASK 0x0F -#define CODE(row, col) (((row) << 4) | (col)) -#define ROW(code) (((code) & ROW_MASK) >> 4) -#define COL(code) ((code) & COL_MASK) -#define ROW_BITS(code) (1 << COL(code)) - - -uint8_t matrix_rows(void) { return MATRIX_ROWS; } -uint8_t matrix_cols(void) { return MATRIX_COLS; } -void matrix_init(void) {} -bool matrix_has_ghost(void) { return false; } - -static bool matrix_is_mod =false; - -uint8_t matrix_scan(void) { - static uint16_t last_time_stamp = 0; - - if (last_time_stamp != usb_hid_time_stamp) { - last_time_stamp = usb_hid_time_stamp; - matrix_is_mod = true; - } else { - matrix_is_mod = false; - } - return 1; -} - -bool matrix_is_modified(void) { - - return matrix_is_mod; -} - -bool matrix_is_on(uint8_t row, uint8_t col) { - uint8_t code = CODE(row, col); - - if (IS_MOD(code)) { - if (usb_hid_keyboard_report.mods & ROW_BITS(code)) { - return true; - } - } - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (usb_hid_keyboard_report.keys[i] == code) { - return true; - } - } - return false; -} - -matrix_row_t matrix_get_row(uint8_t row) { - uint16_t row_bits = 0; - - if (IS_MOD(CODE(row, 0)) && usb_hid_keyboard_report.mods) { - row_bits |= usb_hid_keyboard_report.mods; - } - - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(usb_hid_keyboard_report.keys[i])) { - if (row == ROW(usb_hid_keyboard_report.keys[i])) { - row_bits |= ROW_BITS(usb_hid_keyboard_report.keys[i]); - } - } - } - return row_bits; -} - -uint8_t matrix_key_count(void) { - uint8_t count = 0; - - count += bitpop(usb_hid_keyboard_report.mods); - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(usb_hid_keyboard_report.keys[i])) { - count++; - } - } - return count; -} - -void matrix_print(void) { - print("\nr/c 01234567\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - phex(row); print(": "); - pbin_reverse(matrix_get_row(row)); -#ifdef MATRIX_HAS_GHOST - if (matrix_has_ghost_in_row(row)) { - print(" + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_FN0 ACTION_LAYER_MOMENTARY(1) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE, + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, + LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,FN0, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PEQL + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; diff --git a/converter/usb_usb/unimap_trans.h b/converter/usb_usb/unimap_trans.h new file mode 100644 index 00000000..9dc230f9 --- /dev/null +++ b/converter/usb_usb/unimap_trans.h @@ -0,0 +1,80 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_COMMON_H +#define UNIMAP_COMMON_H + +#include +#include +#include "unimap.h" + + +/* Mapping to Universal keyboard layout + * + * Universal keyboard layout + * ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|KP=| + * `-----------------------------------------------------------' `-----------' `---------------' + */ +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_KANA, UNIMAP_VOLUME_DOWN, UNIMAP_VOLUME_UP, UNIMAP_VOLUME_MUTE, UNIMAP_A, UNIMAP_B, UNIMAP_C, UNIMAP_D, + UNIMAP_E, UNIMAP_F, UNIMAP_G, UNIMAP_H, UNIMAP_I, UNIMAP_J, UNIMAP_K, UNIMAP_L }, + { UNIMAP_M, UNIMAP_N, UNIMAP_O, UNIMAP_P, UNIMAP_Q, UNIMAP_R, UNIMAP_S, UNIMAP_T, + UNIMAP_U, UNIMAP_V, UNIMAP_W, UNIMAP_X, UNIMAP_Y, UNIMAP_Z, UNIMAP_1, UNIMAP_2 }, + { UNIMAP_3, UNIMAP_4, UNIMAP_5, UNIMAP_6, UNIMAP_7, UNIMAP_8, UNIMAP_9, UNIMAP_0, + UNIMAP_ENTER, UNIMAP_ESCAPE,UNIMAP_BSPACE,UNIMAP_TAB, UNIMAP_SPACE, UNIMAP_MINUS, UNIMAP_EQUAL, UNIMAP_LBRACKET }, + { UNIMAP_RBRACKET,UNIMAP_BSLASH,UNIMAP_NONUS_HASH, UNIMAP_SCOLON, UNIMAP_QUOTE, UNIMAP_GRAVE, UNIMAP_COMMA, UNIMAP_DOT, + UNIMAP_SLASH, UNIMAP_CAPSLOCK,UNIMAP_F1, UNIMAP_F2, UNIMAP_F3, UNIMAP_F4, UNIMAP_F5, UNIMAP_F6 }, + { UNIMAP_F7, UNIMAP_F8, UNIMAP_F9, UNIMAP_F10, UNIMAP_F11, UNIMAP_F12, UNIMAP_PSCREEN,UNIMAP_SCROLLLOCK, + UNIMAP_PAUSE, UNIMAP_INSERT,UNIMAP_HOME, UNIMAP_PGUP, UNIMAP_DELETE,UNIMAP_END, UNIMAP_PGDOWN, UNIMAP_RIGHT }, + { UNIMAP_LEFT, UNIMAP_DOWN, UNIMAP_UP, UNIMAP_NUMLOCK, UNIMAP_KP_SLASH, UNIMAP_KP_ASTERISK, UNIMAP_KP_MINUS, UNIMAP_KP_PLUS, + UNIMAP_KP_ENTER,UNIMAP_KP_1,UNIMAP_KP_2, UNIMAP_KP_3, UNIMAP_KP_4, UNIMAP_KP_5, UNIMAP_KP_6, UNIMAP_KP_7 }, + { UNIMAP_KP_8, UNIMAP_KP_9, UNIMAP_KP_0, UNIMAP_KP_DOT,UNIMAP_NONUS_BSLASH,UNIMAP_APPLICATION,UNIMAP_KP_COMMA,UNIMAP_KP_EQUAL, + UNIMAP_F13, UNIMAP_F14, UNIMAP_F15, UNIMAP_F16, UNIMAP_F17, UNIMAP_F18, UNIMAP_F19, UNIMAP_F20 }, + { UNIMAP_F21, UNIMAP_F22, UNIMAP_F23, UNIMAP_F24, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 78-7F */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_RO, /* 80-87 */ \ + UNIMAP_NO, UNIMAP_JYEN, UNIMAP_HENK, UNIMAP_MHEN, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 88-8F */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* 90-97 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 98-9F */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* A0-A7 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* A8-AF */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* B0-B7 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* B8-BF */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* C0-C7 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* C8-CF */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* D0-D7 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* D8-DF */ \ + { UNIMAP_LCTRL, UNIMAP_LSHIFT,UNIMAP_LALT, UNIMAP_LGUI, UNIMAP_RCTRL, UNIMAP_RSHIFT,UNIMAP_RALT, UNIMAP_RGUI, /* E0-E7 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* E8-EF */ \ + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* F0-F7 */ \ + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* F8-FF */ \ +}; + +#endif diff --git a/converter/usb_usb/usb_usb.cpp b/converter/usb_usb/usb_usb.cpp new file mode 100644 index 00000000..26721de0 --- /dev/null +++ b/converter/usb_usb/usb_usb.cpp @@ -0,0 +1,233 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ + +#include +#include + +// USB HID host +#include "Usb.h" +#include "usbhub.h" +#include "hid.h" +#include "hidboot.h" +#include "parser.h" + +#include "keycode.h" +#include "util.h" +#include "print.h" +#include "debug.h" +#include "timer.h" +#include "matrix.h" +#include "led.h" +#include "host.h" +#include "keyboard.h" + + +/* KEY CODE to Matrix + * + * HID keycode(1 byte): + * Higher 5 bits indicates ROW and lower 3 bits COL. + * + * 7 6 5 4 3 2 1 0 + * +---------------+ + * | ROW | COL | + * +---------------+ + * + * Matrix space(16 * 16): + * r\c0123456789ABCDEF + * 0 +----------------+ + * : | | + * : | | + * 16 +----------------+ + */ +#define ROW_MASK 0xF0 +#define COL_MASK 0x0F +#define CODE(row, col) (((row) << 4) | (col)) +#define ROW(code) (((code) & ROW_MASK) >> 4) +#define COL(code) ((code) & COL_MASK) +#define ROW_BITS(code) (1 << COL(code)) + + +// Integrated key state of all keyboards +static report_keyboard_t keyboard_report; + +static bool matrix_is_mod =false; + +/* + * USB Host Shield HID keyboards + * This supports two cascaded hubs and four keyboards + */ +USB usb_host; +USBHub hub1(&usb_host); +USBHub hub2(&usb_host); +HIDBoot kbd1(&usb_host); +HIDBoot kbd2(&usb_host); +HIDBoot kbd3(&usb_host); +HIDBoot kbd4(&usb_host); +KBDReportParser kbd_parser1; +KBDReportParser kbd_parser2; +KBDReportParser kbd_parser3; +KBDReportParser kbd_parser4; + + +uint8_t matrix_rows(void) { return MATRIX_ROWS; } +uint8_t matrix_cols(void) { return MATRIX_COLS; } +bool matrix_has_ghost(void) { return false; } +void matrix_init(void) { + // USB Host Shield setup + usb_host.Init(); + kbd1.SetReportParser(0, (HIDReportParser*)&kbd_parser1); + kbd2.SetReportParser(0, (HIDReportParser*)&kbd_parser2); + kbd3.SetReportParser(0, (HIDReportParser*)&kbd_parser3); + kbd4.SetReportParser(0, (HIDReportParser*)&kbd_parser4); +} + +static void or_report(report_keyboard_t report) { + // integrate reports into keyboard_report + keyboard_report.mods |= report.mods; + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (IS_ANY(report.keys[i])) { + for (uint8_t j = 0; j < KEYBOARD_REPORT_KEYS; j++) { + if (! keyboard_report.keys[j]) { + keyboard_report.keys[j] = report.keys[i]; + break; + } + } + } + } +} + +uint8_t matrix_scan(void) { + static uint16_t last_time_stamp1 = 0; + static uint16_t last_time_stamp2 = 0; + static uint16_t last_time_stamp3 = 0; + static uint16_t last_time_stamp4 = 0; + + // check report came from keyboards + if (kbd_parser1.time_stamp != last_time_stamp1 || + kbd_parser2.time_stamp != last_time_stamp2 || + kbd_parser3.time_stamp != last_time_stamp3 || + kbd_parser4.time_stamp != last_time_stamp4) { + + last_time_stamp1 = kbd_parser1.time_stamp; + last_time_stamp2 = kbd_parser2.time_stamp; + last_time_stamp3 = kbd_parser3.time_stamp; + last_time_stamp4 = kbd_parser4.time_stamp; + + // clear and integrate all reports + keyboard_report = {}; + or_report(kbd_parser1.report); + or_report(kbd_parser2.report); + or_report(kbd_parser3.report); + or_report(kbd_parser4.report); + + matrix_is_mod = true; + + dprintf("state: %02X %02X", keyboard_report.mods, keyboard_report.reserved); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + dprintf(" %02X", keyboard_report.keys[i]); + } + dprint("\r\n"); + } else { + matrix_is_mod = false; + } + + uint16_t timer; + timer = timer_read(); + usb_host.Task(); + timer = timer_elapsed(timer); + if (timer > 100) { + dprintf("host.Task: %d\n", timer); + } + + static uint8_t usb_state = 0; + if (usb_state != usb_host.getUsbTaskState()) { + usb_state = usb_host.getUsbTaskState(); + dprintf("usb_state: %02X\n", usb_state); + + // restore LED state when keyboard comes up + if (usb_state == USB_STATE_RUNNING) { + keyboard_set_leds(host_keyboard_leds()); + } + } + return 1; +} + +bool matrix_is_modified(void) { + return matrix_is_mod; +} + +bool matrix_is_on(uint8_t row, uint8_t col) { + uint8_t code = CODE(row, col); + + if (IS_MOD(code)) { + if (keyboard_report.mods & ROW_BITS(code)) { + return true; + } + } + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (keyboard_report.keys[i] == code) { + return true; + } + } + return false; +} + +matrix_row_t matrix_get_row(uint8_t row) { + uint16_t row_bits = 0; + + if (IS_MOD(CODE(row, 0)) && keyboard_report.mods) { + row_bits |= keyboard_report.mods; + } + + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (IS_ANY(keyboard_report.keys[i])) { + if (row == ROW(keyboard_report.keys[i])) { + row_bits |= ROW_BITS(keyboard_report.keys[i]); + } + } + } + return row_bits; +} + +uint8_t matrix_key_count(void) { + uint8_t count = 0; + + count += bitpop(keyboard_report.mods); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (IS_ANY(keyboard_report.keys[i])) { + count++; + } + } + return count; +} + +void matrix_print(void) { + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < matrix_rows(); row++) { + xprintf("%02d: ", row); + print_bin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +void led_set(uint8_t usb_led) +{ + kbd1.SetReport(0, 0, 2, 0, 1, &usb_led); + kbd2.SetReport(0, 0, 2, 0, 1, &usb_led); + kbd3.SetReport(0, 0, 2, 0, 1, &usb_led); + kbd4.SetReport(0, 0, 2, 0, 1, &usb_led); +} diff --git a/converter/x68k_usb/Makefile b/converter/x68k_usb/Makefile index 9df264b3..19901bee 100644 --- a/converter/x68k_usb/Makefile +++ b/converter/x68k_usb/Makefile @@ -77,7 +77,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +#NKRO_ENABLE = yes # USB Nkey Rollover diff --git a/converter/x68k_usb/keymap.c b/converter/x68k_usb/keymap.c index 836752bf..4d6a1261 100644 --- a/converter/x68k_usb/keymap.c +++ b/converter/x68k_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "util.h" @@ -72,7 +71,7 @@ along with this program. If not, see . } -static const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_FUNCTION(0), // toggle all LEDs }; @@ -92,7 +91,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) } -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* X68000 Keyboard Scan codes ,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. | 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| @@ -128,16 +127,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LGUI,LALT,MHEN, SPC, HENK,KANA,APP, ZKHK, F14, F15, P0, PCMM,PDOT ), }; - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/x68k_usb/matrix.c b/converter/x68k_usb/matrix.c index 2d5a1e11..9dff7ba6 100644 --- a/converter/x68k_usb/matrix.c +++ b/converter/x68k_usb/matrix.c @@ -50,18 +50,6 @@ static uint8_t matrix[MATRIX_ROWS]; static bool is_modified = false; -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { serial_init(); @@ -99,44 +87,8 @@ uint8_t matrix_scan(void) return code; } -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< - -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 . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/xt_usb/keymap_common.h b/converter/xt_usb/keymap_common.h index b9de6a86..9953c938 100644 --- a/converter/xt_usb/keymap_common.h +++ b/converter/xt_usb/keymap_common.h @@ -28,10 +28,6 @@ along with this program. If not, see . #include "keymap.h" -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - /* All keys */ #define KEYMAP_ALL( \ K00, K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D, K0E,K0F,K0G, \ diff --git a/converter/xt_usb/keymap_jis.c b/converter/xt_usb/keymap_jis.c index 02585150..b430b907 100644 --- a/converter/xt_usb/keymap_jis.c +++ b/converter/xt_usb/keymap_jis.c @@ -30,5 +30,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/xt_usb/keymap_plain.c b/converter/xt_usb/keymap_plain.c index 51b2fddb..ecb13d7d 100644 --- a/converter/xt_usb/keymap_plain.c +++ b/converter/xt_usb/keymap_plain.c @@ -28,5 +28,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/xt_usb/keymap_spacefn.c b/converter/xt_usb/keymap_spacefn.c index bffd2bc6..8f087a85 100644 --- a/converter/xt_usb/keymap_spacefn.c +++ b/converter/xt_usb/keymap_spacefn.c @@ -54,7 +54,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/converter/xt_usb/matrix.c b/converter/xt_usb/matrix.c index 92fa6935..51742dd2 100644 --- a/converter/xt_usb/matrix.c +++ b/converter/xt_usb/matrix.c @@ -28,10 +28,6 @@ along with this program. If not, see . static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -static void matrix_clear(void); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) (code>>3) @@ -41,20 +37,6 @@ static uint8_t matrix[MATRIX_ROWS]; #define PRINT_SCREEN (0x7C) #define PAUSE (0x7D) -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} void matrix_init(void) { @@ -132,8 +114,6 @@ uint8_t matrix_scan(void) } state = INIT; - is_modified = false; - // 'pseudo break code' hack if (matrix_is_on(ROW(PAUSE), COL(PAUSE))) { matrix_break(PAUSE); @@ -237,83 +217,17 @@ uint8_t matrix_scan(void) return 1; } -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< #include "actionmap.h" #include "action_code.h" #include "actionmap_common.h" @@ -37,7 +36,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } -const uint16_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { +const action_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Default Layer * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | diff --git a/keyboard/alps64/actionmap_plain.c b/keyboard/alps64/actionmap_plain.c index 4a78b7a1..58ffbaaa 100644 --- a/keyboard/alps64/actionmap_plain.c +++ b/keyboard/alps64/actionmap_plain.c @@ -1,4 +1,3 @@ -#include #include "actionmap.h" #include "action_code.h" #include "actionmap_common.h" @@ -10,7 +9,7 @@ #define AC_LM1 ACTION_LAYER_MOMENTARY(1) // HHKB layer -const uint16_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { +const action_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Default Layer * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|BSpc | diff --git a/keyboard/alps64/binary/alps64_unimap.hex b/keyboard/alps64/binary/alps64_unimap.hex new file mode 100644 index 00000000..a86bc84f --- /dev/null +++ b/keyboard/alps64/binary/alps64_unimap.hex @@ -0,0 +1,1294 @@ +:100000000C944A050C9491050C9491050C9491055F +:100010000C9491050C9491050C9491050C94910508 +:100020000C9491050C9491050C9491050C94FB0B88 +:100030000C94AA0C0C94011B0C9491050C94910542 +:100040000C9491050C9491050C9491050C94751BDE +:100050000C9491050C9491050C9491050C949105C8 +:100060000C9491050C9491050C9491050C949105B8 +:100070000C94910589068C068F06920695069806C3 +:100080009B06170D390D270E390D270E7E0DA10D7C +:10009000270EF60D090EA811A811D611D61133128C +:1000A00071128A148A148A128A148B138B135E14A9 +:1000B0008A148A1475147E10360E0F12272D7F377E +:1000C000383334132F2E7C7D29283130742A7879E7 +:1000D00039042B14351E7B641D161A081F207A1B49 +:1000E0000709151721222C06190A1C182324650557 +:1000F000110B0D0C25260A002530325800626F7551 +:100100006E6365213A20004B6579626F61726420ED +:1001100073746172742E0A0055534220636F6E66C9 +:100120006967757265642E0A000D0A696E69740A42 +:10013000000E0341006C00700073003600340000B4 +:1001400000080354004D004B00000004030904099B +:10015000027400040100A03209040000010301013F +:100160000009211101000122400007058103080058 +:100170000A09040100010301020009211101000123 +:10018000224D000705820308000A0904020001034A +:100190000000000921110100012236000705830338 +:1001A00008000A09040300020300000009211101EC +:1001B0000001222200070584032000010705040333 +:1001C0002000011201100100000008EDFE6464012E +:1001D00000010200010631FF0974A1010975150033 +:1001E00026FF009520750881020976150026FF007C +:1001F000952075089102C005010980A101850216AC +:10020000810026B7001A81002AB700751095018178 +:1002100000C0050C0901A1018503160100269C02FE +:100220001A01002A9C02751095018100C005010980 +:1002300002A1010901A100050919012905150025DF +:10024000019505750181029501750381010501097B +:100250003009311581257F95027508810609381509 +:1002600081257F950175088106050C0A38021581E4 +:10027000257F950175088106C0C005010906A10109 +:10028000050719E029E71500250195087501810288 +:100290009501750881010508190129059505750164 +:1002A00091029501750391010507190029FF1500B9 +:1002B00026FF00950675088100C0636F6E73756D2B +:1002C00065723A20253034580A0073797374656D6D +:1002D0003A20253034580A000A00253032582000D0 +:1002E0006B6579626F6172643A20004C45443A2034 +:1002F000253032580A00253032583A2025303862ED +:1003000025730A00722F632030313233343536378B +:100310000A00646F6E652E0A00626F6F746D61670C +:100320006963207363616E3A202E2E2E2000290A05 +:10033000002575002F002575005D2800256400202C +:1003400000256400200025640020002564007C0056 +:1003500025303258006D6F7573656B6579205B626F +:10036000746E7C782079207620685D287265702F05 +:1003700061636C293A205B006D6B5F776865656C23 +:100380005F74696D655F746F5F6D6178203D2025D6 +:10039000640A006D6B5F776865656C5F6D61785F9F +:1003A0007370656564203D2025640A006D6B5F7481 +:1003B000696D655F746F5F6D6178203D2025640A0B +:1003C000006D6B5F6D61785F7370656564203D20C3 +:1003D00025640A006D6B5F696E74657276616C20CE +:1003E0003D2025640A006D6B5F64656C6179203D7A +:1003F0002025640A006D6B5F776865656C5F7469C2 +:100400006D655F746F5F6D6178203D2025640A0023 +:100410006D6B5F776865656C5F6D61785F73706544 +:100420006564203D2025640A006D6B5F74696D650D +:100430005F746F5F6D6178203D2025640A006D6BED +:100440005F6D61785F7370656564203D2025640A87 +:10045000006D6B5F696E74657276616C203D20255E +:10046000640A006D6B5F64656C6179203D202564D2 +:100470000A000A00257500363A20776865656C5FCA +:1004800074696D655F746F5F6D61783A20000A0072 +:10049000257500353A20776865656C5F6D61785F1A +:1004A00073706565643A20000A00257500343A20AF +:1004B00074696D655F746F5F6D61783A20000A0042 +:1004C000257500333A206D61785F73706565643A15 +:1004D00020000A00257500323A20696E7465727634 +:1004E000616C286D73293A20000A00257500313AA5 +:1004F0002064656C6179282A31306D73293A2000B7 +:100500000A092D2056616C756573202D0A004D3E39 +:10051000004D25643E20003F0073657420646566CD +:1005200061756C740A00433E20007768657265202F +:1005300064656C74613A20637572736F723D2564F3 +:100540002C20776865656C3D25640A5365652068D5 +:100550007474703A2F2F656E2E77696B69706564BD +:1005600069612E6F72672F77696B692F4D6F757395 +:10057000655F6B6579730A000A092D204D6F7573ED +:10058000656B6579202D0A4553432F713A097175C2 +:1005900069740A313A0964656C6179282A31306DD1 +:1005A00073290A323A09696E74657276616C286D36 +:1005B00073290A333A096D61785F73706565640A5F +:1005C000343A0974696D655F746F5F6D61780A35DF +:1005D0003A09776865656C5F6D61785F7370656512 +:1005E000640A363A09776865656C5F74696D655FA2 +:1005F000746F5F6D61780A0A703A097072696E747F +:100600002076616C7565730A643A097365742064B9 +:10061000656661756C74730A75703A092B310A64EA +:100620006F776E3A092D310A706775703A092B3170 +:10063000300A7067646F776E3A092D31300A0A7399 +:1006400070656564203D2064656C7461202A206DAE +:1006500061785F7370656564202A20287265706513 +:100660006174202F2074696D655F746F5F6D6178B0 +:10067000290A003F004D3E2000433E20004C2564E7 +:100680000A000A092D20436F6E736F6C65202D0AD6 +:100690004553432F713A09717569740A6D3A096DB2 +:1006A0006F7573656B65790A000A092D204D6167C6 +:1006B0006963202D0A643A0964656275670A783AAD +:1006C000096465627567206D61747269780A6B3AB6 +:1006D000096465627567206B6579626F6172640A8F +:1006E0006D3A096465627567206D6F7573650A768A +:1006F0003A0976657273696F6E0A733A09737461A9 +:100700007475730A633A09636F6E736F6C65206D5D +:100710006F64650A302D343A096C61796572302D49 +:1007200034284631302D4634290A506175733A0910 +:10073000626F6F746C6F616465720A653A09656512 +:1007400070726F6D0A000A002575002E6E6B726F55 +:100750003A20000A002575002E737761705F626190 +:10076000636B736C6173685F6261636B7370616309 +:10077000653A20000A002575002E737761705F6767 +:10078000726176655F6573633A20000A0025750023 +:100790002E6E6F5F6775693A20000A002575002E7E +:1007A000737761705F72616C745F726775693A200C +:1007B000000A002575002E737761705F6C616C74A0 +:1007C0005F6C6775693A20000A002575002E636129 +:1007D00070736C6F636B5F746F5F636F6E74726F57 +:1007E0006C3A20000A002575002E737761705F63F4 +:1007F0006F6E74726F6C5F636170736C6F636B3A72 +:1008000020000A0025303258006B65796D61705FF9 +:10081000636F6E6669672E7261773A20000A002561 +:1008200075002E6D6F7573653A20000A00257500FE +:100830002E6B6579626F6172643A20000A0025753B +:10084000002E6D61747269783A20000A00257500E7 +:100850002E656E61626C653A20000A0025303258C0 +:100860000064656275675F636F6E6669672E7261AB +:10087000773A20000A0025750064656661756C741E +:100880005F6C617965723A20003F0074696D657232 +:100890005F72656164333228293A202530346C5800 +:1008A0000A006B6579626F6172645F69646C653AB6 +:1008B0002025580A006B6579626F6172645F7072FF +:1008C0006F746F636F6C3A2025580A00686F7374F9 +:1008D0005F6B6579626F6172645F6C656473282910 +:1008E0003A2025580A000A092D2053746174757343 +:1008F000202D0A004743433A20342E392E3220411E +:1009000056522D4C4942433A20312E382E307376C0 +:100910006E204156525F415243483A20617672330D +:10092000350A004F5054494F4E533A204C554641DA +:1009300020424F4F544D41474943204D4F55534559 +:100940004B45592045585452414B455920434F4E31 +:10095000534F4C4520434F4D4D414E44204B45593C +:100960004D41505F53454354494F4E203430393642 +:100970000A004255494C443A2063306630393039D8 +:100980002D6469727479202831343A32303A35391D +:10099000204A616E2031312032303137290A005629 +:1009A00049443A2030784645454428544D4B292047 +:1009B0005049443A2030783634363428416C7073CC +:1009C000363429205645523A203078303030310ABA +:1009D00000444553433A20544D4B206B6579626F78 +:1009E000617264206669726D7761726520666F72EC +:1009F00020416C707336340A000A092D2056657246 +:100A000073696F6E202D0A000A6D6F7573653A2049 +:100A10006F66660A000A6D6F7573653A206F6E0A1D +:100A2000000A6B6579626F6172643A206F66660ACC +:100A3000000A6B6579626F6172643A206F6E0A001A +:100A40000A6D61747269783A206F66660A000A6DF1 +:100A500061747269783A206F6E0A000A6465627583 +:100A6000673A206F6E0A000A64656275673A206F04 +:100A700066660A000A0A626F6F746C6F6164657261 +:100A80002E2E2E2000433E20006565636F6E666942 +:100A9000673A0A0011241FBECFEFD4E0DEBFCDBFFE +:100AA00004B603FE27C08091CD019091CE01A091A4 +:100AB000CF01B091D0018730904BA740B04BD1F41B +:100AC0001092CD011092CE011092CF011092D00160 +:100AD00014BE84B7877F84BF0FB6F894A895809121 +:100AE0006000886180936000109260000FBEE0E0BB +:100AF000F8E3099511E0A0E0B1E0ECE8FEE402C003 +:100B000005900D92A433B107D9F721E0A4E3B1E039 +:100B100001C01D92AD3CB207E1F70E9447090C9459 +:100B200044270C940000FF93EF93E0913401F0917F +:100B30003501309709F00995EF91FF910895FC0177 +:100B40008591803011F0EFDFFBCF0895FF27E0E2C1 +:100B500030E247FF0CC0419597FF09C0EDE2609578 +:100B6000709580959095611D711D811D911D27FFC8 +:100B700002C0219530E350E2AA27660F771F881F35 +:100B8000991FAA1FA41710F0A41B63955A95A9F7E3 +:100B9000AA3008F0A95FA05DAF93F39561157105C8 +:100BA0008105910541F7ED3211F4EF93F395F217BA +:100BB00018F43F93F395FBCF8F91B5DFFA95E1F7EA +:100BC0000895E991F9918591803021F0853219F0ED +:100BD000AADFF9CF089520E0E89455915532C1F38A +:100BE000503311F4689455915A3348F4505390F3AC +:100BF000220F022E220F220F200D250FF4CF0EF40C +:100C0000219589919991533619F3533729F1533529 +:100C100059F1BC0188279927E8945C3621F4899121 +:100C2000999168945591543639F446EF7EF077FFE8 +:100C30000DC08FEF9FEF0AC055374AE039F05835A5 +:100C400040E121F0523642E009F00895FF93EF931E +:100C50007DDFEF91FF91B7CFFF93EF93FC0181917F +:100C60008030B9F360DFFBCFFF93EF9368DFF1CF04 +:100C7000DF93CF93CDB7DEB72596A3DFCF91DF917A +:100C800008958AB180788AB98BB180788BB93A9807 +:100C9000429808950E94410684B114B885B18FEF3F +:100CA00085B9A6E3B1E0EEE3F1E088E08E0F1192A2 +:100CB0001D928E13FCCF8091AE0182608093AE01B5 +:100CC0003D9A459A2FEF89E698E121508040904067 +:100CD000E1F700C000003D9845980895EF92FF921B +:100CE0000F931F93CF93DF93C6E3D1E0F12C85E000 +:100CF000E82E08EF10E08F2D90E0FC013197E730EF +:100D0000F10520F4E65CFF4F0C94F926509A5898B0 +:100D100014C0519A599811C0529A5A980EC0539AB9 +:100D20005B980BC0549A5C9808C0559A5D9805C0B2 +:100D3000569A5E9802C03A9A429880EA8A95F1F7EC +:100D400083B180959881981739F18883809100014B +:100D5000882301F18091AE0180FF04C08DEF90E007 +:100D60000E949F058091AE0180FF0CC08091000120 +:100D70001F928F931F930F930E9438060F900F902E +:100D80000F900F908091AE0180FF04C086EF90E03D +:100D90000E949F05E09200010E944106F394219673 +:100DA00098E0F912A8CF809100018823B1F081501A +:100DB00080930001882339F08FE99FE00197F1F7D4 +:100DC00000C000000AC0AEE3B1E0E6E3F1E0CF010D +:100DD000885F91919D938E13FCCF81E0DF91CF913D +:100DE0001F910F91FF90EF900895E82FF0E0E25CE3 +:100DF000FE4F8081089581FF03C03D9A459A089572 +:100E00003D98459808958091520108959FB7F894B0 +:100E1000109249019FBF9091C301943009F057C0CF +:100E20009091E9009F703091EC00232F217030FDEC +:100E300020E8922B24E02093E9002091EB0020FF92 +:100E400043C02091EE0027FF3FC02091460122239E +:100E500021F02091E80025FF37C01092460126E0DE +:100E60003091E80035FD15C03091C301343061F593 +:100E70003091EB0035FD28C0215021F481E08093B2 +:100E8000460122C0EFE9FFE03197F1F700C0000012 +:100E9000E7CF8093F1008091E80085FD0AC0809142 +:100EA000E80080FFFCCF8091E8008E778093E80017 +:100EB00006C08FB7F89421E0209349018FBF9F703F +:100EC0009093E90080E008959F709093E9008FEF80 +:100ED0000895CF93DF9300D01F92CDB7DEB79C016A +:100EE0008091C301843019F593E099833B832A8371 +:100EF0009093E9008FEF9091E800815095FD06C036 +:100F000095ED9A95F1F700008111F5CF8091E800F9 +:100F100085FF0DC040E050E063E070E0CE01019637 +:100F20000E94090A8091E8008E778093E8000F9074 +:100F30000F900F90DF91CF910895CF93DF9300D062 +:100F40001F92CDB7DEB72091C301243021F522E0F6 +:100F500029839B838A8383E08093E9008FEF9091BC +:100F6000E800815095FD06C095ED9A95F1F70000D7 +:100F70008111F5CF8091E80085FF0DC040E050E081 +:100F800063E070E0CE0101960E94090A8091E800BA +:100F90008E778093E8000F900F900F90DF91CF91A4 +:100FA00008952091C3012430F1F422E02093E90058 +:100FB0002FEF3091E800215035FD06C035ED3A9510 +:100FC000F1F700002111F5CF2091E80025FF0BC0BB +:100FD00040E050E065E070E00E94090A8091E8007E +:100FE0008E778093E8000895CF93DF932091C3011B +:100FF000243039F521E02093E9002FEF3091E8000B +:10100000215035FD06C035ED3A95F1F7000021116C +:10101000F5CF2091E80025FF14C0EC0140E050E03E +:1010200068E070E00E94090A8091E8008E77809362 +:10103000E80088E0FE01AAE4B1E001900D928A95F3 +:10104000E1F7DF91CF9108950895209147012F5F37 +:10105000822F62E30E94D926992319F02093470139 +:1010600008951092470180914901882371F1809180 +:10107000C301843041F58091E9008F702091EC002C +:10108000922F917020FD90E8892B94E09093E900D5 +:101090009091EB0090FF14C09091EE0097FF10C06C +:1010A0009091E80095FF03C01092F100F9CF909164 +:1010B000E80090FF05C09091E8009E779093E800CB +:1010C0008F708093E90010924901089542E061EC2D +:1010D00081E00E94120B42E061EC82E00E94120B60 +:1010E00042E061EC83E00E94120B42E261EC84E09A +:1010F0000C94120B8091C501833009F453C030F475 +:10110000813071F0823009F48CC008958A3009F47E +:1011100078C08B3009F45EC0893009F09AC020C0D5 +:101120008091C401813A09F094C08091E800877FE2 +:101130008093E8008091C8019091C901892B21F426 +:1011400068E08AE491E003C060E080E090E070E055 +:101150000E94540A8091E8008B778093E8000895FC +:101160008091C401813209F074C08091C8019091CE +:10117000C901892B09F06DC08091E800877F8093B9 +:10118000E8008091E80082FD05C08091C3018111D3 +:10119000F8CF5FC08091F100809352018091E80008 +:1011A0008B7753C08091C401813A09F052C080917D +:1011B000C8019091C901892B09F04BC08091E800CA +:1011C000877F8093E8008091E80080FFFCCF8091CA +:1011D0000B0136C08091C4018132D9F58091C801DC +:1011E0009091C901892BA9F58091E800877F8093B0 +:1011F000E8000E94470B8091C60180930B010C947C +:10120000AC148091C401813221F58091E800877F80 +:101210008093E8000E94470B8091C701809353019F +:1012200008958091C401813AA1F48091E800877FFC +:101230008093E8008091E80080FFFCCF809153010B +:101240008093F1008091E8008E778093E8000C9401 +:10125000470B0895089508958091520180934801A5 +:101260001092520180E00E94FB060E94C70F0C946E +:10127000AC140C942C090E94C01A8091C1018823DF +:1012800029F00E94E91A81110C94F309089584B79A +:10129000877F84BF0FB6F894A8958091600088611D +:1012A00080936000109260000FBE90E080E80FB65F +:1012B000F89480936100909361000FBE86E097E000 +:1012C0000E94941A89E291E00E949F050E942A09D7 +:1012D0000E94000F0E94980B0E94EB0B8091E2008D +:1012E00084608093E20078948091C3018430E1F7B8 +:1012F00088E191E00E949F050E94020F81E091E049 +:101300000E943F0E87E091E00E949F050E942B09FA +:101310008091C301853019F40E943B09F9CF0E94E6 +:10132000080FF6CF0E94FD1A809148018093520168 +:1013300008950C949209292F332723303105C9F0E1 +:1013400064F42130310581F02230310509F043C0C9 +:1013500084E790E02FE431E042C021323105F1F022 +:101360002232310541F137C082E190E023EC31E0D7 +:1013700036C099278130910541F08230910541F0C6 +:10138000892B49F5EBE4F1E005C0E1E4F1E002C0AE +:10139000E1E3F1E0849190E09F0121C06430D8F452 +:1013A000E62FF0E0EE0FFF1FE05EFE4F208131815F +:1013B00089E090E014C0643070F470E0FB01EE0F3F +:1013C000FF1FE85EFE4F20813181FB01EC5EFE4F86 +:1013D000808190E004C080E090E020E030E0FA01FD +:1013E00031832083089584E089BD86E089BD09B4F6 +:1013F00000FEFDCF8091D8008F7D8093D800809132 +:10140000E00082608093E0008091E00081FDFCCFED +:101410000895CF92DF92EF92FF920F931F93CF9395 +:10142000DF93EC018B016A010E94660B811133C0CE +:10143000C114D10439F0F60180819181081B190B88 +:10144000C80FD91FE12CF12C0115110519F180915C +:10145000E80085FD16C08091E8008E778093E80053 +:10146000C114D10449F0F60180819181E80EF91E82 +:10147000F182E08285E00FC00E94660B882321F391 +:101480000AC089918093F10001501109FFEFEF1A12 +:10149000FF0ADACF80E0DF91CF911F910F91FF908B +:1014A000EF90DF90CF9008952091CA013091CB0149 +:1014B0002617370748F06115710539F42091E800C7 +:1014C0002E772093E80001C0B90140E06115710555 +:1014D00091F12091C301222309F440C0253009F481 +:1014E0003FC02091E80023FD3DC02091E80022FD8F +:1014F0002FC02091E80020FFE9CF2091F20030E0DA +:10150000FC01CF016115710559F02830310540F417 +:1015100081918093F100615071092F5F3F4FF1CFAE +:1015200041E02830310509F040E02091E8002E77B5 +:101530002093E800CBCF4111CCCF0AC08091C301EA +:10154000882361F0853061F08091E80083FD0AC056 +:101550008091E80082FFF2CF80E0089582E0089554 +:1015600083E0089581E008952091CA013091CB0174 +:101570002617370748F06115710539F42091E80006 +:101580002E772093E80001C0B901FC0120E061152D +:10159000710579F18091C301882309F43DC085303C +:1015A00009F43CC08091E80083FD3AC08091E800D6 +:1015B00082FD2CC08091E80080FFE9CF8091F2008D +:1015C00090E06115710559F08830910540F424913F +:1015D0002093F1003196615071090196F2CF21E01C +:1015E000089709F020E08091E8008E778093E8006A +:1015F000CECF2111CFCF0AC08091C301882361F0E3 +:10160000853061F08091E80083FD0AC08091E80098 +:1016100082FFF2CF80E0089582E0089583E008958C +:1016200081E00895982F953058F59093E900981728 +:1016300039F07091EC002091ED005091F00003C062 +:10164000242F762F50E021FF19C03091EB003E7F10 +:101650003093EB003091ED003D7F3093ED00309101 +:10166000EB0031603093EB007093EC002093ED00C1 +:101670005093F0002091EE0027FF07C09F5FD3CF6B +:101680008F708093E90081E0089580E00895809153 +:10169000C40187FF11C08091E80082FD05C08091E0 +:1016A000C3018111F8CF11C08091E8008B770BC086 +:1016B0008091C301882349F08091E80080FFF8CF32 +:1016C0008091E8008E778093E80008952091E400EF +:1016D0003091E50095E64091EC00842F817040FF49 +:1016E00022C08091E80080FD1CC08091C301882346 +:1016F00091F0853091F08091EB0085FD10C0409114 +:10170000E4005091E5004217530729F39A019150E4 +:1017100011F784E0089582E0089583E0089581E060 +:10172000089580E008954091E80042FFDECF0895DB +:101730000E94F50B0E94F80BE0EEF0E080818160E2 +:101740008083E8EDF0E080818F77808319BCE3E649 +:10175000F0E08081816080831092C20108950E9430 +:10176000F50B0E94F80B8091D8008F778093D800FA +:101770008091D80080688093D8008091D8008F7DB8 +:101780008093D80084E089BD86E089BD09B400FE5D +:10179000FDCF1092C3011092BF011092C1011092AF +:1017A000C00142E060E080E00E94120B8091E10005 +:1017B0008E7F8093E1008091E20081608093E2005F +:1017C0008091E20088608093E2008091E0008E7F4B +:1017D0008093E0000895E3E6F0E080818E7F8083CF +:1017E00081E08093C2010C94AF0B1092E200089547 +:1017F0001092E10008951F920F920FB60F921124DC +:101800002F933F934F935F936F937F938F939F9308 +:10181000AF93BF93EF93FF938091E10082FF0BC0E2 +:101820008091E20082FF07C08091E1008B7F80936E +:10183000E1000E9425088091E10080FF19C080919D +:10184000E20080FF15C08091E2008E7F8093E2006D +:101850008091E20080618093E2008091D8008062F4 +:101860008093D80019BC85E08093C3010E94390998 +:101870008091E10084FF30C08091E20084FF2CC0A1 +:1018800084E089BD86E089BD09B400FEFDCF80916A +:10189000D8008F7D8093D8008091E1008F7E809367 +:1018A000E1008091E2008F7E8093E2008091E2006F +:1018B00081608093E2008091BF01882311F084E071 +:1018C00007C08091E30087FD02C081E001C083E092 +:1018D0008093C3010E9499098091E10083FF29C090 +:1018E0008091E20083FF25C08091E100877F809393 +:1018F000E10082E08093C3011092BF018091E1007A +:101900008E7F8093E1008091E2008E7F8093E200E1 +:101910008091E20080618093E20042E060E080E03C +:101920000E94120B8091F00088608093F0000E946A +:101930002408FF91EF91BF91AF919F918F917F917B +:101940006F915F914F913F912F910F900FBE0F902C +:101950001F9018951F920F920FB60F9211242F937C +:101960003F934F935F936F937F938F939F93AF9327 +:10197000BF93CF93DF93EF93FF93C091E900CF70B4 +:101980008091EC00D82FD17080FDD0E81092E90052 +:101990008091F000877F8093F00078940E94EE0C95 +:1019A0001092E9008091F00088608093F000CD2BC8 +:1019B000CF70C093E900FF91EF91DF91CF91BF917C +:1019C000AF919F918F917F916F915F914F913F91D7 +:1019D0002F910F900FBE0F901F9018951F93CF93CC +:1019E000DF93CDB7DEB7AA970FB6F894DEBF0FBE70 +:1019F000CDBFE4ECF1E088E08E0F9091F10091937F +:101A00008E13FBCF0E947A088091E80083FF1FC1EC +:101A10008091C4019091C501492F50E04A30510591 +:101A200008F015C1FA01EF5BFF4F0C94F9268038DE +:101A300081F0823809F00BC18091C8018F708093CA +:101A4000E9008091EB0085FB882780F91092E9007E +:101A500006C08091C0019091C10191118260909166 +:101A6000E800977F9093E8008093F1001092F100D6 +:101A7000C8C0282F2D7F09F0EAC0882319F08230D2 +:101A800061F0E5C08091C601813009F0E0C093307B +:101A900009F080E08093C1012BC08091C6018111C3 +:101AA00027C08091C8018F7009F4D1C08093E900EC +:101AB0002091EB0020FF1CC0933021F48091EB00BB +:101AC000806214C09091EB0090619093EB0021E054 +:101AD00030E0A90102C0440F551F8A95E2F74093F8 +:101AE000EA001092EA008091EB0088608093EB009E +:101AF0001092E9008091E800877F86C08111A7C01D +:101B00001091C6011F778091E3008078812B80932C +:101B1000E3008091E800877F8093E8000E94470BF4 +:101B20008091E80080FFFCCF8091E3008068809383 +:101B3000E300111102C082E001C083E08093C30181 +:101B400086C08058823008F082C08091C601909192 +:101B5000C7018C3D53E0950779F583E08A838AE2DB +:101B600089834FB7F894DE01139620E03EE051E2FE +:101B7000E32FF0E050935700E49120FF03C0E2957B +:101B8000EF703F5FEF708E2F90E0EA3010F0C79655 +:101B900001C0C0968D939D932F5F243149F74FBFAD +:101BA0008091E800877F8093E8006AE270E0CE01D0 +:101BB00001960E94540A14C0AE014F5F5F4F6091BE +:101BC000C8010E949B09BC01892B09F440C0909177 +:101BD000E800977F9093E80089819A810E94B40A77 +:101BE0008091E8008B778093E80031C0803879F5E8 +:101BF0008091E800877F8093E8008091BF01809307 +:101C0000F1008091E8008E778093E8000E94470BF6 +:101C10001EC081111CC09091C6019230C0F4809109 +:101C2000E800877F8093E8009093BF010E94470BF4 +:101C30008091BF01811106C08091E30087FD02C041 +:101C400081E001C084E08093C3010E946608809116 +:101C5000E80083FF0AC08091E800877F8093E80056 +:101C60008091EB0080628093EB00AA960FB6F89407 +:101C7000DEBF0FBECDBFDF91CF911F91089590932E +:101C80005901809358010895E0915801F09159014C +:101C9000309721F00190F081E02D099480E00895C3 +:101CA000EF92FF920F931F93CF93DF93E091580130 +:101CB000F09159013097B1F18C010280F381E02D50 +:101CC00009958091AE0182FF2DC080FF04C080EE97 +:101CD00092E00E949F05E80118E08AEDE82E82E07C +:101CE000F82E8091AE0180FF0BC088811F928F93E8 +:101CF000FF92EF920E9438060F900F900F900F9076 +:101D0000115021961111EDCF8091AE0180FF0AC0D4 +:101D100088ED92E0DF91CF911F910F91FF90EF90AE +:101D20000C949F05DF91CF911F910F91FF90EF9041 +:101D30000895E0915801F0915901309721F0048005 +:101D4000F581E02D09940895CF93DF93EC01809104 +:101D5000560190915701C817D90709F1D09357013F +:101D6000C0935601E0915801F09159013097B9F0B4 +:101D70000680F781E02DCE0109958091AE0182FFAA +:101D80000EC080FF0CC0DF93CF938AEC92E09F934C +:101D90008F930E9438060F900F900F900F90DF9155 +:101DA000CF910895CF93DF93EC01809154019091EE +:101DB0005501C817D90709F1D0935501C0935401B3 +:101DC000E0915801F09159013097B9F00084F18504 +:101DD000E02DCE0109958091AE0182FF0EC080FFFB +:101DE0000CC0DF93CF938AEB92E09F938F930E9476 +:101DF00038060F900F900F900F90DF91CF910895BC +:101E00000C94C80F0E942A1B0E944A060C94521C74 +:101E1000CF92DF92EF92FF920F931F93CF93DF93B6 +:101E200000D000D000D0CDB7DEB70E946E068BE5A3 +:101E3000C82E81E0D82E00E010E0E02E802F0E9416 +:101E4000F506F60141916F01F42EF826B1F40F5F0B +:101E50001F4F0830110589F78FEF89838A831B8212 +:101E60000E94331B8160782F9D838C8349815A8126 +:101E70006B818D810E94FF0F47C09091AE0191FF51 +:101E800004C08E830E94C90F8E8120E030E04F2D68 +:101E900050E0922FBA01022E02C0759567950A9400 +:101EA000E2F760FF2BC02983EA8221E030E069017C +:101EB00002C0CC0CDD1C9A95E2F790E08C219D21AC +:101EC000892B09F420E02B830E94331B8160782F3B +:101ED0009D838C8349815A816B818D810E94FF0F84 +:101EE00049815A816B817C818D810E94AC1AF801F5 +:101EF000E55AFE4F8081C826C08206C02F5F3F4F43 +:101F00002830310531F6A3CF0E94AB1A0E94D91FA9 +:101F100010915A010E94440E181741F10E94440E7C +:101F200080935A019091AE0192FF0EC090FF0CC0B9 +:101F30001F928F938BEE92E09F938F930E943806AF +:101F40000F900F900F900F9080915A0126960FB628 +:101F5000F894DEBF0FBECDBFDF91CF911F910F91DF +:101F6000FF90EF90DF90CF900C94BD1A26960FB69D +:101F7000F894DEBF0FBECDBFDF91CF911F910F91BF +:101F8000FF90EF90DF90CF9008950C94FB0608959A +:101F90000895EF92FF920F931F93CF93DF9384E006 +:101FA00093E00E949F05C0E0D0E088E2E82E81E047 +:101FB000F82E06EF12E08C2F0E94F5060E94991A67 +:101FC000FF92EF921F928F93DF93CF931F930F9304 +:101FD0000E94380621968DB79EB708960FB6F894E2 +:101FE0009EBF0FBE8DBFC830D10529F7DF91CF91BD +:101FF0001F910F91FF90EF90089508950895CF934A +:10200000DF93CDB7DEB72B970FB6F894DEBF0FBEC8 +:10201000CDBF942F4F83252F588769877A878B8769 +:102020004A855B85452B21F02F3F09F59F3FF9F449 +:10203000DE01119686E0FD0111928A95E9F785E0AF +:10204000FE01379601900D928A95E1F749815A81F8 +:102050006B817C818D819E810E9466172B960FB6C5 +:10206000F894DEBF0FBECDBFDF91CF9108954F81B1 +:10207000588569857A858B850E94AC1AD9CFCF9314 +:10208000882309F4A9C0C82F8238A1F40E94440E05 +:1020900081FDA2C089E30E94F5190E946E1A2FEFFC +:1020A00081EE94E0215080409040E1F700C00000B4 +:1020B00089E315C08338C1F40E94440E80FD8CC0B2 +:1020C00083E50E94F5190E946E1A2FEF81EE94E0CD +:1020D000215080409040E1F700C0000083E50E945D +:1020E000121ACF910C946E1A8438A1F40E94440EF7 +:1020F00082FD72C087E40E94F5190E946E1A2FEFCC +:1021000081EE94E0215080409040E1F700C0000053 +:1021100087E4E5CF8CEF8C0F813A20F080E58C0FBF +:102120008E3248F48C2F0E943A24811155C08C2F96 +:102130000E94F519D6CF80E28C0F883048F4C77022 +:1021400081E001C0880FCA95EAF70E94341AC9CF0E +:102150008BE58C0F833078F4C53A29F0C63A31F01C +:1021600083E890E005C081E890E002C082E890E05A +:10217000CF910C94A40E88E58C0F853168F5C83A90 +:1021800089F0C93A91F0CA3A99F0CB3AA1F0CC3A29 +:10219000A9F0CD3AB1F0CE3AB9F0CF3AC1F080E033 +:1021A00090E017C082EE90E014C089EE90E011C07C +:1021B0008AEE90E00EC085EB90E00BC086EB90E0DD +:1021C00008C083EB90E005C084EB90E002C087EB91 +:1021D00090E0CF910C94D20ECF910895882309F40A +:1021E0006AC08238A1F40E94440E81FF64C089E372 +:1021F0000E94F5190E946E1A2FEF81EE94E0215093 +:1022000080409040E1F700C0000089E315C08338AA +:10221000B9F40E94440E80FF4EC083E50E94F51978 +:102220000E946E1A2FEF81EE94E021508040904082 +:10223000E1F700C0000083E50E94121A0C946E1AA8 +:102240008438A1F40E94440E82FF35C087E40E94C6 +:10225000F5190E946E1A2FEF81EE94E02150804014 +:102260009040E1F700C0000087E4E6CF9CEF980FB4 +:10227000913A10F390E5980F9E32F0F290E2980FA9 +:10228000983050F4877091E001C0990F8A95EAF771 +:10229000892F0E943A1AD2CF9BE5980F933020F4F1 +:1022A00080E090E00C94A40E885A853120F480E000 +:1022B00090E00C94D20E0895882321F00E94341AE5 +:1022C0000C946E1A0895882321F00E943A1A0C94F7 +:1022D0006E1A0895BF92CF92DF92EF92FF920F9302 +:1022E0001F93CF93DF9300D000D000D0CDB7DEB7DF +:1022F00025E0FC01DE01119601900D922A95E1F78F +:10230000FC0140813181F280258122952F7063810B +:102310007481672B09F4FEC23F3F19F44F3F09F463 +:10232000F9C26C0149833A8389819A812E830E9484 +:10233000B419182FB92E0E94B3190E94C318EB2D9F +:10234000E295EF70F0E0E55BFF4F2E810C94F926EB +:102350008B2D807F9B2D9F70092F882311F0029574 +:10236000007FFF2049F0002309F481C2802F0E94E2 +:10237000471A0E946E1A7BC2812F0E94EE10002322 +:1023800009F4C8C2802F0E944D1A26960FB6F89401 +:10239000DEBF0FBECDBFDF91CF911F910F91FF9098 +:1023A000EF90DF90CF90BF900C946E1A8B2D807FB2 +:1023B0009B2D9F70092F803211F00295007F112311 +:1023C00019F0113009F12AC0FF20B1F0802F22232B +:1023D00051F1213041F526960FB6F894DEBF0FBEBD +:1023E000CDBFDF91CF911F910F91FF90EF90DF90C4 +:1023F000CF90BF900C94571A222319F0213009F482 +:1024000089C20E945A1A2DC0FF20F1F0263008F030 +:1024100081C20E94311A802329F023C0FF20F9F0E5 +:10242000211116C0802F26960FB6F894DEBF0FBE7E +:10243000CDBFDF91CF911F910F91FF90EF90DF9073 +:10244000CF90BF900C945C11253008F063C209C096 +:10245000F601858180FF0BC28F708583E3CF211148 +:102460001BC2802F82C12B2D26952695237030E02C +:102470002115310521F021303105D1F04BC2FF206B +:1024800021F0812F9B2D937002C080E090E0269672 +:102490000FB6F894DEBF0FBECDBFDF91CF911F9175 +:1024A0000F91FF90EF90DF90CF90BF900C94A40E0F +:1024B000FF2021F0812F9B2D937002C080E090E0DF +:1024C00026960FB6F894DEBF0FBECDBFDF91CF9139 +:1024D0001F910F91FF90EF90DF90CF90BF900C94E1 +:1024E000D20E812FFF2019F00E945F1E02C00E94B1 +:1024F000C71E26960FB6F894DEBF0FBECDBFDF9184 +:10250000CF911F910F91FF90EF90DF90CF90BF90F0 +:102510000C944C1F8B2D837009F07BC0F110FAC115 +:10252000812F829586958770880F880F912F9F70D5 +:10253000C92ED12CE12CF12C082E04C0CC0CDD1CB2 +:10254000EE1CFF1C0A94D2F714FF12C04FE050E0BB +:1025500060E070E004C0440F551F661F771F8A9526 +:10256000D2F7CB01BA01609570958095909503C024 +:1025700060E070E0CB012B2D269526952370422F2D +:1025800050E042305105D9F04330510569F16C29D2 +:102590007D298E299F294130510551F126960FB68C +:1025A000F894DEBF0FBECDBFDF91CF911F910F9189 +:1025B000FF90EF90DF90CF90BF900C94D8186C29CB +:1025C0007D298E299F2926960FB6F894DEBF0FBE6F +:1025D000CDBFDF91CF911F910F91FF90EF90DF90D2 +:1025E000CF90BF900C94EA180E94D818C701B6018A +:1025F00026960FB6F894DEBF0FBECDBFDF91CF9108 +:102600001F910F91FF90EF90DF90CF90BF900C94AF +:10261000C618FF2019F08B2D817001C08695882384 +:1026200009F478C1812F829586958770880F880F6D +:10263000912F9F70C92ED12CE12CF12C082E04C0B3 +:10264000CC0CDD1CEE1CFF1C0A94D2F714FF12C048 +:102650004FE050E060E070E004C0440F551F661F7B +:10266000771F8A95D2F7CB01BA0160957095809556 +:10267000909503C060E070E0CB012B2D2695269548 +:102680002370422F50E042305105D9F043305105BC +:1026900069F16C297D298E299F294130510551F11D +:1026A00026960FB6F894DEBF0FBECDBFDF91CF9157 +:1026B0001F910F91FF90EF90DF90CF90BF900C94FF +:1026C0008F196C297D298E299F2926960FB6F8949B +:1026D000DEBF0FBECDBFDF91CF911F910F91FF9055 +:1026E000EF90DF90CF90BF900C94A1190E948F19AA +:1026F000C701B60126960FB6F894DEBF0FBECDBF58 +:10270000DF91CF911F910F91FF90EF90DF90CF90CD +:10271000BF900C947D19103FC9F128F480E4810F1B +:10272000803250F09FC0123F09F461C008F44AC0E3 +:10273000133F09F471C096C0012F00718B2D8F716A +:10274000FF2051F00E941619812F002319F0829565 +:10275000807F69CE8F7067CE0E943719812F00234A +:1027600019F08295807F01C08F7026960FB6F8947D +:10277000DEBF0FBECDBFDF91CF911F910F91FF90B4 +:10278000EF90DF90CF90BF900C946311FF20B1F0D9 +:10279000253008F0BFC08B2D8F7126960FB6F894A8 +:1027A000DEBF0FBECDBFDF91CF911F910F91FF9084 +:1027B000EF90DF90CF90BF900C945C19263008F01A +:1027C000A9C0E9CFFF20A9F08B2D8F7126960FB6F7 +:1027D000F894DEBF0FBECDBFDF91CF911F910F9157 +:1027E000FF90EF90DF90CF90BF900C941619FF20D0 +:1027F00059F38B2D8F7126960FB6F894DEBF0FBE5E +:10280000CDBFDF91CF911F910F91FF90EF90DF909F +:10281000CF90BF900C943719FF2099F08B2D8F71BA +:1028200026960FB6F894DEBF0FBECDBFDF91CF91D5 +:102830001F910F91FF90EF90DF90CF90BF900C947D +:10284000011926960FB6F894DEBF0FBECDBFDF91FB +:10285000CF911F910F91FF90EF90DF90CF90BF909D +:102860000C94FC18FF20A9F0222309F4ADCF812F8E +:1028700026960FB6F894DEBF0FBECDBFDF91CF9185 +:102880001F910F91FF90EF90DF90CF90BF900C942D +:102890003F10222309F4ADCF812F26960FB6F8946E +:1028A000DEBF0FBECDBFDF91CF911F910F91FF9083 +:1028B000EF90DF90CF90BF900C94EE104B2D4F70A7 +:1028C000612FC6010E94FC1B26960FB6F894DEBF4E +:1028D0000FBECDBFDF91CF911F910F91FF90EF9071 +:1028E000DF90CF90BF900C940E184B2D4F70612F3E +:1028F000C60126960FB6F894DEBF0FBECDBFDF919E +:10290000CF911F910F91FF90EF90DF90CF90BF90EC +:102910000C94FF1B26960FB6F894DEBF0FBECDBFFA +:10292000DF91CF911F910F91FF90EF90DF90CF90AB +:10293000BF9008950E94541A0E94231A0E946E1A92 +:102940000E9480200E944C1F80E090E00E94A40E14 +:1029500080E090E00C94D20E0E94441A0C949A14D9 +:102960000E94B419292F22952F7030E02C303105A8 +:102970004CF42A303105C4F422503109223031059B +:1029800040F023C02C303105D1F02F303105B9F0A3 +:102990001CC0853A28F48430B0F4823028F413C087 +:1029A00090E2980F983078F0883E30F4803E58F4EA +:1029B0008450813A50F407C0803F39F404C093FB3F +:1029C000882780F9089581E0089580E00895CF93E5 +:1029D000DF9300D000D01F92CDB7DEB70F900F90DD +:1029E0000F900F900F90DF91CF910895CF93DF93C9 +:1029F00000D000D000D0CDB7DEB726960FB6F89441 +:102A0000DEBF0FBECDBFDF91CF910895CF93DF938F +:102A1000C091630180916401C817A1F0D0E0CE019C +:102A200066E070E00E94C826FC01EB59FE4F408131 +:102A3000518162817381848195810E94F61421966F +:102A4000C770E8CFDF91CF910895409195015091E3 +:102A500096016091970170919801809199019091F0 +:102A60009A010C94F614CF93DF9380919A0182958A +:102A70008F7009F05CC080919701882309F457C0DA +:102A800020916301D091640140919501C09196011C +:102A9000E0919801F09199012D1709F448C030E0B8 +:102AA000309709F440C0CF3F11F44F3FE1F1C90125 +:102AB00066E070E00E94C826DC01AB59BE4F11965B +:102AC0008C911197C8132FC08C9148132CC012966B +:102AD0008C911297811127C013968D919C91149718 +:102AE0008E179F0708F401978E1B9F0B883C91055A +:102AF000D0F480919A018F70806180939A01C9010E +:102B000066E070E00E94C826FC01E659FE4F908105 +:102B10009F709061908385E991E00E946A11DF9136 +:102B2000CF910C9406152F5F3F4F2770B5CFDF91E3 +:102B3000CF910895BF92CF92DF92EF92FF920F93C1 +:102B40001F93CF93DF93CDB7DEB761970FB6F8949D +:102B5000DEBF0FBECDBF8C0185E0F801DE011D9602 +:102B600001900D928A95E1F7D8014C9111962C9124 +:102B700011971296EC9012971396CD90DC901497C3 +:102B800050919501609196018091980190919901E1 +:102B9000009709F46EC16F3F19F45F3F09F469C1F2 +:102BA000B0909701BB2009F4C3C030919A01C816B8 +:102BB000D90628F0F601E81BF90BCF0104C0809577 +:102BC00090958C0D9D1DFF24F394883C910588F011 +:102BD000F12C307F09F0CBC07C2DD98AC88A522FC6 +:102BE0006E2D89890E94E71485E991E00E946A119F +:102BF000B4C0832F807F09F049C0621314C05413FE +:102C000012C0E11010C03F70306130939A010E94F1 +:102C1000251585E991E00E946A1180919A01D801F9 +:102C200015968C9331C0CD2831F12F3F11F44F3FD1 +:102C300011F1FE2CE1101FC0E0916301309164019D +:102C4000E31709F45CC0F0E0CF0166E070E00E9499 +:102C5000C826DC01AB59BE4F11968C9111972813F1 +:102C600007C08C91481304C012968C91811103C047 +:102C70003196E770E5CFFE2CEE2009F416C1809165 +:102C80009A01816080939A01F12C0FC1621308C0F0 +:102C9000541306C0E11004C080919A01D801C1C04C +:102CA0004D872E878D859E850E94B0148823E1F183 +:102CB000EE20D1F120919A01822F82958F7090E0C1 +:102CC000029774F0809195019091960198878F8377 +:102CD0001986DB86CA862C87CE0107960E946A1168 +:102CE00086E0F801A5E9B1E001900D928A95E1F73F +:102CF0000E9433150E942515FF24F394D6C04D87FA +:102D00002E878D859E850E94B419292F22952F70BC +:102D100030E0223031050CF0BCC09F7009F0B6C025 +:102D2000805E883008F4C1C0C8010E946A11E4CFF7 +:102D3000C816D90608F453C0F601E81BF90BCF01F9 +:102D4000883C910508F450C0F12C7C2DD98AC88AA2 +:102D5000522F6E2D89890E94E714E5E9F1E086E0A3 +:102D6000DF011D928A95E9F70E9425159EC0621326 +:102D700014C0541312C0E11010C080919A01F801E0 +:102D80008583C8010E946A1186E0E5E9F1E0DF0170 +:102D90001D928A95E9F7FB2C88C04D872E878D857B +:102DA0009E850E94B014882309F4BECFEE2009F45A +:102DB000BBCF20919A01822F82958F7090E002976D +:102DC0000CF48ECF80919501909196019A8389831E +:102DD0001B82DD82CC822E83CE0101967FCF80952F +:102DE00090958C0D9D1DACCFFE2CEE2009F49CCF50 +:102DF00062132EC054132CC020919A0120FD1FC0D5 +:102E0000822F82958F70D9F0D80115962C93159743 +:102E10008F3049F08F5F982F9295907F822F8F701F +:102E2000892B15968C93C8010E946A1186E0F801DF +:102E3000A5E9B1E001900D928A95E1F795CF86E082 +:102E4000F801A5E9B1E001900D928A95E1F72DC056 +:102E50004D872E878D859E850E94B014811140CFAD +:102E600080919A01816080939A01C8010E946A1141 +:102E70001CC0EE2009F458CF4D872E878D859E8586 +:102E80000E94B014882309F44FCF2ACF811148CF74 +:102E90000CC0243031050CF047CF9F7009F440CFAF +:102EA000F8019581907F09F03BCF8F2D61960FB689 +:102EB000F894DEBF0FBECDBFDF91CF911F910F9170 +:102EC000FF90EF90DF90CF90BF900895CF93DF9366 +:102ED000CDB7DEB72C970FB6F894DEBF0FBECDBFCF +:102EE0004F83588769877A878B879C87CE0107969F +:102EF0000E949A15882371F08F8198852A853B85D9 +:102F0000232B09F43FC09F3F09F068C08F3F09F0B1 +:102F100065C038C086E0FE013796DE01119601904B +:102F20000D928A95E1F76F817885EA85FB85309768 +:102F300049F17F3F11F46F3F29F18091640190E0E6 +:102F40009C012F5F3F4F277033274091630150E072 +:102F50002417350709F44BC069837A83FD83EC831A +:102F600066E070E00E94C826DC01AB59BE4F96E0D7 +:102F7000FE01319601900D929A95E1F7209364013C +:102F80000E94061580916301909164018917E9F10F +:102F900090E066E070E00E94C8268B599E4F0E9428 +:102FA0009A15882391F18091630190E066E070E0CA +:102FB0000E94C826FC01EB59FE4F4081518162817D +:102FC0007381848195810E94F6148091630190E061 +:102FD00001968770992780936301D4CF4F815885DC +:102FE00069857A858B859C850E94F614CBCF0E94DB +:102FF000AC141092640110926301E5E9F1E086E0FF +:10300000DF011D928A95E9F7BDCF2C960FB6F89493 +:10301000DEBF0FBECDBFDF91CF910895DF92EF925B +:10302000FF920F931F93CF93DF93FC01892B09F439 +:103030008AC0E12CF12CDD24D394EF0121968491F8 +:10304000853709F461C058F4843708F04EC08430E5 +:1030500008F06AC08130D1F0823071F174C08837D5 +:1030600009F45DC050F4863709F455C0873709F07C +:103070006AC08E2D0E94411A54C09CE7980F903769 +:1030800008F061C08F770E94EE1050C08F010E5F74 +:103090001F4FFE01849190E2980F983050F4877092 +:1030A000FD2D01C0FF0F8A95EAF78F2F0E94471A66 +:1030B00014C00E943F1013C08F010E5F1F4FFE010E +:1030C000C49180E28C0F883060F4C7708D2D01C0F0 +:1030D000880FCA95EAF70E944D1A0E946E1AE801FD +:1030E00025C08C2F0E94EE10FACF9F012E5F3F4F1C +:1030F000FE01C491CC2369F08FE99FE00197F1F7BD +:1031000000C00000C150F6CF9F012E5F3F4FFE016F +:10311000F490E9010BC00E94311AE82E07C00E940A +:10312000441A0E946E1A02C00E943F108F2D8823FD +:1031300041F0EFE9FFE03197F1F700C00000815066 +:10314000F6CFFE017ACFDF91CF911F910F91FF90C3 +:10315000EF90DF90089560939F017093A00180939A +:10316000A1019093A2010E94BB1A0C949A1460933F +:103170009B0170939C0180939D0190939E010E94FE +:10318000BC1A0C949A1408950C94AB180F931F93C7 +:1031900000919F011091A0012091A1013091A20105 +:1031A000602B712B822B932B1F910F910C94AB18DA +:1031B0000F931F9300919F011091A0012091A101F5 +:1031C0003091A20160237123822393231F910F91D9 +:1031D0000C94AB180F931F9300919F011091A001C5 +:1031E0002091A1013091A2016027712782279327A6 +:1031F0001F910F910C94AB1860E070E0CB010C9420 +:10320000B7180F931F9341E050E060E070E08A012F +:103210009B0104C0000F111F221F331F8A95D2F794 +:10322000C901B8011F910F910C94B7180F931F9308 +:1032300041E050E060E070E004C0440F551F661F9D +:10324000771F8A95D2F780919B0190919C01A09164 +:103250009D01B0919E018A019B01082B192B2A2BFD +:103260003B2BC901B8011F910F910C94B7180F9314 +:103270001F9341E050E060E070E004C0440F551F30 +:10328000661F771F8A95D2F7409550956095709587 +:1032900080919B0190919C01A0919D01B0919E0114 +:1032A0008A019B01082319232A233B23C901B80162 +:1032B0001F910F910C94B7180F931F9341E050E0AA +:1032C00060E070E004C0440F551F661F771F8A95A9 +:1032D000D2F780919B0190919C01A0919D01B091AA +:1032E0009E018A019B01082719272A273B27C9012C +:1032F000B8011F910F910C94B7180F931F93009171 +:103300009B0110919C0120919D0130919E01602BA9 +:10331000712B822B932B1F910F910C94B7180F9345 +:103320001F9300919B0110919C0120919D01309170 +:103330009E0160237123822393231F910F910C948C +:10334000B7180F931F9300919B0110919C0120913E +:103350009D0130919E0160277127822793271F913D +:103360000F910C94B7180895CF92DF92EF92FF92CD +:103370000F931F93CF93DF938C01C0909F01D09048 +:10338000A001E090A101F090A20140919B01509119 +:103390009C0160919D0170919E01C42AD52AE62A64 +:1033A000F72ACFE1D0E0D701C6010C2E04C0B695B4 +:1033B000A795979587950A94D2F780FF07C0B80123 +:1033C0008C2F0E94CD1B8130910531F4219758F745 +:1033D000B80180E00E94CD1BDF91CF911F910F912A +:1033E000FF90EF90DF90CF90089520910C013091E5 +:1033F0000D01F90132969FEF40E05191581789F085 +:103400009F3F19F4511101C0942F4F5F4630A9F727 +:103410009F3F39F0F901E90FF11D97FDFA9582837D +:103420000895089520910C0130910D01F901329613 +:10343000285F3F4F9081981301C010823196E217A8 +:10344000F307C1F7089581E090E0E0910C01F0915D +:103450000D01E80FF91F1082019688309105A9F738 +:1034600008958091AD0108959091AD01892B8093CD +:10347000AD01089580959091AD0189238093AD01B0 +:1034800008958093AD0108951092AD010895909133 +:10349000AC01892B8093AC01089580959091AC018B +:1034A00089238093AC0108951092AC010895809314 +:1034B000A30108951092A301089580910C019091A9 +:1034C0000D01FC0131969C01285F3F4F80E09191F6 +:1034D00091118F5FE217F307D1F70895E0910C0186 +:1034E000F0910D018091AD018083E0910C01F0918C +:1034F0000D0190818091AC01892B80838091A30183 +:10350000882361F0E0910C01F0910D019081892BED +:1035100080830E945D1A81111092A30180910C0199 +:1035200090910D010C94500E9093350180933401CD +:1035300008958295982F9C7C292F26952695982F63 +:103540009373990F990F922B892F8A7A8695957587 +:10355000990F892B08950895CF93DF9300D000D061 +:103560001F92CDB7DEB70F900F900F900F900F9076 +:10357000DF91CF910895089508950C94C50F089593 +:103580008091C301843021F11092AF0120E488E1E1 +:1035900090E00FB6F894A895809360000FBE20933A +:1035A000600083B7817F846083BF83B7816083BFFE +:1035B0007894889583B78E7F83BF0FB6F894A895CB +:1035C00080916000886180936000109260000FBE5F +:1035D0000895CF930E94FD0F0E946E060E94FE0F79 +:1035E000C0E08C2F0E94F506811104C0CF5FC83067 +:1035F000C1F701C081E0CF9108950E94C70F0C94DC +:10360000AC141F920F920FB60F9211248F939F93B9 +:10361000AF93BF938091AF01811113C08091B0012E +:103620009091B101A091B201B091B3014196A11D59 +:10363000B11D8093B0019093B101A093B201B093FA +:10364000B301BF91AF919F918F910F900FBE0F90DB +:103650001F90189582E084BD93E095BD9AEF97BDC9 +:1036600080936E0008952FB7F8948091B0019091E7 +:10367000B101A091B201B091B3012FBF08952FB74E +:10368000F8946091B0017091B1018091B201909174 +:10369000B3012FBF0895CF92DF92EF92FF920F9365 +:1036A0001F932FB7F8944091B0015091B1016091F0 +:1036B000B2017091B3012FBF6A017B01EE24FF2498 +:1036C0008C0120E030E0C016D106E206F30610F4CB +:1036D000415051099A01281B390BC9011F910F91C3 +:1036E000FF90EF90DF90CF9008951F920F920FB64A +:1036F0000F9211248F939F93AF93BF938091B0014A +:103700009091B101A091B201B091B3010196A11DB8 +:10371000B11D8093B0019093B101A093B201B09319 +:10372000B301BF91AF919F918F910F900FBE0F90FA +:103730001F9018950E94980BF8942FEF87EA91E656 +:10374000215080409040E1F700C0000087E090EBFE +:10375000DC018093CD019093CE01A093CF01B09373 +:10376000D0019CE088E10FB6F894A89580936000A2 +:103770000FBE90936000FFCFE92FF0E093E0EE0FD3 +:10378000FF1F9A95E1F7E80FF11DEA54FF4F94915E +:10379000892F8F7092959F700895CF93C82FCB017A +:1037A0000E94BC1B492F90E0242F30E054E0220FF0 +:1037B000331F5A95E1F7282B392B2038310519F49E +:1037C00080E090E017C0EC2FF0E023E0EE0FFF1F49 +:1037D0002A95E1F74770E40FF11D34E0EE0FFF1F6B +:1037E0003A95E1F7E80FF91FEE0FFF1FE050F84997 +:1037F00085919491CF91089580E090E00895089587 +:10380000CF92DF92EF92FF920F931F93CF936C01B1 +:10381000C0E08C2F0E94F50600E010E0E82EF12CAD +:10382000C701002E02C0959587950A94E2F780FFA4 +:1038300016C0602F7C2F80E00E94CD1B9C018C1550 +:103840009D0559F0832F807E932F907C11F0803A54 +:1038500031F430E02C153D0511F481E009C00F5F13 +:103860001F4F08301105E1F6CF5FC83091F680E0B8 +:10387000CF911F910F91FF90EF90DF90CF9008951F +:10388000CF93DF93EC018CE290E00E94001C882330 +:1038900029F0CE01DF91CF910C94001C80E0DF91E4 +:1038A000CF910895CF930E94B31D811102C00E9451 +:1038B000991D89E193E00E949F05C5E6C15049F03A +:1038C0000E946E068FE39CE90197F1F700C00000AB +:1038D000F5CF82E193E00E949F0589E290E00E948B +:1038E000401C811124C18AE290E00E94401C811199 +:1038F0000E94991D85E090E00E94401C81110E9469 +:103900009A1B0E94BF1A0E94BE1D8093AE0187E0E1 +:1039100090E00E94401C8823C1F18BE190E00E945E +:10392000401C882351F08091AE0181FB222720F9B1 +:1039300091E0922790FB81F90FC08EE090E00E9409 +:10394000401C882361F08091AE0182FB222720F980 +:1039500091E0922790FB82F98093AE0116C080E13E +:1039600090E00E94401C9091AE01882341F093FBAF +:10397000222720F981E0822780FB93F904C0892F58 +:10398000809580FB90F99093AE018091AE010E94EA +:10399000C21D0E94D01D8093CC0180EE90E00E9459 +:1039A000401C882341F08091CC01982F909590FB8A +:1039B00080F98093CC0189E390E00E94401C882329 +:1039C00059F08091CC0181FB222720F991E09227C8 +:1039D00090FB81F98093CC0182EE90E00E94401C24 +:1039E000882359F08091CC0182FB222720F991E0B5 +:1039F000922790FB82F98093CC0186EE90E00E94A2 +:103A0000401C882359F08091CC0183FB222720F9A8 +:103A100091E0922790FB83F98093CC0183EE90E0B4 +:103A20000E94401C882359F08091CC0184FB2227FE +:103A300020F991E0922790FB84F98093CC0185E3F3 +:103A400090E00E94401C882359F08091CC0185FBB6 +:103A5000222720F991E0922790FB85F98093CC01F1 +:103A600081E390E00E94401C882359F08091CC01B2 +:103A700086FB222720F991E0922790FB86F980931C +:103A8000CC0181E190E00E94401C882359F0809194 +:103A9000CC0187FB222720F991E0922790FB87F940 +:103AA0008093CC018091CC010E94D41D87E290E0EC +:103AB0000E94401CC82F8EE190E00E94401C8111A2 +:103AC000C2608FE190E00E94401C8111C46080E2DE +:103AD00090E00E94401C8111C86081E290E00E9449 +:103AE000401C8111C06182E290E00E94401C811163 +:103AF000C06283E290E00E94401C8111C06484E2B5 +:103B000090E00E94401C882311F0C06802C0CC23C2 +:103B100029F08C2F0E94CB1D6C2F03C00E94C71D63 +:103B2000682F70E080E090E0CF910C94C418CF91A2 +:103B300008956DEE7EEF80E090E00E942F2760E018 +:103B400082E090E00E94212760E083E090E00E9404 +:103B5000212760E084E090E00E94212760E085E07A +:103B600090E00C94212780E090E00E941B2721E048 +:103B70008D3E9E4F09F020E0822F089582E090E074 +:103B80000C941327682F82E090E00C94212783E0A7 +:103B900090E00C941327682F83E090E00C94212789 +:103BA00084E090E00C941327682F84E090E00C945C +:103BB00021278091B60180FF0CC08091110190E017 +:103BC00065E070E00E94C826959587959595879544 +:103BD0002EC081FF0AC08091110190E065E070E085 +:103BE0000E94C8269595879522C082FF08C08091C3 +:103BF000110190E065E070E00E94C82618C0209195 +:103C0000B7012223D1F030911001231780F7809162 +:103C1000110190E065E070E00E94C826622F70E01C +:103C20000E94C826632F70E00E94E526CB018038F1 +:103C3000910530F4009731F0089585E090E0089503 +:103C40008FE7089581E008958091B60180FF08C054 +:103C500060910F0170E0759567957595679523C024 +:103C600081FF06C060910F0170E0759567951BC0DC +:103C700082FF04C060910F0170E012C06091B70133 +:103C80006623D1F020910E016217A0F780910F01F9 +:103C900070E090E00E94C826622F70E00E94E52646 +:103CA0006038710528F46115710521F0862F08959B +:103CB0008FE7089581E0089561E070E0F4CF803FE0 +:103CC00021F40E94D91D819504C0813F29F40E94EE +:103CD000D91D8093BA010895823F21F40E94D91D15 +:103CE000819504C0833F29F40E94D91D8093B901B6 +:103CF0000895893F19F40E94241E05C08A3F31F4BB +:103D00000E94241E81958093BB0108958B3F21F46E +:103D10000E94241E819504C08C3F29F40E94241E19 +:103D20008093BC010895843F21F48091B8018160A3 +:103D300017C0853F21F48091B801826011C0863F91 +:103D400021F48091B80184600BC0873F21F48091F9 +:103D5000B801886005C0883F31F48091B801806166 +:103D60008093B80108958D3F21F48091B601816060 +:103D70000BC08E3F21F48091B601826005C08F3F59 +:103D800029F48091B60184608093B6010895803F44 +:103D900039F48091BA0187FF6CC01092BA0169C0F2 +:103DA000813F29F48091BA011816BCF362C090914A +:103DB000B901823F29F497FF5CC01092B90159C044 +:103DC000833F19F41916CCF354C0893F41F4809114 +:103DD000BB0118160CF04DC01092BB014AC08A3FBF +:103DE00029F48091BB0187FF44C0F6CF8B3F39F4A3 +:103DF0008091BC0187FF3DC01092BC013AC08C3F4E +:103E000029F48091BC011816BCF333C0843F21F41F +:103E10008091B8018E7F17C0853F21F48091B80151 +:103E20008D7F11C0863F21F48091B8018B7F0BC03C +:103E3000873F21F48091B801877F05C0883F31F426 +:103E40008091B8018F7E8093B80113C08D3F21F41B +:103E50008091B6018E7F0BC08E3F21F48091B60118 +:103E60008D7F05C08F3F29F48091B6018B7F8093B1 +:103E7000B6018091B90181110EC08091BA01811102 +:103E80000AC08091BB01811106C08091BC018111E3 +:103E900002C01092B70108958091AE0183FF7EC0E9 +:103EA00085E593E00E949F058091B8011F928F9352 +:103EB00080E593E09F938F930E9438068EE493E011 +:103EC0000E949F058091B901282F082E000C330B0A +:103ED0003F938F938BE493E09F938F930E943806D8 +:103EE00089E493E00E949F058091BA01282F082E53 +:103EF000000C330B3F938F9386E493E09F938F9353 +:103F00000E94380684E493E00E949F058091BB01E3 +:103F1000282F082E000C330B3F938F9381E493E0FE +:103F20009F938F930E9438068FE393E00E949F0532 +:103F30008091BC01282F082E000C330B3F938F93E8 +:103F40008CE393E09F938F930E94380689E393E07C +:103F50000E949F058091B7011F928F9386E393E0A3 +:103F60009F938F930E94380684E393E00E949F05FD +:103F70008091B6011F928F9381E393E09F938F937B +:103F80000E9438068EE293E00E949F058DB79EB78F +:103F90004C960FB6F8949EBF0FBE8DBF88EB91E094 +:103FA0000E94990E0E94331B9093B5018093B40137 +:103FB00008951F93CF93DF938091B4019091B50141 +:103FC0000E944B1BFC012091B701222329F0909104 +:103FD0001201892F90E007C08091130190E06AE000 +:103FE00070E00E94C826E817F90708F485C08091A0 +:103FF000B901C091BA01D091BB011091BC018111EE +:1040000007C0C11175C0D11173C0111171C074C046 +:104010002F3F19F02F5F2093B701181624F40E9448 +:10402000D91D8093B9018091B90187FF05C00E9415 +:10403000D91D81958093B9011C1624F40E94D91DC5 +:104040008093BA018091BA0187FF05C00E94D91DF3 +:1040500081958093BA016091B901662331F1C091D5 +:10406000BA01CC2311F1062E000C770B880B990BAB +:104070000E94C72523E333E343E35FE30E942B263B +:104080000E948F256093B9016C2FCC0F770B880BA2 +:10409000990B0E94C72523E333E343E35FE30E94C8 +:1040A0002B260E948F256093BA011D1624F40E94CE +:1040B000241E8093BB018091BB0187FF05C00E9435 +:1040C000241E81958093BB01111624F40E94241EA6 +:1040D0008093BC018091BC0187FF05C00E94241E13 +:1040E00081958093BC01DF91CF911F910C944C1F5F +:1040F0002F3F09F08FCF97CFDF91CF911F91089578 +:10410000E8EBF1E085E0DF011D928A95E9F7109276 +:10411000B7011092B601089588E795E00E949F05C7 +:104120001F9281E08F931F9285E08F938AE295E042 +:104130009F938F930E9438060F900F900F900F90CF +:104140000F900F9008958330E9F128F4813061F0E9 +:10415000823009F10895853009F462C008F449C03D +:10416000863009F474C0089580911301262F30E041 +:10417000280F311D2F3F310524F4680F6093130180 +:1041800003C08FEF80931301809113011F928F93CF +:1041900083E694E072C080911201262F30E0280F50 +:1041A000311D2F3F310524F4680F6093120103C0C5 +:1041B0008FEF80931201809112011F928F9381E5FE +:1041C00094E05BC080911101262F30E0280F311D53 +:1041D0002F3F310524F4680F6093110103C08FEF66 +:1041E00080931101809111011F928F938EE394E0CF +:1041F00044C080911001262F30E0280F311D2F3F41 +:10420000310524F4680F6093100103C08FEF809391 +:104210001001809110011F928F9389E294E02DC0CC +:1042200080910F01262F30E0280F311D2F3F3105DF +:1042300024F4680F60930F0103C08FEF80930F0188 +:1042400080910F011F928F9380E194E016C08091BE +:104250000E01262F30E0280F311D2F3F310524F4A9 +:10426000680F60930E0103C08FEF80930E01809161 +:104270000E011F928F9385EF93E09F938F930E947F +:1042800038060F900F900F900F900895833081F1B2 +:1042900028F4813059F08230D1F00895853009F446 +:1042A00049C0B8F1863009F456C0089580911301D1 +:1042B000681720F4861B8093130102C0109213012B +:1042C000809113011F928F9386EE93E054C08091EA +:1042D0001201681720F4861B8093120102C010920D +:1042E0001201809112011F928F9384ED93E043C0DD +:1042F00080911101681720F4861B8093110102C080 +:1043000010921101809111011F928F9381EC93E023 +:1043100032C080911001681720F4861B8093100131 +:1043200002C010921001809110011F928F938CEAAD +:1043300093E021C080910F01681720F4861B8093C1 +:104340000F0102C010920F0180910F011F928F93F5 +:1043500083E993E010C080910E01681720F4861B5A +:1043600080930E0102C010920E0180910E011F92E7 +:104370008F9388E793E09F938F930E9438060F9066 +:104380000F900F900F900895CF93C82F1F928F9387 +:104390008DE796E09F938F930E94380681E090E02E +:1043A000A0E0B0E0BC01CD0104C0660F771F881FFC +:1043B000991FCA95D2F70E94C4180F900F900F90C2 +:1043C0000F90CF910C94AC14CF938732B0F58E310F +:1043D00008F040C28E3009F4BEC100F5873009F400 +:1043E0008DC1A8F4863009F039C28091AE01817F79 +:1043F0008E7F8093AE0182E896E00E949F0585E85B +:104400009AE00E949F0581E08093BE0175C18830CB +:1044100009F43FC08B3009F46BC120C2863109F426 +:10442000E0C120F4803109F4AAC118C2893109F42D +:10443000C1C18B3109F47BC111C2883309F458C161 +:1044400050F4893209F404C2853309F401C2873279 +:1044500009F004C2FDC1833409F4FAC128F48A3397 +:1044600008F4FCC18953F7C1883409F0F7C10E94F0 +:10447000AC1484E79AE00E949F059FEF23ED80E350 +:10448000915020408040E1F700C000000E949A1B3C +:1044900033C189E89AE00E949F0589E798E00E946D +:1044A0009F050E94C71D1F928F9386E798E09F93F8 +:1044B0008F930E94380684E798E00E949F050E942F +:1044C000BE1DC82F81E698E00E949F051F92CF93E2 +:1044D0008CE598E09F938F930E9438068AE598E0D8 +:1044E0000E949F0580E598E00E949F058C2F8170B7 +:1044F0001F928F938DE498E09F938F930E943806CC +:104500008BE498E00E949F0581E498E00E949F055B +:10451000C1FB882780F91F928F938EE398E09F93C9 +:104520008F930E9438068CE398E00E949F0580E3F9 +:1045300098E00E949F05C2FB882780F91F928F9305 +:104540008DE298E09F938F930E9438068BE298E06B +:104550000E949F0582E298E00E949F05C3FBCC2742 +:10456000C0F91F92CF938FE198E09F938F930E94A1 +:1045700038068DE198E00E949F050E94D01DC82F4B +:1045800089E098E00E949F051F92CF9384E098E015 +:104590009F938F930E94380682E098E00E949F05C7 +:1045A00089EE97E00E949F058C2F81701F928F9358 +:1045B00086EE97E09F938F930E9438068DB79EB743 +:1045C00080960FB6F8949EBF0FBE8DBF84EE97E025 +:1045D0000E949F058DEC97E00E949F05C1FB8827F4 +:1045E00080F91F928F938AEC97E09F938F930E949C +:1045F000380688EC97E00E949F0586EB97E00E94C2 +:104600009F05C2FB882780F91F928F9383EB97E069 +:104610009F938F930E94380681EB97E00E949F053D +:104620008FE997E00E949F05C3FB882780F91F92BE +:104630008F938CE997E09F938F930E9438068AE9C5 +:1046400097E00E949F0580E997E00E949F05C4FBC8 +:10465000882780F91F928F938DE897E09F938F931F +:104660000E9438068BE897E00E949F0589E797E053 +:104670000E949F05C5FB882780F91F928F9386E7CC +:1046800097E09F938F930E94380684E797E00E94FB +:104690009F0588E597E00E949F05C6FB882780F963 +:1046A0001F928F9385E597E09F938F930E94380622 +:1046B00083E597E00E949F058BE497E00E949F05A9 +:1046C000C7FBCC27C0F91F92CF9388E497E09F9354 +:1046D0008F930E94380686E497E00E949F058DB76D +:1046E0009EB74C960FB6F8949EBF0FBE8DBF04C008 +:1046F00089EA96E00E949F05C1E0B5C08091AE01B5 +:10470000C82FC17080FF09C087E69AE00E949F050C +:104710008091AE01817F8E7F47C08BE59AE00E9439 +:104720009F058091AE0181608093AE01E5CF9091AD +:10473000AE0191FBCC27C0F981E0C827892FC0FBCF +:1047400081F98093AE01CC2319F08EE49AE027C062 +:1047500080E49AE0CFCF9091AE0192FBCC27C0F9D4 +:1047600081E0C827892FC0FB82F98093AE01CC235A +:1047700019F081E39AE013C081E29AE0BBCF9091F7 +:10478000AE0193FBCC27C0F981E0C827892FC0FB7D +:1047900083F98093AE01CC2351F085E19AE00E9429 +:1047A0009F058091AE0181608093AE015CC088E07E +:1047B0009AE0A0CF89EF99E00E949F0581ED99E0F2 +:1047C0000E949F058FE999E00E949F0582E799E08A +:1047D0000E949F0583E299E00E949F0584EF98E084 +:1047E00089CF86EE98E00E949F050E94440E1F929A +:1047F0008F938CEC98E09F938F930E943806809162 +:104800000B011F928F9385EB98E09F938F930E94EB +:104810003806809153011F928F9382EA98E09F930C +:104820008F930E9438060E943F1B9F938F937F9324 +:104830006F938BE898E09F938F930E9438068DB713 +:104840009EB742960FB6F8949EBF0FBE8DBF54CF51 +:1048500080E001C08D510E94C4214ECF89E898E0CC +:104860000E949F05C0E08C2FCF91089580E00895AD +:1048700080E00895CF93C82F8091BE01813071F000 +:1048800020F0823009F44BC042C1E0910C01F0915C +:104890000D018081823209F03CC107C0E0910C011A +:1048A000F0910D018081823261F48C2F0E943624B8 +:1048B000811104C08C2F0E94E4212FC081E090E080 +:1048C0002CC08C2F0E943824811126C0C431E1F005 +:1048D00070F4CB3081F0C031D1F40E948C2085E798 +:1048E00096E00E949F0582E08093BE0115C0C93208 +:1048F00059F0C83361F482E896E00E949F0589E789 +:1049000096E00E949F0508C01092BE0104C183E793 +:1049100096E00E949F05FFC081E08170FEC0C43216 +:1049200028F5CE3108F0C1C0CB30A1F1D0F4C730AA +:1049300009F0D3C08EE18093130182E380931201CA +:104940008AE08093110184E18093100188E08093D4 +:104950000F0188E280930E0189E195E00E949F0596 +:10496000BFC0C33149F1C431C1F0B7C0CB3409F481 +:10497000A9C028F4C93289F0C83361F0AEC0C1358E +:1049800009F49EC0C23509F499C0CE3409F0A5C01F +:104990006AE09EC00E948C20A3C08091BD01882344 +:1049A00019F01092BD019CC086E295E00E949F051F +:1049B00081E08093BE01B1C080E095E00E949F0538 +:1049C0008EEE94E00E949F05809113011F928F93B9 +:1049D0008BEE94E09F938F930E94380689EE94E0CB +:1049E0000E949F0587ED94E00E949F05809112012F +:1049F0001F928F9384ED94E09F938F930E943806CB +:104A000082ED94E00E949F0583EC94E00E949F0554 +:104A1000809111011F928F9380EC94E09F938F936C +:104A20000E9438068EEB94E00E949F058DEA94E088 +:104A30000E949F05809110011F928F938AEA94E053 +:104A40009F938F930E94380688EA94E00E949F0506 +:104A500083E994E00E949F0580910F011F928F933C +:104A600080E994E09F938F930E9438068EE894E04B +:104A70000E949F0587E794E00E949F0580910E01A8 +:104A80001F928F9384E794E09F938F930E94380640 +:104A900082E794E00E949F058DB79EB748960FB6B7 +:104AA000F8949EBF0FBE8DBF1BC0CE51EC2FF0E01F +:104AB000E75DFE4F80818093BD0112C061E003C0BD +:104AC00061E006C06AE08091BD010E94A32008C099 +:104AD0008091BD010E94462103C087E195E013C08B +:104AE0008091BD01882369F01F928F9381E195E049 +:104AF0009F938F930E9438060F900F900F900F9006 +:104B000004C08EE095E00E949F0581E006C01092EF +:104B1000BE0180E002C080E000CFCF9108950E94E6 +:104B200096256894B1110C94252608950E940A26B2 +:104B300088F09F5798F0B92F9927B751B0F0E1F05E +:104B4000660F771F881F991F1AF0BA95C9F714C00E +:104B5000B13091F00E942426B1E008950C942426EF +:104B6000672F782F8827B85F39F0B93FCCF3869547 +:104B700077956795B395D9F73EF4909580957095A4 +:104B800061957F4F8F4F9F4F0895E89409C097FB21 +:104B90003EF490958095709561957F4F8F4F9F4F14 +:104BA0009923A9F0F92F96E9BB279395F695879558 +:104BB00077956795B795F111F8CFFAF4BB0F11F41B +:104BC00060FF1BC06F5F7F4F8F4F9F4F16C08823C2 +:104BD00011F096E911C0772321F09EE8872F762FF8 +:104BE00005C0662371F096E8862F70E060E02AF039 +:104BF0009A95660F771F881FDAF7880F9695879525 +:104C000097F9089557FD9058440F551F59F05F3F8D +:104C100071F04795880F97FB991F61F09F3F79F0DE +:104C200087950895121613061406551FF2CF469560 +:104C3000F1DF08C0161617061806991FF1CF8695E2 +:104C40007105610508940895E894BB2766277727C6 +:104C5000CB0197F908950E943D260C94B7260E9437 +:104C6000A92638F00E94B02620F0952311F00C946C +:104C7000A0260C94A6260C9425260E94022678F3E2 +:104C80009923C9F35523B9F3950F50E0551FAA276F +:104C9000EE27FF27BB2700240894679520F4E20F36 +:104CA000F31FB41F0A1E220F331F441FAA1F66954D +:104CB000A9F7779530F4F30FB41F0A1E121E08F4FB +:104CC0006395330F441FAA1F221F769599F7879586 +:104CD00020F4B40F0A1E121E631F440FAA1F221FC6 +:104CE000331F8695A9F7862F712D602D11249F57AC +:104CF00050409AF0F1F088234AF0EE0FFF1FBB1FDF +:104D0000661F771F881F91505040A9F79E3F51059D +:104D100080F00C94A0260C9425265F3FE4F3983E87 +:104D2000D4F3869577956795B795F795E7959F5F47 +:104D3000C1F7FE2B880F911D9695879597F90895D9 +:104D400097F99F6780E870E060E008959FEF80EC3E +:104D5000089500240A9416161706180609060895E1 +:104D600000240A9412161306140605060895092E47 +:104D70000394000C11F4882352F0BB0F40F4BF2BB6 +:104D800011F460FF04C06F5F7F4F8F4F9F4F0895F6 +:104D90000024552704C0080E591F880F991F00973B +:104DA00029F076956795B8F37105B9F7802D952FA1 +:104DB0000895991B79E004C0991F961708F0961B77 +:104DC000881F7A95C9F78095089597FB072E16F4EA +:104DD000009407D077FD09D00E94FF2607FC05D07C +:104DE0003EF4909581959F4F0895709561957F4F02 +:104DF0000895EE0FFF1F0590F491E02D0994AA1B72 +:104E0000BB1B51E107C0AA1FBB1FA617B70710F0B5 +:104E1000A61BB70B881F991F5A95A9F780959095E7 +:104E2000BC01CD010895F999FECF92BD81BDF89ADC +:104E3000992780B50895A8E1B0E042E050E00C94D5 +:104E40003627262FF999FECF1FBA92BD81BD20BD0E +:104E50000FB6F894FA9AF99A0FBE019608950E9437 +:104E60002127272F0C942227DC01CB01FC01F99983 +:104E7000FECF06C0F2BDE1BDF89A319600B40D92A6 +:0C4E800041505040B8F70895F894FFCF5F +:104E8C00050307F407D1079D07690701A40128084A +:104E9C00140A321E404D36227A022D02F701D5013A +:104EAC0061017A019301AC010001020304050607BC +:044EBC0008090000E1 +:106800000000000000000000040005000600070072 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:1068600030003100000033003400350036003700BE +:106870003800E00000000000000000000000000000 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000006400650000000000FF +:1068D00000000000000000000000000000000000B8 +:1068E0000000000000000000320000000000000076 +:1068F000E000E100E200E300E400E500E600E7A1DB +:106900000000000000000000EA4401000100E24431 +:106910000100010001005500460054004A004B00F0 +:10692000560057004700480001000100E9440100FB +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000580001004C00390001004400450052007D +:1069600001002A00000050004F0029004D004E0099 +:1069700051000100000000000000000000000000C5 +:106980000000000000000000000000000000000007 +:1069900000000000000000000000000000000000F7 +:1069A00000000000000000000000000000000000E7 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000100010000000000C5 +:1069D00000000000000000000000000000000000B7 +:1069E000000000000000000049000000000000005E +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/keyboard/alps64/keymap_common.c b/keyboard/alps64/keymap_common.c deleted file mode 100644 index fdb1769e..00000000 --- a/keyboard/alps64/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/alps64/keymap_common.h b/keyboard/alps64/keymap_common.h index 957db579..17418783 100644 --- a/keyboard/alps64/keymap_common.h +++ b/keyboard/alps64/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -30,10 +29,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* Alps64 keymap definition macro */ #define KEYMAP( \ K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K26, K27, \ diff --git a/keyboard/alps64/keymap_editor.c b/keyboard/alps64/keymap_editor.c index 68c629f0..7abf6feb 100644 --- a/keyboard/alps64/keymap_editor.c +++ b/keyboard/alps64/keymap_editor.c @@ -27,9 +27,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { }; #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), diff --git a/keyboard/alps64/keymap_hasu.c b/keyboard/alps64/keymap_hasu.c index d297d72f..17e3ac6a 100644 --- a/keyboard/alps64/keymap_hasu.c +++ b/keyboard/alps64/keymap_hasu.c @@ -121,7 +121,7 @@ enum macro_id { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), // HHKB layer [1] = ACTION_LAYER_TAP_KEY(1, KC_ENTER), // HHKB layer [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* diff --git a/keyboard/alps64/keymap_plain.c b/keyboard/alps64/keymap_plain.c index 11a43d59..034b8076 100644 --- a/keyboard/alps64/keymap_plain.c +++ b/keyboard/alps64/keymap_plain.c @@ -28,6 +28,6 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/alps64/matrix.c b/keyboard/alps64/matrix.c index 5638d7f6..109bcf2c 100644 --- a/keyboard/alps64/matrix.c +++ b/keyboard/alps64/matrix.c @@ -43,18 +43,6 @@ static void unselect_rows(void); static void select_row(uint8_t row); -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - #define LED_ON() do { DDRC |= (1<<5); PORTC |= (1<<5); } while (0) #define LED_OFF() do { DDRC &= ~(1<<5); PORTC &= ~(1<<5); } while (0) #define LED_TGL() do { DDRC |= (1<<5); PINC |= (1<<5); } while (0) @@ -107,28 +95,12 @@ uint8_t matrix_scan(void) return 1; } -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1< + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_L1 ACTION_LAYER_TAP_KEY(1, KC_RGUI) + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + /* 0: + * ,-----------------------------------------------------------. + * |` | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| #|Bsp| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift |Esc| + * |-----------------------------------------------------------' + * |Ctrl|Gui |Alt | Space |App |Alt |Gui |Ctrl | + * `-----------------------------------------------------------' + */ + [0] = UNIMAP_ALPS64( \ + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NUHS,BSPC, \ + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, \ + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, \ + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,ESC, \ + LCTL,LGUI,LALT, SPC, APP, RALT,L1, RCTL), + + [1] = UNIMAP_ALPS64( \ + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS, UP, TRNS, BSPC, \ + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, \ + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), +}; diff --git a/keyboard/alps64/unimap_trans.h b/keyboard/alps64/unimap_trans.h new file mode 100644 index 00000000..58a4389a --- /dev/null +++ b/keyboard/alps64/unimap_trans.h @@ -0,0 +1,80 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_TRNAS_H +#define UNIMAP_TRNAS_H + +#include +#include +#include "unimap.h" + + +#define UNIMAP_ALPS64( \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K7D,K29, \ + K78,K7B,K7A, K2C, K65,K7E,K7F,K7C \ +) UNIMAP( \ + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + K29, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, NO, NO, NO, NO, NO, NO, NO, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, NO, NO, NO, NO, NO, NO, NO, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, NO, K28, NO, NO, NO, NO, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, NO, K7D, NO, NO, NO, NO, NO, \ + K78,K7B,K7A,NO, K2C, NO, NO, K7E,K7F,K65,K7C, NO, NO, NO, NO, NO, NO \ +) + + +/* Mapping to Universal keyboard layout + * ,-----------------------------------------------------------. + * |` | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shft| \| Z| X| C| V| B| N| M| ,| .| /|Shift |Esc| + * |-----------------------------------------------------------' + * |Ctrl|Gui |Alt | Space |App |Alt |Gui |Ctrl | + * `-----------------------------------------------------------' + * + * ,-----------------------------------------------------------. + * |36 |37 |46 |47 |56 |57 |66 |67 |76 |77 |06 |07 |17 |26 |27 | + * |-----------------------------------------------------------| + * |34 |35 |44 |45 |54 |55 |64 |65 |75 |05 |15 |16 |25 |24 | + * |-----------------------------------------------------------| + * |32 |33 |43 |52 |53 |63 |73 |74 |03 |04 |13 |14 | 23 | + * |-----------------------------------------------------------| + * |31 |41 |42 |51 |61 |62 |71 |72 |01 |02 |11 |12 |21 |22 | + * |-----------------------------------------------------------| + * |30 |40 |50 | 60 |70 |00 |10 |20 | + * `-----------------------------------------------------------' + */ +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_RALT, UNIMAP_M, UNIMAP_COMM, UNIMAP_K, UNIMAP_L, UNIMAP_O, UNIMAP_0, UNIMAP_MINS }, /* 00-07 */ + { UNIMAP_RGUI, UNIMAP_DOT, UNIMAP_SLSH, UNIMAP_SCLN, UNIMAP_QUOT, UNIMAP_P, UNIMAP_LBRC, UNIMAP_EQL }, /* 10-17 */ + { UNIMAP_RCTL, UNIMAP_RSFT, UNIMAP_ESC, UNIMAP_ENT, UNIMAP_BSLS, UNIMAP_RBRC, UNIMAP_JYEN, UNIMAP_BSPC }, /* 20-27 */ + { UNIMAP_LCTL, UNIMAP_LSFT, UNIMAP_CAPS, UNIMAP_A, UNIMAP_TAB, UNIMAP_Q, UNIMAP_GRV, UNIMAP_1 }, /* 30-37 */ + { UNIMAP_LGUI, UNIMAP_NUBS, UNIMAP_Z, UNIMAP_S, UNIMAP_W, UNIMAP_E, UNIMAP_2, UNIMAP_3 }, /* 40-47 */ + { UNIMAP_LALT, UNIMAP_X, UNIMAP_D, UNIMAP_F, UNIMAP_R, UNIMAP_T, UNIMAP_4, UNIMAP_5 }, /* 50-57 */ + { UNIMAP_SPC, UNIMAP_C, UNIMAP_V, UNIMAP_G, UNIMAP_Y, UNIMAP_U, UNIMAP_6, UNIMAP_7 }, /* 60-67 */ + { UNIMAP_APP, UNIMAP_B, UNIMAP_N, UNIMAP_H, UNIMAP_J, UNIMAP_I, UNIMAP_8, UNIMAP_9 }, /* 70-77 */ +}; + +#endif + + diff --git a/converter/ps2_usb/Makefile.tmk_rev1 b/keyboard/fc660c/Makefile similarity index 59% rename from converter/ps2_usb/Makefile.tmk_rev1 rename to keyboard/fc660c/Makefile index 6aaef499..5fb62fbd 100644 --- a/converter/ps2_usb/Makefile.tmk_rev1 +++ b/keyboard/fc660c/Makefile @@ -1,32 +1,22 @@ -# -# Makefile for TMK keyboard converter rev2 -# https://github.com/tmk/keyboard_converter#pcb-rev1 -# -# Target file name (without extension). -TARGET = ps2_usb_tmk_rev1 +# Target name +TARGET ?= fc660c -# Directory common source filess exist -TMK_DIR = ../../tmk_core +# Location of tmk_core +TMK_DIR ?= ../../tmk_core -# Directory keyboard dependent files exist -TARGET_DIR = . +# Location of target 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_plain.c $(SRC) -endif +# List C source files +SRC ?= fc660c.c -CONFIG_H = config_tmk_rev1.h +# Configure file +CONFIG_H ?= config.h # MCU name -MCU = atmega32u4 +MCU ?= atmega32u4 # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the @@ -39,14 +29,14 @@ MCU = atmega32u4 # 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 +F_CPU ?= 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). -ARCH = AVR8 +ARCH ?= AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the @@ -59,13 +49,16 @@ ARCH = AVR8 # # 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) +F_USB ?= $(F_CPU) + +# Interrupt driven control endpoint task +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Boot Section Size in *bytes* # Teensy halfKay 512 # Teensy++ halfKay 1024 -# Atmel DFU loader 4096 +# Atmel DFU loader 4096 (TMK Alt Controller) # LUFA bootloader 4096 # USBaspLoader 2048 OPT_DEFS += -DBOOTLOADER_SIZE=4096 @@ -74,25 +67,44 @@ 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 -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +#BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE ?= yes # Mouse keys +EXTRAKEY_ENABLE ?= yes # Audio control and System control +CONSOLE_ENABLE ?= yes # Console for debug +COMMAND_ENABLE ?= yes # Commands for debug and configuration +NKRO_ENABLE ?= yes # USB Nkey Rollover +#ACTIONMAP_ENABLE ?= yes # Use 16bit actionmap instead of 8bit keymap +UNIMAP_ENABLE ?= yes # Universal keymap +KEYMAP_SECTION_ENABLE ?= yes # fixed address keymap for keymap editor + +#OPT_DEFS += -DNO_ACTION_TAPPING +#OPT_DEFS += -DNO_ACTION_LAYER +#OPT_DEFS += -DNO_ACTION_MACRO -# PS/2 Options # -PS2_USE_USART = yes # uses hardware USART engine for PS/2 signal receive(recomened) -#PS2_USE_BUSYWAIT = yes # uses primitive reference code +# Keymap file +# +ifeq (yes,$(strip $(UNIMAP_ENABLE))) + KEYMAP_FILE = unimap +else + ifeq (yes,$(strip $(ACTIONMAP_ENABLE))) + KEYMAP_FILE = actionmap + else + KEYMAP_FILE = keymap + endif +endif +ifdef KEYMAP + SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) +else + SRC := $(KEYMAP_FILE).c $(SRC) +endif # Search Path VPATH += $(TARGET_DIR) VPATH += $(TMK_DIR) -include $(TMK_DIR)/protocol.mk include $(TMK_DIR)/protocol/lufa.mk include $(TMK_DIR)/common.mk include $(TMK_DIR)/rules.mk diff --git a/keyboard/fc660c/README.md b/keyboard/fc660c/README.md new file mode 100644 index 00000000..3ceafee5 --- /dev/null +++ b/keyboard/fc660c/README.md @@ -0,0 +1,144 @@ +FC660C controller +================= +2017/02/24 +2017/03/25 + +Thread on Geekhack: https://geekhack.org/index.php?topic=88439.0 + + +Firmware +-------- +Just `make` to build firmware. And consult with wiki for further information. + +https://github.com/tmk/tmk_keyboard/wiki + + +Pinouts +------- + + |Switch |Controller | + | board | board |Description |Schematic |ATmega32u4 + |--------|-----------|--------------------------------------|-----------|------------ + | 1 |20 | FG |FG |GND + | 2 |19 | GND |GND |GND + | 3 |18 | GND |GND |GND + | 4 |17 | 3.3V |V33 |3.3V/5V + | 5 |16 | 5V |Vcc |5V + | 6 |15 |*Z6-TP1684-4-HYS(o) |FBSTB |PC7 + | 7 |14 |*Z6-TP1684-2-KEY(i) |OUT |PC6 + | 8 |13 |*Z2-AD5258-5-SCL(I2C) |SCL |PD0(TWI) + | 9 |12 |*Z2-AD5258-4-SDA(I2C) |SDA |PD1(TWI) + |10 |11 |*Z4-LV4051A-6-~EN(Col 0-7) |INH_1 |PB4 + |11 |10 |*Z5-LV4051A-6-~EN(Col 8-F) |INH_2 |PB3 + |12 | 9 |+Z7-LV07A-5 (LV4051A-9-C) |SEL_C |PB2 + |13 | 8 |+Z7-LV07A-1 (LV4051A-10-B) |SEL_B |PB1 + |14 | 7 |+Z7-LV07A-3 (LV4051A-11-A) |SEL_A |PB0 + |15 | 6 |+Z3-LVC138A-3-C |COL4 |PD6 + |16 | 5 |+Z3-LVC138A-2-B |COL3 |PD5 + |17 | 4 |+Z3-LVC138A-1-A |COL2 |PD4 + |18 | 3 |+Z3-LVC138A-4-~G2A Z6-TP1684-5-~EN |COL1 |PD7 + |19 | 2 |+Z7-LV07A-11-~InsertLED |LED1 |PB5 + |20 | 1 |+Z7-LV07A-13-~CapsLED |LED2 |PB6 + +``` +* 5V intferface ++ 3.3V interface +``` + +- Connector on Switch board: https://i.imgur.com/Zi89xO5.jpg +- Connector on Controller board: https://i.imgur.com/9SZUzYo.jpg + + +Key Matrix +---------- +Row5-7 have no key, you can omit scaning on those lines. Topre original controller scans those rows for some reason. + + | |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |A |B |C |D |E |F | + |----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----| + | 0|Q |W |E |Tab |R |U |T |Y |O |P |[ |I |] | |\ |Del | + | 1|1 |2 |3 |Esc |4 |7 |5 |6 |9 |0 |- |8 |= | |BSpc|Ins | + | 2| |LWin|LAlt|LCtl| | | |Spc |RAlt| |RCtl| |Fn |Down|Left|Rght| + | 3| |Z |X |LSft|C |N |V |B |, |. |/ |M |RSft|Up | | | + | 4|A |S |D |Caps|F |J |G |H |L |; |' |K | | |Entr| | + | 5| | | | | | | | | | | | | | | | | + | 6| | | | | | | | | | | | | | | | | + | 7| | | | | | | | | | | | | | | | | + +Logic analyzer pics: +- http://i.imgur.com/9XoNTev.png +- https://i.imgur.com/5FCP1Ay.png + +This code emuluates what original cotnroller does for matrix scan. +- https://github.com/tmk/tmk_keyboard/blob/master/keyboard/fc660c/fc660c.c + + +### Row designation +LV138A(Z3) selects a row line and gives strobe by enabling with ~G2A(18). + + |Row |A/17|B/16|C/15| + |----|----|----|----| + |0 |0 |0 |0 | + |1 |1 |0 |0 | + |2 |0 |1 |0 | + |3 |1 |1 |0 | + |4 |0 |0 |1 | + |5 |1 |0 |1 | + |6 |0 |1 |1 | + |7 |1 |1 |1 | + + +### Column designation +LV4051A(Z4, Z5) select one of 16 column lines to sense capacitance of switches. + + |Col |A/14|B/13|C/12|Z4-EN/10|Z5-EN/11| + |----|----|----|----|--------|--------| + |0 |0 |0 |0 |0 |1 | + |1 |1 |0 |0 |0 |1 | + |2 |0 |1 |0 |0 |1 | + |3 |1 |1 |0 |0 |1 | + |4 |0 |0 |1 |0 |1 | + |5 |1 |0 |1 |0 |1 | + |6 |0 |1 |1 |0 |1 | + |7 |1 |1 |1 |0 |1 | + |8 |0 |0 |0 |1 |0 | + |9 |1 |0 |0 |1 |0 | + |A |0 |1 |0 |1 |0 | + |B |1 |1 |0 |1 |0 | + |C |0 |0 |1 |1 |0 | + |D |1 |0 |1 |1 |0 | + |E |0 |1 |1 |1 |0 | + |F |1 |1 |1 |1 |0 | + + +FCC documents +------------- +https://fccid.io/RPKFC660C + +- schematic: https://fccid.io/pdf.php?id=1888185 +- part list: https://fccid.io/pdf.php?id=1888184 + + +Datasheets +---------- +- Hirose DF14A-20P-1.25H: http://www.mouser.com/ds/2/185/DF14_catalog-939195.pdf +- LV07A: http://www.ti.com/lit/ds/symlink/sn74lv07a.pdf +- LV138A: http://www.ti.com/lit/ds/symlink/sn74lvc138a.pdf +- LV4051A: http://www.ti.com/lit/ds/symlink/sn74lv4051a.pdf +- AD5258: http://www.analog.com/media/en/technical-documentation/data-sheets/AD5258.pdf + + +3.3V power supply +----------------- +LV07A and LVC138A are 5V-tolerant and can be powered with 5V, the keyboard will work only with 5V power supply. It may not be completely safe to operate LV138A with 5V Vcc, its datasheet says: + +> Exposure to absolute-maximum-rated conditions for extended periods may affect device reliability. + +Digipot AD5258 +-------------- +Controller can operate AD5258 via I2C to change actuation point of keys. This may make keyboard unusable accidentally and it will be difficult to recovery in some situation. For safety firmware doesn't support it at this point, though. + +Lower value of RDAC register causes shallower actuation point. + +Resources +--------- +- Pics: https://imgur.com/a/UTR8Z diff --git a/keyboard/fc660c/binary/fc660c.hex b/keyboard/fc660c/binary/fc660c.hex new file mode 100644 index 00000000..496c6929 --- /dev/null +++ b/keyboard/fc660c/binary/fc660c.hex @@ -0,0 +1,1207 @@ +:100000000C9443050C948A050C948A050C948A057B +:100010000C948A050C948A050C948A050C948A0524 +:100020000C948A050C948A050C94A30C0C94750D01 +:100030000C940B1C0C948A050C948A050C948A056C +:100040000C948A050C948A050C948A050C948A05F4 +:100050000C948A050C947F1C0C948A050C948A05D8 +:100060000C948A050C948A050C948A050C948A05D4 +:100070000C948A050C948A050C948A050C948A05C4 +:100080000C948A050C948A050C948A050C948A05B4 +:100090000C948A050C948A050C948A050C948A05A4 +:1000A0000C948A050C948A050C948A05E20D040EC2 +:1000B000F20E040EF20E490E6C0EF20EC10ED40EAC +:1000C000F911F911271227128412C212DB14DB1462 +:1000D000DB12DB14DC13DC13AF14DB14DB14C614EB +:1000E000141A082B1518171C12132F0C3080314CC2 +:1000F0001E1F20352124222326272D252E802A4924 +:10010000807B7A788080802C7E807C807F51504FED +:10011000801D1B7906111905363738107D528080F5 +:1001200004160739090D0A0B0F33340E808028801E +:1001300080808080808080808080808080808080BF +:1001400080808080808080808080808080808080AF +:10015000808080808080808080808080808080809F +:100160004B6579626F6172642073746172742E0AD8 +:100170000055534220636F6E666967757265642E21 +:100180000A000D0A696E69740A005B445D005B43F6 +:100190005D002C034600430036003600300043006B +:1001A000200041006C007400200043006F006E00CE +:1001B000740072006F006C006C006500720000003B +:1001C0000A0354004D004B002E00000004030904F4 +:1001D00009028D00050100A032090400000103019D +:1001E00001000921110100012240000705810308D7 +:1001F000000A0904010001030102000921110100A4 +:1002000001224D000705820308000A0904020001CB +:1002100003000000092111010001223600070583B7 +:100220000308000A09040300020300000009211169 +:1002300001000122220007058403200001070504B4 +:10024000032000010904040001030000000921113A +:100250000100012239000705850320000112011069 +:100260000100000008EDFE0C66000101020001051E +:10027000010906A101050719E029E71500250195E7 +:100280000875018102050819012905950575019177 +:10029000029501750391010507190029F71500253D +:1002A0000195F875018102C00631FF0974A10109A9 +:1002B00075150026FF009520750881020976150046 +:1002C00026FF00952075089102C005010980A10153 +:1002D000850216810026B7001A81002AB700751022 +:1002E00095018100C0050C0901A1018503160100DB +:1002F000269C021A01002A9C02751095018100C0FB +:1003000005010902A1010901A10005091901290539 +:10031000150025019505750181029501750381017F +:100320000501093009311581257F9502750881067F +:1003300009381581257F950175088106050C0A3855 +:10034000021581257F950175088106C0C005010948 +:1003500006A101050719E029E71500250195087593 +:10036000018102950175088101050819012905958A +:100370000575019102950175039101050719002981 +:10038000FF150026FF00950675088100C0636F6E9B +:1003900073756D65723A20253034580A007379738D +:1003A00074656D3A20253034580A000A0025303231 +:1003B0005820006B6579626F6172643A20004C4589 +:1003C000443A20253032580A00253032583A202548 +:1003D0003031366225730A00722F63203031323398 +:1003E0003435363738394142434445460A0064655E +:1003F0006C5F6B65795F6269743A2063616E277424 +:100400002064656C3A20253032580A006164645FCC +:100410006B65795F6269743A2063616E277420614D +:1004200064643A20253032580A004F6E6573686F55 +:10043000743A2074696D656F75740A00290A002585 +:1004400075002F002575005D28002564002000251B +:100450006400200025640020002564007C00253015 +:100460003258006D6F7573656B6579205B62746ED1 +:100470007C782079207620685D287265702F616312 +:100480006C293A205B006D6B5F776865656C5F7403 +:10049000696D655F746F5F6D6178203D2025640A2A +:1004A000006D6B5F776865656C5F6D61785F737019 +:1004B000656564203D2025640A006D6B5F74696D7D +:1004C000655F746F5F6D6178203D2025640A006D63 +:1004D0006B5F6D61785F7370656564203D20256496 +:1004E0000A006D6B5F696E74657276616C203D20E9 +:1004F00025640A006D6B5F64656C6179203D202581 +:10050000640A006D6B5F776865656C5F74696D6523 +:100510005F746F5F6D6178203D2025640A006D6B0C +:100520005F776865656C5F6D61785F737065656442 +:10053000203D2025640A006D6B5F74696D655F74F2 +:100540006F5F6D6178203D2025640A006D6B5F6DE3 +:1005500061785F7370656564203D2025640A006DD5 +:100560006B5F696E74657276616C203D2025640A4C +:10057000006D6B5F64656C6179203D2025640A0025 +:100580000A00257500363A20776865656C5F7469E6 +:100590006D655F746F5F6D61783A20000A002575A4 +:1005A00000353A20776865656C5F6D61785F7370C0 +:1005B0006565643A20000A00257500343A207469A4 +:1005C0006D655F746F5F6D61783A20000A00257574 +:1005D00000333A206D61785F73706565643A20007E +:1005E0000A00257500323A20696E74657276616C76 +:1005F000286D73293A20000A00257500313A2064DD +:10060000656C6179282A31306D73293A20000A0916 +:100610002D2056616C756573202D0A004D3E004DEE +:1006200025643E20003F0073657420646566617533 +:100630006C740A00433E200077686572652064652B +:100640006C74613A20637572736F723D25642C205F +:10065000776865656C3D25640A5365652068747428 +:10066000703A2F2F656E2E77696B697065646961CA +:100670002E6F72672F77696B692F4D6F7573655F8A +:100680006B6579730A000A092D204D6F7573656BD0 +:100690006579202D0A4553432F713A0971756974A4 +:1006A0000A313A0964656C6179282A31306D732901 +:1006B0000A323A09696E74657276616C286D732925 +:1006C0000A333A096D61785F73706565640A343A7C +:1006D0000974696D655F746F5F6D61780A353A09F9 +:1006E000776865656C5F6D61785F73706565640AD6 +:1006F000363A09776865656C5F74696D655F746F1C +:100700005F6D61780A0A703A097072696E742076BA +:10071000616C7565730A643A097365742064656673 +:1007200061756C74730A75703A092B310A646F77BE +:100730006E3A092D310A706775703A092B31300A0B +:100740007067646F776E3A092D31300A0A737065ED +:100750006564203D2064656C7461202A206D617899 +:100760005F7370656564202A202872657065617406 +:10077000202F2074696D655F746F5F6D6178290A41 +:10078000003F004D3E2000433E20004C25640A00FF +:100790000A092D20436F6E736F6C65202D0A455337 +:1007A000432F713A09717569740A6D3A096D6F7555 +:1007B00073656B65790A000A092D204D61676963CD +:1007C000202D0A643A0964656275670A783A0964FB +:1007D00065627567206D61747269780A6B3A0964A5 +:1007E00065627567206B6579626F6172640A6D3A44 +:1007F000096465627567206D6F7573650A763A09DD +:1008000076657273696F6E0A733A097374617475F1 +:10081000730A633A09636F6E736F6C65206D6F6462 +:10082000650A302D343A096C61796572302D3428AF +:100830004631302D4634290A506175733A09626F8A +:100840006F746C6F616465720A6E3A094E4B524F59 +:100850000A003F004E4B524F3A206F66660A004E28 +:100860004B524F3A206F6E0A0074696D65725F7269 +:10087000656164333228293A202530346C580A00E7 +:100880006B6579626F6172645F6E6B726F3A20257F +:10089000580A006B6579626F6172645F69646C65A8 +:1008A0003A2025580A006B6579626F6172645F7047 +:1008B000726F746F636F6C3A2025580A00686F730B +:1008C000745F6B6579626F6172645F6C65647328D5 +:1008D000293A2025580A000A092D2053746174759D +:1008E00073202D0A004743433A20342E392E3220FC +:1008F0004156522D4C4942433A20312E382E307306 +:10090000766E204156525F415243483A20617672DA +:10091000350A004F5054494F4E533A204C554641EA +:10092000204D4F5553454B45592045585452414B46 +:10093000455920434F4E534F4C4520434F4D4D4159 +:100940004E44204E4B524F204B45594D41505F5322 +:10095000454354494F4E20343039360A00425549F8 +:100960004C443A20653338323935372D6469727416 +:1009700079202831363A31333A32312041707220B1 +:1009800031352032303137290A005649443A203077 +:10099000784645454428544D4B2E29205049443A29 +:1009A00020307836363043284643363630432041AF +:1009B0006C7420436F6E74726F6C6C657229205674 +:1009C00045523A203078303130300A0044455343A4 +:1009D0003A20544D4B2E206B6579626F6172642012 +:1009E0006669726D7761726520666F722046433664 +:1009F0003630430A000A092D2056657273696F6EFE +:100A0000202D0A000A6D6F7573653A206F66660ABD +:100A1000000A6D6F7573653A206F6E0A000A6B6588 +:100A200079626F6172643A206F66660A000A6B65CC +:100A300079626F6172643A206F6E0A000A6D6174A8 +:100A40007269783A206F66660A000A6D617472698D +:100A5000783A206F6E0A000A64656275673A206F03 +:100A60006E0A000A64656275673A206F66660A005E +:100A70000A0A626F6F746C6F616465722E2E2E208D +:100A800000433E20000011241FBECFEFDAE0DEBF9E +:100A9000CDBF04B603FE27C08091220290912302AD +:100AA000A0912402B09125028730904BA740B04B13 +:100AB000D1F410922202109223021092240210927A +:100AC000250214BE84B7877F84BF0FB6F894A8951B +:100AD00080916000886180936000109260000FBE7A +:100AE000E0E0F8E3099511E0A0E0B1E0E4E1FAE428 +:100AF00002C005900D92A833B107D9F722E0A8E310 +:100B0000B1E001C01D92A232B207E1F70E94D10903 +:100B10000C9408250C940000FF93EF93E0913801AA +:100B2000F0913901309709F00995EF91FF910895FF +:100B3000FC018591803011F0EFDFFBCF0895FF2796 +:100B4000E0E230E247FF0CC0419597FF09C0EDE2BB +:100B50006095709580959095611D711D811D911D09 +:100B600027FF02C0219530E350E2AA27660F771FC6 +:100B7000881F991FAA1FA41710F0A41B63955A95EC +:100B8000A9F7AA3008F0A95FA05DAF93F3956115AE +:100B900071058105910541F7ED3211F4EF93F3955D +:100BA000F21718F43F93F395FBCF8F91B5DFFA95C9 +:100BB000E1F70895E991F9918591803021F085322E +:100BC00019F0AADFF9CF089520E0E8945591553245 +:100BD000C1F3503311F4689455915A3348F450538B +:100BE00090F3220F022E220F220F200D250FF4CF9B +:100BF0000EF4219589919991533619F3533729F1C0 +:100C0000533559F1BC0188279927E8945C3621F4C3 +:100C10008991999168945591543639F446EF7EF054 +:100C200077FF0DC08FEF9FEF0AC055374AE039F0CC +:100C3000583540E121F0523642E009F00895FF9323 +:100C4000EF937DDFEF91FF91B7CFFF93EF93FC011F +:100C500081918030B9F360DFFBCFFF93EF9368DFC2 +:100C6000F1CFDF93CF93CDB7DEB72596A3DFCF913A +:100C7000DF91089584B18F6184B93E98469A3F9A76 +:100C80008AB1806F8AB95F9A479884B1806684B9C7 +:100C900085B1806685B9EAE4F1E01192119281E0B4 +:100CA000EA35F807D1F7EAE3F1E01192119281E019 +:100CB000EA34F807D1F78AE491E090935D018093DC +:100CC0005C018AE391E090935B0180935A0108955F +:100CD000AF92BF92DF92EF92FF920F931F93CF9349 +:100CE000DF9380915A0190915B0120915C013091DA +:100CF0005D0130935B0120935A0190935D018093D5 +:100D00005C0100E010E0C1E0D0E085B1982F907E5A +:100D100003FF02C020E101C028E0802F8770892BEB +:100D2000822B85B9BE01002E02C0660F771F0A9480 +:100D3000E2F75B01A094B09440E050E08BB18F707B +:100D400080689A0194E0220F331F9A95E1F7822B75 +:100D50008BB92AE02A95F1F700C0CA01880F991FC4 +:100D6000A0915A01B0915B01A80FB91F2D913C9140 +:100D700026233723232B09F0479AE5E3EA95F1F779 +:100D80000000D6B45F98FAE0FA95F1F700C0A091A0 +:100D90005C01B0915D017D01E80EF91EF701369B03 +:100DA00005C0208131812A213B2104C0208131816D +:100DB000262B372B3183208326B5ED2CF12C2D15D6 +:100DC00018F026B530E004C026B530E021503F4F82 +:100DD0002E193F092630310568F020915A013091D3 +:100DE0005B01280F391FF90120813181A80FB91F3C +:100DF0002D933C93FAE1FA95F1F700C047985F9A7A +:100E00008BE291E00197F1F700C000004F5F5F4F68 +:100E10004830510509F092CFA0915C01B0915D017D +:100E2000E0915A01F0915B0150962D913C915197C0 +:100E3000808991892817390751F00E94491C6093D5 +:100E40005E0170935F0180936001909361010F5F79 +:100E50001F4F0031110509F058CF81E0DF91CF918C +:100E60001F910F91FF90EF90DF90BF90AF9008958A +:100E700020915C0190915D01E22FF92FE80FF11DA7 +:100E8000E80FF11D80819181089581FF02C02E98A5 +:100E900008952E9A08958091860108959FB7F89439 +:100EA000109265019FBF90911902943009F057C0CC +:100EB0009091E9009F703091EC00232F217030FD5C +:100EC00020E8922B24E02093E9002091EB0020FF02 +:100ED00043C02091EE0027FF3FC0209162012223F2 +:100EE00021F02091E80025FF37C01092620126E032 +:100EF0003091E80035FD15C030911902343061F5AC +:100F00003091EB0035FD28C0215021F481E0809321 +:100F1000620122C0EFE9FFE03197F1F700C0000065 +:100F2000E7CF8093F1008091E80085FD0AC08091B1 +:100F3000E80080FFFCCF8091E8008E778093E80086 +:100F400006C08FB7F89421E0209365018FBF9F7092 +:100F50009093E90080E008959F709093E9008FEFEF +:100F60000895CF93DF9300D01F92CDB7DEB79C01D9 +:100F700080911902843019F593E099833B832A8389 +:100F80009093E9008FEF9091E800815095FD06C0A5 +:100F900095ED9A95F1F700008111F5CF8091E80069 +:100FA00085FF0DC040E050E063E070E0CE010196A7 +:100FB0000E94930A8091E8008E778093E8000F905A +:100FC0000F900F90DF91CF910895CF93DF9300D0D2 +:100FD0001F92CDB7DEB720911902243021F522E00F +:100FE00029839B838A8383E08093E9008FEF90912C +:100FF000E800815095FD06C095ED9A95F1F7000047 +:101000008111F5CF8091E80085FF0DC040E050E0F0 +:1010100063E070E0CE0101960E94930A8091E8009F +:101020008E778093E8000F900F900F90DF91CF9113 +:101030000895209119022430F1F422E02093E90070 +:101040002FEF3091E800215035FD06C035ED3A957F +:10105000F1F700002111F5CF2091E80025FF0BC02A +:1010600040E050E065E070E00E94930A8091E80063 +:101070008E778093E8000895CF93DF932091190233 +:10108000243009F048C0EC0180910A018823E1F086 +:1010900080910B018823C1F085E08093E9008FEFF8 +:1010A0009091E800815095FD06C095E19A95F1F781 +:1010B00000008111F5CF8091E80085FF2CC040E051 +:1010C00050E060E270E017C081E08093E9008FEFAC +:1010D0009091E800815095FD06C095ED9A95F1F745 +:1010E00000008111F5CF8091E80085FF14C040E039 +:1010F00050E068E070E0CE010E94930A8091E80021 +:101100008E778093E80080E2FE01A6E6B1E00190D0 +:101110000D928A95E1F7DF91CF9108958EE891E0E5 +:101120000E94980580911802811109C00E94280C24 +:101130000E94850C8091E20084608093E200089513 +:101140008AE891E00E949805109218020895089587 +:10115000209163012F5F822F62E30E94CE249923A6 +:1011600019F0209363010895109263018091650145 +:10117000882371F180911902843041F58091E90052 +:101180008F702091EC00922F917020FD90E8892BB8 +:1011900094E09093E9009091EB0090FF14C090913F +:1011A000EE0097FF10C09091E80095FF03C01092E9 +:1011B000F100F9CF9091E80090FF05C09091E80010 +:1011C0009E779093E8008F708093E90010926501FC +:1011D000089542E061EC81E00E94A20B42E061ECE4 +:1011E00082E00E94A20B42E061EC83E00E94A20B2D +:1011F00042E261EC84E00E94A20B42E261EC85E0F5 +:101200000C94A20B80911B02833009F455C030F47A +:10121000813071F0823009F48EC008958A3009F46B +:101220007AC08B3009F460C0893009F09CC020C0BE +:1012300080911A02813A09F096C08091E800877F78 +:101240008093E80080911E0290911F02892B21F467 +:1012500060E286E691E003C060E080E090E070E04C +:101260000E94DE0A8091E8008B778093E800089561 +:1012700080911A02813209F076C080911E0290910D +:101280001F02009719F0049709F06DC08091E800E3 +:10129000877F8093E8008091E80082FD05C08091FF +:1012A00019028111F8CF5FC08091F100809386010F +:1012B0008091E8008B7753C080911A02813A09F03F +:1012C00052C080911E0290911F02892B09F04BC0E1 +:1012D0008091E800877F8093E8008091E80080FF9C +:1012E000FCCF80910A0136C080911A028132D9F573 +:1012F00080911E0290911F02892BA9F58091E80030 +:10130000877F8093E8000E94D70B80911C02809316 +:101310000A010C94FD1480911A02813221F580910A +:10132000E800877F8093E8000E94D70B80911D0220 +:1013300080938701089580911A02813AA1F48091E7 +:10134000E800877F8093E8008091E80080FFFCCF71 +:10135000809187018093F1008091E8008E778093DF +:10136000E8000C94D70B08950895089580918601A4 +:10137000809364011092860180E00E9445070E94DC +:101380009E100C94FD140C94B6090E94C91B809108 +:101390001702882329F00E94F21B81110C947D0A08 +:1013A000089584B7877F84BF0FB6F894A89580917D +:1013B0006000886180936000109260000FBE90E032 +:1013C00080E80FB6F89480936100909361000FBE9F +:1013D0008EE497E00E94801B82E891E00E949805CD +:1013E0000E94B4090E94CB0F0E94280C0E94850C19 +:1013F0008091E20084608093E200789480911902E9 +:101400008430E1F781E791E00E9498050E94CD0FBA +:1014100080E091E00E940A0F80E691E00E9498052A +:101420000E94B50980911902853019F40E94C509FE +:10143000F9CF0E94D10FF6CF0E94071C8091640162 +:101440008093860108950C941C0A292F332723309A +:101450003105C9F064F42130310581F022303105C5 +:1014600009F043C08DE890E020ED31E042C0213228 +:101470003105F1F02232310541F137C082E190E0CF +:101480002DE532E036C099278130910541F0823058 +:10149000910541F0892B49F5ECECF1E005C0E0EC59 +:1014A000F1E002C0E2E9F1E0849190E09F0121C007 +:1014B0006530D8F4E62FF0E0EE0FFF1FED5DFE4F34 +:1014C0002081318189E090E014C0653070F470E0D3 +:1014D000FB01EE0FFF1FE75EFE4F20813181FB0114 +:1014E000EC5EFE4F808190E004C080E090E020E060 +:1014F00030E0FA0131832083089580E189BD82E1E3 +:1015000089BD09B400FEFDCF8091D8008F7D809306 +:10151000D8008091E00082608093E0008091E0003C +:1015200081FDFCCF0895CF92DF92EF92FF920F934F +:101530001F93CF93DF93EC018B016A010E94F60B9E +:10154000811133C0C114D10439F0F6018081918139 +:10155000081B190BC80FD91FE12CF12C011511051F +:1015600019F18091E80085FD16C08091E8008E7722 +:101570008093E800C114D10449F0F6018081918183 +:10158000E80EF91EF182E08285E00FC00E94F60BA2 +:10159000882321F30AC089918093F1000150110939 +:1015A000FFEFEF1AFF0ADACF80E0DF91CF911F91B2 +:1015B0000F91FF90EF90DF90CF900895209120023F +:1015C000309121022617370748F06115710539F46B +:1015D0002091E8002E772093E80001C0B90140E097 +:1015E00061157105A9F120911902222309F443C064 +:1015F000253009F442C02091E80023FD40C020912D +:10160000E80022FD32C02091E80020FFE9CF4091A0 +:10161000F3002091F20030E0342BFC01CF01611582 +:10162000710559F02830310540F481918093F10023 +:10163000615071092F5F3F4FF1CF41E028303105F4 +:1016400009F040E02091E8002E772093E800C8CF11 +:101650004111C9CF0AC080911902882361F08530F9 +:1016600061F08091E80083FD0AC08091E80082FF6C +:10167000F2CF80E0089582E0089583E0089581E04C +:10168000089520912002309121022617370748F053 +:101690006115710539F42091E8002E772093E80058 +:1016A00001C0B901FC0120E06115710591F1809143 +:1016B0001902882309F440C0853009F43FC08091A5 +:1016C000E80083FD3DC08091E80082FD2FC080913D +:1016D000E80080FFE9CF2091F3008091F20090E0D4 +:1016E000922B6115710559F08830910540F42491D1 +:1016F0002093F1003196615071090196F2CF21E0FB +:10170000089709F020E08091E8008E778093E80048 +:10171000CBCF2111CCCF0AC080911902882361F070 +:10172000853061F08091E80083FD0AC08091E80077 +:1017300082FFF2CF80E0089582E0089583E008956B +:1017400081E00895982F973058F59093E900981705 +:1017500039F07091EC002091ED005091F00003C041 +:10176000242F762F50E021FF19C03091EB003E7FEF +:101770003093EB003091ED003D7F3093ED003091E0 +:10178000EB0031603093EB007093EC002093ED00A0 +:101790005093F0002091EE0027FF07C09F5FD3CF4A +:1017A0008F708093E90081E0089580E00895809132 +:1017B0001A0287FF11C08091E80082FD05C0809168 +:1017C00019028111F8CF11C08091E8008B770BC00E +:1017D00080911902882349F08091E80080FFF8CFBA +:1017E0008091E8008E778093E80008952091E400CE +:1017F0003091E50095E64091EC00842F817040FF28 +:1018000022C08091E80080FD1CC0809119028823CD +:1018100091F0853091F08091EB0085FD10C04091F2 +:10182000E4005091E5004217530729F39A019150C3 +:1018300011F784E0089582E0089583E0089581E03F +:10184000089580E008954091E80042FFDECF0895BA +:101850000E94960C0E949E0CE0EEF0E08081816078 +:101860008083E8EDF0E080818F77808319BCA7ED5D +:10187000B0E08C918E7F8C9380818F7E80831092DC +:10188000180208950F931F93CF93DF930E94960C35 +:101890000E949E0CC8EDD0E088818F778883888174 +:1018A0008068888388818F7D888319BC1092190293 +:1018B00010921502109217021092160200EE10E01C +:1018C000F80180818B7F808388818160888342E0FA +:1018D00060E080E00E94A20BE1EEF0E080818E7F6C +:1018E0008083E2EEF0E08081816080838081886087 +:1018F0008083F80180818E7F8083888180618883E6 +:10190000DF91CF911F910F910895E8EDF0E0808174 +:101910008F7E8083E7EDF0E080818160808384E0CA +:1019200082BF81E0809318020C94420CE8EDF0E055 +:1019300080818E7F80831092E20008951092DA00F9 +:101940001092E10008951F920F920FB60F9211248A +:101950002F933F934F935F936F937F938F939F93B7 +:10196000AF93BF93EF93FF938091E10082FF0BC091 +:101970008091E20082FF07C08091E1008B7F80931D +:10198000E1000E94A8088091DA0080FF1FC08091CA +:10199000D80080FF1BC08091DA008E7F8093DA0030 +:1019A0008091D90080FF0DC080E189BD82E189BDB1 +:1019B00009B400FEFDCF81E0809319020E948E08D9 +:1019C00005C019BC109219020E94A0088091E10084 +:1019D00080FF19C08091E20080FF15C08091E20075 +:1019E0008E7F8093E2008091E20080618093E2002C +:1019F0008091D80080628093D80019BC85E08093E4 +:101A000019020E94C3098091E10084FF30C08091D7 +:101A1000E20084FF2CC080E189BD82E189BD09B468 +:101A200000FEFDCF8091D8008F7D8093D8008091FB +:101A3000E1008F7E8093E1008091E2008F7E8093B1 +:101A4000E2008091E20081608093E20080911502C3 +:101A5000882311F084E007C08091E30087FD02C075 +:101A600081E001C083E0809319020E94230A8091E3 +:101A7000E10083FF29C08091E20083FF25C08091AF +:101A8000E100877F8093E10082E080931902109249 +:101A900015028091E1008E7F8093E1008091E20049 +:101AA0008E7F8093E2008091E20080618093E2006B +:101AB00042E060E080E00E94A20B8091F00088602C +:101AC0008093F0000E94A708FF91EF91BF91AF9122 +:101AD0009F918F917F916F915F914F913F912F9146 +:101AE0000F900FBE0F901F9018951F920F920FB678 +:101AF0000F9211242F933F934F935F936F937F9394 +:101B00008F939F93AF93BF93CF93DF93EF93FF9305 +:101B1000C091E900CF708091EC00D82FD17080FD8A +:101B2000D0E81092E9008091F000877F8093F00068 +:101B300078940E94B90D1092E9008091F0008860BD +:101B40008093F000CD2BCF70C093E900FF91EF910F +:101B5000DF91CF91BF91AF919F918F917F916F91C5 +:101B60005F914F913F912F910F900FBE0F901F905B +:101B700018951F93CF93DF93CDB7DEB7AA970FB613 +:101B8000F894DEBF0FBECDBFEAE1F2E088E08E0F31 +:101B90009091F10091938E13FBCF0E9402098091E6 +:101BA000E80083FF1FC180911A0290911B02492F08 +:101BB00050E04A30510508F015C1FA01EA5AFF4FCA +:101BC0000C94EE24803881F0823809F00BC18091AA +:101BD0001E028F708093E9008091EB0085FB8827BF +:101BE00080F91092E90006C08091160290911702C8 +:101BF000911182609091E800977F9093E800809324 +:101C0000F1001092F100C8C0282F2D7F09F0EAC022 +:101C1000882319F0823061F0E5C080911C02813088 +:101C200009F0E0C0933009F080E0809317022BC0E8 +:101C300080911C02811127C080911E028F7009F4CF +:101C4000D1C08093E9002091EB0020FF1CC09330AD +:101C500021F48091EB00806214C09091EB009061C0 +:101C60009093EB0021E030E0A90102C0440F551F22 +:101C70008A95E2F74093EA001092EA008091EB0027 +:101C800088608093EB001092E9008091E800877FE4 +:101C900086C08111A7C010911C021F778091E300BC +:101CA0008078812B8093E3008091E800877F809388 +:101CB000E8000E94D70B8091E80080FFFCCF809164 +:101CC000E30080688093E300111102C082E001C04C +:101CD00083E08093190286C08058823008F082C069 +:101CE00080911C0290911D028C3D53E0950779F57F +:101CF00083E08A838AE289834FB7F894DE011396E2 +:101D000020E03EE051E2E32FF0E050935700E491F1 +:101D100020FF03C0E295EF703F5FEF708E2F90E0E1 +:101D2000EA3010F0C79601C0C0968D939D932F5F47 +:101D3000243149F74FBF8091E800877F8093E80006 +:101D40006AE270E0CE0101960E94DE0A14C0AE0184 +:101D50004F5F5F4F60911E020E94250ABC01892BD4 +:101D600009F440C09091E800977F9093E800898142 +:101D70009A810E94410B8091E8008B778093E80064 +:101D800031C0803879F58091E800877F8093E80042 +:101D9000809115028093F1008091E8008E77809306 +:101DA000E8000E94D70B1EC081111CC090911C023C +:101DB0009230C0F48091E800877F8093E800909390 +:101DC00015020E94D70B80911502811106C08091E7 +:101DD000E30087FD02C081E001C084E08093190226 +:101DE0000E94E9088091E80083FF0AC08091E80022 +:101DF000877F8093E8008091EB0080628093EB0006 +:101E0000AA960FB6F894DEBF0FBECDBFDF91CF917B +:101E10001F91089590938D0180938C010895E09116 +:101E20008C01F0918D01309721F00190F081E02D2F +:101E3000099480E00895EF92FF920F931F93CF9340 +:101E4000DF93E0918C01F0918D013097B1F18C011D +:101E50000280F381E02D09958091040282FF2DC05C +:101E600080FF04C083EB93E00E949805E80110E234 +:101E70008DEAE82E83E0F82E8091040280FF0BC0EB +:101E800088811F928F93FF92EF920E9431060F90EC +:101E90000F900F900F90115021961111EDCF80915E +:101EA000040280FF0AC08BEA93E0DF91CF911F917B +:101EB0000F91FF90EF900C949805DF91CF911F91B7 +:101EC0000F91FF90EF900895E0918C01F0918D01BA +:101ED000309721F00480F581E02D09940895CF9387 +:101EE000DF93EC0180918A0190918B01C817D9078B +:101EF00009F1D0938B01C0938A01E0918C01F0919C +:101F00008D013097B9F00680F781E02DCE0109955B +:101F10008091040282FF0EC080FF0CC0DF93CF933C +:101F20008DE993E09F938F930E9431060F900F905D +:101F30000F900F90DF91CF910895CF93DF93EC0135 +:101F40008091880190918901C817D90709F1D09330 +:101F50008901C0938801E0918C01F0918D01309747 +:101F6000B9F00084F185E02DCE010995809104023D +:101F700082FF0EC080FF0CC0DF93CF938DE893E00B +:101F80009F938F930E9431060F900F900F900F90A8 +:101F9000DF91CF9108950C949F100E94341C0C94F3 +:101FA0003A065F926F927F928F929F92AF92BF920A +:101FB000CF92DF92EF92FF920F931F93CF93DF9315 +:101FC00000D000D01F92CDB7DEB70E9468060FE8A0 +:101FD00011E0512C88248394912C852D0E94380780 +:101FE0005C01F801C080D180C826D926C114D10473 +:101FF00039F453940E5F1F4FF8E05F12EECF3FC0ED +:102000008091040281FD0E94A010E12CF12C34018A +:102010000E2C02C0660C771C0A94E2F7C3018C21D7 +:102020009D21892B21F1E9825A8221E0C3018A2175 +:102030009B21892B09F420E02B830E943D1C8160A9 +:10204000782F9D838C8349815A816B818D810E9479 +:10205000D61049815A816B817C818D810E94B61B8B +:10206000F801808191816826792671826082FFEF74 +:10207000EF1AFF0A80E1E816F10449F6BACF8FEFB4 +:1020800089838A831B820E943D1C8160782F9D83F7 +:102090008C8349815A816B818D810E94D6100E9468 +:1020A000B51B0E94FE1E10918E010E940F0F181783 +:1020B00071F10E940F0F80938E019091040292FFA4 +:1020C0000EC090FF0CC01F928F938EEB93E09F93F6 +:1020D0008F930E9431060F900F900F900F90809178 +:1020E0008E010F900F900F900F900F90DF91CF9176 +:1020F0001F910F91FF90EF90DF90CF90BF90AF9026 +:102100009F908F907F906F905F900C94C71B0F9063 +:102110000F900F900F900F90DF91CF911F910F9123 +:10212000FF90EF90DF90CF90BF90AF909F908F90F7 +:102130007F906F905F9008950C94450708950895DF +:10214000EF92FF920F931F93CF93DF9388ED93E06D +:102150000E949805C0E0D0E08DE2E82E81E0F82EE4 +:1021600009EC13E08C2F0E9438070E949B1BFF9202 +:10217000EF929F938F93DF93CF931F930F930E94C0 +:10218000310621968DB79EB708960FB6F8949EBF7C +:102190000FBE8DBFC830D10529F7DF91CF911F91B8 +:1021A0000F91FF90EF90089508950895CF93DF93D6 +:1021B000CDB7DEB72B970FB6F894DEBF0FBECDBFFD +:1021C000942F4F83252F588769877A878B874A8575 +:1021D0005B85452B21F02F3F09F59F3FF9F4DE0188 +:1021E000119686E0FD0111928A95E9F785E0FE01DE +:1021F000379601900D928A95E1F749815A816B815A +:102200007C818D819E810E94B1172B960FB6F89428 +:10221000DEBF0FBECDBFDF91CF9108954F815885AE +:1022200069857A858B850E94B61BD9CFCF93882389 +:1022300009F465C0C82F8CEF8C0F813A20F080E53F +:102240008C0F8E3248F48C2F0E944822811157C087 +:102250008C2F0E943C1A0CC080E28C0F883058F4FE +:10226000C77081E001C0880FCA95EAF70E94E71A9B +:10227000CF910C942B1B8BE58C0F833078F4C53AEF +:1022800029F0C63A31F083E890E005C081E890E09B +:1022900002C082E890E0CF910C946F0F88E58C0F1C +:1022A000853168F5C83A89F0C93A91F0CA3A99F08F +:1022B000CB3AA1F0CC3AA9F0CD3AB1F0CE3AB9F090 +:1022C000CF3AC1F080E090E017C082EE90E014C0F9 +:1022D00089EE90E011C08AEE90E00EC085EB90E0B0 +:1022E0000BC086EB90E008C083EB90E005C084EB68 +:1022F00090E002C087EB90E0CF910C949D0FCF91BE +:102300000895882349F19CEF980F913A20F090E5C9 +:10231000980F9E3218F40E948F1A0DC090E2980F09 +:10232000983058F4877091E001C0990F8A95EAF7C8 +:10233000892F0E94ED1A0C942B1B9BE5980F93306C +:1023400020F480E090E00C946F0F885A853120F4DF +:1023500080E090E00C949D0F0895882321F00E9466 +:10236000E71A0C942B1B0895882321F00E94ED1A84 +:102370000C942B1B0895BF92CF92DF92EF92FF92A5 +:102380000F931F93CF93DF9300D000D000D0CDB731 +:10239000DEB725E0FC01DE01119601900D922A9531 +:1023A000E1F7FC0140813181F280258122952F7077 +:1023B00063817481672B09F4FEC23F3F19F44F3FDC +:1023C00009F4F9C26C0149833A8389819A812E8389 +:1023D0000E94FB19182FB92E0E94FA190E940A199F +:1023E000EB2DE295EF70F0E0E05AFF4F2E810C9458 +:1023F000EE248B2D807F9B2D9F70092F882311F059 +:102400000295007FFF2049F0002309F481C2802F4C +:102410000E94FA1A0E942B1B7BC2812F0E948111FD +:10242000002309F4C8C2802F0E94001B26960FB615 +:10243000F894DEBF0FBECDBFDF91CF911F910F91FA +:10244000FF90EF90DF90CF90BF900C942B1B8B2DC3 +:10245000807F9B2D9F70092F803211F00295007FA5 +:10246000112319F0113009F12AC0FF20B1F0802F9B +:10247000222351F1213041F526960FB6F894DEBFA4 +:102480000FBECDBFDF91CF911F910F91FF90EF90C5 +:10249000DF90CF90BF900C940A1B222319F02130BB +:1024A00009F489C20E94131B2DC0FF20F1F02630D1 +:1024B00008F081C20E94E41A802329F023C0FF2083 +:1024C000F9F0211116C0802F26960FB6F894DEBFC2 +:1024D0000FBECDBFDF91CF911F910F91FF90EF9075 +:1024E000DF90CF90BF900C94AD11253008F063C2FF +:1024F00009C0F601858180FF0BC28F708583E3CF11 +:1025000021111BC2802F82C12B2D26952695237069 +:1025100030E02115310521F021303105D1F04BC2D9 +:10252000FF2021F0812F9B2D937002C080E090E06E +:1025300026960FB6F894DEBF0FBECDBFDF91CF91C8 +:102540001F910F91FF90EF90DF90CF90BF900C9470 +:102550006F0FFF2021F0812F9B2D937002C080E030 +:1025600090E026960FB6F894DEBF0FBECDBFDF9188 +:10257000CF911F910F91FF90EF90DF90CF90BF9080 +:102580000C949D0F812FFF2019F00E94841D02C022 +:102590000E94EC1D26960FB6F894DEBF0FBECDBF8D +:1025A000DF91CF911F910F91FF90EF90DF90CF902F +:1025B000BF900C94711E8B2D837009F07BC0F110BD +:1025C000FAC1812F829586958770880F880F912F89 +:1025D0009F70C92ED12CE12CF12C082E04C0CC0CFC +:1025E000DD1CEE1CFF1C0A94D2F714FF12C04FE052 +:1025F00050E060E070E004C0440F551F661F771F75 +:102600008A95D2F7CB01BA01609570958095909527 +:1026100003C060E070E0CB012B2D2695269523703A +:10262000422F50E042305105D9F04330510569F155 +:102630006C297D298E299F294130510551F126961B +:102640000FB6F894DEBF0FBECDBFDF91CF911F91C3 +:102650000F91FF90EF90DF90CF90BF900C941F19D7 +:102660006C297D298E299F2926960FB6F894DEBF06 +:102670000FBECDBFDF91CF911F910F91FF90EF90D3 +:10268000DF90CF90BF900C9431190E941F19C701A1 +:10269000B60126960FB6F894DEBF0FBECDBFDF9110 +:1026A000CF911F910F91FF90EF90DF90CF90BF904F +:1026B0000C940D19FF2019F08B2D817001C08695A7 +:1026C000882309F478C1812F829586958770880FB9 +:1026D000880F912F9F70C92ED12CE12CF12C082E40 +:1026E00004C0CC0CDD1CEE1CFF1C0A94D2F714FFB6 +:1026F00012C04FE050E060E070E004C0440F551F8E +:10270000661F771F8A95D2F7CB01BA016095709545 +:102710008095909503C060E070E0CB012B2D26954D +:1027200026952370422F50E042305105D9F04330B6 +:10273000510569F16C297D298E299F294130510568 +:1027400051F126960FB6F894DEBF0FBECDBFDF91D4 +:10275000CF911F910F91FF90EF90DF90CF90BF909E +:102760000C94D6196C297D298E299F2926960FB69F +:10277000F894DEBF0FBECDBFDF91CF911F910F91B7 +:10278000FF90EF90DF90CF90BF900C94E8190E94DB +:10279000D619C701B60126960FB6F894DEBF0FBE54 +:1027A000CDBFDF91CF911F910F91FF90EF90DF9000 +:1027B000CF90BF900C94C419103FC9F128F480E465 +:1027C000810F803250F09FC0123F09F461C008F4BD +:1027D0004AC0133F09F471C096C0012F00718B2DC0 +:1027E0008F71FF2051F00E945D19812F002319F095 +:1027F0008295807F69CE8F7067CE0E947E19812F6F +:10280000002319F08295807F01C08F7026960FB645 +:10281000F894DEBF0FBECDBFDF91CF911F910F9116 +:10282000FF90EF90DF90CF90BF900C94B411FF20F9 +:10283000B1F0253008F0BFC08B2D8F7126960FB6F2 +:10284000F894DEBF0FBECDBFDF91CF911F910F91E6 +:10285000FF90EF90DF90CF90BF900C94A31926309B +:1028600008F0A9C0E9CFFF20A9F08B2D8F71269623 +:102870000FB6F894DEBF0FBECDBFDF91CF911F9191 +:102880000F91FF90EF90DF90CF90BF900C945D1967 +:10289000FF2059F38B2D8F7126960FB6F894DEBF6B +:1028A0000FBECDBFDF91CF911F910F91FF90EF90A1 +:1028B000DF90CF90BF900C947E19FF2099F08B2D64 +:1028C0008F7126960FB6F894DEBF0FBECDBFDF9195 +:1028D000CF911F910F91FF90EF90DF90CF90BF901D +:1028E0000C94481926960FB6F894DEBF0FBECDBFE4 +:1028F000DF91CF911F910F91FF90EF90DF90CF90DC +:10290000BF900C944319FF20A9F0222309F4ADCF06 +:10291000812F26960FB6F894DEBF0FBECDBFDF9194 +:10292000CF911F910F91FF90EF90DF90CF90BF90CC +:102930000C941611222309F4ADCF812F26960FB6E1 +:10294000F894DEBF0FBECDBFDF91CF911F910F91E5 +:10295000FF90EF90DF90CF90BF900C9481114B2DA2 +:102960004F70612FC6010E94FE1C26960FB6F89488 +:10297000DEBF0FBECDBFDF91CF911F910F91FF90B2 +:10298000EF90DF90CF90BF900C9455184B2D4F7067 +:10299000612FC60126960FB6F894DEBF0FBECDBFDD +:1029A000DF91CF911F910F91FF90EF90DF90CF902B +:1029B000BF900C94011D26960FB6F894DEBF0FBE93 +:1029C000CDBFDF91CF911F910F91FF90EF90DF90DE +:1029D000CF90BF9008950E94071B0E94D61A0E94B4 +:1029E0002B1B0E94A31F0E94711E80E090E00E949A +:1029F0006F0F80E090E00C949D0F0E94F71A0C94EA +:102A0000EB140E94FB19292F22952F7030E02C30F7 +:102A100031054CF42A303105C4F4225031092230FA +:102A2000310540F023C02C303105D1F02F30310575 +:102A3000B9F01CC0853A28F48430B0F4823028F410 +:102A400013C090E2980F983078F0883E30F4803EC2 +:102A500058F48450813A50F407C0803F39F404C0E0 +:102A600093FB882780F9089581E0089580E0089518 +:102A7000CF93DF9300D000D01F92CDB7DEB70F9079 +:102A80000F900F900F900F90DF91CF910895CF93FB +:102A9000DF9300D000D000D0CDB7DEB726960FB6BA +:102AA000F894DEBF0FBECDBFDF91CF9108951F9385 +:102AB000CF93DF93C0919F0116E08091A001C817CA +:102AC00099F0D0E01C9FF0011D9FF00D1124EF55EF +:102AD000FE4F4081518162817381848195810E9482 +:102AE00047152196C770E9CFDF91CF911F910895C7 +:102AF0004091D1015091D2016091D3017091D401E4 +:102B00008091D5019091D6010C9447158091D60102 +:102B100082958F7009F054C08091D301882309F405 +:102B20004FC080919F01A091A0016091D10170914F +:102B3000D2014091D4015091D501B6E08A1709F431 +:102B40003FC090E041155105C1F17F3F11F46F3F47 +:102B5000A1F1B89FF001B99FF00D1124EF55FE4F80 +:102B6000218172132AC02081621327C02281211182 +:102B700024C0238134812417350710F421503109F2 +:102B8000241B350B2C323140C0F42091D6012F701C +:102B900020612093D60126E0289FF001299FF00DA7 +:102BA0001124EA55FE4F80818F708061808381ED12 +:102BB00091E00E94BB110C94571501968770BECF0F +:102BC0000895CF92DF92EF92FF920F931F93CF93CE +:102BD000DF93CDB7DEB762970FB6F894DEBF0FBEB6 +:102BE000CDBF8C0185E0F801DE011D9601900D92AC +:102BF0008A95E1F7D8014C9111965C911197129644 +:102C00006C9112971396CD90DC9014973091D1016E +:102C10007091D2018091D4019091D501009709F46F +:102C200073C17F3F19F43F3F09F46EC1E090D301B7 +:102C3000EE2009F4C5C02091D601C816D90650F07F +:102C4000F601E81BF90BCF01FF24F3948C3291407D +:102C5000C8F009C0809590958C0D9D1DFF24F394BC +:102C60008C32914078F0F12C207F09F0C6C07C2D89 +:102C7000D98AC88A89890E94381581ED91E00E941D +:102C8000BB11B1C0822F807F09F045C0751313C0FE +:102C9000341311C061110FC02F7020612093D60131 +:102CA0000E94781581ED91E00E94BB118091D601C0 +:102CB000F80185832EC0CD2819F15F3F11F44F3FF5 +:102CC000F9F0F62E61111CC080919F012091A001A6 +:102CD00036E0821709F45BC090E0389FF001399F1D +:102CE000F00D1124EF55FE4F7181571306C070810E +:102CF000471303C07281711103C001968770E9CF39 +:102D0000F62E662309F41DC18091D601816080935F +:102D1000D601F12C16C1751309C0341307C0611117 +:102D200005C08091D601F8018583C8C04D875E87B4 +:102D30008D859E856A8B0E9401156A898823E1F141 +:102D40006623D1F12091D601822F82958F7090E079 +:102D5000029774F08091D1019091D20198878F836E +:102D60001986DB86CA862C87CE0107960E94BB1186 +:102D700086E0F801A1EDB1E001900D928A95E1F7AE +:102D80000E9486150E947815FF24F394DAC04D87BF +:102D90005E878D859E850E94FB19292F22952F70B5 +:102DA00030E0223031050CF0BFC09F7009F0B9C08F +:102DB000805E883008F4C5C0C8010E94BB11E4CF12 +:102DC000C816D90608F453C0F601E81BF90BCF0169 +:102DD0008C32914008F453C0F12C7C2DD98AC88ADA +:102DE00089890E943815E1EDF1E086E0DF011D924E +:102DF0008A95E9F70E947815A4C0751314C034139E +:102E000012C0611110C08091D601F8018583C801FC +:102E10000E94BB1186E0E1EDF1E0DF011D928A9591 +:102E2000E9F7FE2C8EC04D875E878D859E856A8B67 +:102E30000E9401156A89882309F4BECF662309F42C +:102E4000BBCF2091D601822F82958F7090E00297A0 +:102E50000CF48ECF8091D1019091D2019A83898315 +:102E60001B82DD82CC822E83CE0101967FCF80959E +:102E700090958C0D9D1D8C32914008F0ADCFF62EB3 +:102E8000662309F499CF75132EC034132CC02091FA +:102E9000D60120FD1FC0822F82958F70D9F0D801F6 +:102EA00015962C9315978F3049F08F5F982F929538 +:102EB000907F822F8F70892B15968C93C8010E946A +:102EC000BB1186E0F801A1EDB1E001900D928A9569 +:102ED000E1F790CF86E0F801A1EDB1E001900D920D +:102EE0008A95E1F72EC04D875E878D859E850E946D +:102EF000011581113DCF8091D60181608093D6016B +:102F0000C8010E94BB111DC0662309F455CF4D872F +:102F10005E878D859E850E940115882309F44CCF1C +:102F200027CF811145CF0DC0243031050CF044CF9F +:102F30009F7009F43DCFD80115969C91907F09F0C0 +:102F400037CF8F2D62960FB6F894DEBF0FBECDBF80 +:102F5000DF91CF911F910F91FF90EF90DF90CF9075 +:102F600008951F93CF93DF93CDB7DEB72C970FB69D +:102F7000F894DEBF0FBECDBF4F83588769877A872D +:102F80008B879C87CE0107960E94E115882369F004 +:102F90008F8198852A853B85232BF1F19F3F09F08E +:102FA00063C08F3F09F060C037C086E0FE013796EE +:102FB000DE01119601900D928A95E1F76F81788577 +:102FC000EA85FB85309741F17F3F11F46F3F21F196 +:102FD0002091A00130E0C9010196877099274091A6 +:102FE0009F0150E08417950709F447C069837A83ED +:102FF000FD83EC8396E0929FD001939FB00D112446 +:10300000AF55BE4FFE01319601900D929A95E1F7B2 +:103010008093A0010E94571516E080919F01909126 +:10302000A0018917C1F1189FC00111248F559E4F2F +:103030000E94E115882379F1E0919F011E9FF00124 +:103040001124EF55FE4F408151816281738184814B +:1030500095810E94471580919F0190E001968770AD +:10306000992780939F01D9CF4F81588569857A85AB +:103070008B859C850E944715CFCF0E94FD1410922E +:10308000A00110929F01E1EDF1E086E0DF011D92C9 +:103090008A95E9F7C1CF2C960FB6F894DEBF0FBE24 +:1030A000CDBFDF91CF911F910895DF92EF92FF92F4 +:1030B0000F931F93CF93DF93FC01892B09F48AC0F0 +:1030C000E12CF12CDD24D394EF01219684918537F6 +:1030D00009F461C058F4843708F04EC0843008F019 +:1030E0006AC08130D1F0823071F174C0883709F440 +:1030F0005DC050F4863709F455C0873709F06AC0BF +:103100008E2D0E94F41A54C09CE7980F903708F057 +:1031100061C08F770E94811150C08F010E5F1F4FD9 +:10312000FE01849190E2980F983050F48770FD2D45 +:1031300001C0FF0F8A95EAF78F2F0E94FA1A14C078 +:103140000E94161113C08F010E5F1F4FFE01C49124 +:1031500080E28C0F883060F4C7708D2D01C0880F1D +:10316000CA95EAF70E94001B0E942B1BE80125C0AC +:103170008C2F0E948111FACF9F012E5F3F4FFE01DD +:10318000C491CC2369F08FE99FE00197F1F700C06B +:103190000000C150F6CF9F012E5F3F4FFE01F4901B +:1031A000E9010BC00E94E41AE82E07C00E94F71A3A +:1031B0000E942B1B02C00E9416118F2D882341F004 +:1031C000EFE9FFE03197F1F700C000008150F6CF42 +:1031D000FE017ACFDF91CF911F910F91FF90EF9079 +:1031E000DF9008956093DB017093DC018093DD0133 +:1031F0009093DE010E94C51B0C94EB146093D701E1 +:103200007093D8018093D9019093DA010E94C61B74 +:103210000C94EB1408950C94F2180F931F930091E3 +:10322000DB011091DC012091DD013091DE01602B8A +:10323000712B822B932B1F910F910C94F2180F93EB +:103240001F930091DB011091DC012091DD01309191 +:10325000DE0160237123822393231F910F910C942D +:10326000F2180F931F930091DB011091DC01209164 +:10327000DD013091DE0160277127822793271F919E +:103280000F910C94F21860E070E0CB010C94FE18E2 +:103290000F931F9341E050E060E070E08A019B01D2 +:1032A00004C0000F111F221F331F8A95D2F7C901D6 +:1032B000B8011F910F910C94FE180F931F9341E0DA +:1032C00050E060E070E004C0440F551F661F771F98 +:1032D0008A95D2F78091D7019091D801A091D90118 +:1032E000B091DA018A019B01082B192B2A2B3B2B69 +:1032F000C901B8011F910F910C94FE180F931F93F1 +:1033000041E050E060E070E004C0440F551F661FCC +:10331000771F8A95D2F7409550956095709580916A +:10332000D7019091D801A091D901B091DA018A0119 +:103330009B01082319232A233B23C901B8011F91AC +:103340000F910C94FE180F931F9341E050E060E042 +:1033500070E004C0440F551F661F771F8A95D2F78F +:103360008091D7019091D801A091D901B091DA0153 +:103370008A019B01082719272A273B27C901B80181 +:103380001F910F910C94FE180F931F930091D7017A +:103390001091D8012091D9013091DA01602B712B65 +:1033A000822B932B1F910F910C94FE180F931F9358 +:1033B0000091D7011091D8012091D9013091DA0103 +:1033C00060237123822393231F910F910C94FE1885 +:1033D0000F931F930091D7011091D8012091D9012B +:1033E0003091DA0160277127822793271F910F916F +:1033F0000C94FE180895CF92DF92EF92FF920F93F4 +:103400001F93CF93DF938C01C090DB01D090DC0140 +:10341000E090DD01F090DE014091D7015091D8019C +:103420006091D9017091DA01C42AD52AE62AF72AD7 +:10343000CFE1D0E0D701C6010C2E04C0B695A79508 +:10344000979587950A94D2F780FF07C0B8018C2F13 +:103450000E94D41C8130910531F4219758F7B801AE +:1034600080E00E94D41CDF91CF911F910F91FF90BB +:10347000EF90DF90CF90089590910A01992321F069 +:1034800090910B01911109C020910C0130910D0117 +:10349000F90132969FEF40E030C0982F96959695AF +:1034A00096959F31A0F4E0910C01F0910D01E90F88 +:1034B000F11D877021E030E0A90102C0440F551FC3 +:1034C0008A95E2F7CA019181892B818308959091B1 +:1034D000040290FF23C01F928F938CE094E09F938F +:1034E0008F930E9431060F900F900F900F900895C8 +:1034F0009F3F39F04F5F4E3141F051915813F8CF53 +:103500000DC05111F7CF942FF5CF9F3F39F0F9013E +:10351000E90FF11D97FDFA95828308950895909122 +:103520000A01992321F090910B01911109C020917A +:103530000C0130910D01F9013296205E3F4F30C0F1 +:10354000982F9695969596959F31A8F4E0910C0149 +:10355000F0910D01E90FF11D877021E030E0A90124 +:1035600002C0440F551F8A95E2F7CA0180959181E8 +:103570008923818308959091040290FF16C01F92C1 +:103580008F938EEE93E09F938F930E9431060F905E +:103590000F900F900F9008953196E217F30729F0DE +:1035A00090819813F9CF1082F7CF089581E090E0D1 +:1035B000E0910C01F0910D01E80FF91F10820196C6 +:1035C00080329105A9F708958091030208959091A2 +:1035D0000302892B80930302089580959091030242 +:1035E0008923809303020895809303020895109223 +:1035F0000302089590910202892B8093020208959C +:10360000809590910202892380930202089510927E +:10361000020208958093E1010E943D1C9093E00115 +:103620008093DF0108951092E1011092E001109261 +:10363000DF01089580910C0190910D01FC013196FC +:103640009C01205E3F4F80E0919191118F5FE217C6 +:10365000F307D1F70895E0910C01F0910D018091ED +:1036600003028083E0910C01F0910D019081809123 +:103670000202892B80838091E1018823D9F10E9485 +:103680003D1C2091DF013091E0018217930748F043 +:103690000E943D1C2091DF013091E001821B930BC1 +:1036A0000AC00E943D1C2091DF013091E00120956D +:1036B0003095820F931F8C32914070F080910402FC +:1036C00080FF08C08AE294E09F938F930E943106A6 +:1036D0000F900F900E94131BE0910C01F0910D01CF +:1036E00090818091E101892B80830E941A1B8111B6 +:1036F0000E94131B80910C0190910D010C941B0FE3 +:10370000909339018093380108958295982F9C7C7D +:10371000392F36953695282F237344E0249FC00116 +:103720001124932F982B292F2A7A2695892F857576 +:10373000880F822B08951F93CF93DF931F92CDB7ED +:10374000DEB799830E94851B182F9981892F0E94CB +:10375000851B212F30E0322F2227A901482BCA01D7 +:103760000F90DF91CF911F9108950895CF93DF932C +:1037700000D000D01F92CDB7DEB70F900F900F9002 +:103780000F900F90DF91CF910895089508950C94B4 +:103790009C1080911902843021F11092050220E4DE +:1037A00088E190E00FB6F894A895809360000FBE72 +:1037B0002093600083B7817F846083BF83B781607B +:1037C00083BF7894889583B78E7F83BF0FB6F894B4 +:1037D000A8958091600088618093600010926000DD +:1037E0000FBE0895CF930E94D4100E9468060E94D5 +:1037F000D510C0E08C2F0E943807892B29F4CF5FA9 +:10380000C830C1F780E001C081E0CF9108950E94E7 +:103810009E100C94FD141F920F920FB60F9211245C +:103820008F939F93AF93BF9380910502811113C033 +:103830008091060290910702A0910802B0910902BE +:103840004196A11DB11D8093060290930702A0939B +:103850000802B0930902BF91AF919F918F910F9091 +:103860000FBE0F901F90189582E084BD93E095BD28 +:103870009AEF97BD80936E0008952FB7F8948091CA +:10388000060290910702A0910802B09109022FBF91 +:1038900008952FB7F8946091060270910702809105 +:1038A0000802909109022FBF0895CF92DF92EF9204 +:1038B000FF920F931F932FB7F894409106025091F7 +:1038C000070260910802709109022FBF6A017B0113 +:1038D000EE24FF248C0120E030E0C016D106E20681 +:1038E000F30610F4415051099A01281B390BC90104 +:1038F0001F910F91FF90EF90DF90CF9008951F924E +:103900000F920FB60F9211248F939F93AF93BF9393 +:103910008091060290910702A0910802B0910902DD +:103920000196A11DB11D8093060290930702A093FA +:103930000802B0930902BF91AF919F918F910F90B0 +:103940000FBE0F901F9018950E94280CF8942FEF2F +:1039500087EA91E6215080409040E1F700C00000E6 +:1039600087E090EBDC018093220290932302A093E6 +:103970002402B09325029CE088E10FB6F894A89544 +:10398000809360000FBE90936000FFCF20E1929F74 +:10399000F0011124E80FF11DE052FF4F9491892F9F +:1039A0008F7092959F700895CF93C82FCB010E947E +:1039B000C61C282F30E080E1989FA0011124422BE3 +:1039C000532B4038510519F480E090E015C09770F2 +:1039D000E92FF0E088E0C89FE00DF11D112484E09C +:1039E000EE0FFF1F8A95E1F7E20FF31FEE0FFF1FA7 +:1039F000E050F84985919491CF91089580E090E04E +:103A00000895089580910C0280FF0BC06091110110 +:103A100085E0689FB0011124759567957595679548 +:103A20002BC081FF09C06091110185E0689FB00142 +:103A300011247595679520C082FF07C06091110120 +:103A400085E0689FB001112417C090910D02992361 +:103A5000D1F060911001961788F72091110185E04F +:103A6000289F90011124929FA001939F500D112433 +:103A700070E0CA010E94DA246038710540F46115D3 +:103A8000710539F002C065E070E0862F08958FE778 +:103A9000089581E0089580910C0280FF08C0609134 +:103AA0000F0170E0759567957595679521C081FF49 +:103AB00006C060910F0170E07595679519C082FF8F +:103AC00004C060910F0170E010C090910D02992325 +:103AD000C1F060910E019617A0F780910F01899FA8 +:103AE000C001112470E00E94DA246038710528F4C6 +:103AF0006115710521F0862F08958FE7089581E003 +:103B0000089561E070E0F4CF803F21F40E94021D2F +:103B1000819504C0813F29F40E94021D8093100208 +:103B20000895823F21F40E94021D819504C0833FC5 +:103B300029F40E94021D80930F020895893F19F411 +:103B40000E944B1D05C08A3F31F40E944B1D819598 +:103B50008093110208958B3F21F40E944B1D8195A3 +:103B600004C08C3F29F40E944B1D809312020895DB +:103B7000843F21F480910E02816017C0853F21F4BB +:103B800080910E02826011C0863F21F480910E0266 +:103B900084600BC0873F21F480910E02886005C0CD +:103BA000883F31F480910E02806180930E02089567 +:103BB0008D3F21F480910C0281600BC08E3F21F477 +:103BC00080910C02826005C08F3F29F480910C0225 +:103BD000846080930C020895803F39F48091100234 +:103BE00087FF6CC01092100269C0813F29F4809158 +:103BF00010021816BCF362C090910F02823F29F4A4 +:103C000097FF5CC010920F0259C0833F19F4191638 +:103C1000CCF354C0893F41F48091110218160CF086 +:103C20004DC0109211024AC08A3F29F480911102BE +:103C300087FF44C0F6CF8B3F39F48091120287FF93 +:103C40003DC0109212023AC08C3F29F480911202BA +:103C50001816BCF333C0843F21F480910E028E7F8E +:103C600017C0853F21F480910E028D7F11C0863FE1 +:103C700021F480910E028B7F0BC0873F21F480914D +:103C80000E02877F05C0883F31F480910E028F7E3F +:103C900080930E0213C08D3F21F480910C028E7F21 +:103CA0000BC08E3F21F480910C028D7F05C08F3FA9 +:103CB00029F480910C028B7F80930C0280910F027B +:103CC00081110EC08091100281110AC080911102F1 +:103CD000811106C080911202811102C010920D0262 +:103CE00008958091040283FF7EC083E694E00E94E1 +:103CF000980580910E021F928F938EE594E09F931A +:103D00008F930E9431068CE594E00E949805809183 +:103D10000F02282F082E000C330B3F938F9389E559 +:103D200094E09F938F930E94310687E594E00E9470 +:103D3000980580911002282F082E000C330B3F931A +:103D40008F9384E594E09F938F930E94310682E5E0 +:103D500094E00E94980580911102282F082E000CF3 +:103D6000330B3F938F938FE494E09F938F930E9444 +:103D700031068DE494E00E94980580911202282F6C +:103D8000082E000C330B3F938F938AE494E09F93AB +:103D90008F930E94310687E494E00E9498058091F9 +:103DA0000D021F928F9384E494E09F938F930E945F +:103DB000310682E494E00E94980580910C021F92E3 +:103DC0008F938FE394E09F938F930E9431068CE34F +:103DD00094E00E9498058DB79EB74C960FB6F89464 +:103DE0009EBF0FBE8DBF8EE092E00E94640F0E94C6 +:103DF0003D1C90930B0280930A0208951F93CF936A +:103E0000DF9380910A0290910B020E94551CAC0135 +:103E100090910D02992321F02091120130E006C00B +:103E2000209113018AE0289F900111244217530723 +:103E300008F485C080910F02C0911002D091110248 +:103E400010911202811107C0C11175C0D11173C048 +:103E5000111171C074C09F3F19F09F5F90930D02C4 +:103E6000181624F40E94021D80930F0280910F0205 +:103E700087FF05C00E94021D819580930F021C16CA +:103E800024F40E94021D809310028091100287FF8B +:103E900005C00E94021D81958093100260910F025F +:103EA000662331F1C0911002CC2311F1062E000CD3 +:103EB000770B880B990B0E94D52323E333E343E36D +:103EC0005FE30E9439240E949D2360930F026C2FB0 +:103ED000CC0F770B880B990B0E94D52323E333E398 +:103EE00043E35FE30E9439240E949D236093100204 +:103EF0001D1624F40E944B1D809311028091110223 +:103F000087FF05C00E944B1D8195809311021116F9 +:103F100024F40E944B1D809312028091120287FFAD +:103F200005C00E944B1D819580931202DF91CF91B5 +:103F30001F910C94711E9F3F09F08FCF97CFDF9197 +:103F4000CF911F910895EEE0F2E085E0DF011D9230 +:103F50008A95E9F710920D0210920C02089586E8F6 +:103F600096E00E9498051F9281E08F931F9285E052 +:103F70008F9388E396E09F938F930E9431060F9072 +:103F80000F900F900F900F900F9008958330E9F1EC +:103F900028F4813061F0823009F10895853009F408 +:103FA00062C008F449C0863009F474C00895809155 +:103FB0001301262F30E0280F311D2F3F310524F447 +:103FC000680F6093130103C08FEF809313018091FA +:103FD00013011F928F9381E795E072C080911201C7 +:103FE000262F30E0280F311D2F3F310524F4680FB4 +:103FF0006093120103C08FEF809312018091120130 +:104000001F928F938FE595E05BC080911101262F61 +:1040100030E0280F311D2F3F310524F4680F6093E5 +:10402000110103C08FEF80931101809111011F9244 +:104030008F938CE495E044C080911001262F30E0EE +:10404000280F311D2F3F310524F4680F60931001B4 +:1040500003C08FEF80931001809110011F928F9306 +:1040600087E395E02DC080910F01262F30E0280FC7 +:10407000311D2F3F310524F4680F60930F0103C0F9 +:104080008FEF80930F0180910F011F928F938EE12C +:1040900095E016C080910E01262F30E0280F311DCB +:1040A0002F3F310524F4680F60930E0103C08FEF9A +:1040B00080930E0180910E011F928F9383E095E013 +:1040C0009F938F930E9431060F900F900F900F9047 +:1040D0000895833081F128F4813059F08230D1F095 +:1040E0000895853009F449C0B8F1863009F456C006 +:1040F000089580911301681720F4861B80931301A3 +:1041000002C010921301809113011F928F9384EFCC +:1041100094E054C080911201681720F4861B8093AC +:10412000120102C010921201809112011F928F930E +:1041300082EE94E043C080911101681720F4861B41 +:104140008093110102C010921101809111011F9200 +:104150008F938FEC94E032C080911001681720F4A7 +:10416000861B8093100102C01092100180911001F3 +:104170001F928F938AEB94E021C080910F01681702 +:1041800020F4861B80930F0102C010920F018091D2 +:104190000F011F928F9381EA94E010C080910E016D +:1041A000681720F4861B80930E0102C010920E0146 +:1041B00080910E011F928F9386E894E09F938F93D6 +:1041C0000E9431060F900F900F900F900895CF939B +:1041D000C82F1F928F938BE897E09F938F930E9435 +:1041E000310681E090E0A0E0B0E0BC01CD0104C068 +:1041F000660F771F881F991FCA95D2F70E940B1967 +:104200000F900F900F900F90CF910C94FD14CF93BF +:104210008732A8F58E3108F02BC1803109F49FC098 +:10422000F8F4873009F464C0A8F4863009F024C19A +:1042300080910402817F8E7F8093040280E997E061 +:104240000E94980581E89AE00E94980581E0809399 +:1042500014024CC08B30F1F18E3009F46CC00CC1EB +:10426000863109F4B0C020F4813109F4EDC004C1F5 +:10427000893109F491C08B3109F449C0FDC08833FC +:1042800049F150F4893209F4F1C0853309F4EEC0E4 +:10429000873209F0F1C0EAC0833409F4E7C028F49A +:1042A0008A3308F4E9C08953E4C0883409F0E4C0D3 +:1042B0000E94FD1480E79AE00E9498052FEF83ED9D +:1042C00090E3215080409040E1F700C000000E9440 +:1042D000A41C0CC087EB97E05CC087E59AE00E94C5 +:1042E000980580910402816080930402C1E0C9C0F6 +:1042F00080910402C82FC17080FFEFCF83E69AE05F +:104300000E94980580910402817F8E7F3DC090912C +:10431000040291FBCC27C0F981E0C827892FC0FB9C +:1043200081F980930402CC2319F08AE49AE027C033 +:104330008CE39AE02EC09091040292FBCC27C0F946 +:1043400081E0C827892FC0FB82F980930402CC2327 +:1043500019F08DE29AE013C08DE19AE01AC09091B5 +:10436000040293FBCC27C0F981E0C827892FC0FB4A +:1043700083F980930402CC2351F081E19AE00E94FA +:104380009805809104028160809304027AC084E0E1 +:104390009AE00E949805AACF85EF99E00E949805BF +:1043A0008CEC99E00E9498058AE899E00E949805B3 +:1043B0008DE599E00E94980583E199E00E949805B7 +:1043C00085EE98E0E6CF87ED98E00E9498050E9480 +:1043D0000F0F1F928F938DEB98E09F938F930E9406 +:1043E000310680910A011F928F9386EA98E09F938D +:1043F0008F930E943106809187011F928F9383E9EA +:1044000098E09F938F930E94310680910B011F9239 +:104410008F9380E898E09F938F930E9431060E94CB +:10442000491C9F938F937F936F9389E698E09F93A6 +:104430008F930E9431068DB79EB746960FB6F894BB +:104440009EBF0FBE8DBF52CF0E94FD14C0910B01C5 +:1044500081E0C827C0930B01CC2329F08FE598E0B9 +:104460000E9498050EC084E598E093CF80E001C0DB +:104470008D510E94E7203ACF82E598E00E9498058E +:10448000C0E08C2FCF91089580E0089580E00895DA +:10449000CF93C82F80911402813071F020F08230C8 +:1044A00009F44BC042C1E0910C01F0910D018081F3 +:1044B000823209F03CC107C0E0910C01F0910D017E +:1044C0008081823261F48C2F0E944422811104C0C9 +:1044D0008C2F0E9407212FC081E090E02CC08C2FF0 +:1044E0000E944622811126C0C431E1F070F4CB3025 +:1044F00081F0C031D1F40E94AF1F83E897E00E94A1 +:10450000980582E08093140215C0C93259F0C8336F +:1045100061F480E997E00E94980587E897E00E949F +:10452000980508C01092140204C181E897E00E9427 +:104530009805FFC081E08170FEC0C43228F5CE31FD +:1045400008F0C1C0CB30A1F1D0F4C73009F0D3C01E +:104550008EE18093130182E3809312018AE08093BD +:10456000110184E18093100188E080930F0188E2BB +:1045700080930E0187E296E00E949805BFC0C33188 +:1045800049F1C431C1F0B7C0CB3409F4A9C028F453 +:10459000C93289F0C83361F0AEC0C13509F49EC09C +:1045A000C23509F499C0CE3409F0A5C06AE09EC0B6 +:1045B0000E94AF1FA3C080911302882319F01092AC +:1045C00013029CC084E396E00E94980581E08093EA +:1045D0001402B1C08EE096E00E9498058CEF95E041 +:1045E0000E949805809113011F928F9389EF95E0A7 +:1045F0009F938F930E94310687EF95E00E94980564 +:1046000085EE95E00E949805809112011F928F938C +:1046100082EE95E09F938F930E94310680EE95E0A5 +:104620000E94980581ED95E00E9498058091110106 +:104630001F928F938EEC95E09F938F930E9431068B +:104640008CEC95E00E9498058BEB95E00E94980514 +:10465000809110011F928F9388EB95E09F938F9329 +:104660000E94310686EB95E00E94980581EA95E06C +:104670000E94980580910F011F928F938EE995E01B +:104680009F938F930E9431068CE995E00E949805D4 +:1046900085E895E00E94980580910E011F928F9306 +:1046A00082E895E09F938F930E94310680E895E021 +:1046B0000E9498058DB79EB748960FB6F8949EBF96 +:1046C0000FBE8DBF1BC0CE51EC2FF0E0E25DFE4F60 +:1046D00080818093130212C061E003C061E006C0D4 +:1046E0006AE0809113020E94C61F08C080911302E5 +:1046F0000E94692003C085E296E013C080911302F6 +:10470000882369F01F928F938FE196E09F938F9398 +:104710000E9431060F900F900F900F9004C08CE113 +:1047200096E00E94980581E006C01092140280E095 +:1047300002C080E000CFCF9108950E94A423689426 +:10474000B1110C94332408950E94182488F09F57C7 +:1047500098F0B92F9927B751B0F0E1F0660F771FA5 +:10476000881F991F1AF0BA95C9F714C0B13091F09B +:104770000E943224B1E008950C943224672F782FE0 +:104780008827B85F39F0B93FCCF386957795679560 +:10479000B395D9F73EF490958095709561957F4FCC +:1047A0008F4F9F4F0895E89409C097FB3EF4909572 +:1047B0008095709561957F4F8F4F9F4F9923A9F0FA +:1047C000F92F96E9BB279395F69587957795679589 +:1047D000B795F111F8CFFAF4BB0F11F460FF1BC0CD +:1047E0006F5F7F4F8F4F9F4F16C0882311F096E960 +:1047F00011C0772321F09EE8872F762F05C066230E +:1048000071F096E8862F70E060E02AF09A95660FC6 +:10481000771F881FDAF7880F9695879597F908957F +:1048200057FD9058440F551F59F05F3F71F0479561 +:10483000880F97FB991F61F09F3F79F08795089546 +:10484000121613061406551FF2CF4695F1DF08C065 +:10485000161617061806991FF1CF86957105610582 +:1048600008940895E894BB2766277727CB0197F92A +:1048700008950E944C240C94BD240E94AF2438F06B +:104880000E94B62420F0952311F00C94A6240C94D9 +:10489000AC2411240C9433240E94102470F3959FAF +:1048A000C1F3950F50E0551F629FF001729FBB2727 +:1048B000F00DB11D639FAA27F00DB11DAA1F649FC3 +:1048C0006627B00DA11D661F829F2227B00DA11D76 +:1048D000621F739FB00DA11D621F839FA00D611DFC +:1048E000221F749F3327A00D611D231F849F600D1D +:1048F000211D822F762F6A2F11249F5750409AF046 +:10490000F1F088234AF0EE0FFF1FBB1F661F771FD1 +:10491000881F91505040A9F79E3F510580F00C949C +:10492000A6240C9433245F3FE4F3983ED4F3869599 +:1049300077956795B795F795E7959F5FC1F7FE2B3C +:10494000880F911D9695879597F9089597F99F6718 +:1049500080E870E060E008959FEF80EC0895002407 +:104960000A941616170618060906089500240A94D4 +:1049700012161306140605060895092E0394000C5A +:1049800011F4882352F0BB0F40F4BF2B11F460FFE9 +:1049900004C06F5F7F4F8F4F9F4F0895991B79E041 +:1049A00004C0991F961708F0961B881F7A95C9F7BF +:1049B0008095089597FB072E16F4009407D077FD95 +:1049C00009D00E94F42407FC05D03EF4909581950F +:1049D0009F4F0895709561957F4F0895EE0FFF1FCB +:1049E0000590F491E02D0994AA1BBB1B51E107C06F +:1049F000AA1FBB1FA617B70710F0A61BB70B881F6F +:104A0000991F5A95A9F780959095BC01CD010895FD +:044A1000F894FFCF48 +:104A14004B073C081908E507B1070101E201280822 +:104A2400140A321E404D3622394D030003CA02A82F +:104A3400026F02E201FB0114022D024D0200010289 +:084A4400030405060708090040 +:106800000000000000000000040005000600070072 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280000002A002B002C002D002E002F0005 +:1068600030003100000033003400290036003700CA +:1068700038003900000000000000000000000000A7 +:106880000000000000000000000000000000000008 +:1068900000004900000000004C00000000004F0014 +:1068A00050005100520000000000000000000000F5 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F000E000E100E200E300E400E500E60035002E +:00000001FF diff --git a/keyboard/fc660c/binary/fc660c_emu.hex b/keyboard/fc660c/binary/fc660c_emu.hex new file mode 100644 index 00000000..ba56fcee --- /dev/null +++ b/keyboard/fc660c/binary/fc660c_emu.hex @@ -0,0 +1,1271 @@ +:100000000C9443050C948A050C948A050C948A057B +:100010000C948A050C948A050C948A050C948A0524 +:100020000C948A050C948A050C94A90C0C947B0DF5 +:100030000C94101C0C948A050C948A050C948A0567 +:100040000C948A050C948A050C948A050C948A05F4 +:100050000C948A050C94841C0C948A050C948A05D3 +:100060000C948A050C948A050C948A050C948A05D4 +:100070000C948A050C948A050C948A050C948A05C4 +:100080000C948A050C948A050C948A050C948A05B4 +:100090000C948A050C948A050C948A050C948A05A4 +:1000A0000C948A050C948A050C948A05E80D0A0EB6 +:1000B000F80E0A0EF80E4F0E720EF80EC70EDA0E7C +:1000C000FF11FF112D122D128A12C812E114E11432 +:1000D000E112E114E213E213B514E114E114CC14BB +:1000E000141A082B1518171C12132F0C3080314CC2 +:1000F0001E1F20352124222326272D252E802A4924 +:10010000807B7A788080802C7E807C807F51504FED +:10011000801D1B7906111905363738107D528080F5 +:1001200004160739090D0A0B0F33340E808028801E +:1001300080808080808080808080808080808080BF +:1001400080808080808080808080808080808080AF +:10015000808080808080808080808080808080809F +:100160004B6579626F6172642073746172742E0AD8 +:100170000055534220636F6E666967757265642E21 +:100180000A000D0A696E69740A005B445D005B43F6 +:100190005D002C034600430036003600300043006B +:1001A000200041006C007400200043006F006E00CE +:1001B000740072006F006C006C006500720000003B +:1001C0000A0354004D004B002E00000004030904F4 +:1001D00009028D00050100A032090400000103019D +:1001E00001000921110100012240000705810308D7 +:1001F000000A0904010001030102000921110100A4 +:1002000001224D000705820308000A0904020001CB +:1002100003000000092111010001223600070583B7 +:100220000308000A09040300020300000009211169 +:1002300001000122220007058403200001070504B4 +:10024000032000010904040001030000000921113A +:100250000100012239000705850320000112011069 +:100260000100000008EDFE0C66000101020001051E +:10027000010906A101050719E029E71500250195E7 +:100280000875018102050819012905950575019177 +:10029000029501750391010507190029F71500253D +:1002A0000195F875018102C00631FF0974A10109A9 +:1002B00075150026FF009520750881020976150046 +:1002C00026FF00952075089102C005010980A10153 +:1002D000850216810026B7001A81002AB700751022 +:1002E00095018100C0050C0901A1018503160100DB +:1002F000269C021A01002A9C02751095018100C0FB +:1003000005010902A1010901A10005091901290539 +:10031000150025019505750181029501750381017F +:100320000501093009311581257F9502750881067F +:1003300009381581257F950175088106050C0A3855 +:10034000021581257F950175088106C0C005010948 +:1003500006A101050719E029E71500250195087593 +:10036000018102950175088101050819012905958A +:100370000575019102950175039101050719002981 +:10038000FF150026FF00950675088100C0636F6E9B +:1003900073756D65723A20253034580A007379738D +:1003A00074656D3A20253034580A000A0025303231 +:1003B0005820006B6579626F6172643A20004C4589 +:1003C000443A20253032580A00253032583A202548 +:1003D0003031366225730A00722F63203031323398 +:1003E0003435363738394142434445460A0064655E +:1003F0006C5F6B65795F6269743A2063616E277424 +:100400002064656C3A20253032580A006164645FCC +:100410006B65795F6269743A2063616E277420614D +:1004200064643A20253032580A004F6E6573686F55 +:10043000743A2074696D656F75740A00290A002585 +:1004400075002F002575005D28002564002000251B +:100450006400200025640020002564007C00253015 +:100460003258006D6F7573656B6579205B62746ED1 +:100470007C782079207620685D287265702F616312 +:100480006C293A205B006D6B5F776865656C5F7403 +:10049000696D655F746F5F6D6178203D2025640A2A +:1004A000006D6B5F776865656C5F6D61785F737019 +:1004B000656564203D2025640A006D6B5F74696D7D +:1004C000655F746F5F6D6178203D2025640A006D63 +:1004D0006B5F6D61785F7370656564203D20256496 +:1004E0000A006D6B5F696E74657276616C203D20E9 +:1004F00025640A006D6B5F64656C6179203D202581 +:10050000640A006D6B5F776865656C5F74696D6523 +:100510005F746F5F6D6178203D2025640A006D6B0C +:100520005F776865656C5F6D61785F737065656442 +:10053000203D2025640A006D6B5F74696D655F74F2 +:100540006F5F6D6178203D2025640A006D6B5F6DE3 +:1005500061785F7370656564203D2025640A006DD5 +:100560006B5F696E74657276616C203D2025640A4C +:10057000006D6B5F64656C6179203D2025640A0025 +:100580000A00257500363A20776865656C5F7469E6 +:100590006D655F746F5F6D61783A20000A002575A4 +:1005A00000353A20776865656C5F6D61785F7370C0 +:1005B0006565643A20000A00257500343A207469A4 +:1005C0006D655F746F5F6D61783A20000A00257574 +:1005D00000333A206D61785F73706565643A20007E +:1005E0000A00257500323A20696E74657276616C76 +:1005F000286D73293A20000A00257500313A2064DD +:10060000656C6179282A31306D73293A20000A0916 +:100610002D2056616C756573202D0A004D3E004DEE +:1006200025643E20003F0073657420646566617533 +:100630006C740A00433E200077686572652064652B +:100640006C74613A20637572736F723D25642C205F +:10065000776865656C3D25640A5365652068747428 +:10066000703A2F2F656E2E77696B697065646961CA +:100670002E6F72672F77696B692F4D6F7573655F8A +:100680006B6579730A000A092D204D6F7573656BD0 +:100690006579202D0A4553432F713A0971756974A4 +:1006A0000A313A0964656C6179282A31306D732901 +:1006B0000A323A09696E74657276616C286D732925 +:1006C0000A333A096D61785F73706565640A343A7C +:1006D0000974696D655F746F5F6D61780A353A09F9 +:1006E000776865656C5F6D61785F73706565640AD6 +:1006F000363A09776865656C5F74696D655F746F1C +:100700005F6D61780A0A703A097072696E742076BA +:10071000616C7565730A643A097365742064656673 +:1007200061756C74730A75703A092B310A646F77BE +:100730006E3A092D310A706775703A092B31300A0B +:100740007067646F776E3A092D31300A0A737065ED +:100750006564203D2064656C7461202A206D617899 +:100760005F7370656564202A202872657065617406 +:10077000202F2074696D655F746F5F6D6178290A41 +:10078000003F004D3E2000433E20004C25640A00FF +:100790000A092D20436F6E736F6C65202D0A455337 +:1007A000432F713A09717569740A6D3A096D6F7555 +:1007B00073656B65790A000A092D204D61676963CD +:1007C000202D0A643A0964656275670A783A0964FB +:1007D00065627567206D61747269780A6B3A0964A5 +:1007E00065627567206B6579626F6172640A6D3A44 +:1007F000096465627567206D6F7573650A763A09DD +:1008000076657273696F6E0A733A097374617475F1 +:10081000730A633A09636F6E736F6C65206D6F6462 +:10082000650A302D343A096C61796572302D3428AF +:100830004631302D4634290A506175733A09626F8A +:100840006F746C6F616465720A6E3A094E4B524F59 +:100850000A003F004E4B524F3A206F66660A004E28 +:100860004B524F3A206F6E0A0074696D65725F7269 +:10087000656164333228293A202530346C580A00E7 +:100880006B6579626F6172645F6E6B726F3A20257F +:10089000580A006B6579626F6172645F69646C65A8 +:1008A0003A2025580A006B6579626F6172645F7047 +:1008B000726F746F636F6C3A2025580A00686F730B +:1008C000745F6B6579626F6172645F6C65647328D5 +:1008D000293A2025580A000A092D2053746174759D +:1008E00073202D0A004743433A20342E392E3220FC +:1008F0004156522D4C4942433A20312E382E307306 +:10090000766E204156525F415243483A20617672DA +:10091000350A004F5054494F4E533A204C554641EA +:10092000204D4F5553454B45592045585452414B46 +:10093000455920434F4E534F4C4520434F4D4D4159 +:100940004E44204E4B524F204B45594D41505F5322 +:10095000454354494F4E20343039360A00425549F8 +:100960004C443A20653338323935372D6469727416 +:1009700079202831363A31333A32362041707220AC +:1009800031352032303137290A005649443A203077 +:10099000784645454428544D4B2E29205049443A29 +:1009A00020307836363043284643363630432041AF +:1009B0006C7420436F6E74726F6C6C657229205674 +:1009C00045523A203078303130300A0044455343A4 +:1009D0003A20544D4B2E206B6579626F6172642012 +:1009E0006669726D7761726520666F722046433664 +:1009F0003630430A000A092D2056657273696F6EFE +:100A0000202D0A000A6D6F7573653A206F66660ABD +:100A1000000A6D6F7573653A206F6E0A000A6B6588 +:100A200079626F6172643A206F66660A000A6B65CC +:100A300079626F6172643A206F6E0A000A6D6174A8 +:100A40007269783A206F66660A000A6D617472698D +:100A5000783A206F6E0A000A64656275673A206F03 +:100A60006E0A000A64656275673A206F66660A005E +:100A70000A0A626F6F746C6F616465722E2E2E208D +:100A800000433E20000011241FBECFEFDAE0DEBF9E +:100A9000CDBF04B603FE27C08091220290912302AD +:100AA000A0912402B09125028730904BA740B04B13 +:100AB000D1F410922202109223021092240210927A +:100AC000250214BE84B7877F84BF0FB6F894A8951B +:100AD00080916000886180936000109260000FBE7A +:100AE000E0E0F8E3099511E0A0E0B1E0EEE1FAE41E +:100AF00002C005900D92A833B107D9F722E0A8E310 +:100B0000B1E001C01D92A232B207E1F70E94D709FD +:100B10000C940D250C940000FF93EF93E0913801A5 +:100B2000F0913901309709F00995EF91FF910895FF +:100B3000FC018591803011F0EFDFFBCF0895FF2796 +:100B4000E0E230E247FF0CC0419597FF09C0EDE2BB +:100B50006095709580959095611D711D811D911D09 +:100B600027FF02C0219530E350E2AA27660F771FC6 +:100B7000881F991FAA1FA41710F0A41B63955A95EC +:100B8000A9F7AA3008F0A95FA05DAF93F3956115AE +:100B900071058105910541F7ED3211F4EF93F3955D +:100BA000F21718F43F93F395FBCF8F91B5DFFA95C9 +:100BB000E1F70895E991F9918591803021F085322E +:100BC00019F0AADFF9CF089520E0E8945591553245 +:100BD000C1F3503311F4689455915A3348F450538B +:100BE00090F3220F022E220F220F200D250FF4CF9B +:100BF0000EF4219589919991533619F3533729F1C0 +:100C0000533559F1BC0188279927E8945C3621F4C3 +:100C10008991999168945591543639F446EF7EF054 +:100C200077FF0DC08FEF9FEF0AC055374AE039F0CC +:100C3000583540E121F0523642E009F00895FF9323 +:100C4000EF937DDFEF91FF91B7CFFF93EF93FC011F +:100C500081918030B9F360DFFBCFFF93EF9368DFC2 +:100C6000F1CFDF93CF93CDB7DEB72596A3DFCF913A +:100C7000DF91089561FF02C02D9808952D9A08957F +:100C800084B18F6184B93E98469A3F9A8AB1806F49 +:100C90008AB95F9A479884B1806684B985B18066C5 +:100CA00085B9EAE4F1E01192119281E0EA35F807A2 +:100CB000D1F7EAE3F1E01192119281E0EA34F8070A +:100CC000D1F78AE491E090935D0180935C018AE31F +:100CD00091E090935B0180935A010895AF92BF9287 +:100CE000DF92EF92FF920F931F93CF93DF93809148 +:100CF0005A0190915B0120915C0130915D0130932C +:100D00005B0120935A0190935D0180935C0100E0A8 +:100D100010E0C1E0D0E085B1982F907E03FF02C0C3 +:100D200020E101C028E0802F8770892B822B85B9B4 +:100D3000BE01002E02C0660F771F0A94E2F75B0126 +:100D4000A094B09440E050E08BB18F7080689A011D +:100D500094E0220F331F9A95E1F7822B8BB92AE09A +:100D60002A95F1F700C0CA01880F991FA0915A0176 +:100D7000B0915B01A80FB91F2D913C912623372319 +:100D8000232B09F0479AE5E3EA95F1F70000D6B482 +:100D90005F98FAE0FA95F1F700C0A0915C01B0917C +:100DA0005D017D01E80EF91EF701369B05C020812B +:100DB00031812A213B2104C020813181262B372B10 +:100DC0003183208326B5ED2CF12C2D1518F026B596 +:100DD00030E004C026B530E021503F4F2E193F09C6 +:100DE0002630310568F020915A0130915B01280FBF +:100DF000391FF90120813181A80FB91F2D933C9330 +:100E0000FAE1FA95F1F700C047985F9A8BE291E01A +:100E10000197F1F700C000004F5F5F4F4830510568 +:100E200009F092CFA0915C01B0915D01E0915A016F +:100E3000F0915B0150962D913C9151978089918959 +:100E40002817390751F00E944E1C60935E01709381 +:100E50005F0180936001909361010F5F1F4F00312C +:100E6000110509F058CF81E0DF91CF911F910F91CB +:100E7000FF90EF90DF90BF90AF90089520915C01BC +:100E800090915D01E22FF92FE80FF11DE80FF11DA0 +:100E900080819181089581FF02C02E9808952E9A35 +:100EA00008958091860108959FB7F8941092650186 +:100EB0009FBF90911902943009F057C09091E900BA +:100EC0009F703091EC00232F217030FD20E8922B91 +:100ED00024E02093E9002091EB0020FF43C0209103 +:100EE000EE0027FF3FC020916201222321F02091D4 +:100EF000E80025FF37C01092620126E03091E8003B +:100F000035FD15C030911902343061F53091EB0098 +:100F100035FD28C0215021F481E08093620122C078 +:100F2000EFE9FFE03197F1F700C00000E7CF8093D1 +:100F3000F1008091E80085FD0AC08091E80080FF03 +:100F4000FCCF8091E8008E778093E80006C08FB7D1 +:100F5000F89421E0209365018FBF9F709093E90082 +:100F600080E008959F709093E9008FEF0895CF93EC +:100F7000DF9300D01F92CDB7DEB79C01809119029C +:100F8000843019F593E099833B832A839093E90099 +:100F90008FEF9091E800815095FD06C095ED9A95F0 +:100FA000F1F700008111F5CF8091E80085FF0DC0B9 +:100FB00040E050E063E070E0CE0101960E94990AA3 +:100FC0008091E8008E778093E8000F900F900F904B +:100FD000DF91CF910895CF93DF9300D01F92CDB7CB +:100FE000DEB720911902243021F522E029839B836A +:100FF0008A8383E08093E9008FEF9091E80081502D +:1010000095FD06C095ED9A95F1F700008111F5CF99 +:101010008091E80085FF0DC040E050E063E070E0A3 +:10102000CE0101960E94990A8091E8008E77809304 +:10103000E8000F900F900F90DF91CF9108952091CD +:1010400019022430F1F422E02093E9002FEF3091CF +:10105000E800215035FD06C035ED3A95F1F7000066 +:101060002111F5CF2091E80025FF0BC040E050E0B2 +:1010700065E070E00E94990A8091E8008E77809385 +:10108000E8000895CF93DF9320911902243009F0EE +:1010900048C0EC0180910A018823E1F080910B01A6 +:1010A0008823C1F085E08093E9008FEF9091E800FC +:1010B000815095FD06C095E19A95F1F700008111E8 +:1010C000F5CF8091E80085FF2CC040E050E060E261 +:1010D00070E017C081E08093E9008FEF9091E80005 +:1010E000815095FD06C095ED9A95F1F700008111AC +:1010F000F5CF8091E80085FF14C040E050E068E043 +:1011000070E0CE010E94990A8091E8008E7780936A +:10111000E80080E2FE01A6E6B1E001900D928A951A +:10112000E1F7DF91CF9108958EE891E00E94980554 +:1011300080911802811109C00E942E0C0E948B0C14 +:101140008091E20084608093E20008958AE891E053 +:101150000E94980510921802089508952091630145 +:101160002F5F822F62E30E94D324992319F02093EA +:10117000630108951092630180916501882371F1E4 +:1011800080911902843041F58091E9008F7020919F +:10119000EC00922F917020FD90E8892B94E09093C1 +:1011A000E9009091EB0090FF14C09091EE0097FF42 +:1011B00010C09091E80095FF03C01092F100F9CFA4 +:1011C0009091E80090FF05C09091E8009E77909381 +:1011D000E8008F708093E90010926501089542E065 +:1011E00061EC81E00E94A80B42E061EC82E00E9489 +:1011F000A80B42E061EC83E00E94A80B42E261ECA4 +:1012000084E00E94A80B42E261EC85E00C94A80BFC +:1012100080911B02833009F455C030F4813071F0A5 +:10122000823009F48EC008958A3009F47AC08B3078 +:1012300009F460C0893009F09CC020C080911A0276 +:10124000813A09F096C08091E800877F8093E8009A +:1012500080911E0290911F02892B21F460E286E6A4 +:1012600091E003C060E080E090E070E00E94E40A5A +:101270008091E8008B778093E800089580911A02AE +:10128000813209F076C080911E0290911F02009772 +:1012900019F0049709F06DC08091E800877F809372 +:1012A000E8008091E80082FD05C08091190281115B +:1012B000F8CF5FC08091F100809386018091E800B3 +:1012C0008B7753C080911A02813A09F052C0809105 +:1012D0001E0290911F02892B09F04BC08091E800FB +:1012E000877F8093E8008091E80080FFFCCF8091A9 +:1012F0000A0136C080911A028132D9F580911E020E +:1013000090911F02892BA9F58091E800877F809337 +:10131000E8000E94DD0B80911C0280930A010C946E +:10132000031580911A02813221F58091E800877FB0 +:101330008093E8000E94DD0B80911D02809387015D +:10134000089580911A02813AA1F48091E800877F84 +:101350008093E8008091E80080FFFCCF80918701B6 +:101360008093F1008091E8008E778093E8000C94E0 +:10137000DD0B08950895089580918601809364019E +:101380001092860180E00E944B070E94A4100C94EA +:1013900003150C94BC090E94CE1B80911702882370 +:1013A00029F00E94F71B81110C94830A089584B7D9 +:1013B000877F84BF0FB6F894A895809160008861FC +:1013C00080936000109260000FBE90E080E80FB63E +:1013D000F89480936100909361000FBE84E597E0DC +:1013E0000E94861B82E891E00E9498050E94BA093B +:1013F0000E94D10F0E942E0C0E948B0C8091E20063 +:1014000084608093E2007894809119028430E1F73F +:1014100081E791E00E9498050E94D30F80E091E05F +:101420000E94100F80E691E00E9498050E94BB097F +:1014300080911902853019F40E94CB09F9CF0E94DE +:10144000D70FF6CF0E940C1C809164018093860117 +:1014500008950C94220A292F332723303105C9F02F +:1014600064F42130310581F02230310509F043C0A8 +:101470008DE890E020ED31E042C021323105F1F0FD +:101480002232310541F137C082E190E02DE532E0B2 +:1014900036C099278130910541F08230910541F0A5 +:1014A000892B49F5ECECF1E005C0E0ECF1E002C07D +:1014B000E2E9F1E0849190E09F0121C06530D8F429 +:1014C000E62FF0E0EE0FFF1FED5DFE4F2081318132 +:1014D00089E090E014C0653070F470E0FB01EE0F1D +:1014E000FF1FE75EFE4F20813181FB01EC5EFE4F66 +:1014F000808190E004C080E090E020E030E0FA01DC +:1015000031832083089580E189BD82E189BD09B4DA +:1015100000FEFDCF8091D8008F7D8093D800809110 +:10152000E00082608093E0008091E00081FDFCCFCC +:101530000895CF92DF92EF92FF920F931F93CF9374 +:10154000DF93EC018B016A010E94FC0B811133C017 +:10155000C114D10439F0F60180819181081B190B67 +:10156000C80FD91FE12CF12C0115110519F180913B +:10157000E80085FD16C08091E8008E778093E80032 +:10158000C114D10449F0F60180819181E80EF91E61 +:10159000F182E08285E00FC00E94FC0B882321F3DA +:1015A0000AC089918093F10001501109FFEFEF1AF1 +:1015B000FF0ADACF80E0DF91CF911F910F91FF906A +:1015C000EF90DF90CF90089520912002309121027A +:1015D0002617370748F06115710539F42091E800A6 +:1015E0002E772093E80001C0B90140E06115710534 +:1015F000A9F120911902222309F443C0253009F4EE +:1016000042C02091E80023FD40C02091E80022FD67 +:1016100032C02091E80020FFE9CF4091F3002091F3 +:10162000F20030E0342BFC01CF016115710559F057 +:101630002830310540F481918093F10061507109A7 +:101640002F5F3F4FF1CF41E02830310509F040E0F6 +:101650002091E8002E772093E800C8CF4111C9CF30 +:101660000AC080911902882361F0853061F0809171 +:10167000E80083FD0AC08091E80082FFF2CF80E09D +:10168000089582E0089583E0089581E0089520910F +:101690002002309121022617370748F061157105A5 +:1016A00039F42091E8002E772093E80001C0B901B9 +:1016B000FC0120E06115710591F1809119028823E8 +:1016C00009F440C0853009F43FC08091E80083FDF3 +:1016D0003DC08091E80082FD2FC08091E80080FF2E +:1016E000E9CF2091F3008091F20090E0922B6115F8 +:1016F000710559F08830910540F424912093F10050 +:101700003196615071090196F2CF21E0089709F0F6 +:1017100020E08091E8008E778093E800CBCF211104 +:10172000CCCF0AC080911902882361F0853061F026 +:101730008091E80083FD0AC08091E80082FFF2CF2B +:1017400080E0089582E0089583E0089581E008959F +:10175000982F973058F59093E900981739F07091C9 +:10176000EC002091ED005091F00003C0242F762F63 +:1017700050E021FF19C03091EB003E7F3093EB0029 +:101780003091ED003D7F3093ED003091EB00316002 +:101790003093EB007093EC002093ED005093F00039 +:1017A0002091EE0027FF07C09F5FD3CF8F708093FB +:1017B000E90081E0089580E0089580911A0287FF92 +:1017C00011C08091E80082FD05C08091190281114D +:1017D000F8CF11C08091E8008B770BC0809119027F +:1017E000882349F08091E80080FFF8CF8091E800DD +:1017F0008E778093E80008952091E4003091E50011 +:1018000095E64091EC00842F817040FF22C08091CA +:10181000E80080FD1CC080911902882391F085307A +:1018200091F08091EB0085FD10C04091E400509153 +:10183000E5004217530729F39A01915011F784E00C +:10184000089582E0089583E0089581E0089580E09E +:1018500008954091E80042FFDECF08950E949C0C5D +:101860000E94A40CE0EEF0E0808181608083E8EDCE +:10187000F0E080818F77808319BCA7EDB0E08C9178 +:101880008E7F8C9380818F7E8083109218020895C2 +:101890000F931F93CF93DF930E949C0C0E94A40C84 +:1018A000C8EDD0E088818F778883888180688883BD +:1018B00088818F7D888319BC1092190210921502BD +:1018C000109217021092160200EE10E0F8018081CB +:1018D0008B7F808388818160888342E060E080E044 +:1018E0000E94A80BE1EEF0E080818E7F8083E2EE23 +:1018F000F0E0808181608083808188608083F8014E +:1019000080818E7F8083888180618883DF91CF9101 +:101910001F910F910895E8EDF0E080818F7E808324 +:10192000E7EDF0E080818160808384E082BF81E028 +:10193000809318020C94480CE8EDF0E080818E7FD3 +:1019400080831092E20008951092DA001092E10074 +:1019500008951F920F920FB60F9211242F933F9369 +:101960004F935F936F937F938F939F93AF93BF93A7 +:10197000EF93FF938091E10082FF0BC08091E20022 +:1019800082FF07C08091E1008B7F8093E1000E947D +:10199000AE088091DA0080FF1FC08091D80080FFE0 +:1019A0001BC08091DA008E7F8093DA008091D9008D +:1019B00080FF0DC080E189BD82E189BD09B400FED0 +:1019C000FDCF81E0809319020E94940805C019BCE4 +:1019D000109219020E94A6088091E10080FF19C0B0 +:1019E0008091E20080FF15C08091E2008E7F80939D +:1019F000E2008091E20080618093E2008091D80053 +:101A000080628093D80019BC85E0809319020E94FF +:101A1000C9098091E10084FF30C08091E20084FF19 +:101A20002CC080E189BD82E189BD09B400FEFDCFF3 +:101A30008091D8008F7D8093D8008091E1008F7EC7 +:101A40008093E1008091E2008F7E8093E20080919C +:101A5000E20081608093E20080911502882311F0FA +:101A600084E007C08091E30087FD02C081E001C0EF +:101A700083E0809319020E94290A8091E10083FF8C +:101A800029C08091E20083FF25C08091E100877F1B +:101A90008093E10082E080931902109215028091F8 +:101AA000E1008E7F8093E1008091E2008E7F809341 +:101AB000E2008091E20080618093E20042E060E019 +:101AC00080E00E94A80B8091F00088608093F00075 +:101AD0000E94AD08FF91EF91BF91AF919F918F91BF +:101AE0007F916F915F914F913F912F910F900FBE1A +:101AF0000F901F9018951F920F920FB60F921124FE +:101B00002F933F934F935F936F937F938F939F9305 +:101B1000AF93BF93CF93DF93EF93FF93C091E9000F +:101B2000CF708091EC00D82FD17080FDD0E810925A +:101B3000E9008091F000877F8093F00078940E9404 +:101B4000BF0D1092E9008091F00088608093F00052 +:101B5000CD2BCF70C093E900FF91EF91DF91CF9132 +:101B6000BF91AF919F918F917F916F915F914F91B5 +:101B70003F912F910F900FBE0F901F9018951F93BC +:101B8000CF93DF93CDB7DEB7AA970FB6F894DEBF39 +:101B90000FBECDBFEAE1F2E088E08E0F9091F10038 +:101BA00091938E13FBCF0E9408098091E80083FF78 +:101BB0001FC180911A0290911B02492F50E04A30B8 +:101BC000510508F015C1FA01EA5AFF4F0C94F324AD +:101BD000803881F0823809F00BC180911E028F702D +:101BE0008093E9008091EB0085FB882780F91092B3 +:101BF000E90006C08091160290911702911182604F +:101C00009091E800977F9093E8008093F100109204 +:101C1000F100C8C0282F2D7F09F0EAC0882319F0F1 +:101C2000823061F0E5C080911C02813009F0E0C093 +:101C3000933009F080E0809317022BC080911C0242 +:101C4000811127C080911E028F7009F4D1C080934A +:101C5000E9002091EB0020FF1CC0933021F480911B +:101C6000EB00806214C09091EB0090619093EB00C8 +:101C700021E030E0A90102C0440F551F8A95E2F728 +:101C80004093EA001092EA008091EB008860809314 +:101C9000EB001092E9008091E800877F86C08111F7 +:101CA000A7C010911C021F778091E3008078812BE0 +:101CB0008093E3008091E800877F8093E8000E9492 +:101CC000DD0B8091E80080FFFCCF8091E30080680D +:101CD0008093E300111102C082E001C083E0809391 +:101CE000190286C08058823008F082C080911C02A0 +:101CF00090911D028C3D53E0950779F583E08A832E +:101D00008AE289834FB7F894DE01139620E03EE023 +:101D100051E2E32FF0E050935700E49120FF03C01D +:101D2000E295EF703F5FEF708E2F90E0EA3010F099 +:101D3000C79601C0C0968D939D932F5F243149F7BC +:101D40004FBF8091E800877F8093E8006AE270E0EF +:101D5000CE0101960E94E40A14C0AE014F5F5F4FAE +:101D600060911E020E942B0ABC01892B09F440C01D +:101D70009091E800977F9093E80089819A810E9472 +:101D8000470B8091E8008B778093E80031C0803862 +:101D900079F58091E800877F8093E80080911502B3 +:101DA0008093F1008091E8008E778093E8000E9494 +:101DB000DD0B1EC081111CC090911C029230C0F43A +:101DC0008091E800877F8093E800909315020E943D +:101DD000DD0B80911502811106C08091E30087FD23 +:101DE00002C081E001C084E0809319020E94EF08E4 +:101DF0008091E80083FF0AC08091E800877F80938C +:101E0000E8008091EB0080628093EB00AA960FB609 +:101E1000F894DEBF0FBECDBFDF91CF911F91089523 +:101E200090938D0180938C010895E0918C01F09145 +:101E30008D01309721F00190F081E02D099480E030 +:101E40000895EF92FF920F931F93CF93DF93E0914A +:101E50008C01F0918D013097B1F18C010280F381FA +:101E6000E02D09958091040282FF2DC080FF04C0FF +:101E700083EB93E00E949805E80110E28DEAE82EDA +:101E800083E0F82E8091040280FF0BC088811F92AE +:101E90008F93FF92EF920E9431060F900F900F9058 +:101EA0000F90115021961111EDCF8091040280FF07 +:101EB0000AC08BEA93E0DF91CF911F910F91FF90C1 +:101EC000EF900C949805DF91CF911F910F91FF90A7 +:101ED000EF900895E0918C01F0918D01309721F001 +:101EE0000480F581E02D09940895CF93DF93EC01F0 +:101EF00080918A0190918B01C817D90709F1D0937D +:101F00008B01C0938A01E0918C01F0918D01309793 +:101F1000B9F00680F781E02DCE0109958091040289 +:101F200082FF0EC080FF0CC0DF93CF938DE993E05A +:101F30009F938F930E9431060F900F900F900F90F8 +:101F4000DF91CF910895CF93DF93EC0180918801C9 +:101F500090918901C817D90709F1D0938901C093DD +:101F60008801E0918C01F0918D013097B9F00084E7 +:101F7000F185E02DCE0109958091040282FF0EC00B +:101F800080FF0CC0DF93CF938DE893E09F938F93F6 +:101F90000E9431060F900F900F900F90DF91CF911C +:101FA00008950C94A5100E94391C0C9440065F9271 +:101FB0006F927F928F929F92AF92BF92CF92DF9259 +:101FC000EF92FF920F931F93CF93DF9300D000D037 +:101FD0001F92CDB7DEB70E946E060FE811E0512CBC +:101FE00088248394912C852D0E943E075C01F80182 +:101FF000C080D180C826D926C114D10439F45394A5 +:102000000E5F1F4FF8E05F12EECF3FC080910402D9 +:1020100081FD0E94A610E12CF12C34010E2C02C08F +:10202000660C771C0A94E2F7C3018C219D21892B51 +:1020300021F1E9825A8221E0C3018A219B21892B67 +:1020400009F420E02B830E94421C8160782F9D833D +:102050008C8349815A816B818D810E94DC1049817A +:102060005A816B817C818D810E94BC1BF80180812B +:1020700091816826792671826082FFEFEF1AFF0A4C +:1020800080E1E816F10449F6BACF8FEF89838A839D +:102090001B820E94421C8160782F9D838C83498122 +:1020A0005A816B818D810E94DC100E94BB1B0E94B3 +:1020B000031F10918E010E94150F181771F10E94D5 +:1020C000150F80938E019091040292FF0EC090FF35 +:1020D0000CC01F928F938EEB93E09F938F930E947F +:1020E00031060F900F900F900F9080918E010F90FE +:1020F0000F900F900F900F90DF91CF911F910F9144 +:10210000FF90EF90DF90CF90BF90AF909F908F9017 +:102110007F906F905F900C94CC1B0F900F900F905E +:102120000F900F90DF91CF911F910F91FF90EF9043 +:10213000DF90CF90BF90AF909F908F907F906F90E7 +:102140005F9008950C944B0708950895EF92FF92C5 +:102150000F931F93CF93DF9388ED93E00E94980530 +:10216000C0E0D0E08DE2E82E81E0F82E09EC13E02B +:102170008C2F0E943E070E94A11BFF92EF929F931B +:102180008F93DF93CF931F930F930E943106219675 +:102190008DB79EB708960FB6F8949EBF0FBE8DBF41 +:1021A000C830D10529F7DF91CF911F910F91FF9092 +:1021B000EF90089508950895CF93DF93CDB7DEB7DC +:1021C0002B970FB6F894DEBF0FBECDBF942F4F8371 +:1021D000252F588769877A878B874A855B85452BAA +:1021E00021F02F3F09F59F3FF9F4DE01119686E0BB +:1021F000FD0111928A95E9F785E0FE01379601907D +:102200000D928A95E1F749815A816B817C818D819C +:102210009E810E94B7172B960FB6F894DEBF0FBEB3 +:10222000CDBFDF91CF9108954F81588569857A851B +:102230008B850E94BC1BD9CFCF93882309F465C03E +:10224000C82F8CEF8C0F813A20F080E58C0F8E32F6 +:1022500048F48C2F0E944D22811157C08C2F0E9470 +:10226000421A0CC080E28C0F883058F4C77081E0AD +:1022700001C0880FCA95EAF70E94ED1ACF910C941D +:10228000311B8BE58C0F833078F4C53A29F0C63AC0 +:1022900031F083E890E005C081E890E002C082E878 +:1022A00090E0CF910C94750F88E58C0F853168F51F +:1022B000C83A89F0C93A91F0CA3A99F0CB3AA1F0FC +:1022C000CC3AA9F0CD3AB1F0CE3AB9F0CF3AC1F05C +:1022D00080E090E017C082EE90E014C089EE90E0BC +:1022E00011C08AEE90E00EC085EB90E00BC086EB4B +:1022F00090E008C083EB90E005C084EB90E002C062 +:1023000087EB90E0CF910C94A30FCF910895882391 +:1023100049F19CEF980F913A20F090E5980F9E328A +:1023200018F40E94951A0DC090E2980F983058F456 +:10233000877091E001C0990F8A95EAF7892F0E9472 +:10234000F31A0C94311B9BE5980F933020F480E036 +:1023500090E00C94750F885A853120F480E090E06D +:102360000C94A30F0895882321F00E94ED1A0C9479 +:10237000311B0895882321F00E94F31A0C94311B1D +:102380000895BF92CF92DF92EF92FF920F931F9327 +:10239000CF93DF9300D000D000D0CDB7DEB725E0DB +:1023A000FC01DE01119601900D922A95E1F7FC01E6 +:1023B00040813181F280258122952F706381748163 +:1023C000672B09F4FEC23F3F19F44F3F09F4F9C2ED +:1023D0006C0149833A8389819A812E830E94011A74 +:1023E000182FB92E0E94001A0E941019EB2DE295A9 +:1023F000EF70F0E0E05AFF4F2E810C94F3248B2D08 +:10240000807F9B2D9F70092F882311F00295007FFC +:10241000FF2049F0002309F481C2802F0E94001B95 +:102420000E94311B7BC2812F0E948711002309F477 +:10243000C8C2802F0E94061B26960FB6F894DEBFF6 +:102440000FBECDBFDF91CF911F910F91FF90EF9005 +:10245000DF90CF90BF900C94311B8B2D807F9B2DF4 +:102460009F70092F803211F00295007F112319F01F +:10247000113009F12AC0FF20B1F0802F222351F141 +:10248000213041F526960FB6F894DEBF0FBECDBFC2 +:10249000DF91CF911F910F91FF90EF90DF90CF9040 +:1024A000BF900C94101B222319F0213009F489C22B +:1024B0000E94191B2DC0FF20F1F0263008F081C2C8 +:1024C0000E94EA1A802329F023C0FF20F9F021118D +:1024D00016C0802F26960FB6F894DEBF0FBECDBF74 +:1024E000DF91CF911F910F91FF90EF90DF90CF90F0 +:1024F000BF900C94B311253008F063C209C0F601F7 +:10250000858180FF0BC28F708583E3CF21111BC2B1 +:10251000802F82C12B2D26952695237030E0211522 +:10252000310521F021303105D1F04BC2FF2021F0DF +:10253000812F9B2D937002C080E090E026960FB60D +:10254000F894DEBF0FBECDBFDF91CF911F910F91E9 +:10255000FF90EF90DF90CF90BF900C94750FFF200D +:1025600021F0812F9B2D937002C080E090E0269691 +:102570000FB6F894DEBF0FBECDBFDF91CF911F9194 +:102580000F91FF90EF90DF90CF90BF900C94A30F2E +:10259000812FFF2019F00E94891D02C00E94F11DA9 +:1025A00026960FB6F894DEBF0FBECDBFDF91CF9158 +:1025B0001F910F91FF90EF90DF90CF90BF900C9400 +:1025C000761E8B2D837009F07BC0F110FAC1812F2C +:1025D000829586958770880F880F912F9F70C92EDE +:1025E000D12CE12CF12C082E04C0CC0CDD1CEE1CEF +:1025F000FF1C0A94D2F714FF12C04FE050E060E0D5 +:1026000070E004C0440F551F661F771F8A95D2F7EC +:10261000CB01BA01609570958095909503C060E0FC +:1026200070E0CB012B2D269526952370422F50E08C +:1026300042305105D9F04330510569F16C297D29AB +:102640008E299F294130510551F126960FB6F894F5 +:10265000DEBF0FBECDBFDF91CF911F910F91FF90D5 +:10266000EF90DF90CF90BF900C9425196C297D29B5 +:102670008E299F2926960FB6F894DEBF0FBECDBFD8 +:10268000DF91CF911F910F91FF90EF90DF90CF904E +:10269000BF900C9437190E942519C701B6012696E0 +:1026A0000FB6F894DEBF0FBECDBFDF91CF911F9163 +:1026B0000F91FF90EF90DF90CF90BF900C94131983 +:1026C000FF2019F08B2D817001C08695882309F4B5 +:1026D00078C1812F829586958770880F880F912FFA +:1026E0009F70C92ED12CE12CF12C082E04C0CC0CEB +:1026F000DD1CEE1CFF1C0A94D2F714FF12C04FE041 +:1027000050E060E070E004C0440F551F661F771F63 +:102710008A95D2F7CB01BA01609570958095909516 +:1027200003C060E070E0CB012B2D26952695237029 +:10273000422F50E042305105D9F04330510569F144 +:102740006C297D298E299F294130510551F126960A +:102750000FB6F894DEBF0FBECDBFDF91CF911F91B2 +:102760000F91FF90EF90DF90CF90BF900C94DC1909 +:102770006C297D298E299F2926960FB6F894DEBFF5 +:102780000FBECDBFDF91CF911F910F91FF90EF90C2 +:10279000DF90CF90BF900C94EE190E94DC19C70116 +:1027A000B60126960FB6F894DEBF0FBECDBFDF91FF +:1027B000CF911F910F91FF90EF90DF90CF90BF903E +:1027C0000C94CA19103FC9F128F480E4810F8032BB +:1027D00050F09FC0123F09F461C008F44AC0133F93 +:1027E00009F471C096C0012F00718B2D8F71FF20ED +:1027F00051F00E946319812F002319F08295807F88 +:1028000069CE8F7067CE0E948419812F002319F042 +:102810008295807F01C08F7026960FB6F894DEBF38 +:102820000FBECDBFDF91CF911F910F91FF90EF9021 +:10283000DF90CF90BF900C94BA11FF20B1F02530FB +:1028400008F0BFC08B2D8F7126960FB6F894DEBFAF +:102850000FBECDBFDF91CF911F910F91FF90EF90F1 +:10286000DF90CF90BF900C94A919263008F0A9C032 +:10287000E9CFFF20A9F08B2D8F7126960FB6F89423 +:10288000DEBF0FBECDBFDF91CF911F910F91FF90A3 +:10289000EF90DF90CF90BF900C946319FF2059F315 +:1028A0008B2D8F7126960FB6F894DEBF0FBECDBF6D +:1028B000DF91CF911F910F91FF90EF90DF90CF901C +:1028C000BF900C948419FF2099F08B2D8F71269660 +:1028D0000FB6F894DEBF0FBECDBFDF91CF911F9131 +:1028E0000F91FF90EF90DF90CF90BF900C944E1916 +:1028F00026960FB6F894DEBF0FBECDBFDF91CF9105 +:102900001F910F91FF90EF90DF90CF90BF900C94AC +:102910004919FF20A9F0222309F4ADCF812F269673 +:102920000FB6F894DEBF0FBECDBFDF91CF911F91E0 +:102930000F91FF90EF90DF90CF90BF900C941C11FF +:10294000222309F4ADCF812F26960FB6F894DEBF6F +:102950000FBECDBFDF91CF911F910F91FF90EF90F0 +:10296000DF90CF90BF900C9487114B2D4F70612F4B +:10297000C6010E94031D26960FB6F894DEBF0FBE57 +:10298000CDBFDF91CF911F910F91FF90EF90DF901E +:10299000CF90BF900C945B184B2D4F70612FC601E8 +:1029A00026960FB6F894DEBF0FBECDBFDF91CF9154 +:1029B0001F910F91FF90EF90DF90CF90BF900C94FC +:1029C000061D26960FB6F894DEBF0FBECDBFDF9171 +:1029D000CF911F910F91FF90EF90DF90CF90BF901C +:1029E00008950E940D1B0E94DC1A0E94311B0E9458 +:1029F000A81F0E94761E80E090E00E94750F80E084 +:102A000090E00C94A30F0E94FD1A0C94F1140E9404 +:102A1000011A292F22952F7030E02C3031054CF40B +:102A20002A303105C4F4225031092230310540F0FA +:102A300023C02C303105D1F02F303105B9F01CC046 +:102A4000853A28F48430B0F4823028F413C090E240 +:102A5000980F983078F0883E30F4803E58F48450D7 +:102A6000813A50F407C0803F39F404C093FB8827B3 +:102A700080F9089581E0089580E00895CF93DF9371 +:102A800000D000D01F92CDB7DEB70F900F900F90FF +:102A90000F900F90DF91CF910895CF93DF9300D0E7 +:102AA00000D000D0CDB7DEB726960FB6F894DEBFC3 +:102AB0000FBECDBFDF91CF9108951F93CF93DF93CA +:102AC000C0919F0116E08091A001C81799F0D0E055 +:102AD0001C9FF0011D9FF00D1124EF55FE4F40810A +:102AE000518162817381848195810E944D15219667 +:102AF000C770E9CFDF91CF911F9108954091D10127 +:102B00005091D2016091D3017091D4018091D5018F +:102B10009091D6010C944D158091D60182958F70BD +:102B200009F054C08091D301882309F44FC08091EB +:102B30009F01A091A0016091D1017091D2014091BB +:102B4000D4015091D501B6E08A1709F43FC090E056 +:102B500041155105C1F17F3F11F46F3FA1F1B89FBD +:102B6000F001B99FF00D1124EF55FE4F2181721332 +:102B70002AC02081621327C02281211124C0238111 +:102B800034812417350710F421503109241B350BEB +:102B90002C323140C0F42091D6012F702061209357 +:102BA000D60126E0289FF001299FF00D1124EA5557 +:102BB000FE4F80818F708061808381ED91E00E9463 +:102BC000C1110C945D1501968770BECF0895CF9208 +:102BD000DF92EF92FF920F931F93CF93DF93CDB7C6 +:102BE000DEB762970FB6F894DEBF0FBECDBF8C0183 +:102BF00085E0F801DE011D9601900D928A95E1F7BE +:102C0000D8014C9111965C91119712966C91129784 +:102C10001396CD90DC9014973091D1017091D20130 +:102C20008091D4019091D501009709F473C17F3F41 +:102C300019F43F3F09F46EC1E090D301EE2009F48E +:102C4000C5C02091D601C816D90650F0F601E81B80 +:102C5000F90BCF01FF24F3948C329140C8F009C0E6 +:102C6000809590958C0D9D1DFF24F3948C3291409E +:102C700078F0F12C207F09F0C6C07C2DD98AC88A53 +:102C800089890E943E1581ED91E00E94C111B1C079 +:102C9000822F807F09F045C0751313C0341311C013 +:102CA00061110FC02F7020612093D6010E947E1504 +:102CB00081ED91E00E94C1118091D601F8018583D8 +:102CC0002EC0CD2819F15F3F11F44F3FF9F0F62ED9 +:102CD00061111CC080919F012091A00136E08217F4 +:102CE00009F45BC090E0389FF001399FF00D11248A +:102CF000EF55FE4F7181571306C07081471303C013 +:102D00007281711103C001968770E9CFF62E662398 +:102D100009F41DC18091D60181608093D601F12C08 +:102D200016C1751309C0341307C0611105C0809125 +:102D3000D601F8018583C8C04D875E878D859E8545 +:102D40006A8B0E9407156A898823E1F16623D1F115 +:102D50002091D601822F82958F7090E0029774F0B7 +:102D60008091D1019091D20198878F831986DB865B +:102D7000CA862C87CE0107960E94C11186E0F80111 +:102D8000A1EDB1E001900D928A95E1F70E948C15BA +:102D90000E947E15FF24F394DAC04D875E878D85EF +:102DA0009E850E94011A292F22952F7030E0223033 +:102DB00031050CF0BFC09F7009F0B9C0805E88304B +:102DC00008F4C5C0C8010E94C111E4CFC816D906D5 +:102DD00008F453C0F601E81BF90BCF018C32914087 +:102DE00008F453C0F12C7C2DD98AC88A89890E94A5 +:102DF0003E15E1EDF1E086E0DF011D928A95E9F7ED +:102E00000E947E15A4C0751314C0341312C0611142 +:102E100010C08091D601F8018583C8010E94C111BC +:102E200086E0E1EDF1E0DF011D928A95E9F7FE2CE5 +:102E30008EC04D875E878D859E856A8B0E940715A3 +:102E40006A89882309F4BECF662309F4BBCF209199 +:102E5000D601822F82958F7090E002970CF48ECF6E +:102E60008091D1019091D2019A8389831B82DD8266 +:102E7000CC822E83CE0101967FCF809590958C0DCC +:102E80009D1D8C32914008F0ADCFF62E662309F4DB +:102E900099CF75132EC034132CC02091D60120FD7C +:102EA0001FC0822F82958F70D9F0D80115962C9370 +:102EB00015978F3049F08F5F982F9295907F822FD2 +:102EC0008F70892B15968C93C8010E94C11186E0E2 +:102ED000F801A1EDB1E001900D928A95E1F790CF54 +:102EE00086E0F801A1EDB1E001900D928A95E1F73D +:102EF0002EC04D875E878D859E850E9407158111A6 +:102F00003DCF8091D60181608093D601C8010E9497 +:102F1000C1111DC0662309F455CF4D875E878D858D +:102F20009E850E940715882309F44CCF27CF811175 +:102F300045CF0DC0243031050CF044CF9F7009F40B +:102F40003DCFD80115969C91907F09F037CF8F2DFA +:102F500062960FB6F894DEBF0FBECDBFDF91CF9162 +:102F60001F910F91FF90EF90DF90CF9008951F93E6 +:102F7000CF93DF93CDB7DEB72C970FB6F894DEBFB3 +:102F80000FBECDBF4F83588769877A878B879C8711 +:102F9000CE0107960E94E715882369F08F819885F6 +:102FA0002A853B85232BF1F19F3F09F063C08F3FBA +:102FB00009F060C037C086E0FE013796DE01119649 +:102FC00001900D928A95E1F76F817885EA85FB85FE +:102FD000309741F17F3F11F46F3F21F12091A00123 +:102FE00030E0C90101968770992740919F0150E018 +:102FF0008417950709F447C069837A83FD83EC83BE +:1030000096E0929FD001939FB00D1124AF55BE4F13 +:10301000FE01319601900D929A95E1F78093A001FF +:103020000E945D1516E080919F019091A001891783 +:10303000C1F1189FC00111248F559E4F0E94E715C2 +:10304000882379F1E0919F011E9FF0011124EF5533 +:10305000FE4F4081518162817381848195810E94FC +:103060004D1580919F0190E001968770992780937C +:103070009F01D9CF4F81588569857A858B859C853D +:103080000E944D15CFCF0E9403151092A0011092FF +:103090009F01E1EDF1E086E0DF011D928A95E9F7FD +:1030A000C1CF2C960FB6F894DEBF0FBECDBFDF9117 +:1030B000CF911F910895DF92EF92FF920F931F938C +:1030C000CF93DF93FC01892B09F48AC0E12CF12C0A +:1030D000DD24D394EF0121968491853709F461C0F2 +:1030E00058F4843708F04EC0843008F06AC081304C +:1030F000D1F0823071F174C0883709F45DC050F4AA +:10310000863709F455C0873709F06AC08E2D0E94B2 +:10311000FA1A54C09CE7980F903708F061C08F7777 +:103120000E94871150C08F010E5F1F4FFE018491D6 +:1031300090E2980F983050F48770FD2D01C0FF0F7A +:103140008A95EAF78F2F0E94001B14C00E941C1161 +:1031500013C08F010E5F1F4FFE01C49180E28C0FE0 +:10316000883060F4C7708D2D01C0880FCA95EAF7CA +:103170000E94061B0E94311BE80125C08C2F0E9473 +:103180008711FACF9F012E5F3F4FFE01C491CC23E0 +:1031900069F08FE99FE00197F1F700C00000C1508E +:1031A000F6CF9F012E5F3F4FFE01F490E9010BC067 +:1031B0000E94EA1AE82E07C00E94FD1A0E94311BE5 +:1031C00002C00E941C118F2D882341F0EFE9FFE01F +:1031D0003197F1F700C000008150F6CFFE017ACFA1 +:1031E000DF91CF911F910F91FF90EF90DF900895A5 +:1031F0006093DB017093DC018093DD019093DE012D +:103200000E94CB1B0C94F1146093D7017093D801EA +:103210008093D9019093DA010E943A060C94F1143C +:1032200008950C94F8180F931F930091DB011091EF +:10323000DC012091DD013091DE01602B712B822BAE +:10324000932B1F910F910C94F8180F931F930091DB +:10325000DB011091DC012091DD013091DE01602362 +:103260007123822393231F910F910C94F8180F93CD +:103270001F930091DB011091DC012091DD01309161 +:10328000DE0160277127822793271F910F910C94ED +:10329000F81860E070E0CB010C9404190F931F93B1 +:1032A00041E050E060E070E08A019B0104C0000F43 +:1032B000111F221F331F8A95D2F7C901B8011F9130 +:1032C0000F910C9404190F931F9341E050E060E0BC +:1032D00070E004C0440F551F661F771F8A95D2F710 +:1032E0008091D7019091D801A091D901B091DA01D4 +:1032F0008A019B01082B192B2A2B3B2BC901B801F2 +:103300001F910F910C9404190F931F9341E050E00B +:1033100060E070E004C0440F551F661F771F8A9558 +:10332000D2F740955095609570958091D701909116 +:10333000D801A091D901B091DA018A019B0108233B +:1033400019232A233B23C901B8011F910F910C9423 +:1033500004190F931F9341E050E060E070E004C057 +:10336000440F551F661F771F8A95D2F78091D701AA +:103370009091D801A091D901B091DA018A019B0105 +:10338000082719272A273B27C901B8011F910F9148 +:103390000C9404190F931F930091D7011091D80139 +:1033A0002091D9013091DA01602B712B822B932B64 +:1033B0001F910F910C9404190F931F930091D70143 +:1033C0001091D8012091D9013091DA016023712345 +:1033D000822393231F910F910C9404190F931F9331 +:1033E0000091D7011091D8012091D9013091DA01D3 +:1033F00060277127822793271F910F910C9404193E +:103400000895CF92DF92EF92FF920F931F93CF9385 +:10341000DF938C01C090DB01D090DC01E090DD01F6 +:10342000F090DE014091D7015091D8016091D9010F +:103430007091DA01C42AD52AE62AF72ACFE1D0E032 +:10344000D701C6010C2E04C0B695A7959795879510 +:103450000A94D2F780FF07C0B8018C2F0E94D91CB4 +:103460008130910531F4219758F7B80180E00E942E +:10347000D91CDF91CF911F910F91FF90EF90DF90BA +:10348000CF90089590910A01992321F090910B011A +:10349000911109C020910C0130910D01F901329672 +:1034A0009FEF40E030C0982F9695969596959F3166 +:1034B000A0F4E0910C01F0910D01E90FF11D87706E +:1034C00021E030E0A90102C0440F551F8A95E2F7C0 +:1034D000CA019181892B818308959091040290FF04 +:1034E00023C01F928F938CE094E09F938F930E9450 +:1034F00031060F900F900F900F9008959F3F39F075 +:103500004F5F4E3141F051915813F8CF0DC051111A +:10351000F7CF942FF5CF9F3F39F0F901E90FF11D57 +:1035200097FDFA9582830895089590910A01992351 +:1035300021F090910B01911109C020910C01309163 +:103540000D01F9013296205E3F4F30C0982F9695BD +:10355000969596959F31A8F4E0910C01F0910D019C +:10356000E90FF11D877021E030E0A90102C0440F8E +:10357000551F8A95E2F7CA0180959181892381833D +:1035800008959091040290FF16C01F928F938EEEC3 +:1035900093E09F938F930E9431060F900F900F90AE +:1035A0000F9008953196E217F30729F09081981350 +:1035B000F9CF1082F7CF089581E090E0E0910C01FF +:1035C000F0910D01E80FF91F1082019680329105EC +:1035D000A9F7089580910302089590910302892B21 +:1035E000809303020895809590910302892380932C +:1035F0000302089580930302089510920302089530 +:1036000090910202892B80930202089580959091F7 +:103610000202892380930202089510920202089503 +:103620008093E1010E94421C9093E0018093DF01AE +:1036300008951092E1011092E0011092DF010895C7 +:1036400080910C0190910D01FC0131969C01205E4E +:103650003F4F80E0919191118F5FE217F307D1F70F +:103660000895E0910C01F0910D0180910302808397 +:10367000E0910C01F0910D01908180910202892B63 +:1036800080838091E1018823D9F10E94421C20911E +:10369000DF013091E0018217930748F00E94421C3D +:1036A0002091DF013091E001821B930B0AC00E9440 +:1036B000421C2091DF013091E00120953095820F6E +:1036C000931F8C32914070F08091040280FF08C0FB +:1036D0008AE294E09F938F930E9431060F900F909F +:1036E0000E94191BE0910C01F0910D0190818091D5 +:1036F000E101892B80830E94201B81110E94191BEC +:1037000080910C0190910D010C94210F909339013F +:103710008093380108958295982F9C7C392F369597 +:103720003695282F237344E0249FC0011124932F42 +:10373000982B292F2A7A2695892F8575880F822B19 +:1037400008951F93CF93DF931F92CDB7DEB7998370 +:103750000E948B1B182F9981892F0E948B1B212F70 +:1037600030E0322F2227A901482BCA010F90DF91A8 +:10377000CF911F9108950895CF93DF9300D000D08B +:103780001F92CDB7DEB70F900F900F900F900F9054 +:10379000DF91CF91089508950C94A21080911902A1 +:1037A000843021F11092050220E488E190E00FB608 +:1037B000F894A895809360000FBE2093600083B7B3 +:1037C000817F846083BF83B7816083BF789488954D +:1037D00083B78E7F83BF0FB6F894A8958091600061 +:1037E000886180936000109260000FBE0895CF93AF +:1037F0000E94DA100E946E060E94DB10C0E08C2F3F +:103800000E943E07892B29F4CF5FC830C1F780E0C2 +:1038100001C081E0CF9108950E94A4100C9403157B +:103820001F920F920FB60F9211248F939F93AF9315 +:10383000BF9380910502811113C08091060290917F +:103840000702A0910802B09109024196A11DB11D85 +:103850008093060290930702A0930802B093090296 +:10386000BF91AF919F918F910F900FBE0F901F90BE +:10387000189582E084BD93E095BD9AEF97BD809343 +:103880006E0008952FB7F894809106029091070278 +:10389000A0910802B09109022FBF08952FB7F894A4 +:1038A00060910602709107028091080290910902CE +:1038B0002FBF0895CF92DF92EF92FF920F931F9345 +:1038C0002FB7F894409106025091070260910802C8 +:1038D000709109022FBF6A017B01EE24FF248C0145 +:1038E00020E030E0C016D106E206F30610F44150A5 +:1038F00051099A01281B390BC9011F910F91FF90A3 +:10390000EF90DF90CF9008951F920F920FB60F9215 +:1039100011248F939F93AF93BF9380910602909150 +:103920000702A0910802B09109020196A11DB11DE4 +:103930008093060290930702A0930802B0930902B5 +:10394000BF91AF919F918F910F900FBE0F901F90DD +:1039500018950E942E0CF8942FEF87EA91E62150DB +:1039600080409040E1F700C0000087E090EBDC0170 +:103970008093220290932302A0932402B093250205 +:103980009CE088E10FB6F894A895809360000FBE84 +:1039900090936000FFCF20E1929FF0011124E80F87 +:1039A000F11DE052FF4F9491892F8F7092959F7077 +:1039B0000895CF93C82FCB010E94CB1C282F30E055 +:1039C00080E1989FA0011124422B532B40385105D0 +:1039D00019F480E090E015C09770E92FF0E088E0DE +:1039E000C89FE00DF11D112484E0EE0FFF1F8A95A2 +:1039F000E1F7E20FF31FEE0FFF1FE050F84985914A +:103A00009491CF91089580E090E008950895809179 +:103A10000C0280FF0BC06091110185E0689FB0012E +:103A2000112475956795759567952BC081FF09C021 +:103A30006091110185E0689FB0011124759567952B +:103A400020C082FF07C06091110185E0689FB0012E +:103A5000112417C090910D029923D1F060911001AB +:103A6000961788F72091110185E0289F9001112475 +:103A7000929FA001939F500D112470E0CA010E94F3 +:103A8000DF246038710540F46115710539F002C01A +:103A900065E070E0862F08958FE7089581E008952E +:103AA00080910C0280FF08C060910F0170E0759555 +:103AB00067957595679521C081FF06C060910F01DC +:103AC00070E07595679519C082FF04C060910F0181 +:103AD00070E010C090910D029923C1F060910E0129 +:103AE0009617A0F780910F01899FC001112470E003 +:103AF0000E94DF246038710528F46115710521F0FA +:103B0000862F08958FE7089581E0089561E070E0C1 +:103B1000F4CF803F21F40E94071D819504C0813FAE +:103B200029F40E94071D809310020895823F21F41A +:103B30000E94071D819504C0833F29F40E94071D40 +:103B400080930F020895893F19F40E94501D05C00B +:103B50008A3F31F40E94501D81958093110208958F +:103B60008B3F21F40E94501D819504C08C3F29F4A5 +:103B70000E94501D809312020895843F21F4809189 +:103B80000E02816017C0853F21F480910E02826091 +:103B900011C0863F21F480910E0284600BC0873FE4 +:103BA00021F480910E02886005C0883F31F4809135 +:103BB0000E02806180930E0208958D3F21F4809162 +:103BC0000C0281600BC08E3F21F480910C02826058 +:103BD00005C08F3F29F480910C02846080930C0211 +:103BE0000895803F39F48091100287FF6CC01092D5 +:103BF000100269C0813F29F4809110021816BCF3AD +:103C000062C090910F02823F29F497FF5CC010922E +:103C10000F0259C0833F19F41916CCF354C0893FE1 +:103C200041F48091110218160CF04DC0109211024F +:103C30004AC08A3F29F48091110287FF44C0F6CF21 +:103C40008B3F39F48091120287FF3DC0109212021F +:103C50003AC08C3F29F4809112021816BCF333C08D +:103C6000843F21F480910E028E7F17C0853F21F49E +:103C700080910E028D7F11C0863F21F480910E024B +:103C80008B7F0BC0873F21F480910E02877F05C098 +:103C9000883F31F480910E028F7E80930E0213C014 +:103CA0008D3F21F480910C028E7F0BC08E3F21F45A +:103CB00080910C028D7F05C08F3F29F480910C020A +:103CC0008B7F80930C0280910F0281110EC0809136 +:103CD000100281110AC080911102811106C08091E9 +:103CE0001202811102C010920D0208958091040207 +:103CF00083FF7EC083E694E00E94980580910E02C7 +:103D00001F928F938EE594E09F938F930E943106CC +:103D10008CE594E00E94980580910F02282F082ED0 +:103D2000000C330B3F938F9389E594E09F938F931F +:103D30000E94310687E594E00E9498058091100268 +:103D4000282F082E000C330B3F938F9384E594E0CB +:103D50009F938F930E94310682E594E00E9498051C +:103D600080911102282F082E000C330B3F938F9364 +:103D70008FE494E09F938F930E9431068DE494E04A +:103D80000E94980580911202282F082E000C330BF8 +:103D90003F938F938AE494E09F938F930E94310620 +:103DA00087E494E00E94980580910D021F928F9302 +:103DB00084E494E09F938F930E94310682E494E020 +:103DC0000E94980580910C021F928F938FE394E0DC +:103DD0009F938F930E9431068CE394E00E94980594 +:103DE0008DB79EB74C960FB6F8949EBF0FBE8DBF91 +:103DF0008EE092E00E946A0F0E94421C90930B0298 +:103E000080930A0208951F93CF93DF9380910A0253 +:103E100090910B020E945A1CAC0190910D029923C3 +:103E200021F02091120130E006C0209113018AE0B8 +:103E3000289F900111244217530708F485C08091F0 +:103E40000F02C0911002D091110210911202811143 +:103E500007C0C11175C0D11173C0111171C074C0F8 +:103E60009F3F19F09F5F90930D02181624F40E9453 +:103E7000071D80930F0280910F0287FF05C00E94EB +:103E8000071D819580930F021C1624F40E94071DC4 +:103E9000809310028091100287FF05C00E94071DC9 +:103EA00081958093100260910F02662331F1C091D9 +:103EB0001002CC2311F1062E000C770B880B990B06 +:103EC0000E94DA2323E333E343E35FE30E943E24CB +:103ED0000E94A22360930F026C2FCC0F770B880BEC +:103EE000990B0E94DA2323E333E343E35FE30E9469 +:103EF0003E240E94A223609310021D1624F40E9407 +:103F0000501D809311028091110287FF05C00E940D +:103F1000501D819580931102111624F40E94501DAA +:103F2000809312028091120287FF05C00E94501DEB +:103F3000819580931202DF91CF911F910C94761E90 +:103F40009F3F09F08FCF97CFDF91CF911F910895B9 +:103F5000EEE0F2E085E0DF011D928A95E9F710922C +:103F60000D0210920C02089586E896E00E949805D2 +:103F70001F9281E08F931F9285E08F9388E396E0F4 +:103F80009F938F930E9431060F900F900F900F9088 +:103F90000F900F9008958330E9F128F4813061F09B +:103FA000823009F10895853009F462C008F449C0EF +:103FB000863009F474C0089580911301262F30E0F3 +:103FC000280F311D2F3F310524F4680F6093130132 +:103FD00003C08FEF80931301809113011F928F9381 +:103FE00081E795E072C080911201262F30E0280F02 +:103FF000311D2F3F310524F4680F6093120103C077 +:104000008FEF80931201809112011F928F938FE5A1 +:1040100095E05BC080911101262F30E0280F311D03 +:104020002F3F310524F4680F6093110103C08FEF17 +:1040300080931101809111011F928F938CE495E080 +:1040400044C080911001262F30E0280F311D2F3FF2 +:10405000310524F4680F6093100103C08FEF809343 +:104060001001809110011F928F9387E395E02DC07E +:1040700080910F01262F30E0280F311D2F3F310591 +:1040800024F4680F60930F0103C08FEF80930F013A +:1040900080910F011F928F938EE195E016C0809161 +:1040A0000E01262F30E0280F311D2F3F310524F45B +:1040B000680F60930E0103C08FEF80930E01809113 +:1040C0000E011F928F9383E095E09F938F930E9440 +:1040D00031060F900F900F900F900895833081F16B +:1040E00028F4813059F08230D1F00895853009F4F8 +:1040F00049C0B8F1863009F456C008958091130183 +:10410000681720F4861B8093130102C010921301DC +:10411000809113011F928F9384EF94E054C080919B +:104120001201681720F4861B8093120102C01092BE +:104130001201809112011F928F9382EE94E043C08E +:1041400080911101681720F4861B8093110102C031 +:1041500010921101809111011F928F938FEC94E0C6 +:1041600032C080911001681720F4861B80931001E3 +:1041700002C010921001809110011F928F938AEB60 +:1041800094E021C080910F01681720F4861B809372 +:104190000F0102C010920F0180910F011F928F93A7 +:1041A00081EA94E010C080910E01681720F4861B0C +:1041B00080930E0102C010920E0180910E011F9299 +:1041C0008F9386E894E09F938F930E9431060F901F +:1041D0000F900F900F900895CF93C82F1F928F9339 +:1041E0008BE897E09F938F930E94310681E090E0E7 +:1041F000A0E0B0E0BC01CD0104C0660F771F881FAE +:10420000991FCA95D2F70E9411190F900F900F9025 +:104210000F90CF910C940315CF938732A8F58E3170 +:1042200008F02BC1803109F49FC0F8F4873009F4FD +:1042300064C0A8F4863009F024C180910402817F13 +:104240008E7F8093040280E997E00E94980581E8C0 +:104250009AE00E94980581E0809314024CC08B3054 +:10426000F1F18E3009F46CC00CC1863109F4B0C094 +:1042700020F4813109F4EDC004C1893109F491C001 +:104280008B3109F449C0FDC0883349F150F48932BB +:1042900009F4F1C0853309F4EEC0873209F0F1C0AA +:1042A000EAC0833409F4E7C028F48A3308F4E9C08B +:1042B0008953E4C0883409F0E4C00E94031580E704 +:1042C0009AE00E9498052FEF83ED90E32150804003 +:1042D0009040E1F700C000000E94A91C0CC087EBD1 +:1042E00097E05CC087E59AE00E94980580910402FF +:1042F000816080930402C1E0C9C080910402C82F8C +:10430000C17080FFEFCF83E69AE00E94980580910C +:104310000402817F8E7F3DC09091040291FBCC27E7 +:10432000C0F981E0C827892FC0FB81F9809304027E +:10433000CC2319F08AE49AE027C08CE39AE02EC0DF +:104340009091040292FBCC27C0F981E0C827892F05 +:10435000C0FB82F980930402CC2319F08DE29AE02D +:1043600013C08DE19AE01AC09091040293FBCC2710 +:10437000C0F981E0C827892FC0FB83F9809304022C +:10438000CC2351F081E19AE00E94980580910402CB +:104390008160809304027AC084E09AE00E949805CC +:1043A000AACF85EF99E00E9498058CEC99E00E94D5 +:1043B00098058AE899E00E9498058DE599E00E94A9 +:1043C000980583E199E00E94980585EE98E0E6CF94 +:1043D00087ED98E00E9498050E94150F1F928F9319 +:1043E0008DEB98E09F938F930E94310680910A0194 +:1043F0001F928F9386EA98E09F938F930E943106D5 +:10440000809187011F928F9383E998E09F938F9308 +:104410000E94310680910B011F928F9380E898E0F3 +:104420009F938F930E9431060E944E1C9F938F93FF +:104430007F936F9389E698E09F938F930E94310654 +:104440008DB79EB746960FB6F8949EBF0FBE8DBF30 +:1044500052CF0E940315C0910B0181E0C827C09381 +:104460000B01CC2329F08FE598E00E9498050EC03F +:1044700084E598E093CF80E001C08D510E94EC204C +:104480003ACF82E598E00E949805C0E08C2FCF914A +:10449000089580E0089580E00895CF93C82F80911B +:1044A0001402813071F020F0823009F44BC042C117 +:1044B000E0910C01F0910D018081823209F03CC144 +:1044C00007C0E0910C01F0910D018081823261F40E +:1044D0008C2F0E944922811104C08C2F0E940C2134 +:1044E0002FC081E090E02CC08C2F0E944B228111C4 +:1044F00026C0C431E1F070F4CB3081F0C031D1F48A +:104500000E94B41F83E897E00E94980582E08093A0 +:10451000140215C0C93259F0C83361F480E997E03C +:104520000E94980587E897E00E94980508C01092BD +:10453000140204C181E897E00E949805FFC081E061 +:104540008170FEC0C43228F5CE3108F0C1C0CB3036 +:10455000A1F1D0F4C73009F0D3C08EE180931301EC +:1045600082E3809312018AE08093110184E18093B9 +:10457000100188E080930F0188E280930E0187E2AA +:1045800096E00E949805BFC0C33149F1C431C1F023 +:10459000B7C0CB3409F4A9C028F4C93289F0C833B4 +:1045A00061F0AEC0C13509F49EC0C23509F499C0AE +:1045B000CE3409F0A5C06AE09EC00E94B41FA3C01B +:1045C00080911302882319F0109213029CC084E397 +:1045D00096E00E94980581E080931402B1C08EE0BD +:1045E00096E00E9498058CEF95E00E9498058091D6 +:1045F00013011F928F9389EF95E09F938F930E94F1 +:10460000310687EF95E00E94980585EE95E00E94BF +:104610009805809112011F928F9382EE95E09F93EF +:104620008F930E94310680EE95E00E94980581EDFF +:1046300095E00E949805809111011F928F938EEC56 +:1046400095E09F938F930E9431068CEC95E00E9439 +:1046500098058BEB95E00E949805809110011F92C0 +:104660008F9388EB95E09F938F930E94310686EBA2 +:1046700095E00E94980581EA95E00E949805809156 +:104680000F011F928F938EE995E09F938F930E9465 +:1046900031068CE995E00E94980585E895E00E9436 +:1046A000980580910E011F928F9382E895E09F9369 +:1046B0008F930E94310680E895E00E9498058DB79F +:1046C0009EB748960FB6F8949EBF0FBE8DBF1BC015 +:1046D000CE51EC2FF0E0E25DFE4F8081809313021B +:1046E00012C061E003C061E006C06AE0809113027D +:1046F0000E94CB1F08C0809113020E946E2003C04D +:1047000085E296E013C080911302882369F01F921E +:104710008F938FE196E09F938F930E9431060F90C5 +:104720000F900F900F9004C08CE196E00E949805C6 +:1047300081E006C01092140280E002C080E000CF49 +:10474000CF9108950E94A9236894B1110C94382444 +:1047500008950E941D2488F09F5798F0B92F99273B +:10476000B751B0F0E1F0660F771F881F991F1AF05C +:10477000BA95C9F714C0B13091F00E943724B1E066 +:1047800008950C943724672F782F8827B85F39F065 +:10479000B93FCCF3869577956795B395D9F73EF4F5 +:1047A00090958095709561957F4F8F4F9F4F08959D +:1047B000E89409C097FB3EF49095809570956195BB +:1047C0007F4F8F4F9F4F9923A9F0F92F96E9BB2771 +:1047D0009395F695879577956795B795F111F8CFED +:1047E000FAF4BB0F11F460FF1BC06F5F7F4F8F4F58 +:1047F0009F4F16C0882311F096E911C0772321F04E +:104800009EE8872F762F05C0662371F096E8862FE5 +:1048100070E060E02AF09A95660F771F881FDAF73C +:10482000880F9695879597F9089557FD9058440FEE +:10483000551F59F05F3F71F04795880F97FB991FFF +:1048400061F09F3F79F087950895121613061406BC +:10485000551FF2CF4695F1DF08C016161706180649 +:10486000991FF1CF86957105610508940895E89424 +:10487000BB2766277727CB0197F908950E9451241B +:104880000C94C2240E94B42438F00E94BB2420F06F +:10489000952311F00C94AB240C94B12411240C94A6 +:1048A00038240E94152470F3959FC1F3950F50E0B2 +:1048B000551F629FF001729FBB27F00DB11D639FD2 +:1048C000AA27F00DB11DAA1F649F6627B00DA11D78 +:1048D000661F829F2227B00DA11D621F739FB00D1E +:1048E000A11D621F839FA00D611D221F749F33278E +:1048F000A00D611D231F849F600D211D822F762F27 +:104900006A2F11249F5750409AF0F1F088234AF003 +:10491000EE0FFF1FBB1F661F771F881F915050406F +:10492000A9F79E3F510580F00C94AB240C943824D9 +:104930005F3FE4F3983ED4F3869577956795B795F6 +:10494000F795E7959F5FC1F7FE2B880F911D969510 +:10495000879597F9089597F99F6780E870E060E080 +:1049600008959FEF80EC089500240A941616170608 +:1049700018060906089500240A9412161306140650 +:1049800005060895092E0394000C11F4882352F0B3 +:10499000BB0F40F4BF2B11F460FF04C06F5F7F4F6B +:1049A0008F4F9F4F0895991B79E004C0991F961768 +:1049B00008F0961B881F7A95C9F78095089597FB94 +:1049C000072E16F4009407D077FD09D00E94F92431 +:1049D00007FC05D03EF4909581959F4F0895709502 +:1049E00061957F4F0895EE0FFF1F0590F491E02D24 +:1049F0000994AA1BBB1B51E107C0AA1FBB1FA61726 +:104A0000B70710F0A61BB70B881F991F5A95A9F777 +:0E4A100080959095BC01CD010895F894FFCFDC +:104A1E00510742081F08EB07B7070101E2012808FA +:104A2E00140A321E404D3622394D030003CA02A825 +:104A3E00026F02E201FB0114022D024D020001027F +:084A4E00030405060708090036 +:106800000000000000000000040005000600070072 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280000002A002B002C002D002E002F0005 +:1068600030003100000033003400290036003700CA +:106870003800E00000000000000000000000000000 +:106880000000000000000000000000000000000008 +:1068900000004900000000004C00000000004F0014 +:1068A00050005100520000000000000000000000F5 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F000E000C2A2E200E300E400D2A2E600F1A3BD +:106900000000000000000000040005000600070071 +:10691000080009000A000B000C000D000E000F001B +:1069200010001100120013001400150016001700CB +:10693000180019001A001B001C001D001E001F007B +:10694000200021002200230024002500260027002B +:10695000280000002A002B002C002D002E002F0004 +:1069600030003100000033003400350036003700BD +:106970003800E000000000000000000000000000FF +:106980000000000000000000000000000000000007 +:1069900000004900000000004C00000000004F0013 +:1069A00050005100520000000000000000000000F4 +:1069B00000000000000000000000000000000000D7 +:1069C00000000000000000000000000000000000C7 +:1069D00000000000000000000000000000000000B7 +:1069E00000000000000000000000000000000000A7 +:1069F000E000E100E200E300E400E500E600F1A4CD +:106A00000000000000000000010001000100010082 +:106A1000010001000100010001000100010001006E +:106A2000010001000100010001000100010001005E +:106A3000010001000100010001000100010001004E +:106A4000010001000100010001000100010001003E +:106A5000010000000100010001000100010001002F +:106A600001000100000001000100350001000100EB +:106A70000100010000000000000000000000000014 +:106A80000000000000000000000000000000000006 +:106A900000000100000000000100000000000100F3 +:106AA00001000100010000000000000000000000E3 +:106AB00000000000000000000000000000000000D6 +:106AC00000000000000000000000000000000000C6 +:106AD00000000000000000000000000000000000B6 +:106AE00000000000000000000000000000000000A6 +:106AF000010001000100010001000100010001008E +:106B00000000000000000000EA4401000100E2442F +:106B10000100010001000100460001004A004B0095 +:106B20000100010047004800028A0100E944010019 +:106B30000100010001000100010001003A003B00DA +:106B40003C003D003E003F00400041004200430049 +:106B5000010000000100390001004400450001006F +:106B60000100010000000100010035004D004E0051 +:106B70000100010000000000000000000000000013 +:106B80000000000000000000000000000000000005 +:106B900000000100000000000100000000004D00A6 +:106BA0004A004E004B000000000000000000000002 +:106BB00000000000000000000000000000000000D5 +:106BC00000000000000000000000000000000000C5 +:106BD00000000000000000000000000000000000B5 +:106BE00000000000000000000000000000000000A5 +:106BF0000100010001000100650001000100F1A396 +:106C00000000000000000000EA4401000100E2442E +:106C10000100010001000100460001004A004B0094 +:106C20000100010047004800028A0100E944010018 +:106C30000100010001000100010001003A003B00D9 +:106C40003C003D003E003F00400041004200430048 +:106C5000010000000100390001004400450001006E +:106C60000100010000000100010029004D004E005C +:106C70000100010000000000000000000000000012 +:106C80000000000000000000000000000000000004 +:106C900000000100000000000100000000004D00A5 +:106CA0004A004E004B000000000000000000000001 +:106CB00000000000000000000000000000000000D4 +:106CC00000000000000000000000000000000000C4 +:106CD00000000000000000000000000000000000B4 +:106CE00000000000000000000000000000000000A4 +:106CF0000100010001000100650001000100F1A494 +:00000001FF diff --git a/keyboard/fc660c/config.h b/keyboard/fc660c/config.h new file mode 100644 index 00000000..fc2c8f4b --- /dev/null +++ b/keyboard/fc660c/config.h @@ -0,0 +1,49 @@ +/* +Copyright 2017 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x660C +#define DEVICE_VER 0x0100 +#define MANUFACTURER TMK. +#define PRODUCT FC660C Alt Controller +#define DESCRIPTION TMK. keyboard firmware for FC660C + + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 16 + + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + + +/* period of tapping(ms) */ +#define TAPPING_TERM 300 +/* tap count needed for toggling a feature */ +#define TAPPING_TOGGLE 5 +/* Oneshot timeout(ms) */ +#define ONESHOT_TIMEOUT 300 + +/* Boot Magic salt key: Space */ +#define BOOTMAGIC_KEY_SALT KC_SPACE + +#endif diff --git a/keyboard/fc660c/fc660c.c b/keyboard/fc660c/fc660c.c new file mode 100644 index 00000000..35dc6abe --- /dev/null +++ b/keyboard/fc660c/fc660c.c @@ -0,0 +1,161 @@ +/* +Copyright 2017 Jun Wako + +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "timer.h" +#include "matrix.h" +#include "led.h" +#include "fc660c.h" + + +static uint32_t matrix_last_modified = 0; + +// matrix state buffer(1:on, 0:off) +static matrix_row_t *matrix; +static matrix_row_t *matrix_prev; +static matrix_row_t _matrix0[MATRIX_ROWS]; +static matrix_row_t _matrix1[MATRIX_ROWS]; + + +void matrix_init(void) +{ +#if 0 + debug_enable = true; + debug_keyboard = true; + debug_matrix = true; +#endif + + KEY_INIT(); + + // LEDs on CapsLock and Insert + DDRB |= (1<<5) | (1<<6); + PORTB |= (1<<5) | (1<<6); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; + for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; + matrix = _matrix0; + matrix_prev = _matrix1; +} + +uint8_t matrix_scan(void) +{ + matrix_row_t *tmp; + + tmp = matrix_prev; + matrix_prev = matrix; + matrix = tmp; + + uint8_t row, col; + for (col = 0; col < MATRIX_COLS; col++) { + SET_COL(col); + for (row = 0; row < MATRIX_ROWS; row++) { + //KEY_SELECT(row, col); + SET_ROW(row); + _delay_us(2); + + // Not sure this is needed. This just emulates HHKB controller's behaviour. + if (matrix_prev[row] & (1< 20/(1000000/TIMER_RAW_FREQ)) { + matrix[row] = matrix_prev[row]; + } + + _delay_us(5); + KEY_HYS_OFF(); + KEY_UNABLE(); + + // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE. + // This takes 25us or more to make sure KEY_STATE returns to idle state. + _delay_us(75); + } + if (matrix[row] ^ matrix_prev[row]) { + matrix_last_modified = timer_read32(); + } + } + return 1; +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +void led_set(uint8_t usb_led) +{ + if (usb_led & (1< +#include "unimap.h" + +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_Q, UNIMAP_W, UNIMAP_E, UNIMAP_TAB, UNIMAP_R, UNIMAP_U, UNIMAP_T, UNIMAP_Y, + UNIMAP_O, UNIMAP_P, UNIMAP_LBRC, UNIMAP_I, UNIMAP_RBRC, UNIMAP_NO, UNIMAP_BSLS, UNIMAP_DEL }, + { UNIMAP_1, UNIMAP_2, UNIMAP_3, UNIMAP_GRV, UNIMAP_4, UNIMAP_7, UNIMAP_5, UNIMAP_6, + UNIMAP_9, UNIMAP_0, UNIMAP_MINS, UNIMAP_8, UNIMAP_EQL, UNIMAP_NO, UNIMAP_BSPC, UNIMAP_INS }, + { UNIMAP_NO, UNIMAP_LGUI, UNIMAP_LALT, UNIMAP_LCTL, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_SPC, + UNIMAP_RALT, UNIMAP_NO, UNIMAP_RCTL, UNIMAP_NO, UNIMAP_RGUI, UNIMAP_DOWN, UNIMAP_LEFT, UNIMAP_RGHT }, + { UNIMAP_NO, UNIMAP_Z, UNIMAP_X, UNIMAP_LSFT, UNIMAP_C, UNIMAP_N, UNIMAP_V, UNIMAP_B, + UNIMAP_COMM, UNIMAP_DOT, UNIMAP_SLSH, UNIMAP_M, UNIMAP_RSFT, UNIMAP_UP, UNIMAP_NO, UNIMAP_NO }, + { UNIMAP_A, UNIMAP_S, UNIMAP_D, UNIMAP_CAPS, UNIMAP_F, UNIMAP_J, UNIMAP_G, UNIMAP_H, + UNIMAP_L, UNIMAP_SCLN, UNIMAP_QUOT, UNIMAP_K, UNIMAP_NO, UNIMAP_NO, UNIMAP_ENT, UNIMAP_NO }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, + UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO } +}; +#endif diff --git a/keyboard/fc660c/fc660c.h b/keyboard/fc660c/fc660c.h new file mode 100644 index 00000000..08d57ab9 --- /dev/null +++ b/keyboard/fc660c/fc660c.h @@ -0,0 +1,107 @@ +#ifndef FC660C_H +#define FC660C_H + +#include +#include +#include +#include +#include +#include "timer.h" +#include "unimap.h" + + +// Timer resolution check +#if (1000000/TIMER_RAW_FREQ > 20) +# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB." +#endif + + +/* + * Pin configuration for ATMega32U4 + * + * Row: PD4-6, 7(~EN) + * Col: PB0-2, 3(Z5 ~EN), 4(Z4 ~EN) + * Key: PC6(pull-uped) + * Hys: PC7 + */ +static inline void KEY_ENABLE(void) { (PORTD &= ~(1<<7)); } +static inline void KEY_UNABLE(void) { (PORTD |= (1<<7)); } +static inline bool KEY_STATE(void) { return (PINC & (1<<6)); } +static inline void KEY_HYS_ON(void) { (PORTC |= (1<<7)); } +static inline void KEY_HYS_OFF(void) { (PORTC &= ~(1<<7)); } +static inline void KEY_INIT(void) +{ + /* Col */ + DDRB |= 0x1F; + /* Key: input with pull-up */ + DDRC &= ~(1<<6); + PORTC |= (1<<6); + /* Hys */ + DDRC |= (1<<7); + /* Row */ + DDRD |= 0xF0; + + KEY_UNABLE(); + KEY_HYS_OFF(); +} +static inline void SET_ROW(uint8_t ROW) +{ + // set row with unabling key + PORTD = (PORTD & 0x0F) | (1<<7) | ((ROW & 0x07) << 4); +} +static inline void SET_COL(uint8_t COL) +{ + // |PB3(Z5 ~EN)|PB4(Z4 ~EN) + // --------|-----------|----------- + // Col:0-7 |high |low + // Col:8-F |low |high + PORTB = (PORTB & 0xE0) | ((COL & 0x08) ? 1<<4 : 1<<3) | (COL & 0x07); +} + + +#ifdef UNIMAP_ENABLE +/* unimap */ +#define KMAP( \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K31, K4C, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, \ + K79,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K7D,K52, \ + K78,K7B,K7A, K2C, K7E,K7C,K7F,K50,K51,K4F \ +) UNIMAP( \ + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,NO, K2A, K49,NO, NO, NO, NO, NO, NO, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,NO, NO, NO, NO, NO, NO, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, NO, K28, NO, NO, NO, NO, \ + K79,NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, NO, K7D, K52, NO, NO, NO, NO, \ + K78,K7B,K7A,NO, K2C, NO, NO, K7E,K7F,NO, K7C, K50,K51,K4F, NO, NO, NO \ +) +#else +/* actionmap */ +#define KMAP( \ + K13, K10, K11, K12, K14, K16, K17, K15, K1B, K18, K19, K1A, K1C, K1E, K1F, \ + K03, K00, K01, K02, K04, K06, K07, K05, K0B, K08, K09, K0A, K0C, K0E, K0F, \ + K43, K40, K41, K42, K44, K46, K47, K45, K4B, K48, K49, K4A, K4E, \ + K33, K31, K32, K34, K36, K37, K35, K3B, K38, K39, K3A, K3C, K3D, \ + K23, K21, K22, K27, K28, K2A, K2C, K2E, K2D, K2F \ +) { \ + { AC_##K00, AC_##K01, AC_##K02, AC_##K03, AC_##K04, AC_##K05, AC_##K06, AC_##K07, \ + AC_##K08, AC_##K09, AC_##K0A, AC_##K0B, AC_##K0C, AC_NO, AC_##K0E, AC_##K0F }, \ + { AC_##K10, AC_##K11, AC_##K12, AC_##K13, AC_##K14, AC_##K15, AC_##K16, AC_##K17, \ + AC_##K18, AC_##K19, AC_##K1A, AC_##K1B, AC_##K1C, AC_NO, AC_##K1E, AC_##K1F }, \ + { AC_NO, AC_##K21, AC_##K22, AC_##K23, AC_NO, AC_NO, AC_NO, AC_##K27, \ + AC_##K28, AC_NO, AC_##K2A, AC_NO, AC_##K2C, AC_##K2D, AC_##K2E, AC_##K2F }, \ + { AC_NO, AC_##K31, AC_##K32, AC_##K33, AC_##K34, AC_##K35, AC_##K36, AC_##K37, \ + AC_##K38, AC_##K39, AC_##K3A, AC_##K3B, AC_##K3C, AC_##K3D, AC_NO, AC_NO }, \ + { AC_##K40, AC_##K41, AC_##K42, AC_##K43, AC_##K44, AC_##K45, AC_##K46, AC_##K47, \ + AC_##K48, AC_##K49, AC_##K4A, AC_##K4B, AC_NO, AC_NO, AC_##K4E, AC_NO }, \ + { AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, \ + AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO }, \ + { AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, \ + AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO }, \ + { AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, \ + AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO, AC_NO } \ +} +#endif + +#endif diff --git a/keyboard/fc660c/unimap.c b/keyboard/fc660c/unimap.c new file mode 100644 index 00000000..77c33506 --- /dev/null +++ b/keyboard/fc660c/unimap.c @@ -0,0 +1,19 @@ +#include "action.h" +#include "actionmap.h" +#include "hook.h" +#include "fc660c.h" + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + [0] = KMAP( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, + CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,UP, + LCTL,LGUI,LALT, SPC, RALT,RCTL,GRV, LEFT,DOWN,RGHT + ), +}; diff --git a/keyboard/fc660c/unimap_emu.c b/keyboard/fc660c/unimap_emu.c new file mode 100644 index 00000000..50e44599 --- /dev/null +++ b/keyboard/fc660c/unimap_emu.c @@ -0,0 +1,65 @@ +#include "action.h" +#include "actionmap.h" +#include "hook.h" +#include "fc660c.h" + + +#define AC_L3 ACTION_LAYER_MOMENTARY(3) +#define AC_L4 ACTION_LAYER_MOMENTARY(4) +#define AC_LS_2 ACTION_LAYER_MODS(2, MOD_LSFT) +#define AC_RS_2 ACTION_LAYER_MODS(2, MOD_RSFT) +#define AC_TGL1 ACTION_LAYER_TOGGLE(1) + +// emulates FC660C default keymap +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + [0] = KMAP( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, + LS_2,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RS_2,UP, + LCTL,LGUI,LALT, SPC, RALT,RCTL,L3, LEFT,DOWN,RGHT + ), + [1] = KMAP( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,UP, + LCTL,LGUI,LALT, SPC, RALT,RCTL,L4, LEFT,DOWN,RGHT + ), + [2] = KMAP( + GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS + ), + [3] = KMAP( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, + CAPS,TGL1,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,TRNS,TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,TRNS, TRNS,PGUP, + TRNS,TRNS,TRNS, TRNS, TRNS,APP, L3, HOME,PGDN,END + ), + [4] = KMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, + CAPS,TGL1,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,TRNS,TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,TRNS, TRNS,PGUP, + TRNS,TRNS,TRNS, TRNS, TRNS,APP, L4, HOME,PGDN,END + ), +}; + + +void hook_layer_change(uint32_t layer_state) +{ + // lights LED on Insert when layer 1 is enabled + if (layer_state & (1L<<1)) { + PORTB &= ~(1<<5); + } else { + PORTB |= (1<<5); + } +} diff --git a/keyboard/fc660c/unimap_hasu.c b/keyboard/fc660c/unimap_hasu.c new file mode 100644 index 00000000..4eac06b6 --- /dev/null +++ b/keyboard/fc660c/unimap_hasu.c @@ -0,0 +1,84 @@ +#include "action.h" +#include "actionmap.h" +#include "hook.h" +#include "fc660c.h" + + +#define AC_L3 ACTION_LAYER_MOMENTARY(3) +#define AC_L4 ACTION_LAYER_MOMENTARY(4) +#define AC_LS_2 ACTION_LAYER_MODS(2, MOD_LSFT) +#define AC_RS_2 ACTION_LAYER_MODS(2, MOD_RSFT) +#define AC_TGL1 ACTION_LAYER_TOGGLE(1) +#define AC_SPC5 ACTION_LAYER_TAP_KEY(5, KC_SPC) +#define AC_SLS6 ACTION_LAYER_TAP_KEY(6, KC_SLSH) + +#define AC_BACK ACTION_MODS_KEY(MOD_LALT, KC_LEFT) +#define AC_FRWD ACTION_MODS_KEY(MOD_LALT, KC_RIGHT) + +// emulates FC660C default keymap +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + [0] = KMAP( \ + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS, INS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, DEL, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, + LS_2,Z, X, C, V, B, N, M, COMM,DOT, SLS6, RS_2,UP, + L3, LGUI,LALT, SPC5, RALT,RCTL,L3, LEFT,DOWN,RGHT + ), + [1] = KMAP( + GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS, INS, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, DEL, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, + LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,UP, + L4, LGUI,LALT, SPC5, RALT,RCTL,L4, LEFT,DOWN,RGHT + ), + [2] = KMAP( + GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS + ), + [3] = KMAP( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, + CAPS,TGL1,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,TRNS,TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,TRNS, TRNS,PGUP, + L3, TRNS,TRNS, TRNS, TRNS,APP, L3, HOME,PGDN,END + ), + [4] = KMAP( + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, + CAPS,TGL1,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,TRNS,TRNS,TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,TRNS,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,TRNS, TRNS,PGUP, + L4, TRNS,TRNS, TRNS, TRNS,APP, L4, HOME,PGDN,END + ), + [5] = KMAP( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5,TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,MS_L,MS_D,MS_R,BTN1,TRNS, TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,BTN3,BTN2,BTN1,BACK,FRWD,TRNS, TRNS,PGUP, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,HOME,PGDN,END + ), + [6] = KMAP( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, + TRNS,HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, TRNS,TRNS,TRNS,TRNS, TRNS, + TRNS,TRNS,LEFT,DOWN,RGHT,TRNS,LEFT,DOWN,UP, RGHT,TRNS,TRNS, TRNS, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,HOME,PGDN,PGUP,END, TRNS, TRNS,PGUP, + TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,HOME,PGDN,END + ), +}; + + +void hook_layer_change(uint32_t layer_state) +{ + // lights LED on Insert when layer 1 is enabled + if (layer_state & (1L<<1)) { + PORTB &= ~(1<<5); + } else { + PORTB |= (1<<5); + } +} diff --git a/keyboard/fc660c/update_bin.sh b/keyboard/fc660c/update_bin.sh new file mode 100644 index 00000000..032ddd7c --- /dev/null +++ b/keyboard/fc660c/update_bin.sh @@ -0,0 +1,8 @@ +#!/bin/sh +make clean +make +cp fc660c.hex binary/fc660c.hex +make clean +make KEYMAP=emu +cp fc660c.hex binary/fc660c_emu.hex +make clean diff --git a/keyboard/gh60/Makefile b/keyboard/gh60/Makefile index 083b87c3..b0e7a30e 100644 --- a/keyboard/gh60/Makefile +++ b/keyboard/gh60/Makefile @@ -48,8 +48,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP @@ -120,7 +119,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +NKRO_ENABLE = yes # USB Nkey Rollover # Optimize size but this may cause error "relocation truncated to fit" diff --git a/keyboard/gh60/keymap_common.c b/keyboard/gh60/keymap_common.c deleted file mode 100644 index fdb1769e..00000000 --- a/keyboard/gh60/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/gh60/keymap_common.h b/keyboard/gh60/keymap_common.h index 896badd7..7dbdf4b9 100644 --- a/keyboard/gh60/keymap_common.h +++ b/keyboard/gh60/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -30,10 +29,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* GH60 keymap definition macro * K2C, K31 and K3C are extra keys for ISO */ diff --git a/keyboard/gh60/keymap_hasu.c b/keyboard/gh60/keymap_hasu.c index e6af2858..cdeefb26 100644 --- a/keyboard/gh60/keymap_hasu.c +++ b/keyboard/gh60/keymap_hasu.c @@ -131,7 +131,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(4), [1] = ACTION_LAYER_TAP_KEY(5, KC_SLASH), [2] = ACTION_LAYER_TAP_KEY(6, KC_SCLN), diff --git a/keyboard/gh60/keymap_hhkb.c b/keyboard/gh60/keymap_hhkb.c index ce1b816e..4253c385 100644 --- a/keyboard/gh60/keymap_hhkb.c +++ b/keyboard/gh60/keymap_hhkb.c @@ -47,6 +47,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/gh60/keymap_plain.c b/keyboard/gh60/keymap_plain.c index 3138c180..1cd52139 100644 --- a/keyboard/gh60/keymap_plain.c +++ b/keyboard/gh60/keymap_plain.c @@ -8,4 +8,4 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH,NO, RSFT, \ LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL), }; -const uint16_t PROGMEM fn_actions[] = {}; +const action_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/gh60/keymap_poker.c b/keyboard/gh60/keymap_poker.c index 7a612ee4..5e94184f 100644 --- a/keyboard/gh60/keymap_poker.c +++ b/keyboard/gh60/keymap_poker.c @@ -90,7 +90,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,FN6, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { /* Poker Layout */ [0] = ACTION_LAYER_MOMENTARY(6), // to Fn overlay [1] = ACTION_LAYER_TOGGLE(4), // toggle arrow overlay diff --git a/keyboard/gh60/keymap_poker_bit.c b/keyboard/gh60/keymap_poker_bit.c index b8870fdd..f6045644 100644 --- a/keyboard/gh60/keymap_poker_bit.c +++ b/keyboard/gh60/keymap_poker_bit.c @@ -40,7 +40,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ TRNS,TRNS,TRNS, TRNS, TRNS,LEFT,DOWN,RGHT), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { /* Poker Layout */ [0] = ACTION_LAYER_BIT_XOR(1, 0b0101, ON_BOTH), // Poker Fn(with fix for Esc) [1] = ACTION_LAYER_TOGGLE(5), // Poker Arrow toggle diff --git a/keyboard/gh60/keymap_poker_set.c b/keyboard/gh60/keymap_poker_set.c index aaa31fc5..ec17605d 100644 --- a/keyboard/gh60/keymap_poker_set.c +++ b/keyboard/gh60/keymap_poker_set.c @@ -65,7 +65,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { /* Poker Layout */ [0] = ACTION_LAYER_SET(4, ON_PRESS), // FN0 move to Fn'd when press [1] = ACTION_LAYER_SET(5, ON_PRESS), // FN1 move to Fn'd arrow when press diff --git a/keyboard/gh60/keymap_spacefn.c b/keyboard/gh60/keymap_spacefn.c index 8077dcee..8724b56d 100644 --- a/keyboard/gh60/keymap_spacefn.c +++ b/keyboard/gh60/keymap_spacefn.c @@ -49,7 +49,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/keyboard/gh60/matrix.c b/keyboard/gh60/matrix.c index a6121515..5a56cee0 100644 --- a/keyboard/gh60/matrix.c +++ b/keyboard/gh60/matrix.c @@ -43,18 +43,6 @@ static void unselect_rows(void); static void select_row(uint8_t row); -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 @@ -97,43 +85,12 @@ uint8_t matrix_scan(void) 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<5~EN <-+ | <6-------|-|-|-|-|-|-|-|--|R|-+ + | 2 4 | | | <7-------|-|-|-|-|-|-|-|--|R|-+ +---V---^-+ | +-^-^-^--+ 0 1 2 3 4 5 6 7 33K*8 KEY HYS | A B C +-----------------+ | | +-^----+ | | | | LS145 | @@ -130,14 +130,14 @@ Matrix diagram: |bias control? - - - - - --- | 3.9K*5 R R R R R | +--------^+ +--------+ - - - - - | - | | | HC4051 <0-----------|-|-|-|-|----|R|-+ + | 3| | HC4051 <0-----------|-|-|-|-|----|R|-+ | |capa. | Z2 <1-----------|-|-|-|-|----|R|-+ | TP1684 |sense | <2-----------|-|-|-|-|----|R|-+ - | <---+--| <3-----------|-|-|-|-|----|R|-+ + | 20<---+--| <3-----------|-|-|-|-|----|R|-+ | | | | <4-----------|-|-|-|-|----|R|-+ | | ~En| <5-----------|-|-|-|-|----|R|-+ - | | +----> <6-----------|-|-|-|-|----|R|-+ - | | | | | A B C <7-----------|-|-|-|-|----|R|-+ + >5~EN | +----> <6-----------|-|-|-|-|----|R|-+ + | 2 4 | | | | A B C <7-----------|-|-|-|-|----|R|-+ +---V---^-+ | | +-^-^-^--+ | | | | | | KEY HYS | | | | | | | | | | | | | | | +--------+ | | | | | | @@ -159,6 +159,8 @@ Matrix diagram: +--------------------------------------------------+ | | connector | --- +--------------------------------------------------+ GND + +TP1684-5(~EN) pin is connected with LS145-D/Connector-11. Signals charts @@ -170,7 +172,7 @@ Signals charts (HHKB_chart1.jpg) Space bar locate at ROW:3 COL:7. A key is selected by HC4051(C,B,A) and LS145(C,B,A). - Key state can be read on TP1684(4/KEY) while asserting low on LS145(D). + Key state can be read on TP1684(4) while asserting low on LS145(D). (HHKB_chart2.jpg) diff --git a/keyboard/hhkb/hhkb_avr.h b/keyboard/hhkb/hhkb_avr.h index 7ea6322c..5cb1d0d7 100644 --- a/keyboard/hhkb/hhkb_avr.h +++ b/keyboard/hhkb/hhkb_avr.h @@ -71,6 +71,10 @@ static inline void KEY_INIT(void) /* row extention for HHKB JP */ DDRC |= (1<<6|1<<7); PORTC |= (1<<6|1<<7); +#else + /* input with pull up to save power */ + DDRC &= ~(1<<6|1<<7); + PORTC |= (1<<6|1<<7); #endif KEY_UNABLE(); KEY_PREV_OFF(); diff --git a/keyboard/hhkb/keymap_common.c b/keyboard/hhkb/keymap_common.c deleted file mode 100644 index e938fb62..00000000 --- a/keyboard/hhkb/keymap_common.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -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 . -*/ -#include -#include "action.h" -#include -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/hhkb/keymap_common.h b/keyboard/hhkb/keymap_common.h index 3622665f..97e2e098 100644 --- a/keyboard/hhkb/keymap_common.h +++ b/keyboard/hhkb/keymap_common.h @@ -32,10 +32,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - #define KEYMAP( \ K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \ K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \ diff --git a/keyboard/hhkb/keymap_hasu.c b/keyboard/hhkb/keymap_hasu.c index a5602ded..b63265c9 100644 --- a/keyboard/hhkb/keymap_hasu.c +++ b/keyboard/hhkb/keymap_hasu.c @@ -192,9 +192,9 @@ enum macro_id { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) diff --git a/keyboard/hhkb/keymap_hhkb.c b/keyboard/hhkb/keymap_hhkb.c index 7807f436..ae96e834 100644 --- a/keyboard/hhkb/keymap_hhkb.c +++ b/keyboard/hhkb/keymap_hhkb.c @@ -54,7 +54,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), [2] = ACTION_LAYER_MOMENTARY(3), @@ -89,7 +89,7 @@ const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { [31] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_BSLASH), }; #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), }; #endif diff --git a/keyboard/hhkb/keymap_jp.c b/keyboard/hhkb/keymap_jp.c index 48d0ee70..152674d0 100644 --- a/keyboard/hhkb/keymap_jp.c +++ b/keyboard/hhkb/keymap_jp.c @@ -42,9 +42,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/hhkb/keymap_spacefn.c b/keyboard/hhkb/keymap_spacefn.c index deff920a..b5a8c8b4 100644 --- a/keyboard/hhkb/keymap_spacefn.c +++ b/keyboard/hhkb/keymap_spacefn.c @@ -108,7 +108,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), [2] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde diff --git a/keyboard/hhkb/matrix.c b/keyboard/hhkb/matrix.c index 14fae0b8..08721fc5 100644 --- a/keyboard/hhkb/matrix.c +++ b/keyboard/hhkb/matrix.c @@ -43,18 +43,6 @@ static matrix_row_t _matrix0[MATRIX_ROWS]; static matrix_row_t _matrix1[MATRIX_ROWS]; -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { #ifdef DEBUG @@ -153,41 +141,12 @@ uint8_t matrix_scan(void) return 1; } -bool matrix_is_modified(void) -{ - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix[i] != matrix_prev[i]) - return true; - } - return false; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1< +#include "host_driver.h" host_driver_t rn42_driver; host_driver_t rn42_config_driver; @@ -20,4 +21,10 @@ void rn42_cts_lo(void); bool rn42_linked(void); void rn42_set_leds(uint8_t l); +const char *rn42_send_command(const char *cmd); +void rn42_send_str(const char *str); +void rn42_print_response(void); +#define SEND_STR(str) rn42_send_str(PSTR(str)) +#define SEND_COMMAND(cmd) rn42_send_command(PSTR(cmd)) + #endif diff --git a/keyboard/hhkb/rn42/rn42_task.c b/keyboard/hhkb/rn42/rn42_task.c index 5107fef4..cef6a547 100644 --- a/keyboard/hhkb/rn42/rn42_task.c +++ b/keyboard/hhkb/rn42/rn42_task.c @@ -125,40 +125,6 @@ void rn42_task(void) ******************************************************************************/ static host_driver_t *prev_driver = &rn42_driver; -static void print_rn42(void) -{ - int16_t c; - while ((c = rn42_getc()) != -1) { - xprintf("%c", c); - } -} - -static void clear_rn42(void) -{ - while (rn42_getc() != -1) ; -} - -#define SEND_STR(str) send_str(PSTR(str)) -#define SEND_COMMAND(cmd) send_command(PSTR(cmd)) - -static void send_str(const char *str) -{ - uint8_t c; - while ((c = pgm_read_byte(str++))) - rn42_putc(c); -} - -static const char *send_command(const char *cmd) -{ - static const char *s; - send_str(cmd); - wait_ms(500); - s = rn42_gets(100); - xprintf("%s\r\n", s); - print_rn42(); - return s; -} - static void enter_command_mode(void) { prev_driver = host_get_driver(); @@ -171,7 +137,7 @@ static void enter_command_mode(void) wait_ms(1100); // need 1 sec SEND_COMMAND("$$$"); wait_ms(600); // need 1 sec - print_rn42(); + rn42_print_response(); const char *s = SEND_COMMAND("v\r\n"); if (strncmp("v", s, 1) != 0) SEND_COMMAND("+\r\n"); // local echo on } diff --git a/keyboard/hhkb/unimap_hasu.c b/keyboard/hhkb/unimap_hasu.c new file mode 100644 index 00000000..da16e9c8 --- /dev/null +++ b/keyboard/hhkb/unimap_hasu.c @@ -0,0 +1,152 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#include "unimap_trans.h" + + +/* id for user defined functions */ +enum function_id { + LSHIFT_LPAREN, +}; + +enum macro_id { + HELLO, + VOLUP, + ALT_TAB, +}; + +#define AC_L1 ACTION_LAYER_MOMENTARY(1) +#define AC_SLS2 ACTION_LAYER_TAP_KEY(2, KC_SLSH) +#define AC_SCL3 ACTION_LAYER_TAP_KEY(3, KC_SCLN) +#define AC_SPC4 ACTION_LAYER_TAP_KEY(4, KC_SPC) +#define AC_APSW ACTION_MACRO(ALT_TAB) +#define AC_BACK ACTION_MODS_KEY(MOD_LALT, KC_LEFT) +#define AC_FRWD ACTION_MODS_KEY(MOD_LALT, KC_RIGHT) +#define AC_ENT_ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT) + +// Function: LShift with tap '(' +#define AC_LPRN ACTION_FUNCTION_TAP(LSHIFT_LPAREN) +// Macro: say hello +#define AC_HELO ACTION_MACRO(HELLO) + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + [0] = UNIMAP_HHKB( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT_, + LPRN, Z, X, C, V, B, N, M, COMM,DOT, SLS2, RSFT,L1, + LGUI,LALT, SPC4, RALT,RGUI), + + [1] = UNIMAP_HHKB( + PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, + TRNS,TRNS, TRNS, TRNS,TRNS), + + [2] = UNIMAP_HHKB( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, + LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, + LSFT, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, TRNS, RSFT,TRNS, + LGUI,LALT, SPC, RALT,RGUI), + + [3] = UNIMAP_HHKB( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + APSW,NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BACK,FRWD, APSW, + LCTL,ACL0,ACL1,ACL2,ACL2,NO, NO, MS_L,MS_D,MS_R,TRNS,NO, ENT, + LSFT, NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, RSFT,TRNS, + LGUI,LALT, BTN1, TRNS,TRNS), + + [4] = UNIMAP_HHKB( + GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + APSW,NO, NO, NO, NO, NO, WH_L,WH_D,MS_U,WH_U,WH_R,BTN4,BTN5, APSW, + LCTL,VOLD,VOLU,MUTE,NO, NO, NO, MS_L,MS_D,MS_R,BTN1,NO, ENT, + LSFT, NO, NO, NO, NO, BTN3,BTN2,BTN1,BACK,FRWD,NO, RSFT,TRNS, + TRNS,TRNS, TRNS, TRNS,TRNS), +}; + + + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case HELLO: + return (record->event.pressed ? + MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : + MACRO_NONE ); + case VOLUP: + return (record->event.pressed ? + MACRO( D(VOLU), U(VOLU), END ) : + MACRO_NONE ); + case ALT_TAB: + return (record->event.pressed ? + MACRO( D(LALT), D(TAB), END ) : + MACRO( U(TAB), END )); + } + return MACRO_NONE; +} + + + +/* + * user defined action function + */ +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (record->event.pressed) dprint("P"); else dprint("R"); + dprintf("%d", record->tap.count); + if (record->tap.interrupted) dprint("i"); + dprint("\n"); + + switch (id) { + case LSHIFT_LPAREN: + // Shift parentheses example: LShft + tap '(' + // http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses + // http://geekhack.org/index.php?topic=41989.msg1304899#msg1304899 + if (record->event.pressed) { + if (record->tap.count > 0 && !record->tap.interrupted) { + if (record->tap.interrupted) { + dprint("tap interrupted\n"); + register_mods(MOD_BIT(KC_LSHIFT)); + } + } else { + register_mods(MOD_BIT(KC_LSHIFT)); + } + } else { + if (record->tap.count > 0 && !(record->tap.interrupted)) { + add_weak_mods(MOD_BIT(KC_LSHIFT)); + send_keyboard_report(); + register_code(KC_9); + unregister_code(KC_9); + del_weak_mods(MOD_BIT(KC_LSHIFT)); + send_keyboard_report(); + record->tap.count = 0; // ad hoc: cancel tap + } else { + unregister_mods(MOD_BIT(KC_LSHIFT)); + } + } + break; + } +} diff --git a/keyboard/hhkb/unimap_hhkb.c b/keyboard/hhkb/unimap_hhkb.c new file mode 100644 index 00000000..6ace66c2 --- /dev/null +++ b/keyboard/hhkb/unimap_hhkb.c @@ -0,0 +1,41 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_L1 ACTION_LAYER_MOMENTARY(1) + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + [0] = UNIMAP_HHKB( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, + LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT,L1, + LALT,LGUI, SPC, RGUI,RALT), + + [1] = UNIMAP_HHKB( + PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, PENT, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, + TRNS,TRNS, TRNS, TRNS,TRNS), +}; diff --git a/keyboard/hhkb/unimap_jp.c b/keyboard/hhkb/unimap_jp.c new file mode 100644 index 00000000..3fdd8e58 --- /dev/null +++ b/keyboard/hhkb/unimap_jp.c @@ -0,0 +1,43 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#include "unimap_trans.h" + + +#define AC_L1 ACTION_LAYER_MOMENTARY(1) + + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + [0] = UNIMAP_JP( + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, ENT, + LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH,RO, UP, RSFT, + L1, ZKHK,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,L1, LEFT,DOWN,RGHT + ), + + [1] = UNIMAP_JP( + PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,TRNS, PENT, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,TRNS,PGUP,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,HOME,PGDN,END + ), +}; diff --git a/keyboard/hhkb/unimap_trans.h b/keyboard/hhkb/unimap_trans.h new file mode 100644 index 00000000..40b8aa01 --- /dev/null +++ b/keyboard/hhkb/unimap_trans.h @@ -0,0 +1,175 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#ifndef UNIMAP_TRANS_H +#define UNIMAP_TRANS_H + +#include +#include +#include "keycode.h" +#include "action.h" +#include "action_code.h" +#include "action_layer.h" +#include "action_macro.h" +#include "action_util.h" +#include "report.h" +#include "host.h" +#include "print.h" +#include "debug.h" +#include "unimap.h" + + +#define UNIMAP_HHKB( \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, \ + K79, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K7D,K7C, \ + K7A,K7B, K2C, K7F,K7E \ +) UNIMAP( \ + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, NO, NO, NO, NO, NO, NO, NO, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, NO, NO, NO, NO, NO, NO, NO, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, NO, K28, NO, NO, NO, NO, \ + K79,NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, NO, K7D, NO, NO, NO, NO, NO, \ + NO, K7B,K7A,NO, K2C, NO, NO, K7E,K7F,NO, K7C, NO, NO, NO, NO, NO, NO \ +) + +#define UNIMAP_JP( \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34,K32, K28, \ + K79, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38,K75,K52,K7D, \ + K78,K29,K7B,K7A,K77, K2C, K76,K00,K7E,K7C,K50,K51,K4F \ +) UNIMAP( \ + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + K29, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, NO, NO, NO, NO, NO, NO, NO, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, NO, NO, NO, NO, NO, NO, NO, NO, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, NO, NO, NO, NO, \ + K79,NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K75,K7D, K52, NO, NO, NO, NO, \ + K78,K7B,K7A,K77, K2C, K76,K00,K7E,NO, NO, K7C, K50,K51,K4F, NO, NO, NO \ +) + + +/* Mapping to Universal keyboard layout + * + * Universal keyboard layout + * ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|KP=| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| + * `-----------------------------------------------------------' `-----------' `---------------' + */ + +#ifndef HHKB_JP +/* HHKB + * ,-----------------------------------------------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|BS | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '|Enter | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Ctl| + * `-----------------------------------------------------------' + * |Gui|Alt | Space |Alt |Gui| + * `-------------------------------------------' + * + * Matrix - row:8 x col:8 + * ,-----------------------------------------------------------. + * |31 |30 |00 |10 |11 |20 |21 |40 |41 |60 |61 |70 |71 |50 |51 | + * |-----------------------------------------------------------| + * |32 |01 |02 |13 |12 |23 |22 |42 |43 |62 |63 |73 |72 |52 | + * |-----------------------------------------------------------| + * |33 |04 |03 |14 |15 |24 |25 |45 |44 |65 |64 |74 | 53 | + * |-----------------------------------------------------------| + * |34 |05 |06 |07 |16 |17 |26 |46 |66 |76 |75 |55 |54 | + * `-----------------------------------------------------------' + * |35 |36 | 37 |57 |56 | + * `-------------------------------------------' + */ + +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_2, UNIMAP_Q, UNIMAP_W, UNIMAP_S, UNIMAP_A, UNIMAP_Z, UNIMAP_X, UNIMAP_C, }, + { UNIMAP_3, UNIMAP_4, UNIMAP_R, UNIMAP_E, UNIMAP_D, UNIMAP_F, UNIMAP_V, UNIMAP_B, }, + { UNIMAP_5, UNIMAP_6, UNIMAP_Y, UNIMAP_T, UNIMAP_G, UNIMAP_H, UNIMAP_N, UNIMAP_NO, }, + { UNIMAP_1, UNIMAP_GRAVE, UNIMAP_TAB, UNIMAP_CAPSLOCK, UNIMAP_LSHIFT, UNIMAP_LALT, UNIMAP_LGUI, UNIMAP_SPACE, }, + { UNIMAP_7, UNIMAP_8, UNIMAP_U, UNIMAP_I, UNIMAP_K, UNIMAP_J, UNIMAP_M, UNIMAP_NO, }, + { UNIMAP_JYEN, UNIMAP_BSPACE, UNIMAP_BSLASH, UNIMAP_ENTER, UNIMAP_RCTRL, UNIMAP_RSHIFT, UNIMAP_RALT, UNIMAP_RGUI, }, + { UNIMAP_9, UNIMAP_0, UNIMAP_O, UNIMAP_P, UNIMAP_SCOLON, UNIMAP_L, UNIMAP_COMMA, UNIMAP_NO, }, + { UNIMAP_MINUS, UNIMAP_EQUAL, UNIMAP_RBRACKET, UNIMAP_LBRACKET, UNIMAP_QUOTE, UNIMAP_SLASH, UNIMAP_DOT, UNIMAP_NO, }, +}; + +#else +/* HHKB JP + * ,-----------------------------------------------------------. + * |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |JPY|BS | + * |-----------------------------------------------------------| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] | | + * |------------------------------------------------------` | + * |CapsL |A |S |D |F |G |H |J |K |L |; |' |# |Entr| + * |-----------------------------------------------------------| + * |Shift |Z |X |C |V |B |N |M |, |. |/ |RO |Up |Shi| + * |-----------------------------------------------------------| + * |Ctl||Esc|Gui|Alt|MHE| |HEN|KAN|Alt|Ctl||Lef|Dow|Rig| + * `-----------------------------------------------------------' + * + * Matrix - row:16 x col:8 + * ,-----------------------------------------------------------. + * |02 |32 |62 |22 |12 |52 |72 |A2 |92 |82 |B2 |E2 |F2 |D2 |C2 | + * |-----------------------------------------------------------| + * |03 |63 |23 |13 |53 |73 |A3 |93 |83 |B3 |E3 |F3 |D3 | | + * |------------------------------------------------------` | + * |06 |66 |26 |16 |56 |76 |A6 |96 |86 |B6 |E6 |F6 |D6 | C6 | + * |-----------------------------------------------------------| + * |05 |65 |25 |15 |55 |75 |A5 |95 |85 |B5 |E5 |F5 |D5 |C5 | + * |-----------------------------------------------------------| + * |04 ||34 |64 |24 |14 | 74 |94 |84 |B4 |E4 ||F4 |D4 |C4 | + * `-----------------------------------------------------------' + */ +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + { UNIMAP_NO, UNIMAP_NO, UNIMAP_GRAVE, UNIMAP_TAB, UNIMAP_LCTRL, UNIMAP_LSHIFT, UNIMAP_CAPSLOCK, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_4, UNIMAP_E, UNIMAP_MHEN, UNIMAP_C, UNIMAP_D, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_3, UNIMAP_W, UNIMAP_LALT, UNIMAP_X, UNIMAP_S, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_1, UNIMAP_NO, UNIMAP_ESCAPE, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_5, UNIMAP_R, UNIMAP_NO, UNIMAP_V, UNIMAP_F, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_2, UNIMAP_Q, UNIMAP_LGUI, UNIMAP_Z, UNIMAP_A, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_6, UNIMAP_T, UNIMAP_SPACE, UNIMAP_B, UNIMAP_G, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_9, UNIMAP_I, UNIMAP_KANA, UNIMAP_COMMA, UNIMAP_K, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_8, UNIMAP_U, UNIMAP_HENK, UNIMAP_M, UNIMAP_J, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_7, UNIMAP_Y, UNIMAP_NO, UNIMAP_N, UNIMAP_H, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_0, UNIMAP_O, UNIMAP_RALT, UNIMAP_DOT, UNIMAP_L, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_BSPACE, UNIMAP_NO, UNIMAP_RIGHT, UNIMAP_RSHIFT, UNIMAP_ENTER, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_JYEN, UNIMAP_RBRACKET, UNIMAP_DOWN, UNIMAP_UP, UNIMAP_NONUS_HASH, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_MINUS, UNIMAP_P, UNIMAP_RCTRL, UNIMAP_SLASH, UNIMAP_SCOLON, UNIMAP_NO, }, + { UNIMAP_NO, UNIMAP_NO, UNIMAP_EQUAL, UNIMAP_LBRACKET, UNIMAP_LEFT, UNIMAP_RO, UNIMAP_QUOTE, UNIMAP_NO, }, +}; +#endif + +#endif diff --git a/keyboard/infinity/Makefile b/keyboard/infinity/Makefile index 052134c3..5b3c1fe6 100644 --- a/keyboard/infinity/Makefile +++ b/keyboard/infinity/Makefile @@ -9,7 +9,6 @@ OBJDIR = ./build OBJECTS = \ $(OBJDIR)/matrix.o \ - $(OBJDIR)/keymap_common.o \ $(OBJDIR)/led.o \ $(OBJDIR)/main.o diff --git a/keyboard/infinity/Makefile.led b/keyboard/infinity/Makefile.led new file mode 100644 index 00000000..12571b88 --- /dev/null +++ b/keyboard/infinity/Makefile.led @@ -0,0 +1,2 @@ +OPT_DEFS += -DINFINITY_LED +include Makefile diff --git a/keyboard/infinity/Makefile.prototype b/keyboard/infinity/Makefile.prototype new file mode 100644 index 00000000..99853243 --- /dev/null +++ b/keyboard/infinity/Makefile.prototype @@ -0,0 +1,2 @@ +OPT_DEFS += -DINFINITY_PROTOTYPE +include Makefile diff --git a/keyboard/infinity/README b/keyboard/infinity/README index 53d1c917..18da9a88 100644 --- a/keyboard/infinity/README +++ b/keyboard/infinity/README @@ -26,8 +26,12 @@ http://cache.freescale.com/files/32bit/doc/data_sheet/K20P48M50SF0.pdf Pin Usage ========= Key Matrix: - Strobe(output high): PTB0 PTB1 PTB2 PTB3 PTB16 PTB17 PTC4 PTC5 PTD0 - Sense(input with pull-down): PTD1 PTD2 PTD3 PTD4 PTD5 PTD6 PTD7 + For v1.0 (without LED support) + strobe(output high): ptb0 ptb1 ptb2 ptb3 ptb16 ptb17 ptc4 ptc5 ptd0 + sense(input with pull-down): ptd1 ptd2 ptd3 ptd4 ptd5 ptd6 ptd7 + For v1.1a (with LED support) + strobe(output high): ptc0 ptc1 ptc2 ptc3 ptc4 ptc5 ptc6 ptc7 ptd0 + sense(input with pull-down): ptd1 ptd2 ptd3 ptd4 ptd5 ptd6 ptd7 SWD pinout: @@ -47,7 +51,7 @@ kiibohd bootloader: Lib/mk20dx128vlf5.bootloader.ld | .vectors | ------------. | StackPointer0 | of Bootloader | .startup | \ | ResetHandler1 | | .rodata | `--+---------------+ 0xF8 -0x0000_0400 | .flashconfig(0x10)| +0x0000_0400 | .flashconfig(0x10)| _0410 | .text | | .init | 0x0000_1000 +-------------------+ -----------------+---------------+ Vector table @@ -62,7 +66,7 @@ kiibohd bootloader: Lib/mk20dx128vlf5.bootloader.ld 0x1FFF_E000 +-------------------+ -----------------+---------------+ Vector table _E0F8 | | ------------. | | of App(copied) - | | \ | | + | | \ | | | | `--+---------------+ mbed NVIC | | | RAM | diff --git a/keyboard/infinity/config.h b/keyboard/infinity/config.h index dc734dbd..c9295a19 100644 --- a/keyboard/infinity/config.h +++ b/keyboard/infinity/config.h @@ -34,10 +34,13 @@ along with this program. If not, see . #define MATRIX_COLS 7 // Sense /* key combination for command */ -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) /* for prototype */ //#define INFINITY_PROTOTYPE +/* Version 1.1a of the board */ +//#define INFINITY_LED + #endif diff --git a/keyboard/infinity/keymap.c b/keyboard/infinity/keymap.c index 4726cee6..c2845b18 100644 --- a/keyboard/infinity/keymap.c +++ b/keyboard/infinity/keymap.c @@ -42,7 +42,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/infinity/keymap_common.c b/keyboard/infinity/keymap_common.c deleted file mode 100644 index fdb1769e..00000000 --- a/keyboard/infinity/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/infinity/keymap_common.h b/keyboard/infinity/keymap_common.h index b0f765bf..412417a2 100644 --- a/keyboard/infinity/keymap_common.h +++ b/keyboard/infinity/keymap_common.h @@ -29,10 +29,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - #ifdef INFINITY_PROTOTYPE /* Infinity prototype */ diff --git a/keyboard/infinity/led.c b/keyboard/infinity/led.c index b7e638b2..ce9d510b 100644 --- a/keyboard/infinity/led.c +++ b/keyboard/infinity/led.c @@ -19,7 +19,7 @@ along with this program. If not, see . #include "led.h" -/* HHKB has no LEDs */ +/* TODO: setup led support for 1.1a version of the board */ void led_set(uint8_t usb_led) { } diff --git a/keyboard/infinity/matrix.c b/keyboard/infinity/matrix.c index 478a40fd..60cadc4e 100644 --- a/keyboard/infinity/matrix.c +++ b/keyboard/infinity/matrix.c @@ -39,6 +39,7 @@ void matrix_init(void) gpio_init_in_ex(&col[5], PTD6, PullDown); gpio_init_in_ex(&col[6], PTD7, PullDown); +#ifndef INFINITY_LED /* Row(strobe) */ gpio_init_out_ex(&row[0], PTB0, 0); gpio_init_out_ex(&row[1], PTB1, 0); @@ -49,6 +50,18 @@ void matrix_init(void) gpio_init_out_ex(&row[6], PTC4, 0); gpio_init_out_ex(&row[7], PTC5, 0); gpio_init_out_ex(&row[8], PTD0, 0); +#else + gpio_init_out_ex(&row[0], PTC0, 0); + gpio_init_out_ex(&row[1], PTC1, 0); + gpio_init_out_ex(&row[2], PTC2, 0); + gpio_init_out_ex(&row[3], PTC3, 0); + gpio_init_out_ex(&row[4], PTC4, 0); + gpio_init_out_ex(&row[5], PTC5, 0); + gpio_init_out_ex(&row[6], PTC6, 0); + gpio_init_out_ex(&row[7], PTC7, 0); + gpio_init_out_ex(&row[8], PTD0, 0); + +#endif } uint8_t matrix_scan(void) diff --git a/keyboard/infinity_chibios/Makefile b/keyboard/infinity_chibios/Makefile index 9999451c..3873239a 100644 --- a/keyboard/infinity_chibios/Makefile +++ b/keyboard/infinity_chibios/Makefile @@ -9,7 +9,6 @@ TARGET_DIR = . # project specific files SRC = matrix.c \ - keymap_common.c \ led.c ifdef KEYMAP diff --git a/keyboard/infinity_chibios/keymap_common.c b/keyboard/infinity_chibios/keymap_common.c deleted file mode 100644 index 69b170ce..00000000 --- a/keyboard/infinity_chibios/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -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 . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return keymaps[(layer)][(key.row)][(key.col)]; -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; -} diff --git a/keyboard/infinity_chibios/keymap_common.h b/keyboard/infinity_chibios/keymap_common.h index 260822fc..d958f30f 100644 --- a/keyboard/infinity_chibios/keymap_common.h +++ b/keyboard/infinity_chibios/keymap_common.h @@ -30,10 +30,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - #ifdef INFINITY_PROTOTYPE /* Infinity prototype */ diff --git a/keyboard/infinity_chibios/keymap_hasu.c b/keyboard/infinity_chibios/keymap_hasu.c index 2d0635f0..538de746 100644 --- a/keyboard/infinity_chibios/keymap_hasu.c +++ b/keyboard/infinity_chibios/keymap_hasu.c @@ -119,7 +119,7 @@ enum macro_id { /* * Fn action definition */ -const uint16_t fn_actions[] = { +const action_t fn_actions[] = { [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* diff --git a/keyboard/infinity_chibios/keymap_plain.c b/keyboard/infinity_chibios/keymap_plain.c index 2673d6aa..0015a0b2 100644 --- a/keyboard/infinity_chibios/keymap_plain.c +++ b/keyboard/infinity_chibios/keymap_plain.c @@ -42,7 +42,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t fn_actions[] = { +const action_t fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/kl27z_kbd/Makefile b/keyboard/kl27z_kbd/Makefile new file mode 100644 index 00000000..369054f1 --- /dev/null +++ b/keyboard/kl27z_kbd/Makefile @@ -0,0 +1,70 @@ +# Target file name (without extension). +PROJECT = kl27z_kbd + +# Directory common source files exist +TMK_DIR = ../../tmk_core + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# project specific files +SRC = $(PROJECT).c + +CONFIG_H = config.h + +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +# - For Teensies, FAMILY = KINETIS and SERIES is either +# KL2x (LC) or K20x (3.0,3.1,3.2). +MCU_FAMILY = KINETIS +MCU_SERIES = KL2x + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# - NOTE: a custom ld script is needed for EEPROM on Teensy LC +# - LDSCRIPT = +# - MKL26Z64 for Teensy LC +# - MK20DX128 for Teensy 3.0 +# - MK20DX256 for Teensy 3.1 and 3.2 +MCU_LDSCRIPT = MKL27Z256 + +# Startup code to use +# - it should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +# - STARTUP = +# - kl2x for Teensy LC +# - k20x5 for Teensy 3.0 +# - k20x7 for Teensy 3.1 and 3.2 +MCU_STARTUP = kl2x + +# Board: it should exist either in /os/hal/boards/ +# or /boards +# - BOARD = +# - PJRC_TEENSY_LC for Teensy LC +# - PJRC_TEENSY_3 for Teensy 3.0 +# - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2 +BOARD = ELF + +# Cortex version +# Teensy LC is cortex-m0plus; Teensy 3.x are cortex-m4 +MCU = cortex-m0plus + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +# I.e. 6 for Teensy LC; 7 for Teensy 3.x +ARMV = 6 + +# Build Options +# comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.) +#MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +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 + +include $(TMK_DIR)/tool/chibios/common.mk +include $(TMK_DIR)/tool/chibios/chibios.mk diff --git a/keyboard/kl27z_kbd/Matrix.txt b/keyboard/kl27z_kbd/Matrix.txt new file mode 100644 index 00000000..05d3a5da --- /dev/null +++ b/keyboard/kl27z_kbd/Matrix.txt @@ -0,0 +1,34 @@ +COL +--- +Anode side, senses keys with internal pull-up. + +Left to right: + + PTD6 + PTD5 + PTD4 + PTD3 + + PTA19 + PTA18 + PTA4 NMI + PTA2 + PTA1 + + PTE25 + PTE24 + PTE30 + PTE29 + PTE21 + +ROW +---- +Cathod side, given strobe with output low. + +Top to bottom: + + PTB3 + PTB16 + PTB17 + PTC0 + PTC1 diff --git a/keyboard/kl27z_kbd/README.md b/keyboard/kl27z_kbd/README.md new file mode 100644 index 00000000..b10e4b37 --- /dev/null +++ b/keyboard/kl27z_kbd/README.md @@ -0,0 +1,161 @@ +KL27Z128/256 board +================== +2016/11/30 + +KL27Z is configured to use internal 48MHz RC oscillator. + +The board has push button on PTA4 and LED on PTD7. The button works as 'a' key and the LED as an indicator for capslock. + + +ELF board +--------- +This board acommodates 48QFN chip. + +### prototypte pinout +- pcb layout https://deskthority.net/resources/image/33293 +- schematic https://deskthority.net/resources/image/33252 + + +``` + G G + N 5 D D N F D D D D D D + D V - + D G \ USB / 6 5 4 3 2 1 + ,--------------------- | Conn | --------------------. + |39 40 41 42 43 44 | | 1 2 3 4 5 6 | + 3.3V|38 |_________| 7 |D0 + A0|37 RST 8 |C7 + A3|36 9 |C6 + +A20|35 10|C5+ + E20|34 11|C4 + E21|33 BL 12|C3 + E29|32 13|C2 + |31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14| + `-------------------------------------------------------' + E E E A A A 3 A G A C B B B B B C C + 3 2 2 1 2 4 . 1 N 1 1 1 2 3 1 1 0 1 + 0 4 5 + + 3V 8 D 9 6 7 + + + 1 PTD6 12 PTC3 23 GND 34 PTE20* + 2 PTD5 13 PTC2 24 PTA18 35 PTA20/Reset+ + 3 PTD4 14 PTC1 25 3.3V 36 PTA3/SWD_DIO + 4 PTD3* 15 PTC0* 26 PTA4/NMI+ 37 PTA0/SWD_CLK + 5 PTD2* 16 PTB17* 27 PTA2 38 3.3V + 6 PTD1* 17 PTB16* 28 PTA1+ 39 GND + 7 PTD0* 18 PTB3* 29 PTE25* 40 VBUS/VREGIN/5V + 8 PTC7 19 PTB2* 30 PTE24* 41 USB D- + 9 PTC6 20 PTB1 31 PTE30 42 USB D+ + 10 PTC5+ 21 PTB0 32 PTE29* 43 GND + 11 PTC4 22 PTA19 33 PTE21* 44 USB Shield/FB + +: Pins with resistor or switch + *: Pins which don't exist in QFN32 +``` + + +TMK KL27Z breakout +------------------ +This board acommodates 48QFN chip. + +### Pinputs + + _\ conn /_ + 1 28 + : : + : PROG : + : RST : + 14 15 + ---------- + + 1 VUSB 28 GND + 2 VIN/VREGIN 27 PTD4 + 3 PTD5 26 PTC7 + 4 PTD6 25 PTC6 + 5 PTD7 24 PTC5+ + 6 PTE0* 23 PTC4 + + 7 3.3V 22 GND + 8 PTE30 21 PTC3 + 9 PTA0/SWD_CLK 20 PTC2 + 10 PTA1+ 19 PTC1 + 11 PTA2 18 PTB1 + 12 PTA3/SWD_DIO 17 PTB0 + 13 PTA4/NMI+ 16 PTA20/Reset+ + 14 PTA18 15 PTA19 + *: Pin which doesn't exist in QFN48 + + +#### Pinouts difference between 32QFN and 48QFN +48QFN doesn't have PTE0 +32QFN doesn't have PTD0-3, PTC0, PTE20-21,24,25,29, PTB2-3,16,17 + +### ROM bootloader pins +See Reference Manual Chapter 13. + + PTA2 LPUART0_TX + PTA1 LPUART0_RX * + PTB0 I2C0_SCL + PTB1 I2C0_SDA + PTC4 SPI0_SS_b * + PTC7 SPI0_MISO + PTC6 SPI0_MOSI + PTC5 SPI0_SCK * + +Due to errata e9457, need to pull-up `SPI0_SS_b`(or `SPI0_SCK`) to prevent false detection of SPI. +The errata doesn't refer UART though, `LPUART0_RX` also requires pull-up or down resisitor from experience. +Without resistor it easily false-detects activity on UART interface with finger touch on the pin. + + + + +Resources +--------- +### Deskthority thread +https://deskthority.net/workshop-f7/can-we-design-the-teensy-alternative-for-keyboards-t13662-510.html + +### Kinetis KL2x +http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/l-series-ultra-low-power-m0-plus/kinetis-kl2x-48-mhz-usb-ultra-low-power-microcontrollers-based-on-arm-cortex-m0-plus:KL2x + +### KL27Z128/256 Data Sheet +http://www.nxp.com/assets/documents/data/en/data-sheets/KL27P64M48SF6.pdf + +### KL27Z128/256 Reference Manual +http://www.nxp.com/assets/documents/data/en/reference-manuals/KL27P64M48SF6RM.pdf + +### Errata +http://www.nxp.com/assets/documents/data/en/errata/KINETIS_L_1N71K.pdf + +>> +e9457: Kinetis Flashloader/ ROM Bootloader: The peripheral auto-detect code in +bootloader can falsely detect presence of SPI host causing non-responsive +bootloader +Description: During the active peripheral detection process, the bootloader can interpret spurious data on +the SPI peripheral as valid data. The spurious data causes the bootloader to shutdown all +peripherals except the “falsely detected" SPI and enter the command phase loop using the +SPI. After the bootloader enters the command phase loop using the SPI, the other peripherals +are ignored, so the desired peripheral is no longer active. +The bootloader will not falsely detect activity on the I2C, UART, or USB interfaces, so only the +SPI interface is affected. +Workaround: Ensure that there is an external pull-up on the SPI chip-select pin or that the pin is driven high. +This will prevent the bootloader from seeing spurious data due to activity on the SPI clock pin. + +### Kinetis Bootloader and blhost +http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/kinetis-symbols-footprints-and-models/kinetis-bootloader:KBOOT + + +Build +----- + + make + + +Program +------- +Flash firmware with ROM bootloader. + + blhost -u -- flash-image build/kl27z.hex erase + + +TODO +---- +- Fix boards/ELF files +- add macro `USBx_CTL_RESUME` to ChibiOS-Contrib/os/common/ext/CMSIS/KINETIS/kl27zxxx.h diff --git a/keyboard/kl27z_kbd/boards/ELF/board.c b/keyboard/kl27z_kbd/boards/ELF/board.c new file mode 100644 index 00000000..bf8c4686 --- /dev/null +++ b/keyboard/kl27z_kbd/boards/ELF/board.c @@ -0,0 +1,158 @@ +/* + ChibiOS - (C) 2015-2016 flabbergast + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "ch.h" +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = +{ + .ports = { + { + /* + * PORTA setup. + * + * on pads: PTA1, PTA2, PTA5, PTA18, PTA19 + * + * PTA0/3 SWD (default SWD, ALT_7: SWD, ALT_1: PTA0/3) + * PTA4 NMI button (default NMI_b, ALT_1: PTA4) + * PTA20 RESET button (default RESET, ALT_7: RESET, ALT_1: PTA20) + */ + .port = IOPORT1, + .pads = { + PAL_MODE_ALTERNATIVE_7, PAL_MODE_INPUT_PULLUP, PAL_MODE_OUTPUT_PUSHPULL, + PAL_MODE_ALTERNATIVE_7, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_INPUT_ANALOG, PAL_MODE_INPUT_ANALOG, PAL_MODE_ALTERNATIVE_7, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTB setup. + * + * on pads: PTB0, PTB1 + * LED: PTB18 + */ + .port = IOPORT2, + .pads = { + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTC setup. + * + * on pads: PTC1, PTC2, PTC3, PTC6, PTC7, PTC8, PTC9 + */ + .port = IOPORT3, + .pads = { + PAL_MODE_UNCONNECTED, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTD setup. + * + * on pads: PTD0 - PTD7 + */ + .port = IOPORT4, + .pads = { + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTE setup. + * + * on pads: PTE0, PTE1, PTE24, PTE25, PTE29, PTE30 + */ + .port = IOPORT5, + .pads = { + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_OUTPUT_PUSHPULL, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + }, + }, + }, +}; +#endif + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + + kl2x_clock_init(); +} + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboard/kl27z_kbd/boards/ELF/board.h b/keyboard/kl27z_kbd/boards/ELF/board.h new file mode 100644 index 00000000..8f6fec45 --- /dev/null +++ b/keyboard/kl27z_kbd/boards/ELF/board.h @@ -0,0 +1,56 @@ +/* + ChibiOS - (C) 2015-2016 flabbergast + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a custom KL27Z breakout board. + */ + +/* + * Board identifier. + */ +#define BOARD_KL27Z_BREAKOUT +#define BOARD_NAME "Custom KL27Z breakout" + +/* + * MCU type + */ +#define KL27Zxxx + +/* + * Onboard features. + */ +//#define GPIO_LED IOPORT1 +//#define PIN_LED 2 +// PTD7 on ELF +#define GPIO_LED IOPORT4 +#define PIN_LED 7 +#define GPIO_BUTTON IOPORT1 +#define PIN_BUTTON 4 + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboard/kl27z_kbd/boards/ELF/board.mk b/keyboard/kl27z_kbd/boards/ELF/board.mk new file mode 100644 index 00000000..f0c8b4b3 --- /dev/null +++ b/keyboard/kl27z_kbd/boards/ELF/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = ./boards/ELF/board.c + +# Required include directories +BOARDINC = ./boards/ELF diff --git a/keyboard/kl27z_kbd/chconf.h b/keyboard/kl27z_kbd/chconf.h new file mode 100644 index 00000000..cb36996c --- /dev/null +++ b/keyboard/kl27z_kbd/chconf.h @@ -0,0 +1,524 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 1000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 0 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 20 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK TRUE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS TRUE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS TRUE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS TRUE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboard/kl27z_kbd/config.h b/keyboard/kl27z_kbd/config.h new file mode 100644 index 00000000..85aef524 --- /dev/null +++ b/keyboard/kl27z_kbd/config.h @@ -0,0 +1,80 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x1111 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c borks */ +#define MANUFACTURER "TMK" +#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00' +#define PRODUCT "ChibiOS TMK test" +#define USBSTR_PRODUCT 'C', '\x00', 'h', '\x00', 'i', '\x00', 'b', '\x00', 'i', '\x00', 'O', '\x00', 'S', '\x00', ' ', '\x00', 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', 't', '\x00', 'e', '\x00', 's', '\x00', 't', '\x00' +#define DESCRIPTION "TMK keyboard firmware over ChibiOS" + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* 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_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + + +/* + * 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 + +// TODO: add this to ChibiOS-Contrib/os/common/ext/CMSIS/KINETIS/kl27zxxx.h +#ifndef USBx_CTL_RESUME +#define USBx_CTL_RESUME ((uint8_t)0x04) /*!< Executes resume signaling */ +#endif + + +#endif diff --git a/keyboard/kl27z_kbd/halconf.h b/keyboard/kl27z_kbd/halconf.h new file mode 100644 index 00000000..b1d2cd55 --- /dev/null +++ b/keyboard/kl27z_kbd/halconf.h @@ -0,0 +1,187 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboard/kl27z_kbd/kl27z_kbd.c b/keyboard/kl27z_kbd/kl27z_kbd.c new file mode 100644 index 00000000..ddb4bde5 --- /dev/null +++ b/keyboard/kl27z_kbd/kl27z_kbd.c @@ -0,0 +1,234 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#include "ch.h" +#include "hal.h" + +/* + * scan matrix + */ +#include "print.h" +#include "debug.h" +#include "util.h" +#include "wait.h" +#include "matrix.h" +#include "led.h" +#include "keymap.h" +#include "timer.h" + + +/* Matrix + * COL: input with pullup to sense + * PTD6 PTD5 PTD4 PTD3 PTA19 PTA18 PTA4 PTA2 PTA1 PTE25 PTE24 PTE30 PTE29 PTE21 + * + * ROW: output low to strobe + * PTB3 PTB16 PTB17 PTC0 PTC1 + * + * State(1:on, 0:off) + */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; +static bool debouncing = false; +static uint16_t debouncing_time = 0; + + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_matrix = true; + memset(matrix, 0, MATRIX_ROWS); + memset(matrix_debouncing, 0, MATRIX_ROWS); + + // COL: internal pull-up + palSetPadMode(GPIOD, 6, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOD, 5, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOD, 4, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOD, 3, PAL_MODE_INPUT_PULLUP); + + palSetPadMode(GPIOA, 19, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOA, 18, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_PULLUP); + + palSetPadMode(GPIOE, 25, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOE, 24, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOE, 30, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOE, 29, PAL_MODE_INPUT_PULLUP); + palSetPadMode(GPIOE, 21, PAL_MODE_INPUT_PULLUP); + + // ROW: Output high + palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 16, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOB, 17, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOC, 1, PAL_MODE_OUTPUT_PUSHPULL); + palSetPad(GPIOB, 3); + palSetPad(GPIOB, 16); + palSetPad(GPIOB, 17); + palSetPad(GPIOC, 0); + palSetPad(GPIOC, 1); + + + // LED blink + palSetPadMode(GPIOD, 7, PAL_MODE_OUTPUT_PUSHPULL); + palSetPad(GPIOD, 7); + chThdSleepMilliseconds(200); + palClearPad(GPIOD, 7); + chThdSleepMilliseconds(200); + palSetPad(GPIOD, 7); + chThdSleepMilliseconds(200); + palClearPad(GPIOD, 7); +} + +uint8_t matrix_scan(void) +{ + for (int row = 0; row < MATRIX_ROWS; row++) { + matrix_row_t data = 0; + + // strobe row + switch (row) { + case 0: palClearPad(GPIOB, 3); break; + case 1: palClearPad(GPIOB, 16); break; + case 2: palClearPad(GPIOB, 17); break; + case 3: palClearPad(GPIOC, 0); break; + case 4: palClearPad(GPIOC, 1); break; + } + + //wait_us(1); + //chThdSleepMicroseconds(1); // TODO: sleep around 1ms for some reason + //chThdSleepMilliseconds(1); // seems to work correctly + + data = (!palReadPad(GPIOD, 6) << 0UL) | + (!palReadPad(GPIOD, 5) << 1UL) | + (!palReadPad(GPIOD, 4) << 2UL) | + (!palReadPad(GPIOD, 3) << 3UL) | + (!palReadPad(GPIOA, 19) << 4UL) | + (!palReadPad(GPIOA, 18) << 5UL) | + (!palReadPad(GPIOA, 4) << 6UL) | + (!palReadPad(GPIOA, 2) << 7UL) | + (!palReadPad(GPIOA, 1) << 8UL) | + (!palReadPad(GPIOE, 25) << 9UL) | + (!palReadPad(GPIOE, 24) << 10UL) | + (!palReadPad(GPIOE, 30) << 11UL) | + (!palReadPad(GPIOE, 29) << 12UL) | + (!palReadPad(GPIOE, 21) << 13UL); + + // unstrobe row + switch (row) { + case 0: palSetPad(GPIOB, 3); break; + case 1: palSetPad(GPIOB, 16); break; + case 2: palSetPad(GPIOB, 17); break; + case 3: palSetPad(GPIOC, 0); break; + case 4: palSetPad(GPIOC, 1); break; + } + + if (matrix_debouncing[row] != data) { + matrix_debouncing[row] = data; + debouncing = true; + debouncing_time = timer_read(); + } + } + + if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { + for (int row = 0; row < MATRIX_ROWS; row++) { + matrix[row] = matrix_debouncing[row]; + } + debouncing = false; + } + return 1; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & (1< + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _MCUCONF_H_ +#define _MCUCONF_H_ + +#define KL2x_MCUCONF + +/* + * HAL driver system settings. + */ +#if 1 +/* High-frequency internal RC, 48MHz, possible USB clock recovery */ +#define KINETIS_MCGLITE_MODE KINETIS_MCGLITE_MODE_HIRC +#define KINETIS_SYSCLK_FREQUENCY 48000000UL +#define KINETIS_CLKDIV1_OUTDIV1 1 +#endif + +#if 0 +/* Low-frequency internal RC, 8 MHz mode */ +#define KINETIS_MCGLITE_MODE KINETIS_MCGLITE_MODE_LIRC8M +#define KINETIS_SYSCLK_FREQUENCY 8000000UL +#define KINETIS_CLKDIV1_OUTDIV1 1 +#endif + +/* + * SERIAL driver system settings. + */ +#define KINETIS_SERIAL_USE_UART0 TRUE + +/* + * USB driver settings + */ +#define KINETIS_USB_USE_USB0 TRUE +/* need to redefine this, since the default is for K20x */ +#define KINETIS_USB_USB0_IRQ_PRIORITY 2 + +/* + * Kinetis FOPT configuration byte + */ +/* for KL27: */ +#define KINETIS_NV_FOPT_BYTE 0x39 +#define KINETIS_NV_FSEC_BYTE 0x7E +/* NV_FOPT: bit7-6/BOOTSRC_SEL=0b00 (11=from ROM; 00=from FLASH) + bit5/FAST_INIT=1, bit4/LPBOOT1=1, + bit3/RESET_PIN_CFG=1, bit2/NMI_DIS=1, + bit1/BOOTPIN_OPT=0, bit0/LPBOOT0=1 */ +/* BOOTPIN_OPT: 1=boot depends on BOOTSRC_SEL + 0=boot samples BOOTCFG0=NMI pin */ +/* Boot sequence, page 88 of manual: + * - If the NMI/BOOTCFG0 input is high or the NMI function is disabled in FTFA_FOPT, the CPU begins execution at the PC location. + * - If the NMI/BOOTCFG0 input is low, the NMI function is enabled in FTFA_FOPT, and FTFA_FOPT[BOOTPIN_OPT] = 1, this results in an NMI interrupt. The processor executes an Exception Entry and reads the NMI interrupt handler address from vector-table offset 8. The CPU begins execution at the NMI interrupt handler. + * - When FTFA_FOPT[BOOTPIN_OPT] = 0, it forces boot from ROM if NMI/BOOTCFG0 pin set to 0. + * + * Observed behaviour: + * - when BOOTPIN_OPT=0, BOOTSRC_SEL still matters: + * - if 0b11 (from ROM), it still boots from ROM, even if BOOTCFG0 pin + * is high/floating, but leaves ROM and runs user app after + * 5 seconds delay. + * - if 0b00 (from FLASH), reset/powerup jumps to user app unless + * BOOTCFG0 pin is asserted. + * - in any case, reset when in bootloader induces the 5 second delay + * before starting the user app. + * + */ + +#endif /* _MCUCONF_H_ */ diff --git a/keyboard/kl27z_onekey/Makefile b/keyboard/kl27z_onekey/Makefile new file mode 100644 index 00000000..8179d5bb --- /dev/null +++ b/keyboard/kl27z_onekey/Makefile @@ -0,0 +1,70 @@ +# Target file name (without extension). +PROJECT = kl27z_onekey + +# Directory common source files exist +TMK_DIR = ../../tmk_core + +# Directory keyboard dependent files exist +TARGET_DIR = . + +# project specific files +SRC = $(PROJECT).c + +CONFIG_H = config.h + +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +# - For Teensies, FAMILY = KINETIS and SERIES is either +# KL2x (LC) or K20x (3.0,3.1,3.2). +MCU_FAMILY = KINETIS +MCU_SERIES = KL2x + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# - NOTE: a custom ld script is needed for EEPROM on Teensy LC +# - LDSCRIPT = +# - MKL26Z64 for Teensy LC +# - MK20DX128 for Teensy 3.0 +# - MK20DX256 for Teensy 3.1 and 3.2 +MCU_LDSCRIPT = MKL27Z256 + +# Startup code to use +# - it should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +# - STARTUP = +# - kl2x for Teensy LC +# - k20x5 for Teensy 3.0 +# - k20x7 for Teensy 3.1 and 3.2 +MCU_STARTUP = kl2x + +# Board: it should exist either in /os/hal/boards/ +# or /boards +# - BOARD = +# - PJRC_TEENSY_LC for Teensy LC +# - PJRC_TEENSY_3 for Teensy 3.0 +# - PJRC_TEENSY_3_1 for Teensy 3.1 or 3.2 +BOARD = ELF + +# Cortex version +# Teensy LC is cortex-m0plus; Teensy 3.x are cortex-m4 +MCU = cortex-m0plus + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +# I.e. 6 for Teensy LC; 7 for Teensy 3.x +ARMV = 6 + +# Build Options +# comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.) +#MOUSEKEY_ENABLE = yes # Mouse keys +#EXTRAKEY_ENABLE = yes # Audio control and System control +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 + +include $(TMK_DIR)/tool/chibios/common.mk +include $(TMK_DIR)/tool/chibios/chibios.mk diff --git a/keyboard/kl27z_onekey/README.md b/keyboard/kl27z_onekey/README.md new file mode 100644 index 00000000..c2db5e5c --- /dev/null +++ b/keyboard/kl27z_onekey/README.md @@ -0,0 +1,144 @@ +KL27Z128/256 board +================== +2016/11/30 + +KL27Z is configured to use internal 48MHz RC oscillator. + +The board has push button on PTA4 and LED on PTD7. The button works as 'a' key and the LED as an indicator for capslock. + + +ELF board +--------- +This board acommodates 48QFN chip. + +### prototypte pinout +- pcb layout https://deskthority.net/resources/image/33293 +- schematic https://deskthority.net/resources/image/33252 + + + 39 ..... 44 \ conn / 1 ..... 6 + 38 |______| LED 7 + : Rst : + : : + 32 Bl 13 + 31 .........24 23............ 14 + + 1 PTD6 12 PTC3 23 GND 34 PTE20* + 2 PTD5 13 PTC2 24 PTA18 35 PTA20 Reset + 3 PTD4 14 PTC1 25 3.3V 36 PTA3 SWD_DIO + 4 PTD3* 15 PTC0* 26 PTA4 NMI 37 PTA0 SWD_CLK + 5 PTD2* 16 PTB17* 27 PTA2 38 3.3V + 6 PTD1* 17 PTB16* 28 PTA1 39 GND + 7 PTD0* 18 PTB3* 29 PTE25* 40 VBUS VREGIN + 8 PTC7 19 PTB2* 30 PTE24* 41 USB D- + 9 PTC6 20 PTB1 31 PTE30 42 USB D+ + 10 PTC5 21 PTB0 32 PTE29* 43 GND + 11 PTC4 22 PTA19 33 PTE21* 44 USB Shield + + +TMK KL27Z breakout +------------------ +This board acommodates 48QFN chip. + +### Pinputs + + _\ conn /_ + 1 28 + : : + : PROG : + : RST : + 14 15 + ---------- + + 1 VUSB 28 GND + 2 VIN VREGIN 27 PTD4 + 3 PTD5 26 PTC7 + 4 PTD6 25 PTC6 + 5 PTD7 24 PTC5 + 6 PTE0* 23 PTC4 + + 7 3.3V 22 GND + 8 PTE30 21 PTC3 + 9 PTA0 SWD_CLK 20 PTC2 + 10 PTA1 19 PTC1 + 11 PTA2 18 PTB1 + 12 PTA3 SWD_DIO 17 PTB0 + 13 PTA4 NMI 16 PTA20 Reset + 14 PTA18 15 PTA19 + + +#### Pinouts difference between 32QFN and 48QFN +48QFN doesn't have PTE0 +32QFN doesn't have PTD0-3, PTC0, PTE20-21,24,25,29, PTB2-3,16,17 + +### ROM bootloader pins +See Reference Manual Chapter 13. + + PTA2 LPUART0_TX + PTA1 LPUART0_RX * + PTB0 I2C0_SCL + PTB1 I2C0_SDA + PTC4 SPI0_SS_b * + PTC7 SPI0_MISO + PTC6 SPI0_MOSI + PTC5 SPI0_SCK * + +Due to errata e9457, need to pull-up `SPI0_SS_b`(or `SPI0_SCK`) to prevent false detection of SPI. +The errata doesn't refer UART though, `LPUART0_RX` also requires pull-up or down resisitor from experience. +Without resistor it easily false-detects activity on UART interface with finger touch on the pin. + + + + +Resources +--------- +### Deskthority thread +https://deskthority.net/workshop-f7/can-we-design-the-teensy-alternative-for-keyboards-t13662-510.html + +### Kinetis KL2x +http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/l-series-ultra-low-power-m0-plus/kinetis-kl2x-48-mhz-usb-ultra-low-power-microcontrollers-based-on-arm-cortex-m0-plus:KL2x + +### KL27Z128/256 Data Sheet +http://www.nxp.com/assets/documents/data/en/data-sheets/KL27P64M48SF6.pdf + +### KL27Z128/256 Reference Manual +http://www.nxp.com/assets/documents/data/en/reference-manuals/KL27P64M48SF6RM.pdf + +### Errata +http://www.nxp.com/assets/documents/data/en/errata/KINETIS_L_1N71K.pdf + +>> +e9457: Kinetis Flashloader/ ROM Bootloader: The peripheral auto-detect code in +bootloader can falsely detect presence of SPI host causing non-responsive +bootloader +Description: During the active peripheral detection process, the bootloader can interpret spurious data on +the SPI peripheral as valid data. The spurious data causes the bootloader to shutdown all +peripherals except the “falsely detected" SPI and enter the command phase loop using the +SPI. After the bootloader enters the command phase loop using the SPI, the other peripherals +are ignored, so the desired peripheral is no longer active. +The bootloader will not falsely detect activity on the I2C, UART, or USB interfaces, so only the +SPI interface is affected. +Workaround: Ensure that there is an external pull-up on the SPI chip-select pin or that the pin is driven high. +This will prevent the bootloader from seeing spurious data due to activity on the SPI clock pin. + +### Kinetis Bootloader and blhost +http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/kinetis-cortex-m-mcus/kinetis-symbols-footprints-and-models/kinetis-bootloader:KBOOT + + +Build +----- + + make + + +Program +------- +Flash firmware with ROM bootloader. + + blhost -u -- flash-image build/kl27z.hex erase + + +TODO +---- +- Fix boards/ELF files +- add macro `USBx_CTL_RESUME` to ChibiOS-Contrib/os/common/ext/CMSIS/KINETIS/kl27zxxx.h diff --git a/keyboard/kl27z_onekey/boards/ELF/board.c b/keyboard/kl27z_onekey/boards/ELF/board.c new file mode 100644 index 00000000..bf8c4686 --- /dev/null +++ b/keyboard/kl27z_onekey/boards/ELF/board.c @@ -0,0 +1,158 @@ +/* + ChibiOS - (C) 2015-2016 flabbergast + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "ch.h" +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = +{ + .ports = { + { + /* + * PORTA setup. + * + * on pads: PTA1, PTA2, PTA5, PTA18, PTA19 + * + * PTA0/3 SWD (default SWD, ALT_7: SWD, ALT_1: PTA0/3) + * PTA4 NMI button (default NMI_b, ALT_1: PTA4) + * PTA20 RESET button (default RESET, ALT_7: RESET, ALT_1: PTA20) + */ + .port = IOPORT1, + .pads = { + PAL_MODE_ALTERNATIVE_7, PAL_MODE_INPUT_PULLUP, PAL_MODE_OUTPUT_PUSHPULL, + PAL_MODE_ALTERNATIVE_7, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_INPUT_ANALOG, PAL_MODE_INPUT_ANALOG, PAL_MODE_ALTERNATIVE_7, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTB setup. + * + * on pads: PTB0, PTB1 + * LED: PTB18 + */ + .port = IOPORT2, + .pads = { + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTC setup. + * + * on pads: PTC1, PTC2, PTC3, PTC6, PTC7, PTC8, PTC9 + */ + .port = IOPORT3, + .pads = { + PAL_MODE_UNCONNECTED, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTD setup. + * + * on pads: PTD0 - PTD7 + */ + .port = IOPORT4, + .pads = { + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_OUTPUT_PUSHPULL, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + }, + }, + { + /* + * PORTE setup. + * + * on pads: PTE0, PTE1, PTE24, PTE25, PTE29, PTE30 + */ + .port = IOPORT5, + .pads = { + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_OUTPUT_PUSHPULL, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, + PAL_MODE_INPUT_PULLUP, PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + PAL_MODE_UNCONNECTED, PAL_MODE_UNCONNECTED, PAL_MODE_INPUT_PULLUP, + PAL_MODE_INPUT_PULLUP, PAL_MODE_UNCONNECTED, + }, + }, + }, +}; +#endif + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + + kl2x_clock_init(); +} + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboard/kl27z_onekey/boards/ELF/board.h b/keyboard/kl27z_onekey/boards/ELF/board.h new file mode 100644 index 00000000..8f6fec45 --- /dev/null +++ b/keyboard/kl27z_onekey/boards/ELF/board.h @@ -0,0 +1,56 @@ +/* + ChibiOS - (C) 2015-2016 flabbergast + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a custom KL27Z breakout board. + */ + +/* + * Board identifier. + */ +#define BOARD_KL27Z_BREAKOUT +#define BOARD_NAME "Custom KL27Z breakout" + +/* + * MCU type + */ +#define KL27Zxxx + +/* + * Onboard features. + */ +//#define GPIO_LED IOPORT1 +//#define PIN_LED 2 +// PTD7 on ELF +#define GPIO_LED IOPORT4 +#define PIN_LED 7 +#define GPIO_BUTTON IOPORT1 +#define PIN_BUTTON 4 + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboard/kl27z_onekey/boards/ELF/board.mk b/keyboard/kl27z_onekey/boards/ELF/board.mk new file mode 100644 index 00000000..f0c8b4b3 --- /dev/null +++ b/keyboard/kl27z_onekey/boards/ELF/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = ./boards/ELF/board.c + +# Required include directories +BOARDINC = ./boards/ELF diff --git a/keyboard/kl27z_onekey/chconf.h b/keyboard/kl27z_onekey/chconf.h new file mode 100644 index 00000000..cb36996c --- /dev/null +++ b/keyboard/kl27z_onekey/chconf.h @@ -0,0 +1,524 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 1000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 0 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 20 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK TRUE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS TRUE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS TRUE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS TRUE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboard/kl27z_onekey/config.h b/keyboard/kl27z_onekey/config.h new file mode 100644 index 00000000..8aceb7be --- /dev/null +++ b/keyboard/kl27z_onekey/config.h @@ -0,0 +1,80 @@ +/* +Copyright 2015 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x1111 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c borks */ +#define MANUFACTURER "TMK" +#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00' +#define PRODUCT "ChibiOS TMK test" +#define USBSTR_PRODUCT 'C', '\x00', 'h', '\x00', 'i', '\x00', 'b', '\x00', 'i', '\x00', 'O', '\x00', 'S', '\x00', ' ', '\x00', 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', 't', '\x00', 'e', '\x00', 's', '\x00', 't', '\x00' +#define DESCRIPTION "TMK keyboard firmware over ChibiOS" + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 5 + +/* 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_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + + +/* + * 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 + +// TODO: add this to ChibiOS-Contrib/os/common/ext/CMSIS/KINETIS/kl27zxxx.h +#ifndef USBx_CTL_RESUME +#define USBx_CTL_RESUME ((uint8_t)0x04) /*!< Executes resume signaling */ +#endif + + +#endif diff --git a/keyboard/kl27z_onekey/halconf.h b/keyboard/kl27z_onekey/halconf.h new file mode 100644 index 00000000..b1d2cd55 --- /dev/null +++ b/keyboard/kl27z_onekey/halconf.h @@ -0,0 +1,187 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboard/kl27z_onekey/kl27z_onekey.c b/keyboard/kl27z_onekey/kl27z_onekey.c new file mode 100644 index 00000000..4af1beb6 --- /dev/null +++ b/keyboard/kl27z_onekey/kl27z_onekey.c @@ -0,0 +1,102 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#include "ch.h" +#include "hal.h" + +/* + * scan matrix + */ +#include "print.h" +#include "debug.h" +#include "util.h" +#include "wait.h" +#include "matrix.h" +#include "led.h" +#include "keymap.h" + + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + // internal pull-up + palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_PULLUP); + + // LED blink + palSetPadMode(GPIOD, 7, PAL_MODE_OUTPUT_PUSHPULL); + palSetPad(GPIOD, 7); + chThdSleepMilliseconds(200); + palClearPad(GPIOD, 7); + chThdSleepMilliseconds(200); + palSetPad(GPIOD, 7); + chThdSleepMilliseconds(200); + palClearPad(GPIOD, 7); +} + +uint8_t matrix_scan(void) +{ + return 1; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return !palReadPad(GPIOA, 4); +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return !palReadPad(GPIOA, 4); +} + +void matrix_print(void) +{ +} + +void led_set(uint8_t usb_led) { + if (usb_led & (1< + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _MCUCONF_H_ +#define _MCUCONF_H_ + +#define KL2x_MCUCONF + +/* + * HAL driver system settings. + */ +#if 1 +/* High-frequency internal RC, 48MHz, possible USB clock recovery */ +#define KINETIS_MCGLITE_MODE KINETIS_MCGLITE_MODE_HIRC +#define KINETIS_SYSCLK_FREQUENCY 48000000UL +#define KINETIS_CLKDIV1_OUTDIV1 1 +#endif + +#if 0 +/* Low-frequency internal RC, 8 MHz mode */ +#define KINETIS_MCGLITE_MODE KINETIS_MCGLITE_MODE_LIRC8M +#define KINETIS_SYSCLK_FREQUENCY 8000000UL +#define KINETIS_CLKDIV1_OUTDIV1 1 +#endif + +/* + * SERIAL driver system settings. + */ +#define KINETIS_SERIAL_USE_UART0 TRUE + +/* + * USB driver settings + */ +#define KINETIS_USB_USE_USB0 TRUE +/* need to redefine this, since the default is for K20x */ +#define KINETIS_USB_USB0_IRQ_PRIORITY 2 + +/* + * Kinetis FOPT configuration byte + */ +/* for KL27: */ +#define KINETIS_NV_FOPT_BYTE 0x39 +#define KINETIS_NV_FSEC_BYTE 0x7E +/* NV_FOPT: bit7-6/BOOTSRC_SEL=0b00 (11=from ROM; 00=from FLASH) + bit5/FAST_INIT=1, bit4/LPBOOT1=1, + bit3/RESET_PIN_CFG=1, bit2/NMI_DIS=1, + bit1/BOOTPIN_OPT=0, bit0/LPBOOT0=1 */ +/* BOOTPIN_OPT: 1=boot depends on BOOTSRC_SEL + 0=boot samples BOOTCFG0=NMI pin */ +/* Boot sequence, page 88 of manual: + * - If the NMI/BOOTCFG0 input is high or the NMI function is disabled in FTFA_FOPT, the CPU begins execution at the PC location. + * - If the NMI/BOOTCFG0 input is low, the NMI function is enabled in FTFA_FOPT, and FTFA_FOPT[BOOTPIN_OPT] = 1, this results in an NMI interrupt. The processor executes an Exception Entry and reads the NMI interrupt handler address from vector-table offset 8. The CPU begins execution at the NMI interrupt handler. + * - When FTFA_FOPT[BOOTPIN_OPT] = 0, it forces boot from ROM if NMI/BOOTCFG0 pin set to 0. + * + * Observed behaviour: + * - when BOOTPIN_OPT=0, BOOTSRC_SEL still matters: + * - if 0b11 (from ROM), it still boots from ROM, even if BOOTCFG0 pin + * is high/floating, but leaves ROM and runs user app after + * 5 seconds delay. + * - if 0b00 (from FLASH), reset/powerup jumps to user app unless + * BOOTCFG0 pin is asserted. + * - in any case, reset when in bootloader induces the 5 second delay + * before starting the user app. + * + */ + +#endif /* _MCUCONF_H_ */ diff --git a/keyboard/onekey/Makefile b/keyboard/onekey/Makefile index 0b54e7d2..26c9a637 100644 --- a/keyboard/onekey/Makefile +++ b/keyboard/onekey/Makefile @@ -114,7 +114,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 CONSOLE_ENABLE = yes # Console for debug(+400) #COMMAND_ENABLE = yes # Commands for debug and configuration #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +#NKRO_ENABLE = yes # USB Nkey Rollover #PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support #PS2_USE_BUSYWAIT = yes # uses primitive reference code diff --git a/keyboard/onekey/keymap.c b/keyboard/onekey/keymap.c index dce4e919..dca32d27 100644 --- a/keyboard/onekey/keymap.c +++ b/keyboard/onekey/keymap.c @@ -16,7 +16,6 @@ along with this program. If not, see . */ #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -27,40 +26,12 @@ along with this program. If not, see . #include "keymap.h" -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_A}}, }; /* * Fn action definition */ -static const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; - - - -#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0])) -#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - if (layer < KEYMAPS_SIZE) { - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); - } else { - // fall back to layer 0 - return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]); - } -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - } else { - action.code = ACTION_NO; - } - return action; -} diff --git a/keyboard/onekey/matrix.c b/keyboard/onekey/matrix.c index 29df8683..d78e47ec 100644 --- a/keyboard/onekey/matrix.c +++ b/keyboard/onekey/matrix.c @@ -43,18 +43,6 @@ static void unselect_rows(void); static void select_row(uint8_t row); -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { debug_enable = true; @@ -100,43 +88,12 @@ uint8_t matrix_scan(void) 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<. #include "keycode.h" #include "action.h" #include "action_macro.h" +#include "action_code.h" #include "report.h" #include "host.h" #include "print.h" @@ -28,7 +29,7 @@ static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_CAPS}}, // test with KC_CAPS, KC_A, KC_BTLD }; -static const uint16_t fn_actions[] = { +static const action_t fn_actions[] = { }; /* translates key to keycode */ @@ -40,5 +41,5 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; + return (action_t)fn_actions[FN_INDEX(keycode)]; } diff --git a/keyboard/stm32_f103_onekey/keymap_plain.c b/keyboard/stm32_f103_onekey/keymap_plain.c index 8de1c027..5aee2b7f 100644 --- a/keyboard/stm32_f103_onekey/keymap_plain.c +++ b/keyboard/stm32_f103_onekey/keymap_plain.c @@ -28,7 +28,7 @@ static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_CAPS}}, // test with KC_CAPS, KC_A, KC_BTLD }; -static const uint16_t fn_actions[] = { +static const action_t fn_actions[] = { }; /* translates key to keycode */ @@ -40,5 +40,5 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; + return fn_actions[FN_INDEX(keycode)]; } diff --git a/keyboard/teensy_lc_onekey/instructions.md b/keyboard/teensy_lc_onekey/instructions.md index 16886a01..524014c8 100644 --- a/keyboard/teensy_lc_onekey/instructions.md +++ b/keyboard/teensy_lc_onekey/instructions.md @@ -4,13 +4,16 @@ These ARM Teensies are now supported through [ChibiOS](http://chibios.org). You'll need to install an ARM toolchain, for instance from [gcc ARM embedded](https://launchpad.net/gcc-arm-embedded) website, or using your favourite package manager. After installing, you should be able to run `arm-none-eabi-gcc -v` in the command prompt and get sensible output. This toolchain is used instead of `avr-gcc`, which is only for AVR chips. Naturally you'll also need the usual development tools (e.g. `make`), just as in the AVR setting. -Next, you'll need ChibiOS. For Teensies, you'll need code from two repositories: [chibios-main](https://github.com/ChibiOS/ChibiOS) and [chibios-contrib](https://github.com/ChibiOS/ChibiOS). If you're not using git, you can just download a [zip of chibios from here](https://github.com/ChibiOS/ChibiOS/archive/a7df9a891067621e8e1a5c2a2c0ceada82403afe.zip), unpack the zip, and rename/move the unpacked directory (named `ChibiOS-`) to `tmk_core/tool/chibios/chibios` (so that the file `tmk_core/tool/chibios/chibios/license.txt` exists). Now the same procedure with a [zip of chibios-contrib from here](https://github.com/ChibiOS/ChibiOS-Contrib/archive/e1311c4db6cd366cf760673f769e925741ac0ad3.zip): unpack and move `ChibiOS-Contrib-` to `tmk_core/tool/chibios/chibios-contrib`. +Next, you'll need ChibiOS. For Teensies, you'll need code from two repositories: [chibios-main](https://github.com/ChibiOS/ChibiOS) and [chibios-contrib](https://github.com/ChibiOS/ChibiOS-Contrib). +If you're not using git, you can just download a [zip of chibios from here](https://github.com/ChibiOS/ChibiOS/archive/a7df9a891067621e8e1a5c2a2c0ceada82403afe.zip), unpack the zip, and rename/move the unpacked directory (named `ChibiOS-`) to `tmk_core/tool/chibios/ChibiOS` (so that the file `tmk_core/tool/chibios/ChibiOS/license.txt` exists). Now the same procedure with a [zip of chibios-contrib from here](https://github.com/ChibiOS/ChibiOS-Contrib/archive/e1311c4db6cd366cf760673f769e925741ac0ad3.zip): unpack and move `ChibiOS-Contrib-` to `tmk_core/tool/chibios/ChibiOS-Contrib`. -(If you're using git, you can just clone the two repos: [chibios](https://github.com/ChibiOS/ChibiOS) and [chibios-contrib](https://github.com/ChibiOS/ChibiOS-Contrib). However - be warned that things may be somewhat out-of-sync (updates at different rates), so you may need to hunt a bit for the right commits.) +If you're using git, you can just clone the two repos inside `tmk_core/tool/chibios`: [chibios](https://github.com/ChibiOS/ChibiOS) and [chibios-contrib](https://github.com/ChibiOS/ChibiOS-Contrib). (Why do we need chibios-contrib? Well, the main repo focuses on STM32 chips, and Freescale/NXP Kinetis chips are supported via the Contrib repository.) -This should be it. Running `make` in `keyboard/teensy_lc_onekey` should create a working firmware in `build/`, called `ch.hex`. +This should be it. + +Running `make` in `keyboard/teensy_lc_onekey` should create a working firmware in `build/`, called `ch.hex`. For more notes about the ChibiOS backend in TMK, see `tmk_core/protocol/chibios/README.md`. diff --git a/keyboard/teensy_lc_onekey/keymap_plain.c b/keyboard/teensy_lc_onekey/keymap_plain.c index 922fa537..16b05a75 100644 --- a/keyboard/teensy_lc_onekey/keymap_plain.c +++ b/keyboard/teensy_lc_onekey/keymap_plain.c @@ -28,7 +28,7 @@ static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_A}}, }; // to test: KC_CAPS, KT_BTLD, KC_A -static const uint16_t fn_actions[] = { +static const action_t fn_actions[] = { }; /* translates key to keycode */ @@ -40,5 +40,5 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; + return fn_actions[FN_INDEX(keycode)]; } diff --git a/keyboard/IIgs/Makefile b/orphan/IIgs/Makefile similarity index 100% rename from keyboard/IIgs/Makefile rename to orphan/IIgs/Makefile diff --git a/keyboard/IIgs/README b/orphan/IIgs/README similarity index 100% rename from keyboard/IIgs/README rename to orphan/IIgs/README diff --git a/keyboard/IIgs/config.h b/orphan/IIgs/config.h similarity index 100% rename from keyboard/IIgs/config.h rename to orphan/IIgs/config.h diff --git a/keyboard/IIgs/doc/PIN_BYPASS.jpg b/orphan/IIgs/doc/PIN_BYPASS.jpg similarity index 100% rename from keyboard/IIgs/doc/PIN_BYPASS.jpg rename to orphan/IIgs/doc/PIN_BYPASS.jpg diff --git a/keyboard/IIgs/doc/Teensy++_Mod.jpg b/orphan/IIgs/doc/Teensy++_Mod.jpg similarity index 100% rename from keyboard/IIgs/doc/Teensy++_Mod.jpg rename to orphan/IIgs/doc/Teensy++_Mod.jpg diff --git a/keyboard/IIgs/hid_listen.mac b/orphan/IIgs/hid_listen.mac old mode 100755 new mode 100644 similarity index 100% rename from keyboard/IIgs/hid_listen.mac rename to orphan/IIgs/hid_listen.mac diff --git a/keyboard/IIgs/keymap.c b/orphan/IIgs/keymap.c similarity index 100% rename from keyboard/IIgs/keymap.c rename to orphan/IIgs/keymap.c diff --git a/converter/serialmouse_usb/led.c b/orphan/IIgs/led.c similarity index 100% rename from converter/serialmouse_usb/led.c rename to orphan/IIgs/led.c diff --git a/keyboard/IIgs/matrix.c b/orphan/IIgs/matrix.c similarity index 100% rename from keyboard/IIgs/matrix.c rename to orphan/IIgs/matrix.c diff --git a/orphan/README.md b/orphan/README.md new file mode 100644 index 00000000..917c2c4d --- /dev/null +++ b/orphan/README.md @@ -0,0 +1,30 @@ +Orphan Projects +=============== +These projects won't be updated by tmk anymore and might be removed sometime in the future. +https://github.com/tmk/tmk_keyboard/issues/173 + +Also see this wiki page to find original repositories/authors and alternative projects. +https://github.com/tmk/tmk_keyboard/wiki/TMK-Based-Projects + + +* [ascii_usb](ascii_usb/) - ASCII(Serial console terminal) to USB +* [hid_liber](hid_liber/) - [HID liberation][HID_liber] controller (by alaricljs) +* [phantom](phantom/) - [Phantom] keyboard (by Tranquilite) +* [IIgs](IIgs/) - Apple [IIGS] keyboard mod(by JeffreySung) +* [macway](macway/) - [Compact keyboard mod][GH_macway] [retired] +* [kmac](kmac/) - Korean custom keyboard +* [lightsaber](lightsaber/) - Korean custom keyboard +* [nerd](nerd/) - Korean custom keyboard +* [lightpad](lightpad) - Korean custom keypad +* [kitten_paw](kitten_paw) - Custom Majestouch controller +* [ghost_squid](ghost_squid/) - [The Ghost Squid][ghost_squid] controller for [Cooler Master QuickFire XT][cmxt] +* [terminal_bluefruit](terminal_bluefruit) - [Model M to Bluetooth with Bluefruit EZ-Key HID][Ada] +* [serialmouse_usb](serialmouse_usb) - + +[GH_macway]: http://geekhack.org/showwiki.php?title=Island:11930 +[HID_liber]: http://deskthority.net/wiki/HID_Liberation_Device_-_DIY_Instructions +[Phantom]: http://geekhack.org/index.php?topic=26742 +[IIGS]: http://en.wikipedia.org/wiki/Apple_IIGS +[ghost_squid]: http://deskthority.net/wiki/Costar_replacement_controllers#The_Ghost_Squid +[cmxt]: http://gaming.coolermaster.com/en/products/keyboards/quickfirext/ +[M_bluefruit]: https://learn.adafruit.com/convert-your-model-m-keyboard-to-bluetooth-with-bluefruit-ez-key-hid/overview diff --git a/converter/ascii_usb/Makefile b/orphan/ascii_usb/Makefile similarity index 100% rename from converter/ascii_usb/Makefile rename to orphan/ascii_usb/Makefile diff --git a/converter/ascii_usb/README b/orphan/ascii_usb/README similarity index 100% rename from converter/ascii_usb/README rename to orphan/ascii_usb/README diff --git a/converter/ascii_usb/config.h b/orphan/ascii_usb/config.h similarity index 100% rename from converter/ascii_usb/config.h rename to orphan/ascii_usb/config.h diff --git a/converter/ascii_usb/keymap.c b/orphan/ascii_usb/keymap.c similarity index 100% rename from converter/ascii_usb/keymap.c rename to orphan/ascii_usb/keymap.c diff --git a/converter/ascii_usb/led.c b/orphan/ascii_usb/led.c similarity index 100% rename from converter/ascii_usb/led.c rename to orphan/ascii_usb/led.c diff --git a/converter/ascii_usb/matrix.c b/orphan/ascii_usb/matrix.c similarity index 100% rename from converter/ascii_usb/matrix.c rename to orphan/ascii_usb/matrix.c diff --git a/keyboard/ghost_squid/Makefile.lufa b/orphan/ghost_squid/Makefile.lufa similarity index 100% rename from keyboard/ghost_squid/Makefile.lufa rename to orphan/ghost_squid/Makefile.lufa diff --git a/keyboard/ghost_squid/README.md b/orphan/ghost_squid/README.md similarity index 100% rename from keyboard/ghost_squid/README.md rename to orphan/ghost_squid/README.md diff --git a/keyboard/ghost_squid/config.h b/orphan/ghost_squid/config.h similarity index 100% rename from keyboard/ghost_squid/config.h rename to orphan/ghost_squid/config.h diff --git a/keyboard/ghost_squid/keymap.c b/orphan/ghost_squid/keymap.c similarity index 100% rename from keyboard/ghost_squid/keymap.c rename to orphan/ghost_squid/keymap.c diff --git a/keyboard/kitten_paw/keymap_ansi.h b/orphan/ghost_squid/keymap_ansi.h similarity index 97% rename from keyboard/kitten_paw/keymap_ansi.h rename to orphan/ghost_squid/keymap_ansi.h index ed1088ba..e659d060 100644 --- a/keyboard/kitten_paw/keymap_ansi.h +++ b/orphan/ghost_squid/keymap_ansi.h @@ -18,6 +18,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_COLS][MATRIX_ROWS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/keyboard/ghost_squid/led.c b/orphan/ghost_squid/led.c similarity index 100% rename from keyboard/ghost_squid/led.c rename to orphan/ghost_squid/led.c diff --git a/keyboard/ghost_squid/matrix.c b/orphan/ghost_squid/matrix.c similarity index 100% rename from keyboard/ghost_squid/matrix.c rename to orphan/ghost_squid/matrix.c diff --git a/keyboard/hid_liber/Makefile.lufa b/orphan/hid_liber/Makefile.lufa similarity index 100% rename from keyboard/hid_liber/Makefile.lufa rename to orphan/hid_liber/Makefile.lufa diff --git a/keyboard/hid_liber/Makefile.pjrc b/orphan/hid_liber/Makefile.pjrc similarity index 100% rename from keyboard/hid_liber/Makefile.pjrc rename to orphan/hid_liber/Makefile.pjrc diff --git a/keyboard/hid_liber/README.md b/orphan/hid_liber/README.md similarity index 100% rename from keyboard/hid_liber/README.md rename to orphan/hid_liber/README.md diff --git a/keyboard/hid_liber/config.h b/orphan/hid_liber/config.h similarity index 100% rename from keyboard/hid_liber/config.h rename to orphan/hid_liber/config.h diff --git a/keyboard/hid_liber/keymap.c b/orphan/hid_liber/keymap.c similarity index 100% rename from keyboard/hid_liber/keymap.c rename to orphan/hid_liber/keymap.c diff --git a/keyboard/hid_liber/keymap_alaricljs.h b/orphan/hid_liber/keymap_alaricljs.h similarity index 98% rename from keyboard/hid_liber/keymap_alaricljs.h rename to orphan/hid_liber/keymap_alaricljs.h index 8903fc68..3d10913f 100644 --- a/keyboard/hid_liber/keymap_alaricljs.h +++ b/orphan/hid_liber/keymap_alaricljs.h @@ -56,6 +56,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(1), // activate layer 1 when FN1 pressed }; diff --git a/keyboard/hid_liber/keymap_ansi.h b/orphan/hid_liber/keymap_ansi.h similarity index 97% rename from keyboard/hid_liber/keymap_ansi.h rename to orphan/hid_liber/keymap_ansi.h index 8ce85a49..1e67ed21 100644 --- a/keyboard/hid_liber/keymap_ansi.h +++ b/orphan/hid_liber/keymap_ansi.h @@ -29,4 +29,4 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = {}; +static const action_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/hid_liber/keymap_custom.h b/orphan/hid_liber/keymap_custom.h similarity index 98% rename from keyboard/hid_liber/keymap_custom.h rename to orphan/hid_liber/keymap_custom.h index 03e1a1bf..db1d5c7b 100644 --- a/keyboard/hid_liber/keymap_custom.h +++ b/orphan/hid_liber/keymap_custom.h @@ -59,6 +59,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(1), // activate layer 1 when FN1 pressed }; diff --git a/keyboard/hid_liber/keymap_iso.h b/orphan/hid_liber/keymap_iso.h similarity index 97% rename from keyboard/hid_liber/keymap_iso.h rename to orphan/hid_liber/keymap_iso.h index c1845367..a3df0038 100644 --- a/keyboard/hid_liber/keymap_iso.h +++ b/orphan/hid_liber/keymap_iso.h @@ -29,4 +29,4 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = {}; +static const action_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/hid_liber/led.c b/orphan/hid_liber/led.c similarity index 100% rename from keyboard/hid_liber/led.c rename to orphan/hid_liber/led.c diff --git a/keyboard/hid_liber/matrix.c b/orphan/hid_liber/matrix.c similarity index 100% rename from keyboard/hid_liber/matrix.c rename to orphan/hid_liber/matrix.c diff --git a/keyboard/kitten_paw/Makefile.lufa b/orphan/kitten_paw/Makefile.lufa similarity index 100% rename from keyboard/kitten_paw/Makefile.lufa rename to orphan/kitten_paw/Makefile.lufa diff --git a/keyboard/kitten_paw/README.md b/orphan/kitten_paw/README.md similarity index 100% rename from keyboard/kitten_paw/README.md rename to orphan/kitten_paw/README.md diff --git a/keyboard/kitten_paw/config.h b/orphan/kitten_paw/config.h similarity index 100% rename from keyboard/kitten_paw/config.h rename to orphan/kitten_paw/config.h diff --git a/keyboard/kitten_paw/keymap.c b/orphan/kitten_paw/keymap.c similarity index 100% rename from keyboard/kitten_paw/keymap.c rename to orphan/kitten_paw/keymap.c diff --git a/keyboard/ghost_squid/keymap_ansi.h b/orphan/kitten_paw/keymap_ansi.h similarity index 97% rename from keyboard/ghost_squid/keymap_ansi.h rename to orphan/kitten_paw/keymap_ansi.h index ed1088ba..e659d060 100644 --- a/keyboard/ghost_squid/keymap_ansi.h +++ b/orphan/kitten_paw/keymap_ansi.h @@ -18,6 +18,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_COLS][MATRIX_ROWS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/keyboard/kitten_paw/led.c b/orphan/kitten_paw/led.c similarity index 100% rename from keyboard/kitten_paw/led.c rename to orphan/kitten_paw/led.c diff --git a/keyboard/kitten_paw/matrix.c b/orphan/kitten_paw/matrix.c similarity index 100% rename from keyboard/kitten_paw/matrix.c rename to orphan/kitten_paw/matrix.c diff --git a/keyboard/kmac/Makefile.lufa b/orphan/kmac/Makefile.lufa similarity index 100% rename from keyboard/kmac/Makefile.lufa rename to orphan/kmac/Makefile.lufa diff --git a/keyboard/kmac/Makefile.pjrc b/orphan/kmac/Makefile.pjrc similarity index 100% rename from keyboard/kmac/Makefile.pjrc rename to orphan/kmac/Makefile.pjrc diff --git a/keyboard/kmac/README.md b/orphan/kmac/README.md similarity index 100% rename from keyboard/kmac/README.md rename to orphan/kmac/README.md diff --git a/keyboard/kmac/backlight.c b/orphan/kmac/backlight.c similarity index 100% rename from keyboard/kmac/backlight.c rename to orphan/kmac/backlight.c diff --git a/keyboard/kmac/config.h b/orphan/kmac/config.h similarity index 100% rename from keyboard/kmac/config.h rename to orphan/kmac/config.h diff --git a/keyboard/kmac/keymap.c b/orphan/kmac/keymap.c similarity index 100% rename from keyboard/kmac/keymap.c rename to orphan/kmac/keymap.c diff --git a/keyboard/kmac/keymap_winkey.h b/orphan/kmac/keymap_winkey.h similarity index 96% rename from keyboard/kmac/keymap_winkey.h rename to orphan/kmac/keymap_winkey.h index 3379789e..7ae1e881 100644 --- a/keyboard/kmac/keymap_winkey.h +++ b/orphan/kmac/keymap_winkey.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_STEP() }; diff --git a/keyboard/kmac/keymap_winkeyless.h b/orphan/kmac/keymap_winkeyless.h similarity index 96% rename from keyboard/kmac/keymap_winkeyless.h rename to orphan/kmac/keymap_winkeyless.h index 939ee379..b6244c42 100644 --- a/keyboard/kmac/keymap_winkeyless.h +++ b/orphan/kmac/keymap_winkeyless.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_STEP() }; diff --git a/keyboard/kmac/led.c b/orphan/kmac/led.c similarity index 100% rename from keyboard/kmac/led.c rename to orphan/kmac/led.c diff --git a/keyboard/kmac/matrix.c b/orphan/kmac/matrix.c similarity index 100% rename from keyboard/kmac/matrix.c rename to orphan/kmac/matrix.c diff --git a/keyboard/lightpad/Makefile.lufa b/orphan/lightpad/Makefile.lufa similarity index 100% rename from keyboard/lightpad/Makefile.lufa rename to orphan/lightpad/Makefile.lufa diff --git a/keyboard/lightpad/README.md b/orphan/lightpad/README.md similarity index 100% rename from keyboard/lightpad/README.md rename to orphan/lightpad/README.md diff --git a/keyboard/lightpad/backlight.c b/orphan/lightpad/backlight.c similarity index 100% rename from keyboard/lightpad/backlight.c rename to orphan/lightpad/backlight.c diff --git a/keyboard/lightpad/backlight.h b/orphan/lightpad/backlight.h similarity index 100% rename from keyboard/lightpad/backlight.h rename to orphan/lightpad/backlight.h diff --git a/keyboard/lightpad/config.h b/orphan/lightpad/config.h similarity index 100% rename from keyboard/lightpad/config.h rename to orphan/lightpad/config.h diff --git a/keyboard/lightpad/keymap.c b/orphan/lightpad/keymap.c similarity index 100% rename from keyboard/lightpad/keymap.c rename to orphan/lightpad/keymap.c diff --git a/keyboard/lightpad/keymap_lightpad.h b/orphan/lightpad/keymap_lightpad.h similarity index 94% rename from keyboard/lightpad/keymap_lightpad.h rename to orphan/lightpad/keymap_lightpad.h index 9333964e..febdc6c7 100644 --- a/keyboard/lightpad/keymap_lightpad.h +++ b/orphan/lightpad/keymap_lightpad.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { FN7, NO, MSTP) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_FN1), [2] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_FN2), diff --git a/keyboard/lightpad/led.c b/orphan/lightpad/led.c similarity index 100% rename from keyboard/lightpad/led.c rename to orphan/lightpad/led.c diff --git a/keyboard/lightpad/matrix.c b/orphan/lightpad/matrix.c similarity index 100% rename from keyboard/lightpad/matrix.c rename to orphan/lightpad/matrix.c diff --git a/keyboard/lightsaber/Makefile.lufa b/orphan/lightsaber/Makefile.lufa similarity index 100% rename from keyboard/lightsaber/Makefile.lufa rename to orphan/lightsaber/Makefile.lufa diff --git a/keyboard/lightsaber/Makefile.pjrc b/orphan/lightsaber/Makefile.pjrc similarity index 100% rename from keyboard/lightsaber/Makefile.pjrc rename to orphan/lightsaber/Makefile.pjrc diff --git a/keyboard/lightsaber/README.md b/orphan/lightsaber/README.md similarity index 100% rename from keyboard/lightsaber/README.md rename to orphan/lightsaber/README.md diff --git a/keyboard/lightsaber/backlight.c b/orphan/lightsaber/backlight.c similarity index 100% rename from keyboard/lightsaber/backlight.c rename to orphan/lightsaber/backlight.c diff --git a/keyboard/lightsaber/backlight.h b/orphan/lightsaber/backlight.h similarity index 100% rename from keyboard/lightsaber/backlight.h rename to orphan/lightsaber/backlight.h diff --git a/keyboard/lightsaber/config.h b/orphan/lightsaber/config.h similarity index 100% rename from keyboard/lightsaber/config.h rename to orphan/lightsaber/config.h diff --git a/keyboard/lightsaber/keymap.c b/orphan/lightsaber/keymap.c similarity index 100% rename from keyboard/lightsaber/keymap.c rename to orphan/lightsaber/keymap.c diff --git a/keyboard/lightsaber/keymap_winkey.h b/orphan/lightsaber/keymap_winkey.h similarity index 97% rename from keyboard/lightsaber/keymap_winkey.h rename to orphan/lightsaber/keymap_winkey.h index 3e836708..99ceaa6f 100644 --- a/keyboard/lightsaber/keymap_winkey.h +++ b/orphan/lightsaber/keymap_winkey.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_TOGGLE(), [2] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_ALPHA), diff --git a/keyboard/lightsaber/led.c b/orphan/lightsaber/led.c similarity index 100% rename from keyboard/lightsaber/led.c rename to orphan/lightsaber/led.c diff --git a/keyboard/lightsaber/matrix.c b/orphan/lightsaber/matrix.c similarity index 100% rename from keyboard/lightsaber/matrix.c rename to orphan/lightsaber/matrix.c diff --git a/keyboard/macway/Makefile.lufa b/orphan/macway/Makefile.lufa similarity index 100% rename from keyboard/macway/Makefile.lufa rename to orphan/macway/Makefile.lufa diff --git a/keyboard/macway/Makefile.pjrc b/orphan/macway/Makefile.pjrc similarity index 100% rename from keyboard/macway/Makefile.pjrc rename to orphan/macway/Makefile.pjrc diff --git a/keyboard/macway/config.h b/orphan/macway/config.h similarity index 100% rename from keyboard/macway/config.h rename to orphan/macway/config.h diff --git a/keyboard/macway/doc/back.jpg b/orphan/macway/doc/back.jpg similarity index 100% rename from keyboard/macway/doc/back.jpg rename to orphan/macway/doc/back.jpg diff --git a/keyboard/macway/doc/case.jpg b/orphan/macway/doc/case.jpg similarity index 100% rename from keyboard/macway/doc/case.jpg rename to orphan/macway/doc/case.jpg diff --git a/keyboard/macway/doc/keys.jpg b/orphan/macway/doc/keys.jpg similarity index 100% rename from keyboard/macway/doc/keys.jpg rename to orphan/macway/doc/keys.jpg diff --git a/keyboard/macway/doc/side.jpg b/orphan/macway/doc/side.jpg similarity index 100% rename from keyboard/macway/doc/side.jpg rename to orphan/macway/doc/side.jpg diff --git a/keyboard/macway/doc/switch.jpg b/orphan/macway/doc/switch.jpg similarity index 100% rename from keyboard/macway/doc/switch.jpg rename to orphan/macway/doc/switch.jpg diff --git a/keyboard/macway/doc/teensy.jpg b/orphan/macway/doc/teensy.jpg similarity index 100% rename from keyboard/macway/doc/teensy.jpg rename to orphan/macway/doc/teensy.jpg diff --git a/keyboard/macway/doc/wiring.jpg b/orphan/macway/doc/wiring.jpg similarity index 100% rename from keyboard/macway/doc/wiring.jpg rename to orphan/macway/doc/wiring.jpg diff --git a/keyboard/macway/doc/withHHKB.jpg b/orphan/macway/doc/withHHKB.jpg similarity index 100% rename from keyboard/macway/doc/withHHKB.jpg rename to orphan/macway/doc/withHHKB.jpg diff --git a/keyboard/macway/doc/withThinkPad.jpg b/orphan/macway/doc/withThinkPad.jpg similarity index 100% rename from keyboard/macway/doc/withThinkPad.jpg rename to orphan/macway/doc/withThinkPad.jpg diff --git a/keyboard/macway/keymap.c b/orphan/macway/keymap.c similarity index 100% rename from keyboard/macway/keymap.c rename to orphan/macway/keymap.c diff --git a/keyboard/IIgs/led.c b/orphan/macway/led.c similarity index 100% rename from keyboard/IIgs/led.c rename to orphan/macway/led.c diff --git a/keyboard/macway/matrix.c b/orphan/macway/matrix.c similarity index 100% rename from keyboard/macway/matrix.c rename to orphan/macway/matrix.c diff --git a/keyboard/nerd/Makefile b/orphan/nerd/Makefile similarity index 100% rename from keyboard/nerd/Makefile rename to orphan/nerd/Makefile diff --git a/keyboard/nerd/README.md b/orphan/nerd/README.md similarity index 100% rename from keyboard/nerd/README.md rename to orphan/nerd/README.md diff --git a/keyboard/nerd/backlight.c b/orphan/nerd/backlight.c similarity index 100% rename from keyboard/nerd/backlight.c rename to orphan/nerd/backlight.c diff --git a/keyboard/nerd/backlight.h b/orphan/nerd/backlight.h similarity index 100% rename from keyboard/nerd/backlight.h rename to orphan/nerd/backlight.h diff --git a/keyboard/nerd/config.h b/orphan/nerd/config.h similarity index 100% rename from keyboard/nerd/config.h rename to orphan/nerd/config.h diff --git a/keyboard/nerd/keymap_60_ansi150.c b/orphan/nerd/keymap_60_ansi150.c similarity index 97% rename from keyboard/nerd/keymap_60_ansi150.c rename to orphan/nerd/keymap_60_ansi150.c index f85836ab..e974625b 100644 --- a/keyboard/nerd/keymap_60_ansi150.c +++ b/orphan/nerd/keymap_60_ansi150.c @@ -22,7 +22,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LEFT,DOWN,RGHT, TRNS, TRNS,TRNS,TRNS) }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(2), [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), [2] = ACTION_LAYER_TOGGLE(1), diff --git a/keyboard/nerd/keymap_80_ansi150.c b/orphan/nerd/keymap_80_ansi150.c similarity index 98% rename from keyboard/nerd/keymap_80_ansi150.c rename to orphan/nerd/keymap_80_ansi150.c index 72a7d83c..79eb52b1 100644 --- a/keyboard/nerd/keymap_80_ansi150.c +++ b/orphan/nerd/keymap_80_ansi150.c @@ -25,7 +25,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(2), [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), [2] = ACTION_LAYER_TOGGLE(1), diff --git a/keyboard/nerd/keymap_common.c b/orphan/nerd/keymap_common.c similarity index 100% rename from keyboard/nerd/keymap_common.c rename to orphan/nerd/keymap_common.c diff --git a/keyboard/nerd/keymap_common.h b/orphan/nerd/keymap_common.h similarity index 99% rename from keyboard/nerd/keymap_common.h rename to orphan/nerd/keymap_common.h index e1166359..d342e4ba 100644 --- a/keyboard/nerd/keymap_common.h +++ b/orphan/nerd/keymap_common.h @@ -30,7 +30,7 @@ along with this program. If not, see . #include "keymap.h" extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; +extern const action_t fn_actions[]; #define KEYMAP( \ K08, K09, K18, K19, K28, K29, K38, K39, K48, K49, K58, K59, K68, K69, K88, K89, \ diff --git a/keyboard/nerd/matrix.c b/orphan/nerd/matrix.c similarity index 100% rename from keyboard/nerd/matrix.c rename to orphan/nerd/matrix.c diff --git a/keyboard/phantom/Makefile.lufa b/orphan/phantom/Makefile.lufa similarity index 100% rename from keyboard/phantom/Makefile.lufa rename to orphan/phantom/Makefile.lufa diff --git a/keyboard/phantom/Makefile.pjrc b/orphan/phantom/Makefile.pjrc similarity index 100% rename from keyboard/phantom/Makefile.pjrc rename to orphan/phantom/Makefile.pjrc diff --git a/keyboard/phantom/README.md b/orphan/phantom/README.md similarity index 100% rename from keyboard/phantom/README.md rename to orphan/phantom/README.md diff --git a/keyboard/phantom/config.h b/orphan/phantom/config.h similarity index 100% rename from keyboard/phantom/config.h rename to orphan/phantom/config.h diff --git a/keyboard/phantom/keymap.c b/orphan/phantom/keymap.c similarity index 99% rename from keyboard/phantom/keymap.c rename to orphan/phantom/keymap.c index a040434f..81180aa5 100644 --- a/keyboard/phantom/keymap.c +++ b/orphan/phantom/keymap.c @@ -145,7 +145,7 @@ action_t keymap_fn_to_action(uint8_t keycode) if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); } else { - action.code = ACTION_NO; + return (action_t)ACTION_NO; } return action; } diff --git a/keyboard/phantom/keymap_7bit.h b/orphan/phantom/keymap_7bit.h similarity index 98% rename from keyboard/phantom/keymap_7bit.h rename to orphan/phantom/keymap_7bit.h index e6c4eabb..8ab81a14 100644 --- a/keyboard/phantom/keymap_7bit.h +++ b/orphan/phantom/keymap_7bit.h @@ -35,7 +35,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, \ TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_9), [2] = ACTION_MODS_KEY(MOD_LSFT, KC_0) diff --git a/keyboard/phantom/keymap_ansi.h b/orphan/phantom/keymap_ansi.h similarity index 96% rename from keyboard/phantom/keymap_ansi.h rename to orphan/phantom/keymap_ansi.h index 96a4c9df..a39b0125 100644 --- a/keyboard/phantom/keymap_ansi.h +++ b/orphan/phantom/keymap_ansi.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/keyboard/phantom/keymap_ansi_150.h b/orphan/phantom/keymap_ansi_150.h similarity index 96% rename from keyboard/phantom/keymap_ansi_150.h rename to orphan/phantom/keymap_ansi_150.h index 7fdb9eb1..7f18f95d 100644 --- a/keyboard/phantom/keymap_ansi_150.h +++ b/orphan/phantom/keymap_ansi_150.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/keyboard/phantom/keymap_iso.h b/orphan/phantom/keymap_iso.h similarity index 89% rename from keyboard/phantom/keymap_iso.h rename to orphan/phantom/keymap_iso.h index 970f622e..af92e25e 100644 --- a/keyboard/phantom/keymap_iso.h +++ b/orphan/phantom/keymap_iso.h @@ -11,12 +11,12 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 1: media keys */ KEYMAP_ISO(\ TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,SLEP, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MUTE,VOLD,VOLU, TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MSTP,MPLY,MPRV,MNXT,MSEL, TRNS,TRNS,TRNS, \ - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MUTE,VOLD,VOLU,TRNS, TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MSTP,MPLY,MPRV,MNXT, TRNS,TRNS,TRNS, \ + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,MSEL, \ TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/keyboard/phantom/keymap_iso_150.h b/orphan/phantom/keymap_iso_150.h similarity index 96% rename from keyboard/phantom/keymap_iso_150.h rename to orphan/phantom/keymap_iso_150.h index ab9acda1..cf9ea787 100644 --- a/keyboard/phantom/keymap_iso_150.h +++ b/orphan/phantom/keymap_iso_150.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/keyboard/phantom/led.c b/orphan/phantom/led.c similarity index 100% rename from keyboard/phantom/led.c rename to orphan/phantom/led.c diff --git a/keyboard/phantom/matrix.c b/orphan/phantom/matrix.c similarity index 100% rename from keyboard/phantom/matrix.c rename to orphan/phantom/matrix.c diff --git a/converter/serialmouse_usb/Makefile b/orphan/serialmouse_usb/Makefile similarity index 100% rename from converter/serialmouse_usb/Makefile rename to orphan/serialmouse_usb/Makefile diff --git a/converter/serialmouse_usb/README.md b/orphan/serialmouse_usb/README.md similarity index 100% rename from converter/serialmouse_usb/README.md rename to orphan/serialmouse_usb/README.md diff --git a/converter/serialmouse_usb/config.h b/orphan/serialmouse_usb/config.h similarity index 100% rename from converter/serialmouse_usb/config.h rename to orphan/serialmouse_usb/config.h diff --git a/converter/serialmouse_usb/keymap.c b/orphan/serialmouse_usb/keymap.c similarity index 100% rename from converter/serialmouse_usb/keymap.c rename to orphan/serialmouse_usb/keymap.c diff --git a/converter/adb_usb/keymap_common.c b/orphan/serialmouse_usb/keymap_common.c similarity index 100% rename from converter/adb_usb/keymap_common.c rename to orphan/serialmouse_usb/keymap_common.c diff --git a/converter/serialmouse_usb/keymap_common.h b/orphan/serialmouse_usb/keymap_common.h similarity index 99% rename from converter/serialmouse_usb/keymap_common.h rename to orphan/serialmouse_usb/keymap_common.h index 216a8dc0..59619097 100644 --- a/converter/serialmouse_usb/keymap_common.h +++ b/orphan/serialmouse_usb/keymap_common.h @@ -31,7 +31,7 @@ along with this program. If not, see . // 32*8(256) byte array which converts PS/2 code into USB code extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; +extern const action_t fn_actions[]; /* All keys */ diff --git a/keyboard/macway/led.c b/orphan/serialmouse_usb/led.c similarity index 100% rename from keyboard/macway/led.c rename to orphan/serialmouse_usb/led.c diff --git a/converter/serialmouse_usb/matrix.c b/orphan/serialmouse_usb/matrix.c similarity index 100% rename from converter/serialmouse_usb/matrix.c rename to orphan/serialmouse_usb/matrix.c diff --git a/converter/terminal_bluefruit/Makefile b/orphan/terminal_bluefruit/Makefile similarity index 100% rename from converter/terminal_bluefruit/Makefile rename to orphan/terminal_bluefruit/Makefile diff --git a/converter/terminal_bluefruit/README b/orphan/terminal_bluefruit/README similarity index 100% rename from converter/terminal_bluefruit/README rename to orphan/terminal_bluefruit/README diff --git a/converter/terminal_bluefruit/config.h b/orphan/terminal_bluefruit/config.h similarity index 100% rename from converter/terminal_bluefruit/config.h rename to orphan/terminal_bluefruit/config.h diff --git a/converter/terminal_bluefruit/keymap.c b/orphan/terminal_bluefruit/keymap.c similarity index 99% rename from converter/terminal_bluefruit/keymap.c rename to orphan/terminal_bluefruit/keymap.c index 8acd8cfb..cb5e0cca 100644 --- a/converter/terminal_bluefruit/keymap.c +++ b/orphan/terminal_bluefruit/keymap.c @@ -177,7 +177,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t fn_actions[] PROGMEM = { +static const action_t fn_actions[] PROGMEM = { [0] = ACTION_DEFAULT_LAYER_SET(0), [1] = ACTION_LAYER_MOMENTARY(1), [2] = ACTION_LAYER_MOMENTARY(2), //ACTION_LAYER_ON(2, ON_RELEASE), diff --git a/converter/terminal_bluefruit/led.c b/orphan/terminal_bluefruit/led.c similarity index 100% rename from converter/terminal_bluefruit/led.c rename to orphan/terminal_bluefruit/led.c diff --git a/converter/terminal_bluefruit/matrix.c b/orphan/terminal_bluefruit/matrix.c similarity index 100% rename from converter/terminal_bluefruit/matrix.c rename to orphan/terminal_bluefruit/matrix.c diff --git a/tmk_core/README.md b/tmk_core/README.md index f460d0ed..c9c2eda4 100644 --- a/tmk_core/README.md +++ b/tmk_core/README.md @@ -7,6 +7,9 @@ Source code is available here: Updates ------- +#### 2016/06/26 +Keymap framework was updated. `fn_actions[]` should be defined as `action_t` instead of `uint16_t`. And default code for keymap handling is now included in core you just need define `uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]` and `action_t fn_actions[]`. + #### 2016/02/10 flabbergast's Chibios protocol was merged from . See [protocol/chibios/README.md](protocol/chibios/README.md). Chibios protocol supports Cortex-M such as STM32 and Kinetis. diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 9cfe6d5a..14951ec8 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -1,6 +1,7 @@ COMMON_DIR = common SRC += $(COMMON_DIR)/host.c \ $(COMMON_DIR)/keyboard.c \ + $(COMMON_DIR)/matrix.c \ $(COMMON_DIR)/action.c \ $(COMMON_DIR)/action_tapping.c \ $(COMMON_DIR)/action_macro.c \ @@ -17,65 +18,71 @@ SRC += $(COMMON_DIR)/host.c \ # Option modules -ifdef ACTIONMAP_ENABLE - SRC += $(COMMON_DIR)/actionmap.c +ifeq (yes,$(strip $(UNIMAP_ENABLE))) + SRC += $(COMMON_DIR)/unimap.c + OPT_DEFS += -DUNIMAP_ENABLE OPT_DEFS += -DACTIONMAP_ENABLE else - SRC += $(COMMON_DIR)/keymap.c + ifeq (yes,$(strip $(ACTIONMAP_ENABLE))) + SRC += $(COMMON_DIR)/actionmap.c + OPT_DEFS += -DACTIONMAP_ENABLE + else + SRC += $(COMMON_DIR)/keymap.c + endif endif -ifdef BOOTMAGIC_ENABLE +ifeq (yes,$(strip $(BOOTMAGIC_ENABLE))) SRC += $(COMMON_DIR)/bootmagic.c SRC += $(COMMON_DIR)/avr/eeconfig.c OPT_DEFS += -DBOOTMAGIC_ENABLE endif -ifdef MOUSEKEY_ENABLE +ifeq (yes,$(strip $(MOUSEKEY_ENABLE))) SRC += $(COMMON_DIR)/mousekey.c OPT_DEFS += -DMOUSEKEY_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif -ifdef EXTRAKEY_ENABLE +ifeq (yes,$(strip $(EXTRAKEY_ENABLE))) OPT_DEFS += -DEXTRAKEY_ENABLE endif -ifdef CONSOLE_ENABLE +ifeq (yes,$(strip $(CONSOLE_ENABLE))) OPT_DEFS += -DCONSOLE_ENABLE else OPT_DEFS += -DNO_PRINT OPT_DEFS += -DNO_DEBUG endif -ifdef COMMAND_ENABLE +ifeq (yes,$(strip $(COMMAND_ENABLE))) SRC += $(COMMON_DIR)/command.c OPT_DEFS += -DCOMMAND_ENABLE endif -ifdef NKRO_ENABLE +ifeq (yes,$(strip $(NKRO_ENABLE))) OPT_DEFS += -DNKRO_ENABLE endif -ifdef USB_6KRO_ENABLE +ifeq (yes,$(strip $(USB_6KRO_ENABLE))) OPT_DEFS += -DUSB_6KRO_ENABLE endif -ifdef KEYBOARD_LOCK_ENABLE +ifeq (yes, $(strip $(KEYBOARD_LOCK_ENABLE))) OPT_DEFS += -DKEYBOARD_LOCK_ENABLE endif -ifdef SLEEP_LED_ENABLE +ifeq (yes,$(strip $(SLEEP_LED_ENABLE))) SRC += $(COMMON_DIR)/avr/sleep_led.c OPT_DEFS += -DSLEEP_LED_ENABLE OPT_DEFS += -DNO_SUSPEND_POWER_DOWN endif -ifdef BACKLIGHT_ENABLE +ifeq (yes,$(strip $(BACKLIGHT_ENABLE))) SRC += $(COMMON_DIR)/backlight.c OPT_DEFS += -DBACKLIGHT_ENABLE endif -ifdef KEYMAP_SECTION_ENABLE +ifeq (yes,$(strip $(KEYMAP_SECTION_ENABLE))) OPT_DEFS += -DKEYMAP_SECTION_ENABLE ifeq ($(strip $(MCU)),atmega32u2) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index b9040f5b..ab6e9d89 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -27,6 +27,7 @@ along with this program. If not, see . #include "action_util.h" #include "action.h" #include "hook.h" +#include "wait.h" #ifdef DEBUG_ACTION #include "debug.h" @@ -100,7 +101,7 @@ void process_action(keyrecord_t *record) { uint8_t mods = (action.kind.id == ACT_LMODS_TAP) ? action.key.mods : action.key.mods<<4; - switch (action.layer_tap.code) { + switch (action.key.code) { #ifndef NO_ACTION_ONESHOT case MODS_ONESHOT: // Oneshot modifier @@ -246,14 +247,18 @@ void process_action(keyrecord_t *record) case ACT_LAYER_TAP: case ACT_LAYER_TAP_EXT: switch (action.layer_tap.code) { - case 0xe0 ... 0xef: - /* layer On/Off with modifiers(left only) */ + case 0xc0 ... 0xdf: + /* layer On/Off with modifiers */ if (event.pressed) { layer_on(action.layer_tap.val); - register_mods(action.layer_tap.code & 0x0f); + register_mods((action.layer_tap.code & 0x10) ? + (action.layer_tap.code & 0x0f) << 4 : + (action.layer_tap.code & 0x0f)); } else { layer_off(action.layer_tap.val); - unregister_mods(action.layer_tap.code & 0x0f); + unregister_mods((action.layer_tap.code & 0x10) ? + (action.layer_tap.code & 0x0f) << 4 : + (action.layer_tap.code & 0x0f)); } break; case OP_TAP_TOGGLE: @@ -365,6 +370,7 @@ void register_code(uint8_t code) #endif add_key(KC_CAPSLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_CAPSLOCK); send_keyboard_report(); } @@ -375,6 +381,7 @@ void register_code(uint8_t code) #endif add_key(KC_NUMLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_NUMLOCK); send_keyboard_report(); } @@ -385,6 +392,7 @@ void register_code(uint8_t code) #endif add_key(KC_SCROLLLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_SCROLLLOCK); send_keyboard_report(); } @@ -440,6 +448,7 @@ void unregister_code(uint8_t code) #endif add_key(KC_CAPSLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_CAPSLOCK); send_keyboard_report(); } @@ -450,6 +459,7 @@ void unregister_code(uint8_t code) #endif add_key(KC_NUMLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_NUMLOCK); send_keyboard_report(); } @@ -460,6 +470,7 @@ void unregister_code(uint8_t code) #endif add_key(KC_SCROLLLOCK); send_keyboard_report(); + wait_ms(100); del_key(KC_SCROLLLOCK); send_keyboard_report(); } @@ -525,10 +536,20 @@ bool is_tap_key(keypos_t key) switch (action.kind.id) { case ACT_LMODS_TAP: case ACT_RMODS_TAP: + switch (action.key.code) { + case MODS_ONESHOT: + case MODS_TAP_TOGGLE: + case KC_A ... KC_EXSEL: // tap key + case KC_LCTRL ... KC_RGUI: // tap key + return true; + } case ACT_LAYER_TAP: case ACT_LAYER_TAP_EXT: switch (action.layer_tap.code) { - case 0x00 ... 0xdf: + case 0xc0 ... 0xdf: // with modifiers + return false; + case KC_A ... KC_EXSEL: // tap key + case KC_LCTRL ... KC_RGUI: // tap key case OP_TAP_TOGGLE: return true; } diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index b39c6441..1eb69104 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -29,14 +29,15 @@ along with this program. If not, see . * 000r|0000|0000 0001 Transparent code * 000r|0000| keycode Key * 000r|mods|0000 0000 Modifiers - * 000r|mods| keycode Modifiers+Key(Modified key) + * 000r|mods| keycode Modifiers+key(Modified key) * r: Left/Right flag(Left:0, Right:1) * * ACT_MODS_TAP(001r): - * 001r|mods|0000 0000 Modifiers with OneShot - * 001r|mods|0000 0001 Modifiers with tap toggle - * 001r|mods|0000 00xx (reserved) - * 001r|mods| keycode Modifiers with Tap Key(Dual role) + * 001r|mods|0000 0000 Modifiers with OneShot[TAP] + * 001r|mods|0000 0001 Modifiers with tap toggle[TAP] + * 001r|mods|0000 00xx (reserved) (0x02-03) + * 001r|mods| keycode Modifiers with tap key(0x04-A4, E0-E7)[TAP] + * (reserved) (0xA5-DF, E8-FF) * * * Other Keys(01xx) @@ -70,13 +71,15 @@ along with this program. If not, see . * 1001|oopp|BBBB BBBB 8-bit Bitwise Operation??? * * ACT_LAYER_TAP(101x): - * 101E|LLLL| keycode On/Off with tap key (0x00-DF)[TAP] - * 101E|LLLL|1110 mods On/Off with modifiers (0xE0-EF)[NOT TAP] + * 101E|LLLL| keycode On/Off with tap key (0x04-A4, E0-E7)[TAP] + * 101E|LLLL|110r mods On/Off with modifiers (0xC0-DF)[NOT TAP] + * r: Left/Right flag(Left:0, Right:1) + * (reserved) (0xA5-BF, E8-EF) * 101E|LLLL|1111 0000 Invert with tap toggle (0xF0) [TAP] * 101E|LLLL|1111 0001 On/Off (0xF1) [NOT TAP] * 101E|LLLL|1111 0010 Off/On (0xF2) [NOT TAP] * 101E|LLLL|1111 0011 Set/Clear (0xF3) [NOT TAP] - * 101E|LLLL|1111 xxxx Reserved (0xF4-FF) + * 101E|LLLL|1111 xxxx (reserved) (0xF4-FF) * ELLLL: layer 0-31(E: extra bit for layer 16-31) * * @@ -181,9 +184,9 @@ typedef union { /* action utility */ -#define ACTION_NO 0 -#define ACTION_TRANSPARENT 1 -#define ACTION(kind, param) ((kind)<<12 | (param)) +#define ACTION_NO { .code = 0 } +#define ACTION_TRANSPARENT { .code = 1 } +#define ACTION(kind, param) { .code = ((kind)<<12 | (param)) } /* @@ -197,25 +200,26 @@ typedef union { * bit 4 +----- LR flag(Left:0, Right:1) */ enum mods_bit { - MOD_LCTL = 0x01, - MOD_LSFT = 0x02, - MOD_LALT = 0x04, - MOD_LGUI = 0x08, - MOD_RCTL = 0x11, - MOD_RSFT = 0x12, - MOD_RALT = 0x14, - MOD_RGUI = 0x18, + MOD_NONE = 0x0000, + MOD_LCTL = 0x0100, + MOD_LSFT = 0x0200, + MOD_LALT = 0x0400, + MOD_LGUI = 0x0800, + MOD_RCTL = 0x1100, + MOD_RSFT = 0x1200, + MOD_RALT = 0x1400, + MOD_RGUI = 0x1800, }; enum mods_codes { MODS_ONESHOT = 0x00, MODS_TAP_TOGGLE = 0x01, }; #define ACTION_KEY(key) ACTION(ACT_MODS, (key)) -#define ACTION_MODS(mods) ACTION(ACT_MODS, ((mods)&0x1f)<<8 | 0) -#define ACTION_MODS_KEY(mods, key) ACTION(ACT_MODS, ((mods)&0x1f)<<8 | (key)) -#define ACTION_MODS_TAP_KEY(mods, key) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | (key)) -#define ACTION_MODS_ONESHOT(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_ONESHOT) -#define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f)<<8 | MODS_TAP_TOGGLE) +#define ACTION_MODS(mods) ACTION(ACT_MODS, ((mods)&0x1f00) | 0) +#define ACTION_MODS_KEY(mods, key) ACTION(ACT_MODS, ((mods)&0x1f00) | (key)) +#define ACTION_MODS_TAP_KEY(mods, key) ACTION(ACT_MODS_TAP, ((mods)&0x1f00) | (key)) +#define ACTION_MODS_ONESHOT(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f00) | MODS_ONESHOT) +#define ACTION_MODS_TAP_TOGGLE(mods) ACTION(ACT_MODS_TAP, ((mods)&0x1f00) | MODS_TAP_TOGGLE) /* @@ -267,7 +271,7 @@ enum layer_pram_tap_op { #define ACTION_LAYER_ON_OFF(layer) ACTION_LAYER_TAP((layer), OP_ON_OFF) #define ACTION_LAYER_OFF_ON(layer) ACTION_LAYER_TAP((layer), OP_OFF_ON) #define ACTION_LAYER_SET_CLEAR(layer) ACTION_LAYER_TAP((layer), OP_SET_CLEAR) -#define ACTION_LAYER_MODS(layer, mods) ACTION_LAYER_TAP((layer), 0xe0 | ((mods)&0x0f)) +#define ACTION_LAYER_MODS(layer, mods) ACTION_LAYER_TAP((layer), 0xc0 | ((mods>>8)&0x1f)) /* With Tapping */ #define ACTION_LAYER_TAP_KEY(layer, key) ACTION_LAYER_TAP((layer), (key)) #define ACTION_LAYER_TAP_TOGGLE(layer) ACTION_LAYER_TAP((layer), OP_TAP_TOGGLE) diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index 95909cc2..6b5a7fd2 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -117,7 +117,7 @@ void layer_debug(void) action_t layer_switch_get_action(keypos_t key) { - action_t action = { .code = ACTION_TRANSPARENT }; + action_t action = ACTION_TRANSPARENT; #ifndef NO_ACTION_LAYER uint32_t layers = layer_state | default_layer_state; @@ -125,7 +125,7 @@ action_t layer_switch_get_action(keypos_t key) for (int8_t i = 31; i >= 0; i--) { if (layers & (1UL<. #include "action_code.h" #include "actionmap.h" + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][MATRIX_ROWS][MATRIX_COLS]; + + /* Converts key to action */ __attribute__ ((weak)) action_t action_for_key(uint8_t layer, keypos_t key) diff --git a/tmk_core/common/actionmap.h b/tmk_core/common/actionmap.h index cbbcfe93..2ebfb0d0 100644 --- a/tmk_core/common/actionmap.h +++ b/tmk_core/common/actionmap.h @@ -24,15 +24,11 @@ along with this program. If not, see . #include "action.h" -/* Keymapping with 16bit action codes */ -extern const uint16_t actionmaps[][MATRIX_ROWS][MATRIX_COLS]; - - /* Modified key */ #define AC_c(kc) ACTION_MODS_KEY(MOD_LCTL, KC_##kc) #define AC_s(kc) ACTION_MODS_KEY(MOD_LSFT, KC_##kc) #define AC_a(kc) ACTION_MODS_KEY(MOD_LALT, KC_##kc) -#define AC_g(kc) ACTION_MODS_KEY(MOD_LSFT, KC_##kc) +#define AC_g(kc) ACTION_MODS_KEY(MOD_LGUI, KC_##kc) /* Normal key */ #define AC_NO ACTION_KEY(KC_NO) diff --git a/tmk_core/common/avr/sleep_led.c b/tmk_core/common/avr/sleep_led.c index dab3eb0f..37c2cf1b 100644 --- a/tmk_core/common/avr/sleep_led.c +++ b/tmk_core/common/avr/sleep_led.c @@ -45,10 +45,17 @@ void sleep_led_disable(void) TIMSK1 &= ~_BV(OCIE1A); } -void sleep_led_toggle(void) + +__attribute__ ((weak)) +void sleep_led_on(void) { - /* Disable Compare Match Interrupt */ - TIMSK1 ^= _BV(OCIE1A); + led_set(1< +.list + +#define BPS 44 /* Bit delay. (see above table) */ +#define BIDIR 0 /* 0:Separated Tx/Rx, 1:Shared Tx/Rx */ + +#define OUT_1 sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 1 */ +#define OUT_0 cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT /* Output 0 */ +#define SKIP_IN_1 sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT /* Skip if 1 */ +#define SKIP_IN_0 sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT /* Skip if 0 */ + + + +#ifdef SPM_PAGESIZE +.macro _LPMI reg + lpm \reg, Z+ +.endm +.macro _MOVW dh,dl, sh,sl + movw \dl, \sl +.endm +#else +.macro _LPMI reg + lpm + mov \reg, r0 + adiw ZL, 1 +.endm +.macro _MOVW dh,dl, sh,sl + mov \dl, \sl + mov \dh, \sh +.endm +#endif + + + +;---------------------------------------------------------------------------; +; Transmit a byte in serial format of N81 +; +;Prototype: void xmit (uint8_t data); +;Size: 16 words + +.global xmit +.func xmit +xmit: +#if BIDIR + ldi r23, BPS-1 ;Pre-idle time for bidirectional data line +5: dec r23 ; + brne 5b ;/ +#endif + in r0, _SFR_IO_ADDR(SREG) ;Save flags + + com r24 ;C = start bit + ldi r25, 10 ;Bit counter + cli ;Start critical section + +1: ldi r23, BPS-1 ;----- Bit transferring loop +2: dec r23 ;Wait for a bit time + brne 2b ;/ + brcs 3f ;MISO = bit to be sent + OUT_1 ; +3: brcc 4f ; + OUT_0 ;/ +4: lsr r24 ;Get next bit into C + dec r25 ;All bits sent? + brne 1b ; no, coutinue + + out _SFR_IO_ADDR(SREG), r0 ;End of critical section + ret +.endfunc + + + +;---------------------------------------------------------------------------; +; Receive a byte +; +;Prototype: uint8_t rcvr (void); +;Size: 19 words + +.global rcvr +.func rcvr +rcvr: + in r0, _SFR_IO_ADDR(SREG) ;Save flags + + ldi r24, 0x80 ;Receiving shift reg + cli ;Start critical section + +1: SKIP_IN_1 ;Wait for idle + rjmp 1b +2: SKIP_IN_0 ;Wait for start bit + rjmp 2b + ldi r25, BPS/2 ;Wait for half bit time +3: dec r25 + brne 3b + +4: ldi r25, BPS ;----- Bit receiving loop +5: dec r25 ;Wait for a bit time + brne 5b ;/ + lsr r24 ;Next bit + SKIP_IN_0 ;Get a data bit into r24.7 + ori r24, 0x80 + brcc 4b ;All bits received? no, continue + + out _SFR_IO_ADDR(SREG), r0 ;End of critical section + ret +.endfunc + + +; Not wait for start bit. This should be called after detecting start bit. +.global recv +.func recv +recv: + in r0, _SFR_IO_ADDR(SREG) ;Save flags + + ldi r24, 0x80 ;Receiving shift reg + cli ;Start critical section + +;1: SKIP_IN_1 ;Wait for idle +; rjmp 1b +;2: SKIP_IN_0 ;Wait for start bit +; rjmp 2b + ldi r25, BPS/2 ;Wait for half bit time +3: dec r25 + brne 3b + +4: ldi r25, BPS ;----- Bit receiving loop +5: dec r25 ;Wait for a bit time + brne 5b ;/ + lsr r24 ;Next bit + SKIP_IN_0 ;Get a data bit into r24.7 + ori r24, 0x80 + brcc 4b ;All bits received? no, continue + + ldi r25, BPS/2 ;Wait for half bit time +6: dec r25 + brne 6b +7: SKIP_IN_1 ;Wait for stop bit + rjmp 7b + + out _SFR_IO_ADDR(SREG), r0 ;End of critical section + ret +.endfunc diff --git a/tmk_core/common/avr/suart.h b/tmk_core/common/avr/suart.h new file mode 100644 index 00000000..72725b99 --- /dev/null +++ b/tmk_core/common/avr/suart.h @@ -0,0 +1,8 @@ +#ifndef SUART +#define SUART + +void xmit(uint8_t); +uint8_t rcvr(void); +uint8_t recv(void); + +#endif /* SUART */ diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index af99f52b..02d7e4c9 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -30,16 +30,6 @@ __asm__ __volatile__ ( \ ) -void suspend_idle(uint8_t time) -{ - cli(); - set_sleep_mode(SLEEP_MODE_IDLE); - sleep_enable(); - sei(); - sleep_cpu(); - sleep_disable(); -} - /* Power down MCU with watchdog timer * wdto: watchdog timer timeout defined in * WDTO_15MS @@ -80,13 +70,45 @@ static void power_down(uint8_t wdto) wdt_disable(); } -void suspend_power_down(void) +static void standby(void) { - power_down(WDTO_15MS); + set_sleep_mode(SLEEP_MODE_STANDBY); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); +} + +static void idle(void) +{ + set_sleep_mode(SLEEP_MODE_IDLE); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); +} + + +void suspend_idle(uint8_t time) +{ + idle(); +} + +void suspend_power_down(void) +{ +#ifdef NO_SUSPEND_POWER_DOWN + ; +#elif defined(SUSPEND_MODE_NOPOWERSAVE) + ; +#elif defined(SUSPEND_MODE_STANDBY) + standby(); +#elif defined(SUSPEND_MODE_IDLE) + idle(); +#else + power_down(WDTO_15MS); +#endif } -__attribute__ ((weak)) void matrix_power_up(void) {} -__attribute__ ((weak)) void matrix_power_down(void) {} bool suspend_wakeup_condition(void) { matrix_power_up(); @@ -102,6 +124,7 @@ bool suspend_wakeup_condition(void) void suspend_wakeup_init(void) { // clear keyboard state + matrix_clear(); clear_keyboard(); #ifdef BACKLIGHT_ENABLE backlight_init(); diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 69209700..bb471e88 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -182,14 +182,22 @@ static bool command_common(uint8_t code) { #ifdef KEYBOARD_LOCK_ENABLE static host_driver_t *host_driver = 0; +#endif +#ifdef SLEEP_LED_ENABLE + static bool sleep_led_test = false; #endif switch (code) { #ifdef SLEEP_LED_ENABLE case KC_Z: // test breathing sleep LED print("Sleep LED test\n"); - sleep_led_toggle(); - led_set(host_keyboard_leds()); + if (sleep_led_test) { + sleep_led_disable(); + led_set(host_keyboard_leds()); + } else { + sleep_led_enable(); + } + sleep_led_test = !sleep_led_test; break; #endif #ifdef BOOTMAGIC_ENABLE diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index e9b79167..56d65e50 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -54,7 +54,7 @@ void host_keyboard_send(report_keyboard_t *report) (*driver->send_keyboard)(report); if (debug_keyboard) { - dprint("keyboard_report: "); + dprint("keyboard: "); for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) { dprintf("%02X ", report->raw[i]); } @@ -75,6 +75,10 @@ void host_system_send(uint16_t report) if (!driver) return; (*driver->send_system)(report); + + if (debug_keyboard) { + dprintf("system: %04X\n", report); + } } void host_consumer_send(uint16_t report) @@ -84,9 +88,13 @@ void host_consumer_send(uint16_t report) if (!driver) return; (*driver->send_consumer)(report); + + if (debug_keyboard) { + dprintf("consumer: %04X\n", report); + } } -uint16_t host_last_sysytem_report(void) +uint16_t host_last_system_report(void) { return last_system_report; } diff --git a/tmk_core/common/host.h b/tmk_core/common/host.h index 918af69e..9814b10d 100644 --- a/tmk_core/common/host.h +++ b/tmk_core/common/host.h @@ -47,7 +47,7 @@ void host_mouse_send(report_mouse_t *report); void host_system_send(uint16_t data); void host_consumer_send(uint16_t data); -uint16_t host_last_sysytem_report(void); +uint16_t host_last_system_report(void); uint16_t host_last_consumer_report(void); #ifdef __cplusplus diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 707351bc..6057ea13 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,7 +63,6 @@ static bool has_ghost_in_row(uint8_t row) #endif -__attribute__ ((weak)) void matrix_setup(void) {} void keyboard_setup(void) { matrix_setup(); @@ -138,8 +137,10 @@ void keyboard_task(void) hook_matrix_change(e); // record a processed key matrix_prev[r] ^= ((matrix_row_t)1<. #define IS_ERROR(code) (KC_ROLL_OVER <= (code) && (code) <= KC_UNDEFINED) #define IS_ANY(code) (KC_A <= (code) && (code) <= 0xFF) + +#ifndef ACTIONMAP_ENABLE #define IS_KEY(code) (KC_A <= (code) && (code) <= KC_EXSEL) +#else +#define IS_KEY(code) ((KC_A <= (code) && (code) <= KC_EXSEL) || \ + (KC_KP_00 <= (code) && (code) <= KC_KP_HEXADECIMAL)) +#endif + #define IS_MOD(code) (KC_LCTRL <= (code) && (code) <= KC_RGUI) @@ -179,7 +186,7 @@ enum hid_keyboard_keypad_usage { KC_ROLL_OVER, KC_POST_FAIL, KC_UNDEFINED, - KC_A, + KC_A, /* 0x04 */ KC_B, KC_C, KC_D, @@ -341,10 +348,7 @@ enum hid_keyboard_keypad_usage { KC_CRSEL, KC_EXSEL, /* 0xA4 */ - /* NOTE: 0xA5-DF are used for internal special purpose */ - -#if 0 - /* NOTE: Following codes(0xB0-DD) are not used. Leave them for reference. */ + /* NOTE: Following code range(0xB0-DD) are shared with special codes of 8-bit keymap */ KC_KP_00 = 0xB0, KC_KP_000, KC_THOUSANDS_SEPARATOR, @@ -391,7 +395,6 @@ enum hid_keyboard_keypad_usage { KC_KP_OCTAL, KC_KP_DECIMAL, KC_KP_HEXADECIMAL, /* 0xDD */ -#endif /* Modifiers */ KC_LCTRL = 0xE0, @@ -401,13 +404,11 @@ enum hid_keyboard_keypad_usage { KC_RCTRL, KC_RSHIFT, KC_RALT, - KC_RGUI, - - /* NOTE: 0xE8-FF are used for internal special purpose */ + KC_RGUI, /* 0xE7 */ }; -/* Special keycodes */ -/* NOTE: 0xA5-DF and 0xE8-FF are used for internal special purpose */ +/* Special keycodes for 8-bit keymap + NOTE: 0xA5-DF and 0xE8-FF are used for internal special purpose */ enum internal_special_keycodes { /* System Control */ KC_SYSTEM_POWER = 0xA5, diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c index 25161748..01c6e642 100644 --- a/tmk_core/common/keymap.c +++ b/tmk_core/common/keymap.c @@ -1,5 +1,5 @@ /* -Copyright 2013 Jun Wako +Copyright 2013,2016 Jun Wako 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 @@ -23,6 +23,9 @@ along with this program. If not, see . #include "wait.h" #include "debug.h" #include "bootloader.h" +#if defined(__AVR__) +#include +#endif #ifdef BOOTMAGIC_ENABLE extern keymap_config_t keymap_config; @@ -32,6 +35,7 @@ static action_t keycode_to_action(uint8_t keycode); /* converts key to action */ +__attribute__ ((weak)) action_t action_for_key(uint8_t layer, keypos_t key) { uint8_t keycode = keymap_key_to_keycode(layer, key); @@ -53,7 +57,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) case KC_LALT: if (keymap_config.swap_lalt_lgui) { if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_LGUI); } @@ -63,13 +67,13 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_LALT); } if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_LGUI); case KC_RALT: if (keymap_config.swap_ralt_rgui) { if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_RGUI); } @@ -79,7 +83,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_RALT); } if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_RGUI); case KC_GRAVE: @@ -133,23 +137,22 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* translates keycode to action */ static action_t keycode_to_action(uint8_t keycode) { - action_t action = {}; switch (keycode) { case KC_A ... KC_EXSEL: case KC_LCTRL ... KC_RGUI: - action.code = ACTION_KEY(keycode); + return (action_t)ACTION_KEY(keycode); break; case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: - action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); + return (action_t)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); break; case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: - action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); + return (action_t)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); break; case KC_MS_UP ... KC_MS_ACCEL2: - action.code = ACTION_MOUSEKEY(keycode); + return (action_t)ACTION_MOUSEKEY(keycode); break; case KC_TRNS: - action.code = ACTION_TRANSPARENT; + return (action_t)ACTION_TRANSPARENT; break; case KC_BOOTLOADER: clear_keyboard(); @@ -157,10 +160,10 @@ static action_t keycode_to_action(uint8_t keycode) bootloader_jump(); // not return break; default: - action.code = ACTION_NO; + return (action_t)ACTION_NO; break; } - return action; + return (action_t)ACTION_NO; } @@ -170,6 +173,28 @@ static action_t keycode_to_action(uint8_t keycode) * Legacy keymap support * Consider using new keymap API instead. */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint8_t fn_layer[]; +extern const uint8_t fn_keycode[]; + +__attribute__ ((weak)) +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) +{ + return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); +} + +__attribute__ ((weak)) +uint8_t keymap_fn_layer(uint8_t index) +{ + return pgm_read_byte(&fn_layer[index]); +} + +__attribute__ ((weak)) +uint8_t keymap_fn_keycode(uint8_t index) +{ + return pgm_read_byte(&fn_keycode[index]); +} + __attribute__ ((weak)) uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { @@ -181,21 +206,47 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) __attribute__ ((weak)) action_t keymap_fn_to_action(uint8_t keycode) { - action_t action = { .code = ACTION_NO }; switch (keycode) { case KC_FN0 ... KC_FN31: { uint8_t layer = keymap_fn_layer(FN_INDEX(keycode)); uint8_t key = keymap_fn_keycode(FN_INDEX(keycode)); if (key) { - action.code = ACTION_LAYER_TAP_KEY(layer, key); + return (action_t)ACTION_LAYER_TAP_KEY(layer, key); } else { - action.code = ACTION_LAYER_MOMENTARY(layer); + return (action_t)ACTION_LAYER_MOMENTARY(layer); } } - return action; + return (action_t)ACTION_NO; default: - return action; + return (action_t)ACTION_NO; } } + +#else + +/* user keymaps should be defined somewhere */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const action_t fn_actions[]; + +__attribute__ ((weak)) +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ +#if defined(__AVR__) + return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +#else + return keymaps[(layer)][(key.row)][(key.col)]; +#endif +} + +__attribute__ ((weak)) +action_t keymap_fn_to_action(uint8_t keycode) +{ +#if defined(__AVR__) + return (action_t)pgm_read_word(&fn_actions[FN_INDEX(keycode)]); +#else + return fn_actions[FN_INDEX(keycode)]; +#endif +} + #endif diff --git a/tmk_core/common/matrix.c b/tmk_core/common/matrix.c new file mode 100644 index 00000000..9939307a --- /dev/null +++ b/tmk_core/common/matrix.c @@ -0,0 +1,95 @@ +/* +Copyright 2016 Jun Wako + +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 . +*/ +#include "print.h" +#include "matrix.h" + + +__attribute__ ((weak)) +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +__attribute__ ((weak)) +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +__attribute__ ((weak)) +void matrix_clear(void) +{ +} + +__attribute__ ((weak)) +void matrix_setup(void) {} + +__attribute__ ((weak)) +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix_get_row(row) & (1< 255) +#error "MATRIX_ROWS must not exceed 255" +#endif + #define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1< +#endif + + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; + +// table translates matrix to universal keymap +extern const uint8_t unimap_trans[MATRIX_ROWS][MATRIX_COLS]; + + + +// translates raw matrix to universal map +keypos_t unimap_translate(keypos_t key) +{ + uint8_t unimap_pos = +#if defined(__AVR__) + pgm_read_byte(&unimap_trans[key.row][key.col]); +#else + unimap_trans[key.row][key.col]; +#endif + return (keypos_t) { + .row = ((unimap_pos & 0xf0) >> 4), + .col = (unimap_pos & 0x0f) + }; +} + +/* Converts key to action */ +__attribute__ ((weak)) +action_t action_for_key(uint8_t layer, keypos_t key) +{ + keypos_t uni = unimap_translate(key); + if ((uni.row << 4 | uni.col) == UNIMAP_NO) { + return (action_t)ACTION_NO; + } +#if defined(__AVR__) + return (action_t)pgm_read_word(&actionmaps[(layer)][(uni.row & 0x7)][(uni.col)]); +#else + return actionmaps[(layer)][(uni.row & 0x7)][(uni.col)]; +#endif +} + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} diff --git a/tmk_core/common/unimap.h b/tmk_core/common/unimap.h new file mode 100644 index 00000000..cd00e1d7 --- /dev/null +++ b/tmk_core/common/unimap.h @@ -0,0 +1,291 @@ +/* +Copyright 2016 Jun Wako +*/ +#ifndef _UNIMAP_H_ +#define _UNIMAP_H_ + +#include +#include +#include "action.h" +#include "action_code.h" +#include "actionmap.h" + + +// Universal map table: 8x16=128key +#define UNIMAP_ROWS 8 +#define UNIMAP_COLS 16 + +/* Universal 128-key keyboard layout(8x16) + ,-----------------------------------------------. + |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| +,---. |-----------------------------------------------| ,-----------. ,-----------. +|Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| +|-----------------------------------------------------------| |-----------| |---------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| +|-----------------------------------------------------------| `-----------' |---------------| +|CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Entr| | 4| 5| 6|KP,| +|-----------------------------------------------------------| ,---. |---------------| +|Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| +|-----------------------------------------------------------| ,-----------. |---------------| +|Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|KP=| +`-----------------------------------------------------------' `-----------' `---------------' +App: Windows Menu key +Gui: Windows key, Mac ⌘ key or Meta key +VDn Vup Mut: Volume control +< #: ISO keys(in UK legend) +KP=: Keypad = for Mac +KP,: Brazilian Keypad Comma +JPY: Japanese Yen(¥) +RO: Japanese ろ(Ro) or Brazilian /(Slash) +MHEN: Japanese 無変換(Non Conversion) or Korean Hanja +HENK: Japanese 変換(Conversion) or Korean Hangul/English +KANA: Japanese かな(Hiragana/Katakana) +https://en.wikipedia.org/wiki/Keyboard_layout#Japanese +https://en.wikipedia.org/wiki/Keyboard_layout#Hangul_.28for_Korean.29 +*/ +#define UNIMAP( \ + K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ + K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K01,K02,K03, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,K66, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K75,K7D, K52, K59,K5A,K5B,K58, \ + K78,K7B,K7A,K77, K2C, K76,K00,K7E,K7F,K65,K7C, K50,K51,K4F, K62,K63,K67 \ +) { \ + { AC_##K00, AC_##K01, AC_##K02, AC_##K03, AC_##K04, AC_##K05, AC_##K06, AC_##K07, /* 00-07 */ \ + AC_##K08, AC_##K09, AC_##K0A, AC_##K0B, AC_##K0C, AC_##K0D, AC_##K0E, AC_##K0F }, /* 08-0F */ \ + { AC_##K10, AC_##K11, AC_##K12, AC_##K13, AC_##K14, AC_##K15, AC_##K16, AC_##K17, /* 10-17 */ \ + AC_##K18, AC_##K19, AC_##K1A, AC_##K1B, AC_##K1C, AC_##K1D, AC_##K1E, AC_##K1F }, /* 18-1F */ \ + { AC_##K20, AC_##K21, AC_##K22, AC_##K23, AC_##K24, AC_##K25, AC_##K26, AC_##K27, /* 20-27 */ \ + AC_##K28, AC_##K29, AC_##K2A, AC_##K2B, AC_##K2C, AC_##K2D, AC_##K2E, AC_##K2F }, /* 28-2F */ \ + { AC_##K30, AC_##K31, AC_##K32, AC_##K33, AC_##K34, AC_##K35, AC_##K36, AC_##K37, /* 30-37 */ \ + AC_##K38, AC_##K39, AC_##K3A, AC_##K3B, AC_##K3C, AC_##K3D, AC_##K3E, AC_##K3F }, /* 38-3F */ \ + { AC_##K40, AC_##K41, AC_##K42, AC_##K43, AC_##K44, AC_##K45, AC_##K46, AC_##K47, /* 40-47 */ \ + AC_##K48, AC_##K49, AC_##K4A, AC_##K4B, AC_##K4C, AC_##K4D, AC_##K4E, AC_##K4F }, /* 48-4F */ \ + { AC_##K50, AC_##K51, AC_##K52, AC_##K53, AC_##K54, AC_##K55, AC_##K56, AC_##K57, /* 50-57 */ \ + AC_##K58, AC_##K59, AC_##K5A, AC_##K5B, AC_##K5C, AC_##K5D, AC_##K5E, AC_##K5F }, /* 58-5F */ \ + { AC_##K60, AC_##K61, AC_##K62, AC_##K63, AC_##K64, AC_##K65, AC_##K66, AC_##K67, /* 60-67 */ \ + AC_##K68, AC_##K69, AC_##K6A, AC_##K6B, AC_##K6C, AC_##K6D, AC_##K6E, AC_##K6F }, /* 68-6F */ \ + { AC_##K70, AC_##K71, AC_##K72, AC_##K73, AC_##K74, AC_##K75, AC_##K76, AC_##K77, /* 70-77 */ \ + AC_##K78, AC_##K79, AC_##K7A, AC_##K7B, AC_##K7C, AC_##K7D, AC_##K7E, AC_##K7F } /* 78-7F */ \ +} + + +/* Matrix poision for Universal 128-key keyboard + ,-----------------------------------------------. + | 68| 69| 6A| 6B| 6C| 6D| 6E| 6F| 70| 71| 72| 73| +,---. |-----------------------------------------------| ,-----------. ,-----------. +| 29| | 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42| 43| 44| 45| | 46| 47| 48| | 01| 02| 03| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| 35| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 2D| 2E| 74| 2A| | 49| 4A| 4B| | 53| 54| 55| 56| +|-----------------------------------------------------------| |-----------| |---------------| +| 2B| 14| 1A| 08| 15| 17| 1C| 18| 0C| 12| 13| 2F| 30| 31| | 4C| 4D| 4E| | 5F| 60| 61| 57| +|-----------------------------------------------------------| `-----------' |---------------| +| 39| 04| 16| 07| 09| 0A| 0B| 0D| 0E| 0F| 33| 34| 32| 28| | 5C| 5D| 5E| 66| +|-----------------------------------------------------------| ,---. |---------------| +| 79| 64| 1D| 1B| 06| 19| 05| 11| 10| 36| 37| 38| 75| 7D| | 52| | 59| 5A| 5B| 58| +|-----------------------------------------------------------| ,-----------. |---------------| +| 78| 7B| 7A| 77| 2C| 76| 00| 7E| 7F| 65| 7C| | 50| 51| 4F| | 62| 63| 67| +`-----------------------------------------------------------' `-----------' `---------------' +*/ +// Universal map position codes +enum unimap_position_codes { +// logical name position(row << 4 | col) +// ------------------------------------------------ + UNIMAP_KANA, // 0x00 + UNIMAP_VOLUME_DOWN, // 0x01 + UNIMAP_VOLUME_UP, // 0x02 + UNIMAP_VOLUME_MUTE, // 0x03 + UNIMAP_A, // 0x04 + UNIMAP_B, // 0x05 + UNIMAP_C, // 0x06 + UNIMAP_D, // 0x07 + UNIMAP_E, // 0x08 + UNIMAP_F, // 0x09 + UNIMAP_G, // 0x0A + UNIMAP_H, // 0x0B + UNIMAP_I, // 0x0C + UNIMAP_J, // 0x0D + UNIMAP_K, // 0x0E + UNIMAP_L, // 0x0F + UNIMAP_M, // 0x10 + UNIMAP_N, // 0x11 + UNIMAP_O, // 0x12 + UNIMAP_P, // 0x13 + UNIMAP_Q, // 0x14 + UNIMAP_R, // 0x15 + UNIMAP_S, // 0x16 + UNIMAP_T, // 0x17 + UNIMAP_U, // 0x18 + UNIMAP_V, // 0x19 + UNIMAP_W, // 0x1A + UNIMAP_X, // 0x1B + UNIMAP_Y, // 0x1C + UNIMAP_Z, // 0x1D + UNIMAP_1, // 0x1E + UNIMAP_2, // 0x1F + UNIMAP_3, // 0x20 + UNIMAP_4, // 0x21 + UNIMAP_5, // 0x22 + UNIMAP_6, // 0x23 + UNIMAP_7, // 0x24 + UNIMAP_8, // 0x25 + UNIMAP_9, // 0x26 + UNIMAP_0, // 0x27 + UNIMAP_ENTER, // 0x28 + UNIMAP_ESCAPE, // 0x29 + UNIMAP_BSPACE, // 0x2A + UNIMAP_TAB, // 0x2B + UNIMAP_SPACE, // 0x2C + UNIMAP_MINUS, // 0x2D + UNIMAP_EQUAL, // 0x2E + UNIMAP_LBRACKET, // 0x2F + UNIMAP_RBRACKET, // 0x30 + UNIMAP_BSLASH, // 0x31 + UNIMAP_NONUS_HASH, // 0x32 ISO UK hash + UNIMAP_SCOLON, // 0x33 + UNIMAP_QUOTE, // 0x34 + UNIMAP_GRAVE, // 0x35 + UNIMAP_COMMA, // 0x36 + UNIMAP_DOT, // 0x37 + UNIMAP_SLASH, // 0x38 + UNIMAP_CAPSLOCK, // 0x39 + UNIMAP_F1, // 0x3A + UNIMAP_F2, // 0x3B + UNIMAP_F3, // 0x3C + UNIMAP_F4, // 0x3D + UNIMAP_F5, // 0x3E + UNIMAP_F6, // 0x3F + UNIMAP_F7, // 0x40 + UNIMAP_F8, // 0x41 + UNIMAP_F9, // 0x42 + UNIMAP_F10, // 0x43 + UNIMAP_F11, // 0x44 + UNIMAP_F12, // 0x45 + UNIMAP_PSCREEN, // 0x46 + UNIMAP_SCROLLLOCK, // 0x47 + UNIMAP_PAUSE, // 0x48 + UNIMAP_INSERT, // 0x49 + UNIMAP_HOME, // 0x4A + UNIMAP_PGUP, // 0x4B + UNIMAP_DELETE, // 0x4C + UNIMAP_END, // 0x4D + UNIMAP_PGDOWN, // 0x4E + UNIMAP_RIGHT, // 0x4F + UNIMAP_LEFT, // 0x50 + UNIMAP_DOWN, // 0x51 + UNIMAP_UP, // 0x52 + UNIMAP_NUMLOCK, // 0x53 + UNIMAP_KP_SLASH, // 0x54 + UNIMAP_KP_ASTERISK, // 0x55 + UNIMAP_KP_MINUS, // 0x56 + UNIMAP_KP_PLUS, // 0x57 + UNIMAP_KP_ENTER, // 0x58 + UNIMAP_KP_1, // 0x59 + UNIMAP_KP_2, // 0x5A + UNIMAP_KP_3, // 0x5B + UNIMAP_KP_4, // 0x5C + UNIMAP_KP_5, // 0x5D + UNIMAP_KP_6, // 0x5E + UNIMAP_KP_7, // 0x5F + UNIMAP_KP_8, // 0x60 + UNIMAP_KP_9, // 0x61 + UNIMAP_KP_0, // 0x62 + UNIMAP_KP_DOT, // 0x63 + UNIMAP_NONUS_BSLASH, // 0x64 ISO UK backslash + UNIMAP_APPLICATION, // 0x65 + UNIMAP_KP_COMMA, // 0x66 + UNIMAP_KP_EQUAL, // 0x67 + UNIMAP_F13, // 0x68 + UNIMAP_F14, // 0x69 + UNIMAP_F15, // 0x6A + UNIMAP_F16, // 0x6B + UNIMAP_F17, // 0x6C + UNIMAP_F18, // 0x6D + UNIMAP_F19, // 0x6E + UNIMAP_F20, // 0x6F + UNIMAP_F21, // 0x70 + UNIMAP_F22, // 0x71 + UNIMAP_F23, // 0x72 + UNIMAP_F24, // 0x73 + UNIMAP_JYEN, // 0x74 + UNIMAP_RO, // 0x75 + UNIMAP_HENK, // 0x76 + UNIMAP_MHEN, // 0x77 + UNIMAP_LCTRL, // 0x78 + UNIMAP_LSHIFT, // 0x79 + UNIMAP_LALT, // 0x7A + UNIMAP_LGUI, // 0x7B + UNIMAP_RCTRL, // 0x7C + UNIMAP_RSHIFT, // 0x7D + UNIMAP_RALT, // 0x7E + UNIMAP_RGUI, // 0x7F + UNIMAP_NO, // 0x80 +}; + +/* + * Short names + */ +#define UNIMAP_LCTL UNIMAP_LCTRL +#define UNIMAP_RCTL UNIMAP_RCTRL +#define UNIMAP_LSFT UNIMAP_LSHIFT +#define UNIMAP_RSFT UNIMAP_RSHIFT +#define UNIMAP_ESC UNIMAP_ESCAPE +#define UNIMAP_BSPC UNIMAP_BSPACE +#define UNIMAP_ENT UNIMAP_ENTER +#define UNIMAP_DEL UNIMAP_DELETE +#define UNIMAP_INS UNIMAP_INSERT +#define UNIMAP_CAPS UNIMAP_CAPSLOCK +#define UNIMAP_CLCK UNIMAP_CAPSLOCK +#define UNIMAP_RGHT UNIMAP_RIGHT +#define UNIMAP_PGDN UNIMAP_PGDOWN +#define UNIMAP_PSCR UNIMAP_PSCREEN +#define UNIMAP_SLCK UNIMAP_SCROLLLOCK +#define UNIMAP_PAUS UNIMAP_PAUSE +#define UNIMAP_BRK UNIMAP_PAUSE +#define UNIMAP_NLCK UNIMAP_NUMLOCK +#define UNIMAP_SPC UNIMAP_SPACE +#define UNIMAP_MINS UNIMAP_MINUS +#define UNIMAP_EQL UNIMAP_EQUAL +#define UNIMAP_GRV UNIMAP_GRAVE +#define UNIMAP_RBRC UNIMAP_RBRACKET +#define UNIMAP_LBRC UNIMAP_LBRACKET +#define UNIMAP_COMM UNIMAP_COMMA +#define UNIMAP_BSLS UNIMAP_BSLASH +#define UNIMAP_SLSH UNIMAP_SLASH +#define UNIMAP_SCLN UNIMAP_SCOLON +#define UNIMAP_QUOT UNIMAP_QUOTE +#define UNIMAP_APP UNIMAP_APPLICATION +#define UNIMAP_NUHS UNIMAP_NONUS_HASH +#define UNIMAP_NUBS UNIMAP_NONUS_BSLASH +/* Japanese specific */ +#define UNIMAP_ZKHK UNIMAP_GRAVE +/* Keypad */ +#define UNIMAP_P1 UNIMAP_KP_1 +#define UNIMAP_P2 UNIMAP_KP_2 +#define UNIMAP_P3 UNIMAP_KP_3 +#define UNIMAP_P4 UNIMAP_KP_4 +#define UNIMAP_P5 UNIMAP_KP_5 +#define UNIMAP_P6 UNIMAP_KP_6 +#define UNIMAP_P7 UNIMAP_KP_7 +#define UNIMAP_P8 UNIMAP_KP_8 +#define UNIMAP_P9 UNIMAP_KP_9 +#define UNIMAP_P0 UNIMAP_KP_0 +#define UNIMAP_PDOT UNIMAP_KP_DOT +#define UNIMAP_PCMM UNIMAP_KP_COMMA +#define UNIMAP_PSLS UNIMAP_KP_SLASH +#define UNIMAP_PAST UNIMAP_KP_ASTERISK +#define UNIMAP_PMNS UNIMAP_KP_MINUS +#define UNIMAP_PPLS UNIMAP_KP_PLUS +#define UNIMAP_PEQL UNIMAP_KP_EQUAL +#define UNIMAP_PENT UNIMAP_KP_ENTER +/* Consumer Page */ +#define UNIMAP_MUTE UNIMAP_VOLUME_MUTE +#define UNIMAP_VOLU UNIMAP_VOLUME_UP +#define UNIMAP_VOLD UNIMAP_VOLUME_DOWN + +#endif diff --git a/tmk_core/common/util.h b/tmk_core/common/util.h index 7451cc08..3e01a93d 100644 --- a/tmk_core/common/util.h +++ b/tmk_core/common/util.h @@ -28,6 +28,10 @@ along with this program. If not, see . #define XSTR(s) #s +#ifdef __cplusplus +extern "C" { +#endif + uint8_t bitpop(uint8_t bits); uint8_t bitpop16(uint16_t bits); uint8_t bitpop32(uint32_t bits); @@ -40,4 +44,8 @@ uint8_t bitrev(uint8_t bits); uint16_t bitrev16(uint16_t bits); uint32_t bitrev32(uint32_t bits); +#ifdef __cplusplus +} +#endif + #endif diff --git a/tmk_core/doc/keycode.txt b/tmk_core/doc/keycode.txt index 44d7e27c..1712929c 100644 --- a/tmk_core/doc/keycode.txt +++ b/tmk_core/doc/keycode.txt @@ -1,7 +1,7 @@ Keycode Symbol Table ==================== Keycodes are defined in `common/keycode.h`. -Range of 00-A4 and E0-E7 are identical with HID Usage: +Range of 00-A4 and E0-E7 are identical with HID Usage of Keyboard/Keypad Page(0x07): Virtual keycodes are defined out of above range to support special actions. @@ -186,30 +186,35 @@ KC_RGUI E7 Keyboard Right GUI(Windows/Apple/Meta key /* * Virtual keycodes */ -/* System Control */ +/* Generic Desktop Page(0x01) - System Control */ KC_SYSTEM_POWER KC_PWR System Power Down KC_SYSTEM_SLEEP KC_SLEP System Sleep KC_SYSTEM_WAKE KC_WAKE System Wake -/* Consumer Page */ -KC_AUDIO_MUTE KC_MUTE -KC_AUDIO_VOL_UP KC_VOLU -KC_AUDIO_VOL_DOWN KC_VOLD -KC_MEDIA_NEXT_TRACK KC_MNXT -KC_MEDIA_PREV_TRACK KC_MPRV -KC_MEDIA_STOP KC_MSTP -KC_MEDIA_PLAY_PAUSE KC_MPLY -KC_MEDIA_SELECT KC_MSEL -KC_MAIL KC_MAIL -KC_CALCULATOR KC_CALC -KC_MY_COMPUTER KC_MYCM -KC_WWW_SEARCH KC_WSCH -KC_WWW_HOME KC_WHOM -KC_WWW_BACK KC_WBAK -KC_WWW_FORWARD KC_WFWD -KC_WWW_STOP KC_WSTP -KC_WWW_REFRESH KC_WREF -KC_WWW_FAVORITES KC_WFAV -/* Mousekey */ + +/* Consumer Page(0x07) */ +KC_AUDIO_MUTE KC_MUTE Mute +KC_AUDIO_VOL_UP KC_VOLU Volume Increment +KC_AUDIO_VOL_DOWN KC_VOLD Volume Decrement +KC_MEDIA_NEXT_TRACK KC_MNXT Scan Next Track +KC_MEDIA_PREV_TRACK KC_MPRV Scan Previous Track +KC_MEDIA_STOP KC_MSTP Stop +KC_MEDIA_FAST_FORWARD KC_MFFD Fast Forward +KC_MEDIA_REWIND KC_MRWD Rewind +KC_MEDIA_PLAY_PAUSE KC_MPLY Play/Pause +KC_EJCT KC_MEDIA_EJECT Stop/Eject +KC_MEDIA_SELECT KC_MSEL AL Consumer Control Configuration +KC_MAIL KC_MAIL AL Email Reader +KC_CALCULATOR KC_CALC AL Calculator +KC_MY_COMPUTER KC_MYCM AL Local Machine Browser +KC_WWW_SEARCH KC_WSCH AC Search +KC_WWW_HOME KC_WHOM AC Home +KC_WWW_BACK KC_WBAK AC Back +KC_WWW_FORWARD KC_WFWD AC Forward +KC_WWW_STOP KC_WSTP AC Stop +KC_WWW_REFRESH KC_WREF AC Refresh +KC_WWW_FAVORITES KC_WFAV AC Bookmarks + +/* Mousekey - TMK specific */ KC_MS_UP KC_MS_U Mouse Cursor Up KC_MS_DOWN KC_MS_D Mouse Cursor Down KC_MS_LEFT KC_MS_L Mouse Cursor Left @@ -226,7 +231,8 @@ KC_MS_WH_RIGHT KC_WH_R Mouse Wheel Right KC_MS_ACCEL0 KC_ACL0 Mouse Acceleration 0 KC_MS_ACCEL1 KC_ACL1 Mouse Acceleration 1 KC_MS_ACCEL2 KC_ACL2 Mouse Acceleration 2 -/* Fn key */ + +/* Fn key - TMK specific */ KC_FN0 KC_FN1 KC_FN2 diff --git a/tmk_core/doc/keymap.md b/tmk_core/doc/keymap.md index 3a196a2d..e1dc167e 100644 --- a/tmk_core/doc/keymap.md +++ b/tmk_core/doc/keymap.md @@ -95,7 +95,7 @@ Note that ***higher layers have priority in the layer stack***. The firmware sta ### 0.3 Keymap Example -The keymap is defined in the **`keymaps[]`** array, a 2-dimensional array of rows and columns corresponding to positions in the keyboard matrix. But most often the layers are defined using C macros to allow for easier reading and editing of the keymap files. To use complex actions you need to define `Fn` keycodes in the **`fn_actions[]`** array. +The keymap is defined in the **`uint8_t keymaps[]`** array, a 2-dimensional array of rows and columns corresponding to positions in the keyboard matrix. But most often the layers are defined using C macros to allow for easier reading and editing of the keymap files. To use complex actions you need to define `Fn` action in the **`action_t fn_actions[]`** array. This is a keymap example for the [HHKB](http://en.wikipedia.org/wiki/Happy_Hacking_Keyboard) keyboard. This example has three layers: the QWERTY base layer, and two overlay layers for cursor and mousekey control, respectively. @@ -109,7 +109,7 @@ In this example, You can find other keymap definitions in file `keymap.c` located on project directories. - static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: Qwerty * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| @@ -140,7 +140,7 @@ You can find other keymap definitions in file `keymap.c` located on project dire * `-----------------------------------------------------------' * |Gui |Alt |Space |Alt |Gui| * `--------------------------------------------' - */ + */ KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,BSPC, \ LCTL,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ @@ -158,7 +158,7 @@ You can find other keymap definitions in file `keymap.c` located on project dire * `-----------------------------------------------------------' * |Gui |Alt |Mb1 |Alt | | * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel + * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel */ KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ TAB, TRNS,TRNS,TRNS,TRNS,TRNS,WH_L,WH_D,WH_U,WH_R,TRNS,TRNS,TRNS,BSPC, \ @@ -167,7 +167,7 @@ You can find other keymap definitions in file `keymap.c` located on project dire LGUI,LALT, BTN1, RALT,TRNS), }; - static const uint16_t PROGMEM fn_actions[] = { + const action_t PROGMEM fn_actions[] = { ACTION_LAYER_MOMENTARY(1), // FN0 ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN1 ACTION_LAYER_TOGGLE(2), // FN2 @@ -194,7 +194,7 @@ See [`common/keycode.h`](../common/keycode.h) or keycode table below for the det - `KC_P1` to `KC_P0`, `KC_PDOT`, `KC_PCMM`, `KC_PSLS`, `KC_PAST`, `KC_PMNS`, `KC_PPLS`, `KC_PEQL`, `KC_PENT` for keypad. ### 1.2 Modifier -There are 8 modifiers which has discrimination between left and right. +There are 8 modifiers which has discrimination between left and right. - `KC_LCTL` and `KC_RCTL` for Control - `KC_LSFT` and `KC_RSFT` for Shift @@ -214,7 +214,7 @@ There are 8 modifiers which has discrimination between left and right. - `KC_WSCH`, `KC_WHOM`, `KC_WBAK`, `KC_WFWD`, `KC_WSTP`, `KC_WREF`, `KC_WFAV` for web browser operation ### 1.5 Fn key -`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** +`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `action_t fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** ### 1.6 Keycode Table See keycode table in [`doc/keycode.txt`](./keycode.txt) for description of keycodes. @@ -250,21 +250,30 @@ You can define these actions on *'A'* key and *'left shift'* modifier with: ACTION_KEY(KC_LSFT) #### 2.1.2 Modified key -This action is comprised of strokes of modifiers and a key. `Macro` action is needed if you want more complex key strokes. +This action is comprised of modifiers and a key. -Say you want to assign a key to `Shift + 1` to get character *'!'* or `Alt + Tab` to switch application windows. +Modified keys can be defined as below. Say you want to assign a key to `Shift + 1` to get character *'!'* or `Alt + Tab` to switch application windows. ACTION_MODS_KEY(MOD_LSFT, KC_1) ACTION_MODS_KEY(MOD_LALT, KC_TAB) - -Or `Alt,Shift + Tab` can be defined. `ACTION_MODS_KEY(mods, key)` requires **4-bit modifier state** and a **keycode** as arguments. See `keycode.h` for `MOD_BIT()` macro. - ACTION_MODS_KEY(MOD_LALT | MOD_LSFT, KC_TAB) +These are identical to examples above. + + ACTION_KEY(MOD_LSFT | KC_1) + ACTION_KEY(MOD_LALT | KC_TAB) + ACTION_KEY(MOD_LSFT | MOD_LALT | KC_TAB) + #### 2.1.3 Multiple Modifiers Registers multiple modifiers with pressing a key. To specify multiple modifiers use `|`. - ACTION_MODS(MOD_ALT | MOD_LSFT) + ACTION_MODS(MOD_LALT | MOD_LSFT) + ACTION_MODS(MOD_LALT | MOD_LSFT | MOD_LCTL) + +These are identical to examples above. + + ACTION_KEY(MOD_LALT | MOD_LSFT, KC_NO) + ACTION_KEY(MOD_LALT | MOD_LSFT | MOD_LCTL, KC_NO) #### 2.1.3 Modifier with Tap key([Dual role][dual_role]) Works as a modifier key while holding, but registers a key on tap(press and release quickly). @@ -294,7 +303,7 @@ This sets Default Layer to given parameter `layer` and activate it. ACTION_DEFAULT_LAYER_SET(layer) -#### 2.2.2 Momentary +#### 2.2.2 Momentary Turns on `layer` momentarily while holding, in other words it activates when key is pressed and deactivate when released. ACTION_LAYER_MOMENTARY(layer) @@ -379,19 +388,33 @@ Default Layer also has bitwise operations, they are executed when key is release ACTION_DEFAULT_LAYER_BIT_SET(part, bits) - ### 2.3 Macro action -***TBD*** +`Macro` actions allow you to register a complex sequence of keystrokes when a key is pressed, where macros are simple sequences of keypresses. -`Macro` action indicates complex key strokes. - - MACRO( D(LSHIFT), D(D), END ) - MACRO( U(D), U(LSHIFT), END ) - MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) + ACTION_MACRO(id) + ACTION_MACRO_TAP(id) -#### 2.3.1 Macro Commands -- **MACRO()** -- **MACRO_NONE** +`id` is an 8-bit user-defined value the macro getter function can use to pick the specific macro. + + +#### 2.3.1 Implementing Macro getter function +To implement `macro` functions, the macro lookup list must be implemented: + + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt); + +The function must always return a valid macro, and default implementation of `action_get_macro` always returns `MACRO_NONE` which has no effect. + +#### 2.3.1.1 Limitations +Similar to the Function Action system, the selector functions is passed a `keyrecord_t` object, so it can inspect the key state (e.g. different macros on key press or release), and key itself. + +Unlike the Function Action system,`macros` are pre-recorded key sequences, so you can only select from a list. If you want to use dynamic macros then you should look at the more complex function action system. + +#### 2.3.2 Implementing/Defining Macro sequences +Macros are of the form (must be wrapped by the `MACRO` function, and end with an `END` mark) + + MACRO( ..., END ) + +Within each macro, the following commands can be used: - **I()** change interval of stroke. - **D()** press key @@ -401,19 +424,25 @@ Default Layer also has bitwise operations, they are executed when key is release - **SM()** store modifier state - **RM()** restore modifier state - **CM()** clear modifier state -- **END** end mark + +e.g.: + + MACRO( D(LSHIFT), D(D), END ) // hold down LSHIFT and D - will print 'D' + MACRO( U(D), U(LSHIFT), END ) // release U and LSHIFT keys (an event.pressed == False counterpart for the one above) + MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ) // slowly print out h-e-l-l---o #### 2.3.2 Examples -***TBD*** + +in keymap.c, define `action_get_macro` const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { switch (id) { - case HELLO: + case 0: return (record->event.pressed ? MACRO( I(0), T(H), T(E), T(L), T(L), W(255), T(O), END ) : MACRO_NONE ); - case ALT_TAB: + case 1: return (record->event.pressed ? MACRO( D(LALT), D(TAB), END ) : MACRO( U(TAB), END )); @@ -421,7 +450,12 @@ Default Layer also has bitwise operations, they are executed when key is release return MACRO_NONE; } +in keymap.c, bind items in `fn_actions` to the macro function + const action_t PROGMEM fn_actions[] = { + [0] = ACTION_MACRO(0), // will print 'hello' for example + [1] = ACTION_MACRO(1), + }; ### 2.4 Function action @@ -443,7 +477,7 @@ To define tappable `Function` action in keymap use this. #### 2.4.3 Implement user function `Function` actions can be defined freely with C by user in callback function: - void keymap_call_function(keyrecord_t *event, uint8_t id, uint8_t opt) + void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); This C function is called every time key is operated, argument `id` selects action to be performed and `opt` can be used for option. Function `id` can be 0-255 and `opt` can be 0-15. @@ -544,6 +578,7 @@ This registers modifier key(s) simultaneously with layer switching. ACTION_LAYER_MODS(2, MOD_LSFT | MOD_LALT) +You can combine four modifiers at most but cannot use both left and right modifiers at a time, either left or right modiiers only can be allowed. ## 4. Tapping @@ -598,13 +633,13 @@ Legacy Keymap uses two arrays `fn_layer[]` and `fn_keycode[]` to define Fn key. In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. - static const uint8_t PROGMEM fn_layer[] = { + const uint8_t PROGMEM fn_layer[] = { 1, // Fn0 2, // Fn1 2, // Fn2 }; - static const uint8_t PROGMEM fn_keycode[] = { + const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_SPC, // Fn2 diff --git a/tmk_core/doc/unimap.txt b/tmk_core/doc/unimap.txt new file mode 100644 index 00000000..0db038e6 --- /dev/null +++ b/tmk_core/doc/unimap.txt @@ -0,0 +1,51 @@ +Unimap +====== +universal keymapping framework +using logical 128-key keyboard layout independent from physical keyboad matrix + +unimap is actually an actionmap whose size is row:8xcol:16. + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; + +/* Universal 128-key keyboard layout(8x16) + ,-----------------------------------------------. + |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| +,---. |-----------------------------------------------| ,-----------. ,-----------. +|Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| +|-----------------------------------------------------------| |-----------| |---------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| +|-----------------------------------------------------------| `-----------' |---------------| +|CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| +|-----------------------------------------------------------| ,---. |---------------| +|Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| +|-----------------------------------------------------------| ,-----------. |---------------| +|Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| +`-----------------------------------------------------------' `-----------' `---------------' +App: Windows Menu key +Gui: Windows key, Mac ⌘ key or Meta key +VDn Vup Mut: Volume control +< #: ISO keys(in UK legend) +KP=: Keypad = for Mac +KP,: Brazilian Keypad Comma +JPY: Japanese Yen(¥) +RO: Japanese ろ(Ro) or Brazilian /(Slash) +MHEN: Japanese 無変換(Non Conversion) or Korean Hanja +HENK: Japanese 変換(Conversion) or Korean Hangul/English +KANA: Japanese かな(Hiragana/Katakana) +https://en.wikipedia.org/wiki/Keyboard_layout#Japanese +https://en.wikipedia.org/wiki/Keyboard_layout#Hangul_.28for_Korean.29 +*/ + + +when refering to keymapping physical matrix position needed to be translated into logical one on unimap +the translation is defined in unimap array + +row and col of unimap positon is encoded as follows +position = (row << 4) | col + +// table translates matrix to universal keymap +extern const uint8_t unimap_trans[MATRIX_ROWS][MATRIX_COLS]; diff --git a/tmk_core/protocol.mk b/tmk_core/protocol.mk index 630c42b1..2bf05742 100644 --- a/tmk_core/protocol.mk +++ b/tmk_core/protocol.mk @@ -1,59 +1,59 @@ PROTOCOL_DIR = protocol -ifdef PS2_MOUSE_ENABLE +ifeq (yes,$(strip $(PS2_MOUSE_ENABLE))) SRC += $(PROTOCOL_DIR)/ps2_mouse.c OPT_DEFS += -DPS2_MOUSE_ENABLE OPT_DEFS += -DMOUSE_ENABLE endif -ifdef PS2_USE_BUSYWAIT +ifeq (yes,$(strip $(PS2_USE_BUSYWAIT))) SRC += protocol/ps2_busywait.c SRC += protocol/ps2_io_avr.c OPT_DEFS += -DPS2_USE_BUSYWAIT endif -ifdef PS2_USE_INT +ifeq (yes,$(strip $(PS2_USE_INT))) SRC += protocol/ps2_interrupt.c SRC += protocol/ps2_io_avr.c OPT_DEFS += -DPS2_USE_INT endif -ifdef PS2_USE_USART +ifeq (yes,$(strip $(PS2_USE_USART))) SRC += protocol/ps2_usart.c SRC += protocol/ps2_io_avr.c OPT_DEFS += -DPS2_USE_USART endif -ifdef XT_USE_INT +ifeq (yes,$(strip $(XT_USE_INT))) SRC += protocol/xt_interrupt.c SRC += protocol/xt_io_avr.c OPT_DEFS += -DXT_USE_INT endif -ifdef SERIAL_MOUSE_MICROSOFT_ENABLE +ifeq (yes,$(strip $(SERIAL_MOUSE_MICROSOFT_ENABLE))) SRC += $(PROTOCOL_DIR)/serial_mouse_microsoft.c OPT_DEFS += -DSERIAL_MOUSE_ENABLE -DSERIAL_MOUSE_MICROSOFT \ -DMOUSE_ENABLE endif -ifdef SERIAL_MOUSE_MOUSESYSTEMS_ENABLE +ifeq (yes,$(strip $(SERIAL_MOUSE_MOUSESYSTEMS_ENABLE))) SRC += $(PROTOCOL_DIR)/serial_mouse_mousesystems.c OPT_DEFS += -DSERIAL_MOUSE_ENABLE -DSERIAL_MOUSE_MOUSESYSTEMS \ -DMOUSE_ENABLE endif -ifdef SERIAL_MOUSE_USE_SOFT +ifeq (yes,$(strip $(SERIAL_MOUSE_USE_SOFT))) SRC += $(PROTOCOL_DIR)/serial_soft.c endif -ifdef SERIAL_MOUSE_USE_UART +ifeq (yes,$(strip $(SERIAL_MOUSE_USE_UART))) SRC += $(PROTOCOL_DIR)/serial_uart.c endif -ifdef ADB_MOUSE_ENABLE +ifeq (yes,$(strip $(ADB_MOUSE_ENABLE))) OPT_DEFS += -DADB_MOUSE_ENABLE -DMOUSE_ENABLE endif diff --git a/tmk_core/protocol/chibios/README.md b/tmk_core/protocol/chibios/README.md index 63e6641f..2fadc799 100644 --- a/tmk_core/protocol/chibios/README.md +++ b/tmk_core/protocol/chibios/README.md @@ -1,16 +1,16 @@ ## TMK running on top of ChibiOS -This code can be used to run TMK keyboard logic on top of [ChibiOS], meaning that you can run TMK on whatever [ChibiOS] supports. The notable examples are ARM-based Teensies (3.x and LC) and on the boards with STM32 MCUs. +This code can be used to run TMK keyboard logic on top of [ChibiOS], meaning that you can run TMK on whatever ChibiOS supports. The notable examples are PJRC Teensies(3.x and LC) with NXP Kinetis and dev boards with ST Micro STM32 MCUs. ### Usage -- To use, [get a zip of chibios](https://github.com/ChibiOS/ChibiOS/archive/a7df9a891067621e8e1a5c2a2c0ceada82403afe.zip) and unpack/rename it to `tmk_core/tool/chibios/chibios`; or you can just clone [the repo](https://github.com/ChibiOS/ChibiOS) there. For Freescale/NXP Kinetis support (meaning ARM Teensies and the Infinity keyboard), you'll also need [a zip of chibios-contrib](https://github.com/ChibiOS/ChibiOS-Contrib/archive/e1311c4db6cd366cf760673f769e925741ac0ad3.zip), unpacked/renamed to `tmk_core/tool/chibios/chibios-contrib`. Likewise, for git-savvy people, just clone [the repo](https://github.com/ChibiOS/ChibiOS-Contrib) there. -- Note: the abovementioned directories are the defaults. You can have the two chibios repositories wherever you want, just define their location in `CHIBIOS` and `CHIBIOS_CONTRIB` variables in your `Makefile`. +- To use, get a [zip file](https://github.com/ChibiOS/ChibiOS/archive/a7df9a891067621e8e1a5c2a2c0ceada82403afe.zip) of ChibiOS and unpack/rename it to `tmk_core/tool/chibios/ChibiOS`; or you can just clone [ChibiOS repo](https://github.com/ChibiOS/ChibiOS) there. For Freescale/NXP Kinetis support (meaning Teensies 3.x/LC and the Infinity keyboard), you'll also need a [zip](https://github.com/ChibiOS/ChibiOS-Contrib/archive/e1311c4db6cd366cf760673f769e925741ac0ad3.zip) of ChibiOS-Contrib, unpacked/renamed to `tmk_core/tool/chibios/ChibiOS-Contrib`. Likewise, for git-savvy people, just clone [ChibiOS-Contrib repo](https://github.com/ChibiOS/ChibiOS-Contrib) there. +- Note: the above mentioned directories are the defaults. You can have the two ChibiOS repositories wherever you want, just define their location in `CHIBIOS` and `CHIBIOS_CONTRIB` variables in your `Makefile`. - You will also need to install an ARM toolchain, for instance from [here](https://launchpad.net/gcc-arm-embedded). On linux, this is usually also present as a package for your distribution (as `gcc-arm` or something similar). On OS X, you can use [homebrew](http://brew.sh/) with an appropriate tap. ### Notes -- Some comments about ChibiOS syntax and the most commonly used GPIO functions are, as well as an example for ARM Teensies, is [here](https://github.com/tmk/tmk_keyboard/blob/master/keyboard/teensy_lc_onekey/instructions.md). +- Some comments about ChibiOS syntax and the most commonly used GPIO functions are, as well as an example for Teensies, is [here](https://github.com/tmk/tmk_keyboard/blob/master/keyboard/teensy_lc_onekey/instructions.md). - For gcc options, inspect `tmk_core/tool/chibios/chibios.mk`. For instance, I enabled `-Wno-missing-field-initializers`, because TMK common bits generated a lot of warnings on that. - For debugging, it is sometimes useful disable gcc optimisations, you can do that by adding `-O0` to `OPT_DEFS` in your `Makefile`. - USB string descriptors are messy. I did not find a way to cleanly generate the right structures from actual strings, so the definitions in individual keyboards' `config.h` are ugly as heck. diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index fbf0ceba..e8f103a2 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -1033,7 +1033,7 @@ void init_usb_driver(USBDriver *usbp) { chVTObjectInit(&keyboard_idle_timer); #ifdef CONSOLE_ENABLE - obqObjectInit(&console_buf_queue, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); + obqObjectInit(&console_buf_queue, true, console_queue_buffer, CONSOLE_EPSIZE, CONSOLE_QUEUE_CAPACITY, console_queue_onotify, (void*)usbp); chVTObjectInit(&console_flush_timer); #endif } diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 87386be9..1b529bde 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -37,6 +37,10 @@ LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABL #LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 +# Remote wakeup fix for ATmega32U2 https://github.com/tmk/tmk_keyboard/issues/361 +ifeq ($(MCU),atmega32u2) + LUFA_OPTS += -DNO_LIMITED_CONTROLLER_CONNECT +endif OPT_DEFS += -DF_USB=$(F_USB)UL OPT_DEFS += -DARCH=ARCH_$(ARCH) @@ -44,3 +48,8 @@ OPT_DEFS += $(LUFA_OPTS) # This indicates using LUFA stack OPT_DEFS += -DPROTOCOL_LUFA + +ifeq (yes,$(strip $(LUFA_DEBUG_SUART))) + SRC += common/avr/suart.S + LUFA_OPTS += -DLUFA_DEBUG_SUART +endif diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c index 6c2cacb5..4fb5219d 100644 --- a/tmk_core/protocol/lufa/descriptor.c +++ b/tmk_core/protocol/lufa/descriptor.c @@ -140,9 +140,9 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), - HID_RI_LOGICAL_MINIMUM(16, 0x0001), + HID_RI_LOGICAL_MINIMUM(16, 0x0081), HID_RI_LOGICAL_MAXIMUM(16, 0x00B7), - HID_RI_USAGE_MINIMUM(16, 0x0001), /* System Power Down */ + HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */ HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */ HID_RI_REPORT_SIZE(8, 16), HID_RI_REPORT_COUNT(8, 1), diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h index 42af0791..119f4298 100644 --- a/tmk_core/protocol/lufa/descriptor.h +++ b/tmk_core/protocol/lufa/descriptor.h @@ -155,7 +155,7 @@ typedef struct #define MOUSE_EPSIZE 8 #define EXTRAKEY_EPSIZE 8 #define CONSOLE_EPSIZE 32 -#define NKRO_EPSIZE 16 +#define NKRO_EPSIZE 32 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index beec6b2b..93fe9a2f 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1,4 +1,4 @@ -/* +/* * Copyright 2012 Jun Wako * This file is based on: * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse @@ -50,9 +50,18 @@ #include "suspend.h" #include "hook.h" +#ifdef LUFA_DEBUG_SUART +#include "avr/suart.h" +#endif + +#include "matrix.h" #include "descriptor.h" #include "lufa.h" + +//#define LUFA_DEBUG + + uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; @@ -100,10 +109,10 @@ static void Console_Task(void) { /* Create a temporary buffer to hold the read in report from the host */ uint8_t ConsoleData[CONSOLE_EPSIZE]; - + /* Read Console Report Data */ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); - + /* Process Console Report Data */ //ProcessConsoleHIDReport(ConsoleData); } @@ -164,7 +173,7 @@ void EVENT_USB_Device_Disconnect(void) print("[D]"); /* For battery powered device */ USB_IsInitialized = false; -/* TODO: This doesn't work. After several plug in/outs can not be enumerated. +/* TODO: This doesn't work. After several plug in/outs can not be enumerated. if (USB_IsInitialized) { USB_Disable(); // Disable all interrupts USB_Controller_Enable(); @@ -175,18 +184,24 @@ void EVENT_USB_Device_Disconnect(void) void EVENT_USB_Device_Reset(void) { +#ifdef LUFA_DEBUG print("[R]"); +#endif } void EVENT_USB_Device_Suspend() { +#ifdef LUFA_DEBUG print("[S]"); +#endif hook_usb_suspend_entry(); } void EVENT_USB_Device_WakeUp() { +#ifdef LUFA_DEBUG print("[W]"); +#endif hook_usb_wakeup(); } @@ -217,6 +232,9 @@ void EVENT_USB_Device_StartOfFrame(void) */ void EVENT_USB_Device_ConfigurationChanged(void) { +#ifdef LUFA_DEBUG + print("[c]"); +#endif bool ConfigSuccess = true; /* Setup Keyboard HID Report Endpoints */ @@ -293,6 +311,9 @@ void EVENT_USB_Device_ControlRequest(void) /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(ReportData, ReportSize); Endpoint_ClearOUT(); +#ifdef LUFA_DEBUG + xprintf("[r%d]", USB_ControlRequest.wIndex); +#endif } break; @@ -316,6 +337,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); +#ifdef LUFA_DEBUG + xprintf("[L%d]", USB_ControlRequest.wIndex); +#endif break; } @@ -332,6 +356,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_Write_8(keyboard_protocol); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); +#ifdef LUFA_DEBUG + print("[p]"); +#endif } } @@ -345,6 +372,9 @@ void EVENT_USB_Device_ControlRequest(void) keyboard_protocol = (USB_ControlRequest.wValue & 0xFF); clear_keyboard(); +#ifdef LUFA_DEBUG + print("[P]"); +#endif } } @@ -356,6 +386,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_ClearStatusStage(); keyboard_idle = ((USB_ControlRequest.wValue & 0xFF00) >> 8); +#ifdef LUFA_DEBUG + xprintf("[I%d]%d", USB_ControlRequest.wIndex, (USB_ControlRequest.wValue & 0xFF00) >> 8); +#endif } break; @@ -367,6 +400,9 @@ void EVENT_USB_Device_ControlRequest(void) Endpoint_Write_8(keyboard_idle); Endpoint_ClearIN(); Endpoint_ClearStatusStage(); +#ifdef LUFA_DEBUG + print("[i]"); +#endif } break; @@ -374,7 +410,7 @@ void EVENT_USB_Device_ControlRequest(void) } /******************************************************************************* - * Host driver + * Host driver ******************************************************************************/ static uint8_t keyboard_leds(void) { @@ -494,6 +530,9 @@ static void send_consumer(uint16_t data) #define SEND_TIMEOUT 5 int8_t sendchar(uint8_t c) { +#ifdef LUFA_DEBUG_SUART + xmit(c); +#endif // Not wait once timeouted. // Because sendchar() is called so many times, waiting each call causes big lag. static bool timeouted = false; @@ -551,6 +590,9 @@ ERROR_EXIT: #else int8_t sendchar(uint8_t c) { +#ifdef LUFA_DEBUG_SUART + xmit(c); +#endif return 0; } #endif @@ -578,13 +620,20 @@ static void setup_usb(void) // for Console_Task USB_Device_EnableSOFEvents(); - print_set_sendchar(sendchar); } int main(void) __attribute__ ((weak)); int main(void) { setup_mcu(); + +#ifdef LUFA_DEBUG_SUART + SUART_OUT_DDR |= (1<mods, report->reserved); + dprintf("input %d: %02X %02X", hid->GetAddress(), report.mods, report.reserved); for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ERROR(report->keys[i])) { - is_error = true; - } - dprintf(" %02X", report->keys[i]); + dprintf(" %02X", report.keys[i]); } dprint("\r\n"); - - // ignore error and not send report to computer - if (is_error) { - dprint("Error usage! \r\n"); - return; - } - - ::memcpy(&usb_hid_keyboard_report, buf, sizeof(report_keyboard_t)); - usb_hid_time_stamp = millis(); } diff --git a/tmk_core/protocol/usb_hid/parser.h b/tmk_core/protocol/usb_hid/parser.h index 703eb1ed..036281fa 100644 --- a/tmk_core/protocol/usb_hid/parser.h +++ b/tmk_core/protocol/usb_hid/parser.h @@ -2,11 +2,14 @@ #define PARSER_H #include "hid.h" +#include "report.h" class KBDReportParser : public HIDReportParser { public: - virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); + report_keyboard_t report; + uint16_t time_stamp; + virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf); }; #endif diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c index 0d809536..794e4000 100644 --- a/tmk_core/protocol/vusb/main.c +++ b/tmk_core/protocol/vusb/main.c @@ -20,6 +20,7 @@ #include "timer.h" #include "uart.h" #include "debug.h" +#include "suspend.h" #define UART_BAUD_RATE 115200 @@ -41,6 +42,23 @@ static void initForUsbConnectivity(void) sei(); } +void usb_remote_wakeup(void) { + cli(); + + int8_t ddr_orig = USBDDR; + USBOUT |= (1 << USBMINUS); + USBDDR = ddr_orig | USBMASK; + USBOUT ^= USBMASK; + + _delay_ms(25); + + USBOUT ^= USBMASK; + USBDDR = ddr_orig; + USBOUT &= ~(1 << USBMINUS); + + sei(); +} + int main(void) { bool suspended = false; @@ -70,19 +88,6 @@ int main(void) // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1) if (timer_elapsed(last_timer) > 5) { suspended = true; -/* - uart_putchar('S'); - _delay_ms(1); - cli(); - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - sleep_enable(); - sleep_bod_disable(); - sei(); - sleep_cpu(); - sleep_disable(); - _delay_ms(10); - uart_putchar('W'); -*/ } } #endif @@ -95,6 +100,8 @@ int main(void) keyboard_task(); } vusb_transfer_keyboard(); + } else if (suspend_wakeup_condition()) { + usb_remote_wakeup(); } } } diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 0ae84d91..66b4cbd8 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -420,6 +420,13 @@ flip: $(TARGET).hex batchisp -hardware usb -device $(MCU) -operation start reset 0 dfu: $(TARGET).hex + @echo -n dfu-programmer: waiting + @until dfu-programmer $(MCU) get bootloader-version > /dev/null 2>&1; do \ + echo -n "."; \ + sleep 1; \ + done + @echo + ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) dfu-programmer $(MCU) erase --force else diff --git a/tmk_core/tool/chibios/.gitignore b/tmk_core/tool/chibios/.gitignore index 88bbafe3..6be9cf9e 100644 --- a/tmk_core/tool/chibios/.gitignore +++ b/tmk_core/tool/chibios/.gitignore @@ -1,2 +1,2 @@ -chibios -chibios-contrib +ChibiOS +ChibiOS-Contrib diff --git a/tmk_core/tool/chibios/chibios.mk b/tmk_core/tool/chibios/chibios.mk index f2fedd22..88ba94ae 100644 --- a/tmk_core/tool/chibios/chibios.mk +++ b/tmk_core/tool/chibios/chibios.mk @@ -83,8 +83,8 @@ endif # # Imported source files and paths -CHIBIOS ?= $(TMK_DIR)/tool/chibios/chibios -CHIBIOS_CONTRIB ?= $(TMK_DIR)/tool/chibios/chibios-contrib +CHIBIOS ?= $(TMK_DIR)/tool/chibios/ChibiOS +CHIBIOS_CONTRIB ?= $(TMK_DIR)/tool/chibios/ChibiOS-Contrib # Startup files. Try a few different locations, for compability with old versions and # for things hardware in the contrib repository STARTUP_MK = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk diff --git a/tmk_core/tool/mbed/gcc.mk b/tmk_core/tool/mbed/gcc.mk index b8c7336b..596fbc8a 100644 --- a/tmk_core/tool/mbed/gcc.mk +++ b/tmk_core/tool/mbed/gcc.mk @@ -23,6 +23,7 @@ CC_FLAGS += \ -fdata-sections \ -fomit-frame-pointer CC_FLAGS += -MMD -MP +CC_FLAGS += $(OPT_DEFS) LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs #LD_FLAGS += -u _printf_float -u _scanf_float