summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--1-setup-path-win.bat84
-rw-r--r--2-setup-environment-win.bat80
-rw-r--r--BUILD_GUIDE.md23
-rw-r--r--README.md49
-rw-r--r--keyboard/alps64/Makefile4
-rw-r--r--keyboard/alps64/keymaps/default.c (renamed from keyboard/alps64/keymap_plain.c)0
-rw-r--r--keyboard/alps64/keymaps/hasu.c (renamed from keyboard/alps64/keymap_hasu.c)0
-rw-r--r--keyboard/atomic/Makefile92
-rw-r--r--keyboard/atomic/README.md4
-rw-r--r--keyboard/atomic/atomic.c31
-rw-r--r--keyboard/atomic/atomic.h3
-rw-r--r--keyboard/atomic/backlight.c2
-rw-r--r--keyboard/atomic/config.h93
-rw-r--r--keyboard/atomic/keymaps/abienz.c (renamed from keyboard/atomic/keymaps/keymap_abienz.c)0
-rw-r--r--keyboard/atomic/keymaps/default.c234
-rw-r--r--keyboard/atomic/keymaps/keymap_default.c79
-rw-r--r--keyboard/atomic/keymaps/michelle.c (renamed from keyboard/atomic/keymaps/keymap_michelle.c)0
-rw-r--r--keyboard/atomic/keymaps/pvc/config.h157
-rw-r--r--keyboard/atomic/keymaps/pvc/keymap.c469
-rw-r--r--keyboard/atomic/keymaps/pvc/makefile.mk17
-rw-r--r--keyboard/atreus/Makefile4
-rw-r--r--keyboard/atreus/README.md4
-rw-r--r--keyboard/atreus/keymaps/default.c (renamed from keyboard/atreus/keymaps/keymap_default.c)0
-rw-r--r--keyboard/atreus/keymaps/gerb.c (renamed from keyboard/atreus/keymaps/keymap_gerb.c)0
-rw-r--r--keyboard/ergodox_ez/keymaps/alexjj/keymap.c238
-rw-r--r--keyboard/ergodox_ez/keymaps/alexjj/keymap.hex1141
-rw-r--r--keyboard/ergodox_ez/keymaps/alexjj/readme.md179
-rw-r--r--keyboard/ergodox_ez/keymaps/alexjj/rl-layout.jpgbin0 -> 833107 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/README.md29
-rw-r--r--keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/dvorak_intl_squisher.hex1127
-rw-r--r--keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout0.pngbin0 -> 73585 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout1.pngbin0 -> 59122 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout2.pngbin0 -> 53319 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keymap.c185
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py710
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex1240
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c783
-rw-r--r--keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md188
-rw-r--r--keyboard/ergodox_ez/keymaps/j3rn/keymap.c31
-rw-r--r--keyboard/ergodox_ez/keymaps/j3rn/readme.md7
-rw-r--r--keyboard/ergodox_ez/keymaps/msc/img/code_layer.pngbin0 -> 71266 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/msc/img/main_layer.pngbin0 -> 90624 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/msc/img/media_layer.pngbin0 -> 75750 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/msc/keymap.c184
-rw-r--r--keyboard/ergodox_ez/keymaps/msc/msc.hex1118
-rw-r--r--keyboard/ergodox_ez/keymaps/msc/readme.md32
-rw-r--r--keyboard/ergodox_ez/keymaps/osx_de/keymap.c127
-rw-r--r--keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex2396
-rw-r--r--keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.pngbin749565 -> 684862 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/keymap.c134
-rw-r--r--keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/readme.md50
-rw-r--r--keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.hex1139
-rw-r--r--keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.pngbin0 -> 130692 bytes
-rw-r--r--keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx/readme.md13
-rw-r--r--keyboard/ergodox_ez/readme.md2
-rw-r--r--keyboard/gh60/Makefile4
-rw-r--r--keyboard/gh60/Makefile.pjrc4
-rw-r--r--keyboard/gh60/README.md14
-rw-r--r--keyboard/gh60/keymaps/hasu.c (renamed from keyboard/gh60/keymap_hasu.c)0
-rw-r--r--keyboard/gh60/keymaps/hhkb.c (renamed from keyboard/gh60/keymap_hhkb.c)0
-rw-r--r--keyboard/gh60/keymaps/plain.c (renamed from keyboard/gh60/keymap_plain.c)0
-rw-r--r--keyboard/gh60/keymaps/poker.c (renamed from keyboard/gh60/keymap_poker.c)0
-rw-r--r--keyboard/gh60/keymaps/poker_bit.c (renamed from keyboard/gh60/keymap_poker_bit.c)0
-rw-r--r--keyboard/gh60/keymaps/poker_set.c (renamed from keyboard/gh60/keymap_poker_set.c)0
-rw-r--r--keyboard/gh60/keymaps/spacefn.c (renamed from keyboard/gh60/keymap_spacefn.c)0
-rw-r--r--keyboard/hhkb/Makefile8
-rw-r--r--keyboard/hhkb/Makefile.pjrc4
-rw-r--r--keyboard/hhkb/Makefile.rn428
-rw-r--r--keyboard/hhkb/README.md2
-rw-r--r--keyboard/hhkb/keymaps/hasu.c (renamed from keyboard/hhkb/keymap_hasu.c)0
-rw-r--r--keyboard/hhkb/keymaps/hhkb.c (renamed from keyboard/hhkb/keymap_hhkb.c)0
-rw-r--r--keyboard/hhkb/keymaps/jp.c (renamed from keyboard/hhkb/keymap_jp.c)0
-rw-r--r--keyboard/hhkb/keymaps/spacefn.c (renamed from keyboard/hhkb/keymap_spacefn.c)0
-rw-r--r--keyboard/hhkb_qmk/Makefile4
-rw-r--r--keyboard/hhkb_qmk/README.md4
-rw-r--r--keyboard/hhkb_qmk/keymaps/default.c (renamed from keyboard/hhkb_qmk/keymaps/keymap_default.c)0
-rw-r--r--keyboard/hhkb_qmk/keymaps/lxol.c (renamed from keyboard/hhkb_qmk/keymaps/keymap_lxol.c)0
-rw-r--r--keyboard/jd45/Makefile4
-rw-r--r--keyboard/jd45/keymaps/default.c (renamed from keyboard/jd45/keymaps/keymap_default.c)0
-rw-r--r--keyboard/jd45/keymaps/justin.c (renamed from keyboard/jd45/keymaps/keymap_justin.c)0
-rw-r--r--keyboard/planck/Makefile71
-rw-r--r--keyboard/planck/README.md4
-rw-r--r--keyboard/planck/config.h4
-rw-r--r--keyboard/planck/keymaps/bone2planck.c112
-rw-r--r--keyboard/planck/keymaps/default/README.md32
-rw-r--r--keyboard/planck/keymaps/default/keymap.c312
-rw-r--r--keyboard/planck/keymaps/default/makefile.mk2
-rw-r--r--keyboard/planck/keymaps/nico.c69
-rw-r--r--keyboard/planck/keymaps/pvc_planck.c179
-rw-r--r--keyboard/planck/keymaps/tak3over.c130
-rw-r--r--keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c (renamed from keyboard/planck/common_keymaps/keymap_mitch.c)0
-rw-r--r--keyboard/planck/planck.c32
-rw-r--r--keyboard/planck/planck.h1
-rw-r--r--keyboard/preonic/Makefile91
-rw-r--r--keyboard/preonic/Makefile.pjrc116
-rw-r--r--keyboard/preonic/PCB_GUIDE.md116
-rw-r--r--keyboard/preonic/README.md57
-rw-r--r--keyboard/preonic/__avr_gdbinit6
-rw-r--r--keyboard/preonic/analog.c53
-rw-r--r--keyboard/preonic/analog.h36
-rw-r--r--keyboard/preonic/beeps.c246
-rw-r--r--keyboard/preonic/beeps.h12
-rw-r--r--keyboard/preonic/config.h22
-rw-r--r--keyboard/preonic/config_definitions.h50
-rw-r--r--keyboard/preonic/extended_keymap_common.c216
-rw-r--r--keyboard/preonic/extended_keymap_common.h181
-rw-r--r--keyboard/preonic/extended_keymaps/extended_keymap_default.c70
-rw-r--r--keyboard/preonic/extended_keymaps/extended_keymap_lock.c81
-rwxr-xr-xkeyboard/preonic/flash-pcb.sh3
-rw-r--r--keyboard/preonic/keymap_midi.c110
-rw-r--r--keyboard/preonic/keymap_midi.h220
-rw-r--r--keyboard/preonic/keymaps/default/README.md1
-rw-r--r--keyboard/preonic/keymaps/default/keymap.c356
-rw-r--r--keyboard/preonic/keymaps/default/makefile.mk1
-rw-r--r--keyboard/preonic/keymaps/lock/README.md3
-rw-r--r--keyboard/preonic/keymaps/lock/keymap.c105
-rw-r--r--keyboard/preonic/keymaps/nerdgasm/README.md34
-rw-r--r--keyboard/preonic/keymaps/nerdgasm/keymap.c117
-rw-r--r--keyboard/preonic/led.c38
-rw-r--r--keyboard/preonic/matrix.c234
-rw-r--r--keyboard/preonic/preonic.c41
-rw-r--r--keyboard/preonic/preonic.h51
-rw-r--r--keyboard/preonic/preonic_music.hex1713
-rw-r--r--keyboard/preonic/preonic_pcb.hex1702
-rw-r--r--keyboard/preonic/preonic_pcb_silent.hex1189
-rw-r--r--keyboard/retro_refit/Makefile23
-rw-r--r--keyboard/retro_refit/config.h47
-rw-r--r--keyboard/retro_refit/retro_refit.c32
-rw-r--r--quantum/audio.c434
-rw-r--r--quantum/audio.h70
-rw-r--r--quantum/keymap_common.c275
-rw-r--r--quantum/keymap_common.h34
-rw-r--r--quantum/keymap_extras/keymap_german_osx.h156
-rw-r--r--quantum/keymap_midi.c4
-rw-r--r--quantum/keymap_midi.h2
-rw-r--r--quantum/led.c1
-rw-r--r--quantum/musical_notes.h217
-rw-r--r--quantum/quantum.mk9
-rw-r--r--quantum/song_list.h101
-rw-r--r--quantum/template/Makefile23
-rw-r--r--quantum/template/README.md2
-rw-r--r--quantum/template/config.h92
-rw-r--r--quantum/template/template.c20
-rw-r--r--quantum/template/template.h5
-rw-r--r--quantum/tools/README.md6
-rw-r--r--quantum/tools/eeprom_reset.hex9
-rw-r--r--quantum/vibrato_lut.h108
-rw-r--r--tmk_core/common.mk30
-rw-r--r--tmk_core/common/action.c45
-rw-r--r--tmk_core/common/action.h7
-rw-r--r--tmk_core/common/action_code.h2
-rw-r--r--tmk_core/common/action_layer.c89
-rw-r--r--tmk_core/common/action_layer.h12
-rw-r--r--tmk_core/common/action_macro.c8
-rw-r--r--tmk_core/common/action_tapping.c11
-rw-r--r--tmk_core/common/avr/eeconfig.c8
-rw-r--r--tmk_core/common/avr/suspend.c17
-rw-r--r--tmk_core/common/command.c373
-rw-r--r--tmk_core/common/command.h121
-rw-r--r--tmk_core/common/eeconfig.h6
-rw-r--r--tmk_core/common/keyboard.c14
-rw-r--r--tmk_core/common/keymap.c3
-rw-r--r--tmk_core/common/keymap.h3
-rw-r--r--tmk_core/common/magic.c36
-rw-r--r--tmk_core/common/magic.h6
-rw-r--r--tmk_core/common/print.h12
-rw-r--r--tmk_core/protocol/lufa.mk4
-rw-r--r--tmk_core/protocol/lufa/lufa.c18
168 files changed, 19242 insertions, 4010 deletions
diff --git a/1-setup-path-win.bat b/1-setup-path-win.bat
index 49fb00e14..f612d0f4a 100644
--- a/1-setup-path-win.bat
+++ b/1-setup-path-win.bat
@@ -1,9 +1,77 @@
-@echo off
-setx /M path "%PATH%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin" > nul 2>&1
-if NOT ["%errorlevel%"]==["0"] (
- echo FAILED. Rerun with administrator privileges.
- pause
-) else (
- echo Success!
- pause
+@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
+@ECHO OFF
+SET CMDLINERUNSTR=%SystemRoot%\system32\cmd.exe
+
+SET NEWPATH1="C:\MinGW\msys\1.0\bin"
+SET NEWPATH2="C:\MinGW\bin"
+
+:: Make sure we're running with administrator privileges
+NET SESSION >nul 2>&1
+IF ERRORLEVEL 1 (
+ ECHO FAILED. Run this script with administrator privileges.
+ GOTO ExitBatch
)
+
+:: Make sure the second path exists. The first path won't be created until the second script is run
+IF NOT EXIST !NEWPATH2! (ECHO Path not found: %NEWPATH2% && GOTO ExitBatch)
+
+:: Add paths
+CALL :AddPath %NEWPATH1%
+CALL :AddPath %NEWPATH2%
+
+:: Branch to UpdateEnv if we need to update
+IF DEFINED UPDATE (GOTO UpdateEnv)
+
+GOTO ExitBatch
+
+:: -----------------------------------------------------------------------------
+
+:UpdateEnv
+ECHO Making updated PATH go live . . .
+REG delete HKCU\Environment /F /V TEMPVAR > nul 2>&1
+setx TEMPVAR 1 > nul 2>&1
+REG delete HKCU\Environment /F /V TEMPVAR > nul 2>&1
+IF NOT !cmdcmdline! == !CMDLINERUNSTR! (CALL :KillExplorer)
+GOTO ExitBatch
+
+:: -----------------------------------------------------------------------------
+
+:ExitBatch
+ENDLOCAL
+PAUSE
+EXIT /b
+
+:: -----------------------------------------------------------------------------
+
+:AddPath <pathToAdd>
+ECHO %PATH% | FINDSTR /C:"%~1" > nul
+IF ERRORLEVEL 1 (
+ REG add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /f /v PATH /t REG_SZ /d "%PATH%;%~1" > nul 2>&1
+ IF ERRORLEVEL 0 (
+ ECHO Adding %1 . . . Success!
+ SET "PATH=%PATH%;%~1"
+ SET UPDATE=1
+ ) ELSE (
+ ECHO Adding %1 . . . FAILED. Run this script with administrator privileges.
+ )
+) ELSE (
+ ECHO Skipping %1 - Already in PATH
+ )
+EXIT /b
+
+:: -----------------------------------------------------------------------------
+
+:KillExplorer
+
+ECHO Your desktop is being restarted, please wait. . .
+ping -n 5 127.0.0.1 > NUL 2>&1
+ECHO Killing process Explorer.exe. . .
+taskkill /f /im explorer.exe
+ECHO.
+ECHO Your desktop is now loading. . .
+ping -n 5 127.0.0.1 > NUL 2>&1
+ECHO.
+ping -n 5 127.0.0.1 > NUL 2>&1
+START explorer.exe
+START explorer.exe %CD%
+EXIT /b \ No newline at end of file
diff --git a/2-setup-environment-win.bat b/2-setup-environment-win.bat
index 91b6c91e3..905338087 100644
--- a/2-setup-environment-win.bat
+++ b/2-setup-environment-win.bat
@@ -1,41 +1,63 @@
-@echo off
-setx /M test test > nul 2>&1
-if NOT ["%errorlevel%"]==["0"] (
- echo FAILED. Rerun with administrator privileges.
- pause
- exit
+@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
+@ECHO OFF
+
+SET STARTINGDIR=%CD%
+
+:: Check for admin privilages
+SETX /M test test > nul 2>&1
+IF NOT ["%ERRORLEVEL%"]==["0"] (
+ ECHO FAILED. Rerun with administrator privileges.
+ GOTO ExitBatch
)
-echo ------------------------------------------
-echo Installing wget and unzip
-echo ------------------------------------------
+:: Make sure path to MinGW exists - if so, CD to it
+SET MINGWPATH="C:\MinGW\bin"
+IF NOT EXIST !MINGWPATH! (ECHO Path not found: %MINGWPATH% && GOTO ExitBatch)
+CD /D %MINGWPATH%
+
+
+ECHO ------------------------------------------
+ECHO Installing wget and unzip
+ECHO ------------------------------------------
mingw-get install msys-wget-bin msys-unzip-bin
-cd \MinGW\bin
-mkdir temp
-cd temp
-echo ------------------------------------------
-echo Installing dfu-programmer.
-echo ------------------------------------------
+MKDIR temp
+CD temp
+
+ECHO ------------------------------------------
+ECHO Installing dfu-programmer.
+ECHO ------------------------------------------
wget http://iweb.dl.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip
unzip dfu-programmer-win-0.7.2.zip
-copy dfu-programmer.exe ..
+COPY dfu-programmer.exe ..
-echo ------------------------------------------
-echo Downloading driver
-echo ------------------------------------------
+ECHO ------------------------------------------
+ECHO Downloading driver
+ECHO ------------------------------------------
wget http://iweb.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip
unzip libusb-win32-bin-1.2.6.0.zip
-cp libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll
+COPY libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll
+
+ECHO ------------------------------------------
+ECHO Installing driver. Accept prompt.
+ECHO ------------------------------------------
+IF EXIST "%WinDir%\System32\PnPUtil.exe" (%WinDir%\System32\PnPUtil.exe -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf && GOTO PNPUTILFOUND)
+IF EXIST "%WinDir%\Sysnative\PnPUtil.exe" (%WinDir%\Sysnative\PnPUtil.exe -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf && GOTO PNPUTILFOUND)
+
+ECHO FAILED. Could not find PnPUtil.exe in "%WinDir%\System32" or "%WinDir%\Sysnative".
+
+:PNPUTILFOUND
-echo ------------------------------------------
-echo Installing driver. Accept prompt.
-echo ------------------------------------------
-pnputil -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf
+:: Wait then delete directory
+ping -n 5 127.0.0.1 > NUL 2>&1
+CD ..
+RD /s /q temp
-cd ..
-rm -rf temp
+ECHO ------------------------------------------
+ECHO Finished!
-echo ------------------------------------------
-echo Finished!
-pause \ No newline at end of file
+:ExitBatch
+CD /D %STARTINGDIR%
+ENDLOCAL
+PAUSE
+EXIT /b \ No newline at end of file
diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md
index 81c3ec44f..f7a57d2fc 100644
--- a/BUILD_GUIDE.md
+++ b/BUILD_GUIDE.md
@@ -3,11 +3,13 @@
## Build Environment Setup
### Windows
-1. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**.
-2. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location.
-3. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer.
-4. Right-click on the 1-setup-path-win batch script, select "Run as administrator", and accept the User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up.
-5. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete!
+1. If you have ever installed WinAVR, uninstall it.
+2. Install [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe). Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**.
+3. Install [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download). During installation, uncheck the option to install a graphical user interface. **DO NOT change the default installation folder.** The scripts depend on the default location.
+4. Clone this repository. [This link will download it as a zip file, which you'll need to extract.](https://github.com/jackhumbert/qmk_firmware/archive/master.zip) Open the extracted folder in Windows Explorer.
+5. Right-click on the 1-setup-path-win batch script, select "Run as administrator", and accept the User Account Control prompt. Press the spacebar to dismiss the success message in the command prompt that pops up.
+6. Right-click on the 2-setup-environment-win batch script, select "Run as administrator", and accept the User Account Control prompt. This part may take a couple of minutes, and you'll need to approve a driver installation, but once it finishes, your environment is complete!
+7. Future build commands should be run from the standard Windows command prompt, which you can find by searching for "command prompt" from the start menu or start screen. Ignore the "MHV AVR Shell".
### Mac
If you're using [homebrew,](http://brew.sh/) you can use the following commands:
@@ -25,12 +27,12 @@ You can also try these instructions:
3. Install [DFU-Programmer][dfu-prog].
### Linux
-Install AVR GCC and dfu-progammer with your favorite package manager.
+Install AVR GCC, AVR libc, and dfu-progammer with your favorite package manager.
Debian/Ubuntu example:
sudo apt-get update
- sudo apt-get install gcc-avr dfu-programmer
+ sudo apt-get install gcc-avr avr-libc dfu-programmer
### Vagrant
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md).
@@ -42,7 +44,10 @@ If you have any problems building the firmware, you can try using a tool called
4. Once you're in the correct keyboard-specific folder, run the `make` command. This should output a lot of information about the build process.
## Customizing, Building, and Deploying Your Firmware
-1. Running the `make` command from your keyboard's folder will generate a .hex file based on the default keymap. All keymaps for a particular keyboard live in the `keymaps` folder in that keyboard's folder. To create your own keymap, copy `keymaps/default/keymap.c` to the `keymaps` folder, and rename it with your name, for example jack.c. Or, if you don't care about the ability to share your keymap with the community via GitHub, you can just modify the default keymap itself. Details on how to program keymap files can be found in other guides.
+
+Note: Some keyboard folders have non-standard organizations, and may not even support specifying alternate keymaps. Until these get reorganized, you will need to edit their default keymaps directly.
+
+1. Running the `make` command from your keyboard's folder will generate a .hex file based on the default keymap. All keymaps for a particular keyboard live in the `keymaps` folder in that keyboard's folder. To create your own keymap, copy `keymaps/default/keymap.c` to the `keymaps` folder, and rename it with your name, for example jack.c. Or, if you don't care about the ability to share your keymap with the community via GitHub, you can just modify the default keymap itself. Details on how to program keymap files can be found in other guides.
2. To build a keymap other than the default, type `KEYMAP=<name>` after `make`. So if I've named my keymap jack.c, the full command would be `make KEYMAP=jack`.
3. How you deploy the firmware will depend on whether you are using a PCB or a Teensy. In both cases, you'll need to put the keyboard in bootloader mode, either by pressing a button on the PCB/Teensy or pressing the key with the `RESET` keycode. Then, if you're using a PCB, just run `make KEYMAP=<name> dfu` to both build and deploy the firmware. If you're using a Teensy, you'll probably need to take the <keyboardname>.hex file that make produces in the keyboard's folder, and deploy it using the [Teensy Loader.](https://www.pjrc.com/teensy/loader.html)
@@ -52,4 +57,4 @@ If you have any problems building the firmware, you can try using a tool called
## Troubleshooting
1. Try running `make clean` if the make command fails.
- WIP \ No newline at end of file
+ WIP
diff --git a/README.md b/README.md
index 6a6bbed40..f5c271f16 100644
--- a/README.md
+++ b/README.md
@@ -16,13 +16,21 @@ The documentation below explains QMK customizations and elaborates on some of th
* If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there.
* If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh <project_name>`, which will create `/keyboard/<project_name>` with all the necessary components for a Quantum project.
+### Makefile Options
+
You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you.
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = yes # MIDI controls
- # UNICODE_ENABLE = yes # Unicode support - this is commented out, just as an example. You have to use #, not //
+ UNICODE_ENABLE = no # <-- This is how you disable an option, just set it to "no"
BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+### Customizing Makefile options on a per-keymap basis
+
+If your keymap directory has a file called `makefile.mk` (note the lowercase filename, and the `.mk` extension), any Makefile options you set in that file will take precedence over other Makefile options (those set for Quantum as a whole or for your particular keyboard).
+
+So let's say your keyboard's makefile has `CONSOLE_ENABLE = yes` (or maybe doesn't even list the `CONSOLE_ENABLE` option, which would cause it to revert to the global Quantum default). You want your particular keymap to not have the debug console, so you make a file called `makefile.mk` and specify `CONSOLE_ENABLE = no`.
+
## Quick aliases to common actions
Your keymap can include shortcuts to common operations (called "function actions" in tmk).
@@ -98,6 +106,27 @@ We've added shortcuts to make common modifier/tap (mod-tap) mappings more compac
`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.
+### Prevent stuck modifiers
+
+Consider the following scenario:
+
+1. Layer 0 has a key defined as Shift.
+2. The same key is defined on layer 1 as the letter A.
+3. User presses Shift.
+4. User switches to layer 1 for whatever reason.
+5. User releases Shift, or rather the letter A.
+6. User switches back to layer 0.
+
+Shift was actually never released and is still considered pressed.
+
+If such situation bothers you add this to your `config.h`:
+
+ #define PREVENT_STUCK_MODIFIERS
+
+This option uses 5 bytes of memory per every 8 keys on the keyboard
+rounded up (5 bits per key). For example on Planck (48 keys) it uses
+(48/8)\*5 = 30 bytes.
+
### Remember: These are just aliases
These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action).
@@ -178,6 +207,10 @@ This will clear all mods currently pressed.
This will clear all keys besides the mods currently pressed.
+* `update_tri_layer(layer_1, layer_2, layer_3);`
+
+If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0).
+
#### Timer functionality
It's possible to start timers and read values for time-specific events - here's an example:
@@ -241,7 +274,7 @@ This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboar
## International Characters on Windows
-[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys amont others.
+[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys among others.
The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background.
@@ -269,9 +302,9 @@ For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring
RGBLIGHT_ENABLE = yes
-Please note that the underglow is not compatible with MIDI functions. So you cannot enable both of them at the same time.
+Please note that the underglow is not compatible with audio output. So you cannot enable both of them at the same time.
-Please add the following options into your config.h, and set them up according your hardware configuration.
+Please add the following options into your config.h, and set them up according your hardware configuration. These settings are for the F4 by default:
#define ws2812_PORTREG PORTF
#define ws2812_DDRREG DDRF
@@ -281,6 +314,12 @@ Please add the following options into your config.h, and set them up according y
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
+You'll need to edit `PORTF`, `DDRF`, and `PF4` on the first three lines to the port/pin you have your LED(s) wired to, eg for B3 change things to:
+
+ #define ws2812_PORTREG PORTB
+ #define ws2812_DDRREG DDRB
+ #define ws2812_pin PB3
+
The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboard/planck/keymaps/yang/keymap.c`
### WS2812 Wiring
@@ -309,4 +348,4 @@ what things are (and likely aren't) too risky.
- EEPROM has around a 100000 write cycle. You shouldn't rewrite the
firmware repeatedly and continually; that'll burn the EEPROM
eventually.
- \ No newline at end of file
+
diff --git a/keyboard/alps64/Makefile b/keyboard/alps64/Makefile
index e90dcedb6..7634c4280 100644
--- a/keyboard/alps64/Makefile
+++ b/keyboard/alps64/Makefile
@@ -53,9 +53,9 @@ SRC = keymap_common.c \
led.c
ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
- SRC := keymap_plain.c $(SRC)
+ SRC := keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
diff --git a/keyboard/alps64/keymap_plain.c b/keyboard/alps64/keymaps/default.c
index a54899196..a54899196 100644
--- a/keyboard/alps64/keymap_plain.c
+++ b/keyboard/alps64/keymaps/default.c
diff --git a/keyboard/alps64/keymap_hasu.c b/keyboard/alps64/keymaps/hasu.c
index d297d72fe..d297d72fe 100644
--- a/keyboard/alps64/keymap_hasu.c
+++ b/keyboard/alps64/keymaps/hasu.c
diff --git a/keyboard/atomic/Makefile b/keyboard/atomic/Makefile
index e678b4efa..3f066aebc 100644
--- a/keyboard/atomic/Makefile
+++ b/keyboard/atomic/Makefile
@@ -27,7 +27,7 @@
# 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,
+# 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.
@@ -41,7 +41,6 @@
# Target file name (without extension).
TARGET = atomic
-
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
@@ -50,15 +49,42 @@ TMK_DIR = ../../tmk_core
TARGET_DIR = .
# # project specific files
-SRC = atomic.c \
- backlight.c
+SRC = atomic.c
+
+ifdef keymap
+ KEYMAP = $(keymap)
+endif
ifdef KEYMAP
- SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
+ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ KEYMAP_FILE = keymaps/$(KEYMAP).c
+else
+ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
+ KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+ include keymaps/$(KEYMAP)/makefile.mk
+endif
+else
+$(error Keymap file does not exist)
+endif
+endif
+
else
- SRC := keymaps/keymap_default.c $(SRC)
+
+ifneq ("$(wildcard keymaps/default.c)","")
+ KEYMAP_FILE = keymaps/default.c
+else
+ KEYMAP_FILE = keymaps/default/keymap.c
+endif
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+ include keymaps/default/makefile.mk
endif
+endif
+
+SRC := $(KEYMAP_FILE) $(SRC)
+
CONFIG_H = config.h
# MCU name
@@ -78,7 +104,6 @@ MCU = atmega32u4
# software delays.
F_CPU = 16000000
-
#
# LUFA specific
#
@@ -110,23 +135,45 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# 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
+# change to "no" to disable the options, or define them in the makefile.mk in
+# the appropriate keymap folder that will get included automatically
+#
+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 = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
+
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
-BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES # MIDI controls
-# UNICODE_ENABLE = YES # Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+ifdef KEYMAP
+
+ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+ include keymaps/$(KEYMAP)/makefile.mk
+endif
+endif
+else
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+ include keymaps/default/makefile.mk
+endif
+
+endif
+
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
+ SRC := backlight.c $(SRC)
+endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
@@ -136,5 +183,4 @@ VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
-include $(TOP_DIR)/quantum/quantum.mk
-
+include $(TOP_DIR)/quantum/quantum.mk \ No newline at end of file
diff --git a/keyboard/atomic/README.md b/keyboard/atomic/README.md
index c8e83cf55..0e42370ba 100644
--- a/keyboard/atomic/README.md
+++ b/keyboard/atomic/README.md
@@ -16,10 +16,10 @@ Depending on which keymap you would like to use, you will have to compile slight
To build with the default keymap, simply run `make`.
### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
-Keymaps follow the format **__keymap\_\<name\>.c__** and are stored in the `keymaps` folder.
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboard/atomic/atomic.c b/keyboard/atomic/atomic.c
index 30e812289..5e31264e6 100644
--- a/keyboard/atomic/atomic.c
+++ b/keyboard/atomic/atomic.c
@@ -2,12 +2,22 @@
__attribute__ ((weak))
void matrix_init_user(void) {
- // leave these blank
-}
+ // leave this function blank - it can be defined in a keymap file
+};
__attribute__ ((weak))
void matrix_scan_user(void) {
- // leave these blank
+ // leave this function blank - it can be defined in a keymap file
+}
+
+__attribute__ ((weak))
+void process_action_user(keyrecord_t *record) {
+ // leave this function blank - it can be defined in a keymap file
+}
+
+__attribute__ ((weak))
+void led_set_user(uint8_t usb_led) {
+ // leave this function blank - it can be defined in a keymap file
}
void matrix_init_kb(void) {
@@ -33,4 +43,17 @@ void matrix_scan_kb(void) {
// runs every cycle (a lot)
matrix_scan_user();
-} \ No newline at end of file
+}
+
+void process_action_kb(keyrecord_t *record) {
+ // put your per-action keyboard code here
+ // runs for every action, just before processing by the firmware
+
+ process_action_user(record);
+}
+
+void led_set_kb(uint8_t usb_led) {
+ // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+
+ led_set_user(usb_led);
+}
diff --git a/keyboard/atomic/atomic.h b/keyboard/atomic/atomic.h
index d8574efa9..d5461e424 100644
--- a/keyboard/atomic/atomic.h
+++ b/keyboard/atomic/atomic.h
@@ -26,5 +26,8 @@
void matrix_init_user(void);
void matrix_scan_user(void);
+void process_action_user(keyrecord_t *record);
+void led_set_user(uint8_t usb_led);
+void backlight_init_ports(void);
#endif \ No newline at end of file
diff --git a/keyboard/atomic/backlight.c b/keyboard/atomic/backlight.c
index f69364b2a..647b57e71 100644
--- a/keyboard/atomic/backlight.c
+++ b/keyboard/atomic/backlight.c
@@ -1,6 +1,8 @@
#include <avr/io.h>
#include "backlight.h"
+#include "atomic.h"
+
#define CHANNEL OCR1C
diff --git a/keyboard/atomic/config.h b/keyboard/atomic/config.h
index 149aed471..1b34decf9 100644
--- a/keyboard/atomic/config.h
+++ b/keyboard/atomic/config.h
@@ -32,36 +32,109 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
-// Planck PCB default pin-out
-// Change this to how you wired your keyboard
-// COLS: Left to right, ROWS: Top to bottom
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 }
#define ROWS (int []){ D0, D5, B5, B6, C6 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
-/* define if matrix has ghost */
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
-/* NOTE: this is the max value of 0..BACKLIGHT_LEVELS so really 16 levels. */
#define BACKLIGHT_LEVELS 3
-/* 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 */
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
-
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
diff --git a/keyboard/atomic/keymaps/keymap_abienz.c b/keyboard/atomic/keymaps/abienz.c
index 589a64dc4..589a64dc4 100644
--- a/keyboard/atomic/keymaps/keymap_abienz.c
+++ b/keyboard/atomic/keymaps/abienz.c
diff --git a/keyboard/atomic/keymaps/default.c b/keyboard/atomic/keymaps/default.c
new file mode 100644
index 000000000..0ede363a1
--- /dev/null
+++ b/keyboard/atomic/keymaps/default.c
@@ -0,0 +1,234 @@
+#include "atomic.h"
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define ___T___ KC_TRNS
+#define XXXXXXX KC_NO
+
+// Layer shorthand
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+#define _FN 5
+
+/* ROW 1 OPTIONS
+ * .--------------------------------------------------------------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ * .- 2u ------------.
+ * | KEY . XXXXXX |
+ * '-----------------'
+ */
+
+/* ROW 2 OPTIONS
+ * .--------------------------------------------------------------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ * .- 2u ------------. .- 2u ------------.
+ * | KEY . XXXXXX | | KEY . XXXXXX |
+ * '-----------------' '-----------------'
+ */
+
+/* ROW 3 OPTIONS
+ * .--------------------------------------------------------------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ * .- 2u ------------. .- 2u ------------.
+ * | KEY . XXXXXX | | X |
+ * '-----------------' '-----------------'
+ * .- 2u ------------.
+ * | X |
+ * '-----------------'
+ */
+
+/* ROW 4 OPTIONS
+ * .--------------------------------------------------------------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ * .- 2u ------------.
+ * | KEY . XXXXXX |
+ * '-----------------'
+ * .- 2u ------------. .- 2u ------------.
+ * | KEY . XXXXXX | | KEY . XXXXXX |
+ * '-----------------' '-----------------'
+ * .- 2u ------------.
+ * | KEY . XXXXXX |
+ * '-----------------'
+ */
+
+/* ROW 5 OPTIONS
+ * .--------------------------------------------------------------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ * .- 1.25u --+ 1.25u ------- 1.25u +--- 1.25u --- 2u -------------- 1.25u ---- 1.25u ------ 1.25u +---- 1.25u .
+ * | X | X | X | X | X | X | X | X | X |
+ * '-----------------------------------------------------------------------------------------------------------'
+ * .- 2u ------------.
+ * | X |
+ * '-----------------'
+ * .--------------------- 6.25u ----------------------------.
+ * | X |
+ * '--------------------------------------------------------'
+ * .----------------------- 6.25u ---------------------------- 1.25u ---- 1.25u ---- 1.25u ------ 1.25u +-- 1.25u --.
+ * | X | X | X | X | X | X |
+ * '----------------------------------------------------------------------------------------------------------------'
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* QWERTY - MIT ENHANCED / GRID COMPATIBLE
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | ESC | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | BRITE | LCTRL | LALT | LGUI | RAISE | XXXXXX . SPACE | LOWER | RGUI | RALT | RCTRL | FN | LEFT | DOWN | RIGHT |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_QW] = { /* QWERTY */
+ { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
+ { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
+ { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
+ { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
+ { M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_RGUI, KC_RALT, KC_RCTL, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT },
+ },
+
+/* COLEMAK - MIT ENHANCED / GRID COMPATIBLE
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | TAB | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | \ | DEL |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | ESC | A | R | S | T | D | H | N | E | I | O | ' | XXXXXX . ENTER | PG UP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | LSHIFT | Z | X | C | V | B | K | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | BRITE | LCTRL | LALT | LGUI | RAISE | XXXXXX . SPACE | LOWER | RGUI | RALT | RCTRL | FN | LEFT | DOWN | RIGHT |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_CM] = { /* COLEMAK */
+ { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
+ { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
+ { KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
+ { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
+ { M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_RGUI, KC_RALT, KC_RCTL, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT },
+ },
+
+/* DVORAK - MIT ENHANCED / GRID COMPATIBLE
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | TAB | ' | , | . | P | Y | F | G | C | R | L | [ | ] | \ | DEL |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | ESC | A | O | E | U | I | D | H | T | N | S | / | XXXXXX . ENTER | PG UP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | XXXXXX . RSHIFT | UP | PG DN |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | BRITE | LCTRL | LALT | LGUI | RAISE | XXXXXX . SPACE | LOWER | RGUI | RALT | RCTRL | FN | LEFT | DOWN | RIGHT |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_DV] = { /* DVORAK */
+ { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
+ { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
+ { KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, KC_ENT, KC_ENT, KC_PGUP },
+ { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
+ { M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_RGUI, KC_RALT, KC_RCTL, MO(_FN), KC_LEFT, KC_DOWN, KC_RGHT },
+ },
+
+/* LOWERED
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | | INS |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | XXXXXX . | |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | XXXXXX . | | |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | | | | | | XXXXXX . | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_LW] = { /* LOWERED */
+ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
+ { _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, _______, KC_INS },
+ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, ___T___, ___T___, _______ },
+ { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ },
+
+/* RAISED
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | INS |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | XXXXXX . | |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | XXXXXX . | | |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | | | | | | XXXXXX . | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_RS] = { /* RAISED */
+ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
+ { _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_INS },
+ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, ___T___, ___T___, _______ },
+ { _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ },
+
+/* FUNCTION
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | NUM LK | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | XXXXXX . |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | SCR LK | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | F23 | F24 | PAUSE | PR SCR |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | CAP LK | MS BT5 | MS BT4 | MS BT3 | MS BT2 | SLOW M | FAST M | NEXT | VOL+ | VOL- | PLAY | | XXXXXX . | WHEEL+ |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | | | QWERTY | COLEMK | DVORAK | | | | | | | XXXXXX . | MOUS U | WHEEL- |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | | | | | | XXXXXX . MS BT1 | | | | | | MOUS L | MOUS D | MOUS R |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_FN] = { /* FUNCTION */
+ { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
+ { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR },
+ { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U },
+ { _______, _______, DF(_QW), DF(_CM), DF(_DV), _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D },
+ { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R },
+ },
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
diff --git a/keyboard/atomic/keymaps/keymap_default.c b/keyboard/atomic/keymaps/keymap_default.c
deleted file mode 100644
index f37d9d9a5..000000000
--- a/keyboard/atomic/keymaps/keymap_default.c
+++ /dev/null
@@ -1,79 +0,0 @@
-#include "atomic.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = { /* Qwerty */
- { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL },
-// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
-// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
-// ┌─ 2u ────────────┐
-// │ X │
-// └─────────────────┘
- { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
-// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
-// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
-// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐
-// │ X │ │ X │
-// └─────────────────┘ └─────────────────┘
- { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
-// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
-// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
-// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐
-// │ X │ │ X │
-// └─────────────────┘ └─────────────────┘
-// ┌─ 2u ────────────┐
-// │ X │
-// └─────────────────┘
- { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
-// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
-// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
-// ┌─ 2u ────────────┐
-// │ X │
-// └─────────────────┘
-// ┌─ 2u ────────────┐ ┌─ 2u ────────────┐
-// │ X │ │ X │
-// └─────────────────┘ └─────────────────┘
-// ┌─ 2u ────────────┐
-// │ X │
-// └─────────────────┘
- { BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, KC_RGUI, KC_RALT, KC_RCTL, BL_STEP, KC_LEFT, KC_DOWN, KC_RGHT },
-// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
-// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
-// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
-// ┌─ 1.25u ──┬ 1.25u ───┬─── 1.25u ┬─── 1.25u ─┬─ 2u ────────────┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬──── 1.25u ┐
-// │ X │ X │ X │ X │ X │ X │ X │ X │ X │
-// └──────────┴──────────┴──────────┴───────────┴─────────────────┴──────────┴──────────┴──────────┴───────────┘
-// ┌─ 2u ────────────┐
-// │ X │
-// └─────────────────┘
-// ┌───────────────────── 6.25u ────────────────────────────┐
-// │ X │
-// └────────────────────────────────────────────────────────┘
-// ┌─────────────────────── 6.25u ──────────────────────────┬─ 1.25u ──┬─ 1.25u ──┬─ 1.25u ──┬─── 1.25u ┬── 1.25u ──┐
-// │ X │ X │ X │ X │ X │ X │
-// └────────────────────────────────────────────────────────┴──────────┴──────────┴──────────┴──────────┴───────────┘
- }
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE
- [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER
-
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch(id) {
- case 0:
- return MACRODOWN(TYPE(KC_T), END);
- break;
- }
- return MACRO_NONE;
-};
diff --git a/keyboard/atomic/keymaps/keymap_michelle.c b/keyboard/atomic/keymaps/michelle.c
index 2364c46a1..2364c46a1 100644
--- a/keyboard/atomic/keymaps/keymap_michelle.c
+++ b/keyboard/atomic/keymaps/michelle.c
diff --git a/keyboard/atomic/keymaps/pvc/config.h b/keyboard/atomic/keymaps/pvc/config.h
new file mode 100644
index 000000000..cb0b78e44
--- /dev/null
+++ b/keyboard/atomic/keymaps/pvc/config.h
@@ -0,0 +1,157 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Ortholinear Keyboards
+#define PRODUCT The Atomic Keyboard
+#define DESCRIPTION A compact ortholinear keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 }
+#define ROWS (int []){ D0, D5, B5, B6, B3 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* 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
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+
+#endif
diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c
new file mode 100644
index 000000000..36098f1eb
--- /dev/null
+++ b/keyboard/atomic/keymaps/pvc/keymap.c
@@ -0,0 +1,469 @@
+#include "atomic.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+#include "led.h"
+
+#ifdef AUDIO_ENABLE
+ #include "audio.h"
+ #include "song_list.h"
+#endif
+
+#define LAYER_QWERTY 0
+#define LAYER_COLEMAK 1
+#define LAYER_DVORAK 2
+#define LAYER_LOWER 3
+#define LAYER_RAISE 4
+#define LAYER_ADJUST 5
+#define LAYER_FUNCTION 6
+#define LAYER_MUSIC 7
+
+#define MACRO_QWERTY 0
+#define MACRO_COLEMAK 1
+#define MACRO_DVORAK 2
+#define MACRO_LOWER 3
+#define MACRO_RAISE 4
+#define MACRO_FUNCTION 5
+#define MACRO_TIMBRE_1 6
+#define MACRO_TIMBRE_2 7
+#define MACRO_TIMBRE_3 8
+#define MACRO_TIMBRE_4 9
+#define MACRO_TEMPO_U 10
+#define MACRO_TEMPO_D 11
+#define MACRO_TONE_DEFAULT 12
+#define MACRO_MUSIC_ON 13
+#define MACRO_MUSIC_OFF 14
+#define MACRO_AUDIO_ON 15
+#define MACRO_AUDIO_OFF 16
+
+#define M_QWRTY M(MACRO_QWERTY)
+#define M_COLMK M(MACRO_COLEMAK)
+#define M_DVORK M(MACRO_DVORAK)
+#define M_LOWER M(MACRO_LOWER)
+#define M_RAISE M(MACRO_RAISE)
+#define M_FUNCT M(MACRO_FUNCTION)
+#define TIMBR_1 M(MACRO_TIMBRE_1)
+#define TIMBR_2 M(MACRO_TIMBRE_2)
+#define TIMBR_3 M(MACRO_TIMBRE_3)
+#define TIMBR_4 M(MACRO_TIMBRE_4)
+#define TMPO_UP M(MACRO_TEMPO_U)
+#define TMPO_DN M(MACRO_TEMPO_D)
+#define TMPO_DF M(MACRO_TONE_DEFAULT)
+
+
+#define MUS_ON M(MACRO_MUSIC_ON)
+#define MUS_OFF M(MACRO_MUSIC_OFF)
+#define AUD_OFF M(MACRO_AUDIO_OFF)
+#define AUD_ON M(MACRO_AUDIO_ON)
+
+
+#define SC_UNDO LCTL(KC_Z)
+#define SC_REDO LCTL(KC_Y)
+#define SC_CUT LCTL(KC_X)
+#define SC_COPY LCTL(KC_C)
+#define SC_PSTE LCTL(KC_V)
+#define SC_SELA LCTL(KC_A)
+#define SC_SAVE LCTL(KC_S)
+#define SC_OPEN LCTL(KC_O)
+#define SC_ACLS LALT(KC_F4)
+#define SC_CCLS LCTL(KC_F4)
+
+
+#define _______ KC_TRNS
+#define ___T___ KC_TRNS
+#define XXXXXXX KC_NO
+
+/* QWERTY
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | DEL |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | XXXXXX . ENTER | PG UP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | LSHIFT | Z | X | C | V | B | N | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [LAYER_QWERTY] = { /* QWERTY */
+ { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX },
+ { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
+ { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, KC_PGUP },
+ { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX, KC_UP, KC_PGDN },
+ { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, XXXXXXX, M_LOWER, KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
+ },
+
+ /* COLEMAK
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | TAB | Q | W | F | P | G | J | L | U | Y | ; | [ | ] | \ | DEL |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | CAPS | A | R | S | T | D | H | N | E | I | O | ' | XXXXXX . ENTER | PG UP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | LSHIFT | Z | X | C | V | B | K | M | , | . | / | XXXXXX . RSHIFT | UP | PG DN |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [LAYER_COLEMAK] = { /* COLEMAK */
+ { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC },
+ { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL },
+ { KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_ENT, KC_PGUP },
+ { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
+ { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, XXXXXXX, M_LOWER, KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
+ },
+
+/* DVORAK
+ * .---------------------------------------------------------------------------------------------------------------------- 2u ------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [ | ] | XXXXXX . BACKSP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
+ * | TAB | ' | , | . | P | Y | F | G | C | R | L | / | = | \ | DEL |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ------------+--------|
+ * | CAPS | A | O | E | U | I | D | H | T | N | S | - | XXXXXX . ENTER | PG UP |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+- 2u ---------------------+--------|
+ * | LSHIFT | ; | Q | J | K | X | B | M | W | V | Z | XXXXXX . RSHIFT | UP | PG DN |
+ * |--------+--------+--------+--------+--------+- 2u ------------+--------+--------+--------+--------+-----------------+--------+--------|
+ * | LCTRL | LWIN | FN | LALT | RAISED | XXXXXX . SPACE | LOWER | RALT | HOME | END | RCTRL | LEFT | DOWN | RIGHT |
+ * '--------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [LAYER_DVORAK] = { /* DVORAK */
+ { KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_BSPC },
+ { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL },
+ { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_ENT, KC_PGUP },
+ { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_RSFT, KC_UP, KC_PGDN },
+ { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, XXXXXXX, M_LOWER, KC_RALT, KC_HOME, KC_END, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
+ },
+
+
+ [LAYER_LOWER] = { /* LOWERED */
+ { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
+ { _______, _______, _______, _______, SC_CCLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
+ { _______, SC_REDO, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
+ { _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______ },
+ },
+
+ [LAYER_RAISE] = { /* RAISED */
+ { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
+ { _______, _______, _______, _______, SC_ACLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS },
+ { _______, SC_SELA, SC_SAVE, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
+ { _______, SC_UNDO, SC_CUT, SC_COPY, SC_PSTE, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
+ { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ },
+ },
+
+ [LAYER_FUNCTION] = { /* FUNCTION */
+ { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ___T___, ___T___ },
+ { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_PAUS, KC_PSCR },
+ { KC_CAPS, KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_ACL0, KC_ACL2, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, ___T___, ___T___, KC_WH_U },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, KC_MS_U, KC_WH_D },
+ { _______, _______, _______, _______, _______, KC_BTN1, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R },
+ },
+
+ [LAYER_ADJUST] = { /* ADJUST */
+ { _______, TIMBR_1, TIMBR_2, TIMBR_3, TIMBR_4, TMPO_UP, TMPO_DN, TMPO_DF, _______, MUS_ON, MUS_OFF, AUD_ON, AUD_OFF, ___T___, ___T___ },
+ { _______, M_QWRTY, M_COLMK, M_DVORK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
+ { _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
+ { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ },
+ },
+
+ [LAYER_MUSIC] = {
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___ },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______ },
+ { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______ },
+ { _______, _______, _______, _______, _______, ___T___, ___T___, _______, _______, _______, _______, _______, _______, _______, _______ },
+ },
+};
+
+#ifdef AUDIO_ENABLE
+
+float tone_my_startup[][2] = SONG(ODE_TO_JOY);
+float tone_my_goodbye[][2] = SONG(ROCK_A_BYE_BABY);
+
+float tone_qwerty[][2] = SONG(QWERTY_SOUND);
+float tone_dvorak[][2] = SONG(COLEMAK_SOUND);
+float tone_colemak[][2] = SONG(DVORAK_SOUND);
+
+float tone_audio_on[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
+float tone_music_on[][2] = SONG(DOE_A_DEER);
+float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
+float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
+float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND);
+float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND);
+float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
+float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
+
+#endif /* AUDIO_ENABLE */
+
+/*
+void update_quad_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3, uint8_t layer4, bool order)
+{
+ if (order)
+ {
+ if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2))
+ {
+ layer_on(layer3);
+ }
+ else
+ {
+ layer_off(layer3);
+ layer_off(layer4);
+ }
+ }
+ else
+ {
+ if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2))
+ {
+ layer_on(layer4);
+ }
+ else
+ {
+ layer_off(layer3);
+ layer_off(layer4);
+ }
+ }
+}
+*/
+
+void persistant_default_layer_set(uint16_t default_layer)
+{
+ eeconfig_write_default_layer(default_layer);
+ default_layer_set(default_layer);
+}
+
+const uint16_t PROGMEM fn_actions[] = {
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+
+ // MACRODOWN only works in this function
+ switch(id)
+ {
+
+ case MACRO_QWERTY:
+ if (record->event.pressed)
+ {
+ persistant_default_layer_set(1UL<<LAYER_QWERTY);
+ PLAY_NOTE_ARRAY(tone_qwerty, false, STACCATO);
+ }
+ break;
+
+ case MACRO_COLEMAK:
+ if (record->event.pressed)
+ {
+ persistant_default_layer_set(1UL<<LAYER_COLEMAK);
+ PLAY_NOTE_ARRAY(tone_colemak, false, STACCATO);
+ }
+ break;
+
+ case MACRO_DVORAK:
+ if (record->event.pressed)
+ {
+ persistant_default_layer_set(1UL<<LAYER_DVORAK);
+ PLAY_NOTE_ARRAY(tone_dvorak, false, STACCATO);
+ }
+ break;
+
+
+ case MACRO_LOWER:
+ if (record->event.pressed)
+ {
+ layer_on(LAYER_LOWER);
+ update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+ }
+ else
+ {
+ layer_off(LAYER_LOWER);
+ update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+ }
+ break;
+
+ case MACRO_RAISE:
+ if (record->event.pressed)
+ {
+ layer_on(LAYER_RAISE);
+ update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+ }
+ else
+ {
+ layer_off(LAYER_RAISE);
+ update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST);
+ }
+ break;
+
+ case MACRO_FUNCTION:
+ if (record->event.pressed)
+ {
+ layer_on(LAYER_FUNCTION);
+ }
+ else
+ {
+ layer_off(LAYER_FUNCTION);
+ }
+ break;
+
+ case MACRO_TIMBRE_1:
+ if (record->event.pressed) set_timbre(TIMBRE_12);
+ break;
+
+ case MACRO_TIMBRE_2:
+ if (record->event.pressed) set_timbre(TIMBRE_25);
+ break;
+
+ case MACRO_TIMBRE_3:
+ if (record->event.pressed) set_timbre(TIMBRE_50);
+ break;
+
+ case MACRO_TIMBRE_4:
+ if (record->event.pressed) set_timbre(TIMBRE_75);
+ break;
+
+ case MACRO_TEMPO_U:
+ if (record->event.pressed) increase_tempo(10);
+ break;
+
+ case MACRO_TEMPO_D:
+ if (record->event.pressed) decrease_tempo(10);
+ break;
+
+ case MACRO_TONE_DEFAULT:
+ if (record->event.pressed)
+ {
+ set_timbre(TIMBRE_DEFAULT);
+ set_tempo(TEMPO_DEFAULT);
+ }
+ break;
+
+ case MACRO_AUDIO_OFF:
+ if (record->event.pressed)
+ {
+ #ifdef AUDIO_ENABLE
+ audio_off();
+ #endif
+ }
+ break;
+
+ case MACRO_AUDIO_ON:
+ if (record->event.pressed)
+ {
+ #ifdef AUDIO_ENABLE
+ audio_on();
+ PLAY_NOTE_ARRAY(tone_audio_on, false, STACCATO);
+ #endif
+ }
+ break;
+
+ case MACRO_MUSIC_ON:
+ if (record->event.pressed)
+ {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_music_on, false, STACCATO);
+ layer_on(LAYER_MUSIC);
+ #endif
+ }
+ break;
+
+ case MACRO_MUSIC_OFF:
+ if (record->event.pressed)
+ {
+ #ifdef AUDIO_ENABLE
+ layer_off(LAYER_MUSIC);
+ stop_all_notes();
+ #endif
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ return MACRO_NONE;
+};
+
+
+#ifdef AUDIO_ENABLE
+
+uint8_t starting_note = 0x0C;
+int offset = 7;
+
+
+void process_action_user(keyrecord_t *record)
+{
+ if (IS_LAYER_ON(LAYER_MUSIC))
+ {
+ if (record->event.pressed)
+ {
+ play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
+ }
+ else
+ {
+ stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
+ }
+ }
+}
+
+
+void matrix_init_user(void)
+{
+ init_notes();
+ play_startup_tone();
+ println("Matrix Init");
+}
+
+void led_set_user(uint8_t usb_led)
+{
+ static uint8_t old_usb_led = 0;
+
+ if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK)))
+ {
+ // If CAPS LK LED is turning on...
+ PLAY_NOTE_ARRAY(tone_caps_on, false, LEGATO);
+ }
+ else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK)))
+ {
+ // If CAPS LK LED is turning off...
+ PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO);
+ }
+ else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK)))
+ {
+ // If NUM LK LED is turning on...
+ PLAY_NOTE_ARRAY(tone_numlk_on, false, LEGATO);
+ }
+ else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK)))
+ {
+ // If NUM LED is turning off...
+ PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO);
+ }
+ else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+ {
+ // If SCROLL LK LED is turning on...
+ PLAY_NOTE_ARRAY(tone_scroll_on, false, LEGATO);
+ }
+ else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK)))
+ {
+ // If SCROLL LED is turning off...
+ PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO);
+ }
+ old_usb_led = usb_led;
+}
+
+
+void play_startup_tone()
+{
+ PLAY_NOTE_ARRAY(tone_my_startup, false, STACCATO);
+}
+
+void play_goodbye_tone()
+{
+ PLAY_NOTE_ARRAY(tone_my_goodbye, false, STACCATO);
+ _delay_ms(2000);
+}
+
+#endif /* AUDIO_ENABLE */
diff --git a/keyboard/atomic/keymaps/pvc/makefile.mk b/keyboard/atomic/keymaps/pvc/makefile.mk
new file mode 100644
index 000000000..eefa42855
--- /dev/null
+++ b/keyboard/atomic/keymaps/pvc/makefile.mk
@@ -0,0 +1,17 @@
+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 = no # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = yes # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+CONFIG_H = keymaps/$(KEYMAP)/config.h \ No newline at end of file
diff --git a/keyboard/atreus/Makefile b/keyboard/atreus/Makefile
index 2e542d62e..a6fddd70d 100644
--- a/keyboard/atreus/Makefile
+++ b/keyboard/atreus/Makefile
@@ -53,9 +53,9 @@ TARGET_DIR = .
SRC = atreus.c
ifdef KEYMAP
- SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
- SRC := keymaps/keymap_default.c $(SRC)
+ SRC := keymaps/default.c $(SRC)
endif
ifdef TEENSY2
diff --git a/keyboard/atreus/README.md b/keyboard/atreus/README.md
index 4db7ac120..aacf2841f 100644
--- a/keyboard/atreus/README.md
+++ b/keyboard/atreus/README.md
@@ -177,10 +177,10 @@ Depending on which keymap you would like to use, you will have to compile slight
To build with the default keymap, simply run `make`.
### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
-Keymaps follow the format **__keymap\_\<name\>.c__** and are stored in the `keymaps` folder.
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboard/atreus/keymaps/keymap_default.c b/keyboard/atreus/keymaps/default.c
index 1c4280ff5..1c4280ff5 100644
--- a/keyboard/atreus/keymaps/keymap_default.c
+++ b/keyboard/atreus/keymaps/default.c
diff --git a/keyboard/atreus/keymaps/keymap_gerb.c b/keyboard/atreus/keymaps/gerb.c
index 1ba3942e3..1ba3942e3 100644
--- a/keyboard/atreus/keymaps/keymap_gerb.c
+++ b/keyboard/atreus/keymaps/gerb.c
diff --git a/keyboard/ergodox_ez/keymaps/alexjj/keymap.c b/keyboard/ergodox_ez/keymaps/alexjj/keymap.c
new file mode 100644
index 000000000..448f62da0
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/alexjj/keymap.c
@@ -0,0 +1,238 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+#define UNIC 3 // unicode entry layer
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ESC | 1! | 2@ | 3# | 4$ | 5% | 6^ | | 7& | 8* | 9( | 0) | -_ | += | BkSp |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | { | | } | Y | U | I | O | P | |\ |
+ * |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
+ * | Win | A | S | D | F | G |------| |------| H | J | K | L | :; | '" |
+ * |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
+ * | LShift |Z/Alt | X | C | V | B | | | | N | M | , | . | Alt | RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |LCtrl | COPY | PASTE| Left | Right| | Down | Up |Hyper | `~ | RCtrl |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * Hyper = Ctrl+Super+Alt+Shift | ~L3 | F5 | | F2 | ~L2 |
+ * ,------|------|------| |------+------+------.
+ * | | | PgUp | | Ins | | |
+ * | Enter| BkSp |------| |------| ~L1 |Space |
+ * | | | PgDn | | Del | | |
+ * `--------------------' `--------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
+ KC_LGUI, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, ALT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_HOME,
+ KC_LCTRL, LCTL(KC_C), LCTL(KC_V), KC_LEFT,KC_RGHT,
+ KC_FN3, KC_F5,
+ KC_PGUP,
+ KC_ENT,KC_BSPC,KC_PGDN,
+ // right hand
+ KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
+ KC_END, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
+ KC_DOWN,KC_UP, ALL_T(KC_NO),KC_GRV, KC_RCTRL,
+ KC_F2, KC_FN2,
+ KC_INS,
+ KC_DELT,KC_FN1, KC_SPC
+ ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |PrintScr|
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | £ | | | | | | . | 0 | = |Alt+F4|
+ * `----------------------------------' `----------------------------------'
+ * ↑ ,-------------. ,-------------.
+ * THERE! | | | | | |
+ * ,------|------|------| |------+------+------.
+ * CAD = Ctrl + Alt + Delete | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | CAD | | |
+ * `--------------------' `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+ // left hand
+ KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
+ KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+ KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+ KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+ KC_TRNS,M(3),KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,
+ KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,
+ // right hand
+ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,
+ KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS,
+ KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
+ KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
+ KC_TRNS,KC_DOT, KC_0, KC_EQL, LALT(KC_F4),
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ LCTL(LALT(KC_DEL)), KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | TEENSY | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | | MsUp | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | Prev | Next | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | Lclk | Rclk | |VolDn |VolUp | Mute | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | |Brwser|
+ * | | |------| |------| |Back |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = KEYMAP(
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ // right hand
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+ KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_WBAK
+),
+/* Keymap 3: Unicode Entry
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | Alt | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | + | + | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Alt | | | E | | | | | | | 7 | 8 | 9 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Alt | A | | D | F | |------| |------| | 4 | 5 | 6 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Alt | | | C | | B | | | | | 1 | 2 | 3 | + | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | Alt | Alt | Alt | | | | 0 | 0 | 0 | + | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * WINDOWS ONLY SETUP!! | ~L3 | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | Alt | Alt |------| |------| Alt | Alt |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[UNIC] = KEYMAP( // layer 3 : Unicode Entry
+ // left hand
+ KC_LALT, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6,
+ KC_LALT, KC_TRNS, KC_TRNS, KC_E, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_LALT, KC_A, KC_TRNS, KC_D, KC_F, KC_TRNS,
+ KC_LALT, KC_TRNS, KC_TRNS, KC_C, KC_TRNS, KC_B, KC_TRNS,
+ KC_LALT, KC_LALT, KC_LALT, KC_TRNS,KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_LALT,KC_LALT, KC_TRNS,
+ // right hand
+ KC_P7, KC_P8, KC_P9, KC_P0, KC_PPLS,KC_PPLS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_TRNS,
+ KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_TRNS,
+ KC_P0, KC_P0, KC_P0, KC_PPLS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS,KC_LALT, KC_LALT
+ ),
+};
+
+
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
+ [2] = ACTION_LAYER_TAP_TOGGLE(MDIA), // FN2 - Momentary Layer 2 (Media)
+ [3] = ACTION_LAYER_TAP_TOGGLE(UNIC) // FN3 - Momentary Layer 3 (Unicode entry)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ case 3: // this would trigger when you hit a key mapped as M(3)
+ if (record->event.pressed) {
+ return MACRO( I(255), D(LALT), T(P1), T(P5), T(P6), U(LALT), END );
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ // TODO: Make this relevant to the ErgoDox EZ.
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ case 3:
+ ergodox_right_led_3_on();
+ break;
+ default:
+ // none
+ break;
+ }
+
+};
diff --git a/keyboard/ergodox_ez/keymaps/alexjj/keymap.hex b/keyboard/ergodox_ez/keymaps/alexjj/keymap.hex
new file mode 100644
index 000000000..13338a892
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/alexjj/keymap.hex
@@ -0,0 +1,1141 @@
+:100000000C94C5020C940C030C940C030C940C037C
+:100010000C940C030C940C030C940C030C940C0324
+:100020000C940C030C940C030C94380C0C940A0DD7
+:100030000C940C030C940C030C940C030C940C0304
+:100040000C940C030C94AC210C940C030C940C0336
+:100050000C940C030C94381B0C940C030C940C03A0
+:100060000C940C030C940C030C940C030C940C03D4
+:100070000C940C030C940C030C940C030C940C03C4
+:100080000C940C030C940C030C940C030C940C03B4
+:100090000C940C030C940C030C940C030C940C03A4
+:1000A0000C940C030C940C030C940C03770D990D19
+:1000B0008C0E990D8C0EDE0D010E8C0E560E690EF7
+:1000C0005D115D118C118C11CF11091216141614CB
+:1000D0002212161417131713EA1316141614011408
+:1000E00075FF01E201590259015D025D015E025E88
+:1000F00002E2000000F0A1F0A2F0A329002B00E32F
+:1001000000E100E00000001E00140004001D740661
+:10011000014E001F001A0016001B0019012A0020C2
+:100120000008000700060050002800210015000903
+:100130000019004F004B00220017000A00050000C4
+:1001400000C30023002F0000004A0000003E0024EE
+:1001500000300000004D0000003B0025001C000B9B
+:100160000011000000C200260018000D0010005110
+:1001700000490027000C000E00360052002C002D14
+:100180000012000F003700007FC1002E0013003363
+:1001900000380035004C002A0031003400E500E44E
+:1001A0000000000100010001000100010000003A10
+:1001B000001E0220022202033001003B001F022128
+:1001C000022302010001003C002F0226022F000141
+:1001D0000001003D00300227023000010001003E16
+:1001E00000310235003502000001003F000100002F
+:1001F00000010000000100400001000000010000BB
+:1002000000010041005200510024020000010042A0
+:1002100000240021001E00010001004300250022EF
+:10022000001F0037000100440026002300200027A3
+:10023000000100450025022E0231002E004C05462B
+:10024000000100010001003D040000005001000118
+:100250000001000100000001000100010001000197
+:1002600000010001000100F2000100010001000195
+:1002700000F000F1000100F400010001000100F3B2
+:10028000000100F500010001000100010001000073
+:100290000001000100010000000100000001000158
+:1002A0000001000000010000000100010001000148
+:1002B000000100000001000100010001000100AA8E
+:1002C000000100010001000100AC00A900B600011E
+:1002D0000001000100AB00A80001000100010001C5
+:1002E0000001000100010001000100AE0001000159
+:1002F000000000E200E200E200E200E2000000593B
+:1003000000010004000100E20001005A00010001A8
+:10031000000100E200E2005B0008000700060001A7
+:1003200000E2005C00010009000100010001005D25
+:1003300000010001000500000001005E0001000056
+:10034000000100000001005F00010000000100004A
+:1003500000010060000100010001000000010061D7
+:10036000005F005C00590062000100620060005DF7
+:10037000005A006200E200570061005E005B00620C
+:1003800000E20057005700570057005700010001D6
+:100390000001000100010001000000160345007289
+:1003A0000067006F0044006F007800200045005A8D
+:1003B00000000016034500720067006F0044006FE4
+:1003C000007800200045005A0000000403090409D9
+:1003D000026D00040100A0FA0904000001030101FC
+:1003E00000092111010001223F00070581030800D7
+:1003F0000A090401000103010200092111010001A1
+:10040000224D000705820308000A090402000103C7
+:1004100000000009211101000122360007058303B5
+:1004200008000A090403000103000000092111016A
+:100430000001223900070584031000011201100198
+:1004400000000008EDFE0713010001020001050194
+:100450000906A101050719E029E7150025019508FE
+:10046000750181020508190129059505750191029B
+:1004700095017503910105071900297715002501DC
+:10048000957875018102C005010980A101850216D8
+:10049000010026B7001A01002AB7007510950181E6
+:1004A00000C0050C0901A1018503160100269C026C
+:1004B0001A01002A9C02751095018100C0050109EE
+:1004C00002A1010901A1000509190129051500254D
+:1004D00001950575018102950175038101050109E9
+:1004E0003009311581257F95027508810609381577
+:1004F00081257F950175088106050C0A3802158152
+:10050000257F950175088106C0C005010906A10176
+:10051000050719E029E715002501950875018102F5
+:1005200095017508810105081901290595057501D1
+:1005300091029501750391010507190029FF150026
+:1005400025FF950675088100C0000000000000002E
+:1005500000000000010204060A0F17202C3A4A5D31
+:1005600071879DB3C7DAE9F5FCFFFCF5E9DAC7B39B
+:100570009D87715D4A3A2C20170F0A06040201007C
+:100580000000000000000000000011241FBECFEF9B
+:10059000DAE0DEBFCDBF04B603FE27C08091EE01D6
+:1005A0009091EF01A091F001B091F1018730904B53
+:1005B000A740B04BD1F41092EE011092EF011092CF
+:1005C000F0011092F10114BE84B7877F84BF0FB68B
+:1005D000F894A895809160008861809360001092E3
+:1005E00060000FBEE0E0FFE3099511E0A0E0B1E09C
+:1005F000EAEFF6E402C005900D92A433B107D9F7F3
+:1006000021E0A4E3B1E001C01D92AE3EB207E1F7E4
+:100610000E947F090C947B230C940000CF93DF93FE
+:10062000EC01662319F0633059F00DC08A818823EC
+:1006300021F085EE0E94EE0F03C085EE0E94B610F9
+:100640008A81811103C080E090E002C080EE90E0DA
+:10065000DF91CF91089508956091B1017091B20139
+:100660008091B3019091B4010E94621A56985E98ED
+:1006700025982D9826982E9827982F98823039F013
+:10068000833041F0813041F4259A2D9A0895269ABD
+:100690002E9A0895279A2F9A08950C942C03569811
+:1006A0005E9825982D9826982E9827982F988FEF4A
+:1006B00090E0909389008093880090938B008093C2
+:1006C0008A0090938D0080938C00259A2D9A2FEFAD
+:1006D00080E792E0215080409040E1F700C00000A8
+:1006E000269A2E9A2FEF80E792E02150804090408A
+:1006F000E1F700C00000279A2F9A2FEF80E792E0E1
+:10070000215080409040E1F700C0000025982D98CE
+:100710002FEF80E792E0215080409040E1F700C049
+:10072000000026982E982FEF80E792E0215080401D
+:100730009040E1F700C0000027982F9856985E98E7
+:1007400025982D9826982E9827982F98089589EA0D
+:100750008093800089E08093810024982C983F98B2
+:100760008AB18F748AB96E98479A8BB1806B8BB9B6
+:10077000769A0E944F030C942B0380E28093000131
+:100780008091340181110EC00E940C0481E080939D
+:1007900034012FEF83ED90E3215080409040E1F74A
+:1007A00000C0000080E40E941204809300018111C7
+:1007B0002EC00E943C0480930001811128C00E9439
+:1007C0003C0480930001811122C08FE30E943C040D
+:1007D0008093000181111BC00E94340480E40E94B8
+:1007E000120480930001811112C08CE00E943C042D
+:1007F0008093000181110BC00E943C048093000192
+:10080000811105C08FE30E943C04809300010E9487
+:1008100034048091000108951092B9008AE0809319
+:10082000B800089594EA9093BC009091BC0097FFA3
+:10083000FCCF9091B900987F983021F0903111F061
+:1008400081E008958093BB0084E88093BC00809190
+:10085000BC0087FFFCCF8091B900887F883111F000
+:10086000803471F780E0089584E98093BC00809122
+:10087000BC0084FDFCCF08958093BB0084E8809386
+:10088000BC008091BC0087FFFCCF9091B900987F9D
+:1008900081E0983209F480E0089584E88093BC00F8
+:1008A0008091BC0087FFFCCF8091BB0008958091B0
+:1008B0000001811115C080E40E94120480930001A0
+:1008C00081110CC082E10E943C04809300018111DF
+:1008D00005C08FEF0E943C04809300010E94340405
+:1008E00084B1807F84B985B1807F85B98AB1837FE7
+:1008F0008AB98BB1837F8BB93E98469808950E9440
+:10090000BD03809300010E94570480B38C7080BBAC
+:1009100081B3836F81BBE4E4F1E0A6E3B1E011921F
+:100920001D9281E0E235F807D1F70C94A7039F925E
+:10093000AF92BF92CF92DF92EF92FF920F931F93ED
+:10094000CF93DF9380910001882379F08091350166
+:100950008F5F80933501811108C00E94BD03809391
+:100960000001811102C00E944F0386E3E82E81E05E
+:10097000F82E8701C0E0D0E0BB24B39492E0A92E0A
+:10098000CC24C394D12CC730D10500F5809100014F
+:10099000811164C080E40E941204809300018111DF
+:1009A00012C082E10E943C048093000181110BC0BF
+:1009B000C6010C2E01C0880F0A94EAF780950E94A8
+:1009C0003C04809300010E94340448C0CA30A1F066
+:1009D00028F4C83059F0C93061F005C0CC3089F036
+:1009E00070F0CD3089F0209A289810C0219A29986B
+:1009F0000DC0229A2A980AC0239A2B9807C0529AAF
+:100A000001C0539A5B9802C03E9A4698E0EAEA9584
+:100A1000F1F78FB181708B25799902C032E001C066
+:100A200030E0832B7C9902C034E001C030E0832B9E
+:100A30007D9902C028E001C020E0822B7E9902C08F
+:100A400090E101C090E0892B9FB19095991F992763
+:100A5000991F9295990F907E892B0FC0809100016C
+:100A600081114AC080E40E9412048093000188230F
+:100A700081F1912C0E943404892DD8019C91981702
+:100A800019F08C93A09201010E94570421960F5FE8
+:100A90001F4FCE30D10509F076CF80910101882318
+:100AA00069F1815080930101882339F0EFE9FFE07B
+:100AB0003197F1F700C0000021C0E4E4F1E0D70174
+:100AC0008D917D018193B4E4EB16B1E0FB06B9F79B
+:100AD00015C083E10E943C04809300018111C9CFBD
+:100AE00081E40E941204809300018111C2CF0E9410
+:100AF0004D04982E9094BECF80E0BFCF0E944D034E
+:100B000081E0DF91CF911F910F91FF90EF90DF90E7
+:100B1000CF90BF90AF909F900895E82FF0E0EC5BEE
+:100B2000FE4F8081089508958B3B910580F4883AAB
+:100B3000910548F5853A9105D8F48430910508F07F
+:100B4000B2C0019709F06EC081E090E00895803E48
+:100B5000910508F467C0883E910508F4A4C09C0183
+:100B6000205F31092031310508F05CC0906508959F
+:100B7000853A910509F459C0863A910509F058C0A3
+:100B800082E890E40895883A910509F454C0893ABE
+:100B9000910509F453C08A3A910509F452C08B3A81
+:100BA000910509F451C08C3A910509F450C08D3A71
+:100BB000910509F44FC0803B910509F44EC08E3A6F
+:100BC000910509F44DC08F3A910509F44CC0813B61
+:100BD000910509F44BC0823B910509F44AC0833B5F
+:100BE000910509F449C0843B910509F448C0853B4F
+:100BF000910509F447C0863B910509F446C0873B3F
+:100C0000910509F445C0883B910509F444C0893B2E
+:100C1000910509F443C08A3B910509F442C080E084
+:100C200094E4089580E090E0089581E890E40895C8
+:100C300083E890E4089582EE94E4089589EE94E4C4
+:100C400008958AEE94E4089585EB94E4089586EB84
+:100C500094E4089587EB94E408958CEC94E408956B
+:100C60008DEC94E4089583E895E408958AE895E48A
+:100C7000089582E995E4089584E995E4089581E270
+:100C800096E4089583E296E4089584E296E4089554
+:100C900085E296E4089586E296E4089587E296E474
+:100CA00008958AE296E40895089524E5829FC0019C
+:100CB0001124FC0126E0729FE00DF11D1124E60FC6
+:100CC000F11DEE0FFF1FE550FF4F859194910895A0
+:100CD000880F991FFC01ED58F0408591949108957B
+:100CE000880F991FFC01ED50FF4F85919491089555
+:100CF00024E5829FC0011124FC0146E0749FE00DB1
+:100D0000F11D1124E60FF11DEE0FFF1FE550FF4FFF
+:100D1000859194919C013A9521154FE1340708F48F
+:100D200027C13F512115304120F49F700E94700669
+:100D300008959C0130532115304118F49927906C87
+:100D40000895811520E5920771F40E943A144FEF3F
+:100D500084E39CE0415080409040E1F700C00000F7
+:100D60000E945D1B05C1813020E5920731F480911E
+:100D7000CD0181608093CD01FBC09C0130552115D0
+:100D8000304108F05CC0292F33272F7033272130E2
+:100D90003105E9F4AC0164E0440F551F6A95E1F7B1
+:100DA00044275370BC016370772702C0220F331FA2
+:100DB0006A95E2F73C68242B352B73E0880F991F66
+:100DC0007A95E1F780769927822B932B089522302C
+:100DD000310529F4982F8827816F906A0895233070
+:100DE0003105A1F4AC0133E0440F551F3A95E1F70A
+:100DF000407E57708370992721E030E002C0220FB7
+:100E0000331F8A95E2F7C9019C6816C0243031056A
+:100E100031F5AC0123E0440F551F2A95E1F7407EE0
+:100E200057708370992721E030E002C0220F331FF2
+:100E30008A95E2F7C9019A68842B952B08959C0145
+:100E400030572115304118F49F70906208959C012D
+:100E500030582115304118F49F70906A0895803EF3
+:100E60009105E0F4803C910558F58133910509F432
+:100E70006FC048F48932910509F463C08A32910544
+:100E800009F46DC072C089339105E9F0823891058B
+:100E9000D1F08533910509F44DC067C0833E9105BB
+:100EA00081F138F4803E9105B9F0823E9105D9F088
+:100EB0005CC0863E910561F1873E9105A1F155C068
+:100EC0000E94680608952091DF0120FD02C021FFE5
+:100ED0004CC080EE90E049C08091DF0180FFF9CFE7
+:100EE00089E390E042C08091DF0182FF0EC08091D3
+:100EF000DF0184FF03C080E090E037C083EE90E024
+:100F000034C08091DF0182FFF2CF82EE90E02DC0ED
+:100F10008091DF0183FF0BC08091DF0184FDEBCF67
+:100F200087EE90E022C08091DF0183FFF5CF86EE4F
+:100F300090E01BC08091DF0185FF07C089E290E04F
+:100F400014C08091DF0185FFF9CF85E390E00DC0EB
+:100F50008091DF0186FF07C08AE290E006C08091A1
+:100F6000DF0186FFF9CF81E390E00E9494050895A8
+:100F7000089508950C94B907809162010895CF9364
+:100F8000DF9300D01F92CDB7DEB79C018091E501C1
+:100F9000843019F593E099833B832A839093E90089
+:100FA0008FEF9091E800815095FD06C095ED9A95E0
+:100FB000F1F700008111F5CF8091E80085FF0DC0A9
+:100FC00040E050E063E070E0CE0101960E942C0A00
+:100FD0008091E8008E778093E8000F900F900F903B
+:100FE000DF91CF910895CF93DF9300D01F92CDB7BB
+:100FF000DEB72091E501243021F522E029839B838F
+:101000008A8383E08093E9008FEF9091E80081501C
+:1010100095FD06C095ED9A95F1F700008111F5CF89
+:101020008091E80085FF0DC040E050E063E070E093
+:10103000CE0101960E942C0A8091E8008E77809361
+:10104000E8000F900F900F90DF91CF9108959C01D1
+:101050008091E5018430F9F482E08093E9009FEF0C
+:101060008091E800915085FD06C085ED8A95F1F7E5
+:1010700000009111F5CF8091E80085FF0CC040E0A1
+:1010800050E065E070E0C9010E942C0A8091E80000
+:101090008E778093E8000895CF93DF93EC018091E1
+:1010A000E501843009F046C090910C019923D9F0F4
+:1010B00090910D019923B9F08093E9008FEF909101
+:1010C000E800815095FD06C095E19A95F1F7000082
+:1010D0008111F5CF8091E80085FF2CC040E050E001
+:1010E00060E170E017C081E08093E9008FEF90919C
+:1010F000E800815095FD06C095ED9A95F1F7000046
+:101100008111F5CF8091E80085FF14C040E050E0E8
+:1011100068E070E0CE010E942C0A8091E8008E7792
+:101120008093E80080E1FE01A2E5B1E001900D921C
+:101130008A95E1F7DF91CF9108958091E4018111C3
+:1011400009C00E94BD0B0E941A0C8091E2008460CD
+:101150008093E20008951092E401089508950C949C
+:1011600099210E94F31A0E949F210E94C50E0C949F
+:10117000BA0742E061EC81E00E94360B42E061EC8C
+:1011800082E00E94360B42E061EC83E00E94360B65
+:1011900042E161EC84E00C94360B8091E7018330EE
+:1011A00009F455C030F4813071F0823009F48EC0FA
+:1011B00008958A3009F47AC08B3009F460C0893010
+:1011C00009F09CC020C08091E601813A09F096C0E8
+:1011D0008091E800877F8093E8008091EA019091F8
+:1011E000EB01892B21F460E182E591E003C060E02E
+:1011F00080E090E070E00E94770A8091E8008B77B1
+:101200008093E80008958091E601813209F076C06C
+:101210008091EA019091EB01009719F0039709F092
+:101220006DC08091E800877F8093E8008091E8009E
+:1012300082FD05C08091E5018111F8CF5FC08091EA
+:10124000F100809362018091E8008B7753C0809118
+:10125000E601813A09F052C08091EA019091EB01D8
+:10126000892B09F04BC08091E800877F8093E800CC
+:101270008091E80080FFFCCF80910C0136C0809106
+:10128000E6018132D9F58091EA019091EB01892B39
+:10129000A9F58091E800877F8093E8000E946B0B9E
+:1012A0008091E80180930C010C943A148091E6013E
+:1012B000813221F58091E800877F8093E8000E94C9
+:1012C0006B0B8091E9018093630108958091E601A1
+:1012D000813AA1F48091E800877F8093E8008091B3
+:1012E000E80080FFFCCF809163018093F100809142
+:1012F000E8008E778093E8000C946B0B089584B718
+:10130000877F84BF0FB6F894A895809160008861AC
+:1013100080936000109260000FBE90E080E80FB6EE
+:10132000F89480936100909361000FBE0E94140FA7
+:101330000E94BD0B0E941A0C8091E2008460809391
+:10134000E20078940E94A50E0E94160F82E091E0C0
+:101350000E94C00E0E9487218091E501853069F4CA
+:101360000E94B21A8091E3018823B1F30E94DF1A30
+:10137000882391F30E94160AEFCF0E941C0FECCF36
+:10138000292F332723303105C9F060F4213031058E
+:1013900081F02230310509F041C08DE690E02FEC5C
+:1013A00033E040C021323105E1F02232310531F124
+:1013B00035C082E190E02CE334E034C099278130DD
+:1013C000910549F028F0029749F5EBE9F3E005C0F3
+:1013D000EBECF3E002C0E3EBF3E0849190E09F01DB
+:1013E00021C06430D8F4E62FF0E0EE0FFF1FEE5D71
+:1013F000FE4F2081318189E090E014C0643070F4A8
+:1014000070E0FB01EE0FFF1FE65EFE4F2081318191
+:10141000FB01EA5EFE4F808190E004C080E090E036
+:1014200020E030E0FA0131832083089580E189BD16
+:1014300082E189BD09B400FEFDCF8091D8008F7D87
+:101440008093D8008091E00082608093E0008091DA
+:10145000E00081FDFCCF0895CF92DF92EF92FF92E2
+:101460000F931F93CF93DF93EC018B016A010E94CE
+:101470008A0B811133C0C114D10439F0F601808187
+:101480009181081B190BC80FD91FE12CF12C0115F4
+:10149000110519F18091E80085FD16C08091E800E2
+:1014A0008E778093E800C114D10449F0F601808161
+:1014B0009181E80EF91EF182E08285E00FC00E9462
+:1014C0008A0B882321F30AC089918093F10001508F
+:1014D0001109FFEFEF1AFF0ADACF80E0DF91CF9119
+:1014E0001F910F91FF90EF90DF90CF900895209182
+:1014F000EC013091ED012617370748F061157105B1
+:1015000039F42091E8002E772093E80001C0B9015A
+:10151000FC0120E06115710579F18091E5018823D6
+:10152000F1F18530F1F18091E80083FD3CC08091BC
+:10153000E80082FD2EC08091E80080FFEBCF209173
+:10154000F3008091F20090E0922B6115710551F04B
+:101550008830910538F421912093F1006150710990
+:101560000196F3CF21E0089709F020E08091E80090
+:101570008E778093E800CECF2111CFCF0AC0809123
+:10158000E501882361F0853061F08091E80083FDFA
+:101590000AC08091E80082FFF2CF80E0089582E0E7
+:1015A000089583E0089581E008952091EC01309141
+:1015B000ED012617370748F06115710539F42091C0
+:1015C000E8002E772093E80001C0B901FC0120E07B
+:1015D0006115710591F18091E501882309F440C0FE
+:1015E000853009F43FC08091E80083FD3DC08091C3
+:1015F000E80082FD2FC08091E80080FFE9CF2091B4
+:10160000F3008091F20090E0922B6115710559F082
+:101610008830910540F424912093F1003196615077
+:1016200071090196F2CF21E0089709F020E080913E
+:10163000E8008E778093E800CBCF2111CCCF0AC091
+:101640008091E501882361F0853061F08091E800A8
+:1016500083FD0AC08091E80082FFF2CF80E0089508
+:1016600082E0089583E0089581E00895982F9730EF
+:1016700068F59093E900981739F07091EC0020918B
+:10168000ED005091F00003C0242F762F50E021FD93
+:1016900002C09F5FECCF3091EB003E7F3093EB00B8
+:1016A0003091ED003D7F3093ED003091EB003160E3
+:1016B0003093EB007093EC002093ED005093F0001A
+:1016C0002091EE0027FDE5CF80E008958F70809394
+:1016D000E90081E008958091E60187FF11C08091C3
+:1016E000E80082FD05C08091E5018111F8CF11C0AD
+:1016F0008091E8008B770BC08091E501882349F049
+:101700008091E80080FFF8CF8091E8008E77809389
+:10171000E80008952091E4003091E50095E64091BD
+:10172000EC00842F817040FF23C08091E80080FD91
+:101730001DC08091E501882399F0853099F0809152
+:10174000EB0085FD11C04091E4005091E5002417A5
+:10175000350729F3915011F09A01E1CF84E0089503
+:1017600082E0089583E0089581E0089580E008957F
+:101770004091E80042FFDDCF08950E942B0C0E94AB
+:10178000330CE0EEF0E0808181608083E8EDF0E0F2
+:1017900080818F77808319BCA7EDB0E08C918E7F1C
+:1017A0008C9380818F7E80831092E40108950F9343
+:1017B0001F93CF93DF930E942B0C0E94330CC8ED34
+:1017C000D0E088818F77888388818068888388814A
+:1017D0008F7D888319BC1092E5011092E10110926F
+:1017E000E3011092E20100EE10E0F80180818B7FAE
+:1017F000808388818160888342E060E080E00E948D
+:10180000360BE1EEF0E080818E7F8083E2EEF0E047
+:10181000808181608083808188608083F8018081FD
+:101820008E7F8083888180618883DF91CF911F9133
+:101830000F910895E8EDF0E080818F7E8083E7EDE1
+:10184000F0E080818160808384E082BF81E08093CA
+:10185000E4010C94D70BE8EDF0E080818E7F80836B
+:101860001092E20008951092DA001092E1000895BB
+:101870001F920F920FB60F9211242F933F934F9305
+:101880005F936F937F938F939F93AF93BF93EF93E8
+:10189000FF938091E10082FF0BC08091E20082FF04
+:1018A00007C08091E1008B7F8093E1000E94A40E2D
+:1018B0008091DA0080FF1FC08091D80080FF1BC09C
+:1018C0008091DA008E7F8093DA008091D90080FFCA
+:1018D0000DC080E189BD82E189BD09B400FEFDCF64
+:1018E00081E08093E5010E949D0805C019BC10921B
+:1018F000E5010E94AB088091E10080FF19C0809152
+:10190000E20080FF15C08091E2008E7F8093E200AC
+:101910008091E20080618093E2008091D800806233
+:101920008093D80019BC85E08093E5010E94AF0840
+:101930008091E10084FF30C08091E20084FF2CC0E0
+:1019400080E189BD82E189BD09B400FEFDCF8091AF
+:10195000D8008F7D8093D8008091E1008F7E8093A6
+:10196000E1008091E2008F7E8093E2008091E200AE
+:1019700081608093E2008091E101882311F084E08E
+:1019800007C08091E30087FD02C081E001C083E0D1
+:101990008093E5010E94B1088091E10083FF29C096
+:1019A0008091E20083FF25C08091E100877F8093D2
+:1019B000E10082E08093E5011092E1018091E10075
+:1019C0008E7F8093E1008091E2008E7F8093E20021
+:1019D0008091E20080618093E20042E060E080E07C
+:1019E0000E94360B8091F00088608093F0000E9486
+:1019F000AE08FF91EF91BF91AF919F918F917F9131
+:101A00006F915F914F913F912F910F900FBE0F906B
+:101A10001F9018951F920F920FB60F9211242F93BB
+:101A20003F934F935F936F937F938F939F93AF9366
+:101A3000BF93CF93DF93EF93FF93C091E900CF70F3
+:101A40008091EC00D82FD17080FDD0E81092E90091
+:101A50008091F000877F8093F00078940E944E0D73
+:101A60001092E9008091F00088608093F000CD2B07
+:101A7000CF70C093E900FF91EF91DF91CF91BF91BB
+:101A8000AF919F918F917F916F915F914F913F9116
+:101A90002F910F900FBE0F901F9018951F93CF930B
+:101AA000DF93CDB7DEB7AA970FB6F894DEBF0FBEAF
+:101AB000CDBFE6EEF1E08091F100819321E0EE3EB2
+:101AC000F207C9F70E94CD088091E80083FF24C186
+:101AD0008091E6019091E701492F50E04A3051058D
+:101AE00008F01AC1FA01EA5AFF4F0C9430238038EB
+:101AF00081F0823809F010C18091EA018F708093E3
+:101B0000E9008091EB0085FB882780F91092E900BD
+:101B100006C08091E2019091E30191118260909161
+:101B2000E800977F9093E8008093F1001092F10015
+:101B3000C8C0282F2D7F09F0EFC0882319F082300C
+:101B400061F0EAC08091E801813009F0E5C093308E
+:101B500009F080E08093E3012BC08091E8018111BE
+:101B600027C08091EA018F7009F4D6C08093E90004
+:101B70002091EB0020FF1CC0933021F48091EB00FA
+:101B8000806214C09091EB0090619093EB0021E093
+:101B900030E0A90102C0440F551F8A95E2F7409337
+:101BA000EA001092EA008091EB0088608093EB00DD
+:101BB0001092E9008091E800877F86C08111ACC057
+:101BC0001091E8011F778091E3008078812B80934A
+:101BD000E3008091E800877F8093E8000E946B0B10
+:101BE0008091E80080FFFCCF8091E30080688093C3
+:101BF000E300111102C082E001C083E08093E5019F
+:101C00008BC08058823008F087C08091E8019091A5
+:101C1000E9018C3D53E0950779F583E08A838AE2F8
+:101C200089834FB7F894DE01139620E03EE051E23D
+:101C3000E32FF0E050935700E49120FF03C0E295BA
+:101C4000EF703F5FEF708E2F90E0EA3010F0C79694
+:101C500001C0C0968D939D932F5F243149F74FBFEC
+:101C60008091E800877F8093E8006AE270E0CE010F
+:101C700001960E94770A14C0AE014F5F5F4F6091DA
+:101C8000EA010E94C009BC01892B09F445C090916A
+:101C9000E800977F9093E80089819A810E94D50A95
+:101CA0008091E8008B778093E80036C08038A1F5FA
+:101CB0008091E800877F8093E8008091E101809324
+:101CC000F1008091E8008E778093E8000E946B0B12
+:101CD00023C0811121C08091E8019091E9019927E9
+:101CE0000297D4F48091E800877F8093E800809188
+:101CF000E8018093E1010E946B0B8091E101811169
+:101D000006C08091E30087FD02C081E001C084E04D
+:101D10008093E5010E94B9088091E80083FF0AC022
+:101D20008091E800877F8093E8008091EB008062DB
+:101D30008093EB00AA960FB6F894DEBF0FBECDBF1E
+:101D4000DF91CF911F9108950895CF938091E50180
+:101D50008823A1F0C091E900CF709091EC00892F09
+:101D6000817090FD80E8C82B1092E9008091E80016
+:101D700083FD0E944E0DCF70C093E900CF9108956E
+:101D800090936901809368010895E0916801F09152
+:101D90006901309721F00190F081E02D099480E0F5
+:101DA0000895E0916801F0916901309721F0028077
+:101DB000F381E02D09940895E0916801F0916901A3
+:101DC000309721F00480F581E02D09940895209149
+:101DD0006601309167012817390771F09093670108
+:101DE00080936601E0916801F0916901309721F0DC
+:101DF0000680F781E02D09940895209164013091C7
+:101E000065012817390771F090936501809364018B
+:101E1000E0916801F0916901309721F00084F1852B
+:101E2000E02D0994089508950C94130F0E94F91A57
+:101E30000E947F040C94BF1BCF92DF92EF92FF921F
+:101E40000F931F93CF93DF93CDB7DEB72B970FB6CA
+:101E5000F894DEBF0FBECDBF0E9497048BE6C82E5C
+:101E600081E0D82E00E010E0E02E802F0E948D054A
+:101E7000F60141916F01F82EF426B1F40F5F1F4F68
+:101E80000E30110589F78FEF89838A831B820E94A8
+:101E9000021B8160782F9D838C8349815A816B81DD
+:101EA0008D810E94BF0F40C09091CD0191FF04C071
+:101EB0008B870E9493058B8520E030E04F2D50E00A
+:101EC000922FBA01022E02C0759567950A94E2F727
+:101ED00060FF24C02E83EF8221E030E0690102C060
+:101EE000CC0CDD1C9A95E2F790E08C219D21892B8A
+:101EF00009F420E028870E94021B8160782F9A87CE
+:101F000089874E815F8168858A850E94BF0FF801AD
+:101F1000E559FE4F8081C826C08206C02F5F3F4F23
+:101F20002630310569F6AACF0E94A61E0E94C50E72
+:101F300090916A018917A1F00E94C50E80936A01F1
+:101F40002B960FB6F894DEBF0FBECDBFDF91CF91B9
+:101F50001F910F91FF90EF90DF90CF900C94BA07F4
+:101F60002B960FB6F894DEBF0FBECDBFDF91CF9199
+:101F70001F910F91FF90EF90DF90CF900895CF9336
+:101F8000DF93CDB7DEB72B970FB6F894DEBF0FBE49
+:101F9000CDBF4F83588769877A878B87DE0111967B
+:101FA00086E0FD0111928A95E9F785E0FE013796FA
+:101FB00001900D928A95E1F749815A816B817C816C
+:101FC0008D819E810E94CE162B960FB6F894DEBFAF
+:101FD0000FBECDBFDF91CF9108950895CF93C82F45
+:101FE000882309F4C1C0823859F40E94C50E81FDCE
+:101FF000BBC089E30E946B190E94331A89E30CC0AD
+:10200000833879F40E94C50E80FDAEC083E50E943E
+:102010006B190E94331A83E50E94AA19CF910C9480
+:10202000331A843859F40E94C50E82FD9DC087E49E
+:102030000E946B190E94331A87E4EECF8CEF8C0F4D
+:10204000813A48F48C2F0E94EC2081118DC08C2F96
+:102050000E946B19E3CF80E28C0F883048F4C77080
+:1020600081E001C0880FCA95EAF70E94EC19D6CF2B
+:102070008BE58C0F833078F4C53A29F0C63A31F0FD
+:1020800083E890E005C081E890E002C082E890E03B
+:10209000CF910C94E70E88E58C0F833108F064C073
+:1020A000C83A39F1C93A41F1CA3A49F1CB3A51F14A
+:1020B000CC3A59F1CD3A61F1C03B69F1CE3A71F1B8
+:1020C000CF3A79F1C13B81F1C23B89F1C33B91F138
+:1020D000C43B99F1C53BA1F1C63BA9F1C73BB1F1A6
+:1020E000C83BB9F1C93BC1F1CA3BC9F180E090E0FE
+:1020F00038C082EE90E035C089EE90E032C08AEEC2
+:1021000090E02FC085EB90E02CC086EB90E029C0DA
+:1021100087EB90E026C08CEC90E023C08DEC90E043
+:1021200020C083E891E01DC08AE891E01AC082E9EE
+:1021300091E017C084E991E014C081E292E011C0FF
+:1021400083E292E00EC084E292E00BC085E292E06E
+:1021500008C086E292E005C087E292E002C08AE20F
+:1021600092E0CF910C94FD0ECF910895882309F44D
+:102170004BC0823859F40E94C50E81FF45C089E3E7
+:102180000E946B190E94331A89E30CC0833871F4E2
+:102190000E94C50E80FF38C083E50E946B190E9423
+:1021A000331A83E50E94AA190C94331A843859F41F
+:1021B0000E94C50E82FF28C087E40E946B190E940E
+:1021C000331A87E4EFCF9CEF980F913A58F390E2DF
+:1021D000980F983050F4877091E001C0990F8A955C
+:1021E000EAF7892F0E94F219DFCF9BE5980F933011
+:1021F00020F480E090E00C94E70E885A833120F4BC
+:1022000080E090E00C94FD0E0895882321F00E9458
+:10221000EC190C94331A0895882321F00E94F219C6
+:102220000C94331A0895BF92CF92DF92EF92FF92EF
+:102230000F931F93CF93DF9300D000D000D0CDB782
+:10224000DEB77C0185E0F701DE01119601900D9269
+:102250008A95E1F7F70183819481892B09F4E6C21D
+:10226000D08011811F3F21F4FFEFDF1609F4DEC299
+:10227000F7010281258122952F70C7012E830E94CC
+:10228000ED0FD9821A8389819A810E942A19182F09
+:10229000B92E0E9429190E94F0172E81002319F0EF
+:1022A0000E94091A2E81EB2DE295EF704E2F50E01F
+:1022B000FA01E05AFF4F0C9430238B2D807F9B2D29
+:1022C0009F70F92E882319F0F29480EFF8220023F2
+:1022D00049F0FF2009F457C28F2D0E94FC190E947B
+:1022E000331A51C2812F0E94B610FF2009F49EC2FA
+:1022F0008F2D0E94021A26960FB6F894DEBF0FBEED
+:10230000CDBFDF91CF911F910F91FF90EF90DF90A4
+:10231000CF90BF900C94331A3B2D307F8B2D8F7054
+:10232000303211F08295807F112319F0113021F1A4
+:102330002CC00023B9F0222309F490C1213009F008
+:102340008DC126960FB6F894DEBF0FBECDBFDF91CC
+:10235000CF911F910F91FF90EF90DF90CF90BF90A2
+:102360000C941C1A222319F0213009F45FC28E83C9
+:102370000E941F1A8E8186C1002321F0223008F0AE
+:1023800055C26CC1211152C27DC1002321F022230C
+:1023900009F464C1F8C1222309F474C109C28B2D68
+:1023A00086958695837019F08130D1F03FC2002365
+:1023B00021F0812F9B2D937002C080E090E0269643
+:1023C0000FB6F894DEBF0FBECDBFDF91CF911F9146
+:1023D0000F91FF90EF90DF90CF90BF900C94E70E9D
+:1023E000002321F0812F9B2D937002C080E090E0AC
+:1023F00026960FB6F894DEBF0FBECDBFDF91CF910A
+:102400001F910F91FF90EF90DF90CF90BF900C94B1
+:10241000FD0E812F002319F00E94AE1D02C00E9404
+:10242000161E26960FB6F894DEBF0FBECDBFDF9105
+:10243000CF911F910F91FF90EF90DF90CF90BF90C1
+:102440000C949B1E8B2D837009F075C00111EEC199
+:10245000812F829586958770880F880F912F9F70A6
+:10246000C92ED12CE12CF12C082E04C0CC0CDD1C83
+:10247000EE1CFF1C0A94D2F714FF12C00FE010E00C
+:1024800020E030E004C0000F111F221F331F8A9587
+:10249000D2F7C901B801609570958095909503C0F9
+:1024A00060E070E0CB014B2D46954695437042307D
+:1024B000C1F060F56C297D298E299F29413051F1A9
+:1024C00026960FB6F894DEBF0FBECDBFDF91CF9139
+:1024D0001F910F91FF90EF90DF90CF90BF900C94E1
+:1024E00017186C297D298E299F2926960FB6F894F6
+:1024F000DEBF0FBECDBFDF91CF911F910F91FF9037
+:10250000EF90DF90CF90BF900C9433180E94171873
+:10251000C701B60126960FB6F894DEBF0FBECDBF39
+:10252000DF91CF911F910F91FF90EF90DF90CF90AF
+:10253000BF900C94FB17002319F08B2D817001C004
+:102540008695882309F472C1812F829586958770BC
+:10255000880F880F912F9F70C92ED12CE12CF12C60
+:10256000082E04C0CC0CDD1CEE1CFF1C0A94D2F714
+:1025700014FF12C00FE010E020E030E004C0000FB4
+:10258000111F221F331F8A95D2F7C901B801609528
+:1025900070958095909503C060E070E0CB014B2D65
+:1025A0004695469543704230C1F060F56C297D290F
+:1025B0008E299F29413051F126960FB6F894DEBF3F
+:1025C0000FBECDBFDF91CF911F910F91FF90EF9084
+:1025D000DF90CF90BF900C94F1186C297D298E2943
+:1025E0009F2926960FB6F894DEBF0FBECDBFDF91B0
+:1025F000CF911F910F91FF90EF90DF90CF90BF9000
+:102600000C940D190E94F118C701B60126960FB659
+:10261000F894DEBF0FBECDBFDF91CF911F910F9118
+:10262000FF90EF90DF90CF90BF900C94D518103FA3
+:10263000D1F118F4103E50F4A1C0123F09F463C068
+:1026400008F44CC0133F09F473C098C01F708B2D61
+:102650008F710023A1F00E946E18812F26960FB66D
+:10266000F894DEBF0FBECDBFDF91CF911F910F91C8
+:10267000FF90EF90DF90CF90BF900C9405110E94D7
+:102680008F18812F26960FB6F894DEBF0FBECDBFF0
+:10269000DF91CF911F910F91FF90EF90DF90CF903E
+:1026A000BF900C940C110023A9F02111BFC08B2DF9
+:1026B0008F7126960FB6F894DEBF0FBECDBFDF91A7
+:1026C000CF911F910F91FF90EF90DF90CF90BF902F
+:1026D0000C94B418223008F0A9C0E9CF0023A9F067
+:1026E0008B2D8F7126960FB6F894DEBF0FBECDBF2F
+:1026F000DF91CF911F910F91FF90EF90DF90CF90DE
+:10270000BF900C946E18002359F38B2D8F71269671
+:102710000FB6F894DEBF0FBECDBFDF91CF911F91F2
+:102720000F91FF90EF90DF90CF90BF900C948F1897
+:10273000002399F08B2D8F7126960FB6F894DEBF8B
+:102740000FBECDBFDF91CF911F910F91FF90EF9002
+:10275000DF90CF90BF900C94591826960FB6F8943E
+:10276000DEBF0FBECDBFDF91CF911F910F91FF90C4
+:10277000EF90DF90CF90BF900C944F180023A9F0FA
+:10278000222309F4ADCF812F26960FB6F894DEBF31
+:102790000FBECDBFDF91CF911F910F91FF90EF90B2
+:1027A000DF90CF90BF900C94EE0F222309F4ADCFB1
+:1027B000812F26960FB6F894DEBF0FBECDBFDF91F6
+:1027C000CF911F910F91FF90EF90DF90CF90BF902E
+:1027D0000C94B6104B2D4F70612FC7010E940E0351
+:1027E00026960FB6F894DEBF0FBECDBFDF91CF9116
+:1027F0001F910F91FF90EF90DF90CF90BF900C94BE
+:1028000073174B2D4F70612FC70126960FB6F894A2
+:10281000DEBF0FBECDBFDF91CF911F910F91FF9013
+:10282000EF90DF90CF90BF900C94540626960FB691
+:10283000F894DEBF0FBECDBFDF91CF911F910F91F6
+:10284000FF90EF90DF90CF90BF9008950E94091AFB
+:102850000E94191A0E94DE190E94331A0E944B1F0F
+:102860000E949B1E80E090E00E94E70E80E090E0D6
+:102870000C94FD0E0E94F9190C9426140E942A193A
+:10288000292F22952F702C3030F42A3048F4225012
+:10289000223078F405C02C3041F02F3031F009C0DF
+:1028A000803E48F0803F29F406C093FB882780F9DA
+:1028B000089580E0089581E00895CF93DF9300D0DC
+:1028C00000D01F92CDB7DEB70F900F900F900F90F2
+:1028D0000F90DF91CF910895CF93DF9300D000D078
+:1028E00000D0CDB7DEB726960FB6F894DEBF0FBE88
+:1028F000CDBFDF91CF9108951F93CF93DF93C09108
+:10290000790116E080917A01C81799F0D0E01C9FF8
+:10291000F0011D9FF00D1124E558FE4F40815181BB
+:1029200062817381848195810E946C142196C770A5
+:10293000E9CFDF91CF911F9108954091AB01509164
+:10294000AC016091AD017091AE018091AF019091A9
+:10295000B0010C946C148091B00182958F7009F0D5
+:1029600054C08091AD01882309F44FC08091790152
+:10297000A0917A014091AE015091AF016091AB01FD
+:102980007091AC01B6E08A1709F43FC090E04115A0
+:102990005105C1F17F3F11F46F3FA1F1B89FF001E4
+:1029A000B99FF00D1124E558FE4F218127132AC04D
+:1029B0002081261327C02281211124C02381348144
+:1029C0002417350710F421503109241B350B283CFE
+:1029D0003105C0F42091B0012F7020612093B00127
+:1029E00026E0289FF001299FF00D1124E058FE4FAA
+:1029F00080818F70806180838BEA91E00E94131147
+:102A00000C947C1401968770BECF0895CF92DF920C
+:102A1000EF92FF920F931F93CF93DF93CDB7DEB763
+:102A200062970FB6F894DEBF0FBECDBF8C0185E074
+:102A3000F801DE011D9601900D928A95E1F7D8010B
+:102A40004C9111965C91119712966C918091AE0108
+:102A50009091AF01009709F475C13091AB0170916D
+:102A6000AC017F3F19F43F3F09F46CC1F801C3800A
+:102A7000D480E090AD01EE2009F4BEC02091B001F9
+:102A8000C816D90628F0D601A81BB90BCD0104C081
+:102A9000809590958C0D9D1DFF24F394883C9105A5
+:102AA00078F0F12C207F09F0C4C07C2DD98AC88A27
+:102AB00089890E945D148BEA91E00E941311AFC0D6
+:102AC000822F807F09F045C0571313C0431311C0F4
+:102AD00061110FC02F7020612093B0010E949D14DE
+:102AE0008BEA91E00E9413118091B001F801858377
+:102AF0002EC0CD2819F15F3F11F44F3FF9F0F62EAB
+:102B000061111CC08091790120917A0136E0821711
+:102B100009F45BC090E0389FF001399FF00D11245B
+:102B2000E558FE4F7181571306C07081471303C0EB
+:102B30007281711103C001968770E9CFF62E66236A
+:102B400009F41CC18091B00181608093B001F12C27
+:102B500015C1571309C0431307C0611105C0809107
+:102B6000B001F8018583C8C04D875E878D859E853D
+:102B70006A8B0E943E146A898823D1F16623C1F1D1
+:102B80002091B001822F82958F7090E0029774F0AF
+:102B90008091AB019091AC0198878F831986DB8679
+:102BA000CA862C87CE0107960E94131186E0F80191
+:102BB000ABEAB1E001900D928A95E1F70E94AB1467
+:102BC0000E949D14FF24F394D9C04D875E878D85A4
+:102BD0009E850E942A19292F22952F70223008F0F5
+:102BE000C1C09F7009F0BBC0805E883008F4C6C0C9
+:102BF000C8010E941311E6CFC816D90608F453C0C5
+:102C0000F601E81BF90BCF01883C910508F450C090
+:102C1000F12C7C2DD98AC88A89890E945D14EBEA3F
+:102C2000F1E086E0DF011D928A95E9F70E949D148C
+:102C3000A5C0571314C0431312C0611110C0809176
+:102C4000B001F8018583C8010E94131186E0EBEA08
+:102C5000F1E0DF011D928A95E9F7FE2C8FC04D87C8
+:102C60005E878D859E856A8B0E943E146A898823C3
+:102C700009F4BECF662309F4BBCF2091B001822FA7
+:102C800082958F7090E002970CF490CF8091AB0109
+:102C90009091AC019A8389831B82DD82CC822E8342
+:102CA000CE01019681CF809590958C0D9D1DACCF66
+:102CB000F62E662309F49CCF571333C0431331C05B
+:102CC0002091B00120FD24C0822F82958F70482F63
+:102CD00050E041155105E1F0D80115962C93159758
+:102CE0004F30510549F08F5F982F9295907F822F3A
+:102CF0008F70892B15968C93C8010E94131186E062
+:102D0000F801ABEAB1E001900D928A95E1F78ECF20
+:102D100086E0F801ABEAB1E001900D928A95E1F707
+:102D20002DC04D875E878D859E850E943E14811142
+:102D30003DCF8091B00181608093B001C8010E94B5
+:102D400013111CC0662309F453CF4D875E878D8510
+:102D50009E850E943E14882309F44ACF27CF811113
+:102D600043CF0CC0243008F043CF9F7009F43CCF10
+:102D7000D80115969C91907F09F036CF8F2D6296E1
+:102D80000FB6F894DEBF0FBECDBFDF91CF911F917C
+:102D90000F91FF90EF90DF90CF9008951F93CF9306
+:102DA000DF93CDB7DEB72C970FB6F894DEBF0FBE1A
+:102DB000CDBF4F83588769877A878B879C87CE01E1
+:102DC00007960E940615882371F08A859B85892BBA
+:102DD00009F441C088858F3F09F065C08F818F3F1E
+:102DE00009F061C038C086E0FE013796DE01119619
+:102DF00001900D928A95E1F76A857B8561157105D1
+:102E000051F1FF81E885EF3F11F4FF3F21F120915F
+:102E10007A0130E0C90101968770992740917901C4
+:102E200050E08417950709F447C0F983EA837D834E
+:102E30006C8396E0929FD001939FB00D1124A5580A
+:102E4000BE4FFE01319601900D929A95E1F7809365
+:102E50007A010E947C1416E08091790190917A01A8
+:102E60008917B9F1189FC001112485589E4F0E94FF
+:102E70000615882371F1E09179011E9FF00111245C
+:102E8000E558FE4F40815181628173818481958133
+:102E90000E946C148091790190E0019687709927C7
+:102EA00080937901D9CF4F81588569857A858B8543
+:102EB0009C850E946C14CFCF0E943A1410927A0124
+:102EC00010927901EBEAF1E086E0DF011D928A952C
+:102ED000E9F72C960FB6F894DEBF0FBECDBFDF9199
+:102EE000CF911F910895EF92FF920F931F93CF936D
+:102EF000DF938C01892B09F46CC0F12CEE24E39450
+:102F0000E8012196F8018491843740F4843008F078
+:102F100051C0813081F0823019F15BC0853709F4EE
+:102F200044C0A8F19CE7980F903708F052C08F7703
+:102F30000E94B61041C00E5F1F4FFE01849190E2C7
+:102F4000980F983050F48770FE2D01C0FF0F8A95BE
+:102F5000EAF78F2F0E940C1A14C00E94EE0F2DC0AA
+:102F60000E5F1F4FFE01849190E2980F983060F43D
+:102F70008770FE2D01C0FF0F8A95EAF78F2F0E9400
+:102F8000121A0E94331A19C00E94B61016C00E5FA2
+:102F90001F4FFE01C491CC2381F08FE99FE0019780
+:102FA000F1F700C00000C150F6CF0E5F1F4FFE01C9
+:102FB000F49003C00E94EE0F8E018F2D882309F438
+:102FC0009FCFEFE9FFE03197F1F700C0000081509B
+:102FD000F5CFDF91CF911F910F91FF90EF90089562
+:102FE00008956093B5017093B6018093B7019093F3
+:102FF000B8010C9426140F931F930091B501109102
+:10300000B6012091B7013091B801DC01CB01802BD2
+:10301000912BA22BB32B8093B5019093B601A09373
+:10302000B701B093B8011F910F910C9426140F9320
+:103030001F930091B5011091B6012091B701309115
+:10304000B801DC01CB0180239123A223B323809319
+:10305000B5019093B601A093B701B093B8011F9149
+:103060000F910C9426140F931F930091B5011091AA
+:10307000B6012091B7013091B801DC01CB01802766
+:103080009127A227B3278093B5019093B601A0930F
+:10309000B701B093B8011F910F910C9426141092B0
+:1030A000B1011092B2011092B3011092B4010C94CC
+:1030B000261441E050E060E070E004C0440F551F6A
+:1030C000661F771F8A95D2F74093B1015093B201E2
+:1030D0006093B3017093B4010C94261441E050E066
+:1030E00060E070E004C0440F551F661F771F8A958B
+:1030F000D2F78091B1019091B201A091B301B0914A
+:10310000B401482B592B6A2B7B2B4093B101509370
+:10311000B2016093B3017093B4010C94261441E0A2
+:1031200050E060E070E004C0440F551F661F771F39
+:103130008A95D2F740955095609570958091B10130
+:103140009091B201A091B301B091B40148235923E9
+:103150006A237B234093B1015093B2016093B30182
+:103160007093B4010C94261441E050E060E070E0EC
+:1031700004C0440F551F661F771F8A95D2F78091B0
+:10318000B1019091B201A091B301B091B40148276F
+:1031900059276A277B274093B1015093B20160936E
+:1031A000B3017093B4010C9426140F931F930091F4
+:1031B000B1011091B2012091B3013091B401DC0151
+:1031C000CB01802B912BA22BB32B8093B101909339
+:1031D000B201A093B301B093B4011F910F910C946D
+:1031E00026140F931F930091B1011091B201209109
+:1031F000B3013091B401DC01CB0180239123A223E0
+:10320000B3238093B1019093B201A093B301B09323
+:10321000B4011F910F910C9426140F931F930091EA
+:10322000B1011091B2012091B3013091B401DC01E0
+:10323000CB0180279127A227B3278093B1019093D8
+:10324000B201A093B301B093B4011F910F910C94FC
+:1032500026140895CF92DF92EF92FF920F931F935F
+:10326000CF93DF938C01C090B101D090B201E09078
+:10327000B301F090B4018091B5019091B601A09195
+:10328000B701B091B801C82AD92AEA2AFB2ACFE1AE
+:10329000D0E0D701C6010C2E04C0B695A79597952E
+:1032A00087950A94D2F780FF07C0B8018C2F0E943F
+:1032B00078068130910531F4219758F7B80180E004
+:1032C0000E947806DF91CF911F910F91FF90EF90B0
+:1032D000DF90CF90089590910C019923F1F0909197
+:1032E0000D019923D1F0982F9695969596959F303C
+:1032F00080F5E0910E01F0910F01E90FF11D87704B
+:1033000021E030E0A90102C0440F551F8A95E2F781
+:10331000CA019181892B8183089520910E013091FA
+:103320000F01F90132969FEF40E05191851789F026
+:103330009F3F19F4511101C0942F4F5F4E30A9F7F0
+:103340009F3F39F0F901E90FF11D97FDFA9582834E
+:103350000895089590910C019923F9F090910D0131
+:103360009923D9F0982F9695969596959F3028F5A4
+:10337000E0910E01F0910F01E90FF11D877021E03E
+:1033800030E0A90102C0440F551F8A95E2F7CA0137
+:103390008095918189238183089520910E01309138
+:1033A0000F01F9013296205F3F4F9081891301C0D0
+:1033B00010823196E217F307C1F7089581E090E09B
+:1033C000E0910E01F0910F01E80FF91F10820196B4
+:1033D00080319105A9F708959091CC01892B8093B4
+:1033E000CC01089580959091CC0189238093CC01E4
+:1033F00008951092CC0108959091CB01892B809370
+:10340000CB01089580959091CB0189238093CB01C6
+:1034100008951092CB0108959091CA01892B809351
+:10342000CA01089580959091CA0189238093CA01A9
+:1034300008951092CA0108958093B90108951092D9
+:10344000B901089580910E0190910F01FC01319610
+:103450009C01205F3F4F80E0919191118F5FE217B7
+:10346000F307D1F70895E0910E01F0910F018091DB
+:10347000CC018083E0910E01F0910F019081809149
+:10348000CB01892B8083E0910E01F0910F01908197
+:103490008091CA01892B80838091B901882361F0D2
+:1034A000E0910E01F0910F019081892B80830E94A1
+:1034B000221A81111092B90180910E0190910F0191
+:1034C0000C94D10ECF92DF92EF92FF926C01EE241A
+:1034D000FF24C114D104E104F10421F0C701B601B5
+:1034E00020E101C020E0C72ED82EE92EFF24C11410
+:1034F000D104E104F10419F0285FC701B6016B01A2
+:103500007C0154E0F694E794D794C7945A95D1F788
+:10351000C114D104E104F10419F02C5FC701B60114
+:103520006B017C0142E0F694E794D794C7944A95E6
+:10353000D1F7C114D104E104F10419F02E5FC701E1
+:10354000B601DC01CB01B695A79597958795892B98
+:103550008A2B8B2B09F02F5F822FFF90EF90DF904B
+:10356000CF9008958091E501843029F120E488E12D
+:1035700090E00FB6F894A895809360000FBE20935A
+:10358000600080E00E94BA0783B7817F846083BFB8
+:1035900083B7816083BF7894889583B78E7F83BF1C
+:1035A0000FB6F894A89580916000886180936000C0
+:1035B000109260000FBE089508950C94DC1ACF930A
+:1035C0000E94DD1A0E9497040E94DC1AC0E08C2F32
+:1035D0000E948D05811104C0CF5FCE30C1F701C0BC
+:1035E00081E0CF9108950E943A140E94C50E0C9478
+:1035F000BA0782E084BD93E095BD9AEF97BD8093B2
+:103600006E0008952FB7F8948091CE019091CF016C
+:10361000A091D001B091D1012FBF0895CF92DF9238
+:10362000EF92FF920F931F932FB7F8944091CE0122
+:103630005091CF016091D0017091D1012FBF6A01EB
+:103640007B01EE24FF248C0120E030E0C016D1067F
+:10365000E206F30610F4415051099A01281B390B78
+:10366000C9011F910F91FF90EF90DF90CF900895C7
+:103670001F920F920FB60F9211248F939F93AF93C7
+:10368000BF938091CE019091CF01A091D001B091D4
+:10369000D1010196A11DB11D8093CE019093CF0160
+:1036A000A093D001B093D101BF91AF919F918F9121
+:1036B0000F900FBE0F901F9018950E94BD0BF894AD
+:1036C0002FEF87EA91E6215080409040E1F700C05B
+:1036D000000087E090EBDC018093EE019093EF0116
+:1036E000A093F001B093F1019CE088E10FB6F8944B
+:1036F000A895809360000FBE90936000FFCFEF927B
+:10370000FF920F931F93CF93DF93D82FC0E08C2F9E
+:103710000E948D0500E010E0E82EF12CC701002E7C
+:1037200002C0959587950A94E2F780FD06C00F5F69
+:103730001F4F0630110591F709C0602F7C2F80E0E4
+:103740000E9455068D13F3CF81E004C0CF5FCE30C9
+:10375000F1F680E0DF91CF911F910F91FF90EF90F4
+:103760000895CF93C82F8CE20E947F1B882321F0FD
+:103770008C2FCF910C947F1B80E0CF910895CF9335
+:103780000E94061D811102C00E94EC1CC5E6C150BA
+:1037900049F00E9497048FE39CE90197F1F700C07C
+:1037A0000000F5CF89E20E94B11B811113C18AE2AA
+:1037B0000E94B11B81110E94EC1C85E00E94B11B8C
+:1037C00081110E945D1B0E94111D8093CD0187E035
+:1037D0000E94B11B8823A9F18BE10E94B11B8823B1
+:1037E00051F08091CD0181FB222720F991E09227B1
+:1037F00090FB81F90EC08EE00E94B11B882361F01E
+:103800008091CD0182FB222720F991E0922790FB45
+:1038100082F98093CD0115C080E10E94B11B909187
+:10382000CD01882341F093FB222720F981E08227F4
+:1038300080FB93F904C0892F809580FB90F99093C9
+:10384000CD018091CD010E94151D0E94231D809302
+:10385000DF0180EE0E94B11B882341F08091DF01DF
+:10386000982F909590FB80F98093DF0189E30E9467
+:10387000B11B882359F08091DF0181FB222720F9B9
+:1038800091E0922790FB81F98093DF0182EE0E9404
+:10389000B11B882359F08091DF0182FB222720F998
+:1038A00091E0922790FB82F98093DF0186EE0E94DF
+:1038B000B11B882359F08091DF0183FB222720F977
+:1038C00091E0922790FB83F98093DF0183EE0E94C1
+:1038D000B11B882359F08091DF0184FB222720F956
+:1038E00091E0922790FB84F98093DF0185E30E94A9
+:1038F000B11B882359F08091DF0185FB222720F935
+:1039000091E0922790FB85F98093DF0181E30E948B
+:10391000B11B882359F08091DF0186FB222720F913
+:1039200091E0922790FB86F98093DF0181E10E946C
+:10393000B11B882359F08091DF0187FB222720F9F2
+:1039400091E0922790FB87F98093DF018091DF015E
+:103950000E94271D8091DF0187FB882780F98093D3
+:103960000D0187E20E94B11BC82F8EE10E94B11B9E
+:103970008111C2608FE10E94B11B8111C46080E29D
+:103980000E94B11B8111C86081E20E94B11B8111AC
+:10399000C06182E20E94B11B8111C06283E20E9479
+:1039A000B11B8111C06484E20E94B11B882311F015
+:1039B000C06802C0CC2329F08C2F0E941E1D6C2FE2
+:1039C00003C00E941A1D682F70E080E090E0CF9144
+:1039D0000C94F117CF9108956DEE7EEF80E090E0AA
+:1039E0000E94662360E082E090E00E94582360E03D
+:1039F00083E090E00E94582360E084E090E00E9421
+:103A0000582360E085E090E00C94582380E090E03B
+:103A10000E94522321E08D3E9E4F09F020E0822F2C
+:103A2000089582E090E00C944A23682F82E090E0B1
+:103A30000C94582383E090E00C944A23682F83E091
+:103A400090E00C94582384E090E00C944A23682F73
+:103A500084E090E00C9458238091D40180FF0BC047
+:103A60006091130185E0689FB001112475956795F9
+:103A7000759567952BC081FF09C06091130185E0A2
+:103A8000689FB00111247595679520C082FF07C01B
+:103A90006091130185E0689FB001112417C09091D7
+:103AA000D5019923D1F060911201961788F72091E2
+:103AB000130185E0289F90011124929FA001939FFC
+:103AC000500D112470E0CA010E941C23603871055A
+:103AD00040F46115710519F406C065E070E0862FA9
+:103AE00008958FE7089581E008958091D40180FFC3
+:103AF00008C06091110170E075956795759567959F
+:103B000021C081FF06C06091110170E07595679535
+:103B100019C082FF04C06091110170E010C0909143
+:103B2000D501992399F0609110019617A0F7809123
+:103B30001101899FC001112470E00E941C2360388C
+:103B4000710540F46115710519F406C061E070E07B
+:103B5000862F08958FE7089581E00895803F21F42E
+:103B60000E942C1D819504C0813F29F40E942C1DC8
+:103B70008093D8010895823F21F40E942C1D8195E5
+:103B800004C0833F29F40E942C1D8093D70108951F
+:103B9000893F19F40E94751D05C08A3F31F40E94C7
+:103BA000751D81958093D90108958B3F21F40E9462
+:103BB000751D819504C08C3F29F40E94751D80936A
+:103BC000DA010895843F21F48091D601816017C005
+:103BD000853F21F48091D601826011C0863F21F497
+:103BE0008091D60184600BC0873F21F48091D6017B
+:103BF000886005C0883F31F48091D6018061809350
+:103C0000D60108958D3F21F48091D40181600BC0CD
+:103C10008E3F21F48091D401826005C08F3F29F44A
+:103C20008091D40184608093D4010895803F39F459
+:103C30008091D80187FF6CC01092D80169C0813F84
+:103C400029F48091D8011816BCF362C09091D70175
+:103C5000823F29F497FF5CC01092D70159C0833F7F
+:103C600019F41916CCF354C0893F41F48091D9015D
+:103C700018160CF04DC01092D9014AC08A3F29F4A1
+:103C80008091D90187FF44C0F6CF8B3F39F48091F2
+:103C9000DA0187FF3DC01092DA013AC08C3F29F467
+:103CA0008091DA011816BCF333C0843F21F480916F
+:103CB000D6018E7F17C0853F21F48091D6018D7F7C
+:103CC00011C0863F21F48091D6018B7F0BC0873FC6
+:103CD00021F48091D601877F05C0883F31F480911F
+:103CE000D6018F7E8093D60113C08D3F21F4809141
+:103CF000D4018E7F0BC08E3F21F48091D4018D7F43
+:103D000005C08F3F29F48091D4018B7F8093D4012B
+:103D10008091D70181110EC08091D80181110AC014
+:103D20008091D901811106C08091DA01811102C010
+:103D30001092D501089586ED91E00E94DC0E0E945C
+:103D4000021B9093D3018093D20108951F93CF93C8
+:103D5000DF938091D2019091D3010E940E1BAC01A0
+:103D60009091D501992321F02091140130E006C0F3
+:103D7000209115018AE0289F9001112442175307D2
+:103D800008F485C08091D701C091D801D091D901A4
+:103D90001091DA01811107C0C11175C0D11173C032
+:103DA000111171C074C09F3F19F09F5F9093D501AE
+:103DB000181624F40E942C1D8093D7018091D701FE
+:103DC00087FF05C00E942C1D81958093D7011C168A
+:103DD00024F40E942C1D8093D8018091D80187FF84
+:103DE00005C00E942C1D81958093D8016091D70158
+:103DF000662331F1C091D801CC2311F1062E000CBD
+:103E0000770B880B990B0E94232223E333E343E3D0
+:103E10005FE30E9487220E94EB216093D7016C2F01
+:103E2000CC0F770B880B990B0E94232223E333E3FB
+:103E300043E35FE30E9487220E94EB216093D80155
+:103E40001D1624F40E94751D8093D9018091D9011B
+:103E500087FF05C00E94751D81958093D9011116B9
+:103E600024F40E94751D8093DA018091DA0187FFA6
+:103E700005C00E94751D81958093DA01DF91CF9175
+:103E80001F910C949B1E9F3F09F08FCFA0CFDF9115
+:103E9000CF911F910895E6EDF1E085E0DF011D92DD
+:103EA0008A95E9F71092D5011092D40108958330D4
+:103EB00081F128F4813059F08230D1F008958530B5
+:103EC00009F449C0B8F1863009F456C008958091CC
+:103ED0001501262F30E0280F311D2F3F310524F426
+:103EE000680F6093150108958FEF80931501089571
+:103EF00080911401262F30E0280F311D2F3F31050E
+:103F000024F4680F6093140108958FEF80931401D7
+:103F1000089580911301262F30E0280F311D2F3F87
+:103F2000310524F4680F6093130108958FEF809397
+:103F30001301089580911201262F30E0280F311DC2
+:103F40002F3F310524F4680F6093120108958FEF1D
+:103F500080931201089580911101262F30E0280FDF
+:103F6000311D2F3F310524F4680F6093110108952E
+:103F70008FEF80931101089580911001262F30E07A
+:103F8000280F311D2F3F310524F4680F6093100175
+:103F900008958FEF809310010895833011F128F474
+:103FA000813049F0823091F00895853081F120F11F
+:103FB0008630C1F1089580911501681720F4861BA1
+:103FC00080931501089510921501089580911401B0
+:103FD000681720F4861B8093140108951092140131
+:103FE000089580911301681720F4861B80931301B4
+:103FF000089510921301089580911201681720F41A
+:10400000861B8093120108951092120108958091E9
+:104010001101681720F4861B8093110108951092F6
+:104020001101089580911001681720F4861B809378
+:10403000100108951092100108950F931F938D3170
+:1040400009F46AC008F03FC08E3009F484C0C0F49F
+:10405000873009F46DC068F4863009F0B5C08091EE
+:10406000CD01817F8E7F8093CD0181E08093DC0143
+:10407000ACC0883009F457C08B3009F46AC0A4C0C2
+:10408000863109F466C078F4803109F477C0813153
+:1040900009F09AC00E943A1490910D0181E089279D
+:1040A00080930D0156C0893109F453C08B3109F05A
+:1040B0008BC08091CD0181FB222720F991E09227CE
+:1040C00090FB81F951C0853309F475C048F48732FB
+:1040D00009F471C008F45EC0893209F46CC074C080
+:1040E000833430F48A3308F053C0883391F16CC0C4
+:1040F000833409F460C0883409F066C00E943A1421
+:104100000FEF13ED20E3015010402040E1F700C015
+:1041100000000E945D1B1DC00E94A5210E94C50ECB
+:104120000E94BA0716C00E94111D0E94231D11C0D3
+:104130009091CD01892F8095817080FB90F929F0B5
+:10414000966098609093CD0140C0997F977F90933F
+:10415000CD0181E03AC08091CD0182FB222720F978
+:1041600091E0922790FB82F98093CD01992389F306
+:104170008091CD0181608093CD01EBCF8091CD0105
+:1041800083FB222720F991E0922790FB83F9ECCF63
+:10419000895301C08D5141E050E060E070E08A0138
+:1041A0009B0104C0000F111F221F331F8A95D2F7F5
+:1041B000C901B80104C061E070E080E090E00E94B5
+:1041C000F1170E943A14C5CF80E01F910F91089516
+:1041D00080E008950C94E820CF93C82F8091DC01F3
+:1041E000813079F018F08230E9F187C0E0910E015A
+:1041F000F0910F018081813169F0823209F07FC036
+:1042000009C0E0910E01F0910F018081813111F020
+:10421000823261F48C2F0E94EA20811104C08C2F1D
+:104220000E941D201DC081E090E01AC08C2F0E94CA
+:10423000E820811114C0C43179F048F4CB3079F012
+:10424000C03109F060C082E08093DC0108C0C9324F
+:1042500019F0C83321F057C01092DC0154C081E03E
+:10426000817053C0C93289F118F5C43171F1A8F4D5
+:10427000C73009F046C08AE08093150194E190931D
+:10428000140193E0909313018093120188E08093CE
+:10429000110188E28093100134C0CE51C63088F5F8
+:1042A000EC2FF0E0E65DFE4F80818093DB0129C0BA
+:1042B000CE34E9F020F4CB3421F56AE013C0C135E7
+:1042C00079F0C235F1F461E00DC08091DB01882303
+:1042D00019F01092DB0115C081E08093DC0115C05C
+:1042E00061E006C08091DB010E94571F0AC06AE0AE
+:1042F0008091DB010E94CD1F04C01092DC0180E0A0
+:1043000004C081E002C080E0ABCFCF910895E1E826
+:10431000F0E08081886080838081816080838FB7B6
+:10432000F89493E09093890090ED909388008FBF6C
+:104330000895EFE6F0E08081826080830895EFE6E3
+:10434000F0E080818D7F80830895EFE6F0E090813A
+:1043500082E08927808308951F920F920FB60F92F3
+:1043600011242F933F934F935F936F937F938F937A
+:104370009F93AF93BF93EF93FF938091DD01909153
+:10438000DE0101969093DE018093DD01811103C06F
+:1043900082E00E94BA07E091DE01E695E695F0E042
+:1043A000E75BFA4FE4918091DD018E1303C080E05A
+:1043B0000E94BA07FF91EF91BF91AF919F918F91AA
+:1043C0007F916F915F914F913F912F910F900FBE11
+:1043D0000F901F9018950E94F2216894B1110C94CF
+:1043E000812208950E94662288F09F5798F0B92F85
+:1043F0009927B751B0F0E1F0660F771F881F991F1A
+:104400001AF0BA95C9F714C0B13091F00E94802219
+:10441000B1E008950C948022672F782F8827B85F29
+:1044200039F0B93FCCF3869577956795B395D9F771
+:104430003EF490958095709561957F4F8F4F9F4F7B
+:104440000895E89409C097FB3EF490958095709587
+:1044500061957F4F8F4F9F4F9923A9F0F92F96E9D0
+:10446000BB279395F695879577956795B795F11145
+:10447000F8CFFAF4BB0F11F460FF1BC06F5F7F4FE2
+:104480008F4F9F4F16C0882311F096E911C07723F4
+:1044900021F09EE8872F762F05C0662371F096E8FD
+:1044A000862F70E060E02AF09A95660F771F881FCC
+:1044B000DAF7880F9695879597F9089557FD9058E4
+:1044C000440F551F59F05F3F71F04795880F97FBD8
+:1044D000991F61F09F3F79F0879508951216130692
+:1044E0001406551FF2CF4695F1DF08C016161706C1
+:1044F0001806991FF1CF86957105610508940895F6
+:10450000E894BB2766277727CB0197F908950E9487
+:104510009A220C940B230E94FD2238F00E9404235F
+:1045200020F0952311F00C94F4220C94FA2211241B
+:104530000C9481220E945E2270F3959FC1F3950F27
+:1045400050E0551F629FF001729FBB27F00DB11D17
+:10455000639FAA27F00DB11DAA1F649F6627B00DA7
+:10456000A11D661F829F2227B00DA11D621F739F90
+:10457000B00DA11D621F839FA00D611D221F749F9E
+:104580003327A00D611D231F849F600D211D822FE5
+:10459000762F6A2F11249F5750409AF0F1F088230C
+:1045A0004AF0EE0FFF1FBB1F661F771F881F915039
+:1045B0005040A9F79E3F510580F00C94F4220C94D2
+:1045C00081225F3FE4F3983ED4F386957795679513
+:1045D000B795F795E7959F5FC1F7FE2B880F911D63
+:1045E0009695879597F9089597F99F6780E870E009
+:1045F00060E008959FEF80EC089500240A94161659
+:10460000170618060906089500240A9412161306C0
+:10461000140605060895092E0394000C11F488234E
+:1046200052F0BB0F40F4BF2B11F460FF04C06F5F6A
+:104630007F4F8F4F9F4F089597FB072E16F40094DE
+:1046400007D077FD09D00E94362307FC05D03EF441
+:10465000909581959F4F0895709561957F4F08952E
+:10466000EE0FFF1F0590F491E02D0994AA1BBB1BD0
+:1046700051E107C0AA1FBB1FA617B70710F0A61B62
+:10468000B70B881F991F5A95A9F780959095BC0183
+:10469000CD010895F999FECF92BD81BDF89A992771
+:1046A00080B50895A8E1B0E042E050E00C946D239D
+:1046B000262FF999FECF1FBA92BD81BD20BD0FB63E
+:1046C000F894FA9AF99A0FBE019608950E94582319
+:1046D000272F0C945923DC01CB01FC01F999FECF63
+:1046E00006C0F2BDE1BDF89A319600B40D9241507A
+:0A46F0005040B8F70895F894FFCF8A
+:1046FA002002BC074C082708F307BF070101BA01CB
+:10470A0028080A03140A3F4D36390A05BD048704EE
+:10471A004E04E103FA0313042C0401020304050600
+:04472A000708090073
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/alexjj/readme.md b/keyboard/ergodox_ez/keymaps/alexjj/readme.md
new file mode 100644
index 000000000..239e32d39
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/alexjj/readme.md
@@ -0,0 +1,179 @@
+Englishman in New York
+===========================
+
+:microphone: :tea:
+
+About
+------
+
+After using the massdrop configurator to get the basics, I wanted to add a
+little extra to my ergodox. Notably the Hyper hotkey, the press and hold,
+and a way to have my beloved £ :pound: symbol available<sup>[1](#unicode)</sup>. Why not switch to a GB
+layout? Well the computers I use are US keymap'd and I can't always change
+that. Plus I've got used to 2/@ and 3/# and moving to the ergodox was hard
+enough. :sweat_smile:
+
+I started from the default and edited from there as I needed. It's somewhat
+similar to a regular layout, particularly R1 and shift/controls. I ended up
+with a few keys that were blank, so I'm testing out some shortcuts. Alt+F4 for
+quitting things in Windows, is one example, but I felt it was better placed on
+the 1st layer - in case of fat fingers.
+
+Layout
+-------
+
+![Layout](rl-layout.jpg "Isn't it lovely")
+
+### Base Layer
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ESC | 1! | 2@ | 3# | 4$ | 5% | 6^ | | 7& | 8* | 9( | 0) | -_ | += | BkSp |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| Tab | Q | W | E | R | T | { | | } | Y | U | I | O | P | |\ |
+|--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
+| Win | A | S | D | F | G |------| |------| H | J | K | L | :; | '" |
+|--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
+| LShift |Z/Alt | X | C | V | B | | | | N | M | , | . | Alt | RShift |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ |LCtrl | COPY | PASTE| Left | Right| | Down | Up |Hyper | `~ | RCtrl |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ Hyper = Ctrl+Super+Alt+Shift | ~L3 | F5 | | F2 | ~L2 |
+ ,------|------|------| |------+------+------.
+ | | | PgUp | | Ins | | |
+ | Enter| BkSp |------| |------| ~L1 |Space |
+ | | | PgDn | | Del | | |
+ `--------------------' `--------------------'
+```
+
+### Symbol Layer
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |PrintScr|
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | £ | | | | | | . | 0 | = |Alt+F4|
+ `----------------------------------' `----------------------------------'
+ ↑ ,-------------. ,-------------.
+ THERE! | | | | | |
+ ,------|------|------| |------+------+------.
+ CAD = Ctrl + Alt + Delete | | | | | | | |
+ | | |------| |------| | |
+ | | | | | CAD | | |
+ `--------------------' `--------------------'
+```
+### Media Layer
+
+Not touched this, not used either.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| TEENSY | | | | | | | | | | | | | | |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| | | | MsUp | | | | | | | | | | | |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| | | | | | | | | | | | Prev | Next | | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | Lclk | Rclk | |VolDn |VolUp | Mute | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | |Brwser|
+ | | |------| |------| |Back |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
+### Unicode Layer
+
+Used to enter/test unicode input on Windows. All numbers are numpad keys.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| Alt | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | + | + | |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| Alt | | | E | | | | | | | 7 | 8 | 9 | + | |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| Alt | A | | D | F | |------| |------| | 4 | 5 | 6 | + | |
+|--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+| Alt | | | C | | B | | | | | 1 | 2 | 3 | + | |
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | Alt | Alt | Alt | | | | 0 | 0 | 0 | + | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ WINDOWS ONLY SETUP!! | ~L3 | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | Alt | Alt |------| |------| Alt | Alt |
+ | | | | | | | |
+ `--------------------' `--------------------'
+```
+
+
+Usage
+------
+
+~L1 / L2 / L3 will momentarily switch to a layer if held and another key is pressed.
+If pressed and released will remain on layer until pressed again.
+
+### Unicode
+
+This layout is for Windows only. To enter a character Press and Hold Alt, type + and hex code then release Alt.
+
+Changelog
+-----------
+
+### [0.2.1] - 2016-04-05
+
+* Changed £ to alt code in Windows. Windows sucks at unicode.
+
+### [0.2.0] - 2016-03-27
+
+* Added unicode layer
+* Moved Copy/Paste to left hand side
+* Switched Enter and Space (again)
+* Added L3 (unicode layer) toggle
+* Removed Press and Hold for Alt on right hand size (/)
+* Swapped Volume Up/Down to match arrows
+* Tried fixing £ macro
+* Removed * in the matrix function things (upstream change)
+
+### [0.1.1] - 2016-03-23
+
+* Changed £ input to a macro
+
+
+### [0.1.0] - 2016-03-22
+
+After actually using the keyboard, I've made some changes:
+
+* Swapped Enter and Space
+* Moved backspace to thumb keys (top right still remains)
+* Added Ctrl+Alt+Delete
+* Added Teensy Reset on 2nd layer
+* Switched Up and Down
+* Changed copy/paste to be Ctrl+c and Ctrl+v as KC_COPY/PASTE didn't work (in Windows)
+* Moved ~L2 to replace +L1 after learning how the function works (notes above)
+* Hopefully fixed GBP symbol (unicode enabled in MakeFile)
+
+### [0.0.1] - 2016-03-21
+
+First version
+
+
+Issues
+-------
+
+Space for feedback and notes for future improvements
+
+----
+<sup><a name="unicode">1</a></sup>: For Windows only, and you have to edit the [registry](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input).
diff --git a/keyboard/ergodox_ez/keymaps/alexjj/rl-layout.jpg b/keyboard/ergodox_ez/keymaps/alexjj/rl-layout.jpg
new file mode 100644
index 000000000..e4e92bf46
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/alexjj/rl-layout.jpg
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/README.md b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/README.md
new file mode 100644
index 000000000..984106ff4
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/README.md
@@ -0,0 +1,29 @@
+# ErgoDox EZ Dvorak International Squisher
+
+Dvorak layout adjusted with several (linux) applications in mind:
+
+* Easier Escape for VIM
+* Windows/Super key for awesome WM
+* Alt+Shift for international characters
+* PrintScreen for sys-rq
+* Insert for the X11 clip-board
+
+Major layer changes:
+
+* Common multimedia keys are integrated into layer 0, less common into layer 1
+* No mouse keys
+* Layer 2 is qwerty (for easier gaming & less fortunate keyboard users)
+
+Known issues:
+
+* Alt+Shift does not work reliably (depends on the X11 kb layout? Not
+ entirely clear...)
+
+![layer0](keyboard-layout0.png)
+![layer1](keyboard-layout1.png)
+![layer2](keyboard-layout2.png)
+
+## Changelog
+
+* 2016-03-29
+ * Initial release
diff --git a/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/dvorak_intl_squisher.hex b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/dvorak_intl_squisher.hex
new file mode 100644
index 000000000..bd70f5829
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/dvorak_intl_squisher.hex
@@ -0,0 +1,1127 @@
+:100000000C9465020C94AC020C94AC020C94AC02FF
+:100010000C94AC020C94AC020C94AC020C94AC02A8
+:100020000C94AC020C94AC020C94B50B0C94870CA1
+:100030000C94AC020C94AC020C94AC020C94AC0288
+:100040000C94AC020C943B210C94AC020C94AC02CA
+:100050000C94AC020C94C71A0C94AC020C94AC0235
+:100060000C94AC020C94AC020C94AC020C94AC0258
+:100070000C94AC020C94AC020C94AC020C94AC0248
+:100080000C94AC020C94AC020C94AC020C94AC0238
+:100090000C94AC020C94AC020C94AC020C94AC0228
+:1000A0000C94AC020C94AC020C94AC02F40C160D43
+:1000B000040E160D040E5B0D7E0D040ED30DE60D21
+:1000C000D110D11000110011431181119A139A130C
+:1000D0009A119A139B129B126E139A139A138513FB
+:1000E0000000F0A12E0029002A00E1003581000067
+:1000F0001E00340004003371E2004D001F00360082
+:1001000012001400E3002B002000370008000D004F
+:1001100050002C002100130018000E004F004A0070
+:1001200022001C000C001B0000006571B6004C0092
+:100130000000007F00000154AE004900000000777D
+:1001400000000254230009000700050000004600DB
+:1001500024000A000B00100052004B00250006008E
+:1001600017001A0051002800260015001100190080
+:100170002F00E51427000F0016001D7130004E00FF
+:10018000318238002D00E500C100000001000100AF
+:1001900001000100010000003A001E0220022202BC
+:1001A000010001003B001F022102230201000100A7
+:1001B0003C002F0226022F00AC0001003D0030025F
+:1001C00027023000AB0001003E003102350035024D
+:1001D000000001000100010000000100000001001A
+:1001E0000100010000000100000001003F0052007A
+:1001F00051002402000001004000240021001E00E4
+:100200000100A9004100250022001F003700010065
+:1002100042002600230020002700A80043002502FA
+:100220002E0231002E00AA0044004500010001000A
+:1002300001000000010001000100010001000000B8
+:100240000100140004001D710100010001001A00EA
+:1002500016001B0001000100010008000700060055
+:100260000100010001001500090019000100010052
+:10027000010017000A000500000001000100010054
+:100280000000010000000100010001000000010069
+:100290000000010001001C000B0011000000010023
+:1002A000010018000D0010000100010001000C0009
+:1002B0000E00360001000100010012000F0037009F
+:1002C00001000100010013003382387101000100B8
+:1002D00001000100010001000100000016034500BB
+:1002E000720067006F0044006F0078002000450036
+:1002F0005A00000016034500720067006F004400BA
+:100300006F007800200045005A0000000403090433
+:1003100009026D00040100A0FA09040000010301B4
+:100320000100092111010001223F00070581030896
+:10033000000A090401000103010200092111010062
+:1003400001224D000705820308000A09040200018A
+:100350000300000009211101000122360007058376
+:100360000308000A09040300010300000009211129
+:100370000100012239000705840310000112011059
+:100380000100000008EDFE07130100010200010555
+:10039000010906A101050719E029E71500250195C6
+:1003A0000875018102050819012905950575019156
+:1003B000029501750391010507190029771500259C
+:1003C00001957875018102C005010980A1018502AE
+:1003D00016010026B7001A01002AB7007510950112
+:1003E0008100C0050C0901A1018503160100269CAE
+:1003F000021A01002A9C02751095018100C00501B6
+:100400000902A1010901A100050919012905150029
+:10041000250195057501810295017503810105018D
+:10042000093009311581257F950275088106093843
+:100430001581257F950175088106050C0A3802157E
+:1004400081257F950175088106C0C005010906A1B7
+:1004500001050719E029E7150025019508750181B7
+:100460000295017508810105081901290595057591
+:100470000191029501750391010507190029FF15E6
+:100480000025FF950675088100C0000000000000EF
+:100490000000000000010204060A0F17202C3A4A4F
+:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2
+:1004B000B39D87715D4A3A2C20170F0A060402018A
+:1004C0000000000000000000000011241FBECFEF5C
+:1004D000DAE0DEBFCDBF04B603FE27C08091EF0196
+:1004E0009091F001A091F101B091F2018730904B11
+:1004F000A740B04BD1F41092EF011092F00110928E
+:10050000F1011092F20114BE84B7877F84BF0FB649
+:10051000F894A895809160008861809360001092A3
+:1005200060000FBEE0E0FFE3099511E0A0E0B1E05C
+:10053000E8E1F6E402C005900D92A433B107D9F7C3
+:1005400021E0A4E3B1E001C01D92AF3EB207E1F7A4
+:100550000E94F6080C940A230C94000061110BC051
+:10056000FC018281882321F085EE0E94660F03C082
+:1005700085EE0E942E1080E090E00895089560912D
+:10058000B1017091B2018091B3019091B4010E94C8
+:10059000F01956985E9825982D9826982E982798A9
+:1005A0002F98813019F0823021F00895259A2D9AE4
+:1005B0000895269A2E9A08950C94BF0256985E9834
+:1005C00025982D9826982E9827982F988FEF90E0B1
+:1005D000909389008093880090938B0080938A0089
+:1005E00090938D0080938C00259A2D9A2FEF80E7B1
+:1005F00092E0215080409040E1F700C00000269A30
+:100600002E9A2FEF80E792E0215080409040E1F752
+:1006100000C00000279A2F9A2FEF80E792E0215028
+:1006200080409040E1F700C0000025982D982FEF02
+:1006300080E792E0215080409040E1F700C0000048
+:1006400026982E982FEF80E792E02150804090402E
+:10065000E1F700C0000027982F9856985E982598DB
+:100660002D9826982E9827982F98089589EA809398
+:10067000800089E08093810024982C983F988AB16B
+:100680008F748AB96E98479A8BB1806B8BB9769AC2
+:100690000E94DE020C94BE0280E2809300018091F1
+:1006A000340181110EC00E949B0381E080933401CC
+:1006B0002FEF83ED90E3215080409040E1F700C0A0
+:1006C000000080E40E94A1038093000181112EC0EC
+:1006D0000E94CB0380930001811128C00E94CB03AC
+:1006E00080930001811122C08FE30E94CB0380938D
+:1006F000000181111BC00E94C30380E40E94A1037A
+:1007000080930001811112C08CE00E94CB03809382
+:10071000000181110BC00E94CB0380930001811165
+:1007200005C08FE30E94CB03809300010E94C303A6
+:100730008091000108951092B9008AE08093B8007A
+:10074000089594EA9093BC009091BC0097FFFCCF71
+:100750009091B900987F983021F0903111F081E0AC
+:1007600008958093BB0084E88093BC008091BC0016
+:1007700087FFFCCF8091B900887F883111F08034E9
+:1007800071F780E0089584E98093BC008091BC00FB
+:1007900084FDFCCF08958093BB0084E88093BC0067
+:1007A0008091BC0087FFFCCF9091B900987F81E0D9
+:1007B000983209F480E0089584E88093BC00809129
+:1007C000BC0087FFFCCF8091BB00089580910001A1
+:1007D000811115C080E40E94A10380930001811162
+:1007E0000CC082E10E94CB0380930001811105C0FF
+:1007F0008FEF0E94CB03809300010E94C30384B15A
+:10080000807F84B985B1807F85B98AB1837F8AB9B9
+:100810008BB1837F8BB93E98469808950E944C0314
+:10082000809300010E94E60380B38C7080BB81B38B
+:10083000836F81BBA6E3B1E0E4E4F1E08EE08E0FCC
+:1008400011921D928E13FCCF0C943603BF92CF925F
+:10085000DF92EF92FF920F931F93CF93DF938091DC
+:100860000001882379F0809135018F5F80933501F5
+:10087000811108C00E944C0380930001811102C0C5
+:100880000E94DE0206E311E0C0E0D0E0DD24D39454
+:1008900082E0C82EEE24E394F12CC730D10500F598
+:1008A00080910001811164C080E40E94A1038093C3
+:1008B0000001811112C082E10E94CB0380930001EC
+:1008C00081110BC0C7010C2E01C0880F0A94EAF7F2
+:1008D00080950E94CB03809300010E94C30348C00F
+:1008E000CA30A1F028F4C83059F0C93061F005C011
+:1008F000CC3089F070F0CD3089F0209A289810C063
+:10090000219A29980DC0229A2A980AC0239A2B98D6
+:1009100007C0529A01C0539A5B9802C03E9A46980B
+:1009200090EA9A95F1F79FB1799902C082E001C0EF
+:1009300080E091709D25982B7C9902C084E001C0D5
+:1009400080E0892B7D9902C038E001C030E0832B24
+:100950007E9902C020E101C020E0822B9FB19095DA
+:10096000991F9927991F9295990F907E892B0FC0F7
+:1009700080910001811149C080E40E94A10380930D
+:100980000001882379F1B12C0E94C3038B2DF8015B
+:100990009081981719F08083C09201010E94E603AC
+:1009A00021960F5F1F4FCE30D10509F076CF809191
+:1009B0000101882361F1815080930101882339F07E
+:1009C0008FE99FE00197F1F700C0000020C0A4E488
+:1009D000B1E0E6E3F1E0CF01825F91919D938E1348
+:1009E000FCCF15C083E10E94CB03809300018111ED
+:1009F000CACF81E40E94A103809300018111C3CF7B
+:100A00000E94DC03B82EB094BFCF80E0C0CF0E941C
+:100A1000DC0281E0DF91CF911F910F91FF90EF9069
+:100A2000DF90CF90BF900895E82FF0E0EC5BFE4F91
+:100A30008081089508958B3B910578F4883A91055B
+:100A400040F5853A9105D0F48430910508F0B1C0A5
+:100A50008130910509F4ADC06BC0803E910508F46A
+:100A600067C0883E910508F4A4C09C01205F31094D
+:100A70002031310508F05CC090650895853A9105F4
+:100A800009F459C0863A910509F058C082E890E40B
+:100A90000895883A910509F454C0893A910509F4FA
+:100AA00053C08A3A910509F452C08B3A910509F472
+:100AB00051C08C3A910509F450C08D3A910509F462
+:100AC0004FC0803B910509F44EC08E3A910509F460
+:100AD0004DC08F3A910509F44CC0813B910509F452
+:100AE0004BC0823B910509F44AC0833B910509F450
+:100AF00049C0843B910509F448C0853B910509F440
+:100B000047C0863B910509F446C0873B910509F42F
+:100B100045C0883B910509F444C0893B910509F41F
+:100B200043C08A3B910509F442C080E094E40895F3
+:100B300080E090E0089581E890E4089583E890E4EF
+:100B4000089582EE94E4089589EE94E408958AEE7F
+:100B500094E4089585EB94E4089586EB94E4089575
+:100B600087EB94E408958CEC94E408958DEC94E480
+:100B7000089583E895E408958AE895E4089582E964
+:100B800095E4089584E995E4089581E296E4089552
+:100B900083E296E4089584E296E4089585E296E47B
+:100BA000089586E296E4089587E296E408958AE23D
+:100BB00096E40895089596E0799FF001112494E554
+:100BC000899FE00DF11D1124E60FF11DEE0FFF1FAF
+:100BD000EC51FF4F859194910895880F991FFC0166
+:100BE000E05AF040859194910895880F991FFC0177
+:100BF000E052FF4F85919491089526E0729FF00195
+:100C0000112444E5849FE00DF11D1124E60FF11D30
+:100C1000EE0FFF1FEC51FF4F859194919C013A9587
+:100C200021154FE1340708F41CC13F512115304113
+:100C300020F49F700E94F50508959C013053211502
+:100C4000304118F49927906C0895811520E592079A
+:100C500071F40E94BE134FEF84E39CE0415080404A
+:100C60009040E1F700C000000E94EC1AFAC0813009
+:100C700020E5920731F48091CD0181608093CD0110
+:100C8000F0C09C0130552115304108F051C0292F8A
+:100C900033272F70332721303105D9F4AC0143704D
+:100CA000552702C0220F331F4A95E2F73C68AC017A
+:100CB00064E0440F551F6A95E1F744275370242BD5
+:100CC000352B73E0880F991F7A95E1F78076992785
+:100CD0001DC02230310529F4982F8827816F906A32
+:100CE000089523303105A9F4AC014370552721E064
+:100CF00030E002C0220F331F4A95E2F73C6843E020
+:100D0000880F991F4A95E1F7807E9770822B932B6D
+:100D1000089524303105E1F4AC014370552721E0FA
+:100D200030E002C0220F331F4A95E2F73A68E7CF5E
+:100D30009C0130572115304118F49F70906208953E
+:100D40009C0130582115304118F49F70906A089525
+:100D5000803E9105E0F4803C910558F58133910582
+:100D600009F46FC048F48932910509F463C08A32EE
+:100D7000910509F46DC072C089339105E9F082389C
+:100D80009105D1F08533910509F44DC067C0833ECC
+:100D9000910581F138F4803E9105B9F0823E9105CC
+:100DA000D9F05CC0863E910561F1873E9105A1F1C5
+:100DB00055C00E94ED0508952091E00120FD02C07C
+:100DC00021FF4CC080EE90E049C08091E00180FF9F
+:100DD000F9CF89E390E042C08091E00182FF0EC02C
+:100DE0008091E00184FF03C080E090E037C083EE93
+:100DF00090E034C08091E00182FFF2CF82EE90E07B
+:100E00002DC08091E00183FF0BC08091E00184FD43
+:100E1000EBCF87EE90E022C08091E00183FFF5CF19
+:100E200086EE90E01BC08091E00185FF07C089E25B
+:100E300090E014C08091E00185FFF9CF85E390E058
+:100E40000DC08091E00186FF07C08AE290E006C0F5
+:100E50008091E00186FFF9CF81E390E00E941B05BD
+:100E60000895089508950C943207809162010895C1
+:100E7000CF93DF9300D01F92CDB7DEB79C01809156
+:100E8000E601843019F593E099833B832A8390939C
+:100E9000E9008FEF9091E800815095FD06C095ED37
+:100EA0009A95F1F700008111F5CF8091E80085FF58
+:100EB0000DC040E050E063E070E0CE0101960E947A
+:100EC000A5098091E8008E778093E8000F900F903D
+:100ED0000F90DF91CF910895CF93DF9300D01F92B1
+:100EE000CDB7DEB72091E601243021F522E0298339
+:100EF0009B838A8383E08093E9008FEF9091E800E1
+:100F0000815095FD06C095ED9A95F1F7000081118D
+:100F1000F5CF8091E80085FF0DC040E050E063E030
+:100F200070E0CE0101960E94A5098091E8008E77BD
+:100F30008093E8000F900F900F90DF91CF9108956C
+:100F40002091E6012430F1F422E02093E9002FEF14
+:100F50003091E800215035FD06C035ED3A95F1F7A6
+:100F600000002111F5CF2091E80025FF0BC040E0E3
+:100F700050E065E070E00E94A5098091E8008E775E
+:100F80008093E8000895CF93DF93EC019091E60100
+:100F9000943009F046C080910C018823D9F08091EB
+:100FA0000D018823B9F09093E9008FEF9091E8004C
+:100FB000815095FD06C095E19A95F1F700008111E9
+:100FC000F5CF8091E80085FF2CC040E050E060E163
+:100FD00070E017C081E08093E9008FEF9091E80006
+:100FE000815095FD06C095ED9A95F1F700008111AD
+:100FF000F5CF8091E80085FF14C040E050E068E044
+:1010000070E0CE010E94A5098091E8008E77809360
+:10101000E80080E1FE01A2E5B1E001900D928A9521
+:10102000E1F7DF91CF9108958091E501811109C029
+:101030000E943A0B0E94970B8091E200846080939B
+:10104000E20008951092E501089508950C94282176
+:101050000E94821A0E942E210E943D0E0C9433079A
+:1010600042E061EC81E00E94B40A42E061EC82E07F
+:101070000E94B40A42E061EC83E00E94B40A42E1BB
+:1010800061EC84E00C94B40A8091E801833009F4A7
+:1010900055C030F4813071F0823009F48EC008956B
+:1010A0008A3009F47AC08B3009F460C0893009F0C5
+:1010B0009CC020C08091E701813A09F096C08091E0
+:1010C000E800877F8093E8008091EB019091EC012C
+:1010D000892B21F460E182E591E003C060E080E0CB
+:1010E00090E070E00E94F0098091E8008B77809397
+:1010F000E80008958091E701813209F076C080917F
+:10110000EB019091EC01009719F0039709F06DC085
+:101110008091E800877F8093E8008091E80082FD5D
+:1011200005C08091E6018111F8CF5FC08091F10088
+:10113000809362018091E8008B7753C08091E70132
+:10114000813A09F052C08091EB019091EC01892B1A
+:1011500009F04BC08091E800877F8093E800809180
+:10116000E80080FFFCCF80910C0136C08091E70140
+:101170008132D9F58091EB019091EC01892BA9F591
+:101180008091E800877F8093E8000E94E90A8091BF
+:10119000E90180930C010C94BE138091E701813228
+:1011A00021F58091E800877F8093E8000E94E90A9A
+:1011B0008091EA018093630108958091E701813A6B
+:1011C000A1F48091E800877F8093E8008091E80097
+:1011D00080FFFCCF809163018093F1008091E80053
+:1011E0008E778093E8000C94E90A089584B7877F8E
+:1011F00084BF0FB6F894A8958091600088618093B1
+:101200006000109260000FBE90E080E80FB6F89486
+:1012100080936100909361000FBE0E948C0E0E942B
+:101220003A0B0E94970B8091E20084608093E20069
+:1012300078940E941D0E0E948E0E82E091E00E9422
+:10124000380E0E9416218091E601853069F40E94D3
+:10125000401A8091E4018823B1F30E946E1A88231A
+:1012600091F30E948F09EFCF0E94940EECCF292FAB
+:10127000332723303105C9F064F42130310581F082
+:101280002230310509F043C08DE690E020E133E0E3
+:1012900042C021323105F1F02232310541F137C02F
+:1012A00082E190E02DE733E036C099278130910547
+:1012B00041F08230910541F0892B49F5ECE0F3E0F3
+:1012C00005C0E4EFF2E002C0ECEDF2E0849190E0C2
+:1012D0009F0121C06430D8F4E62FF0E0EE0FFF1F2D
+:1012E000EE5DFE4F2081318189E090E014C06430D2
+:1012F00070F470E0FB01EE0FFF1FE65EFE4F2081F1
+:101300003181FB01EA5EFE4F808190E004C080E005
+:1013100090E020E030E0FA0131832083089580E1FD
+:1013200089BD82E189BD09B400FEFDCF8091D8005E
+:101330008F7D8093D8008091E00082608093E000F0
+:101340008091E00081FDFCCF0895CF92DF92EF9273
+:10135000FF920F931F93CF93DF93EC018B016A01F0
+:101360000E94080B811133C0C114D10439F0F60179
+:1013700080819181081B190BC80FD91FE12CF12C1A
+:101380000115110519F18091E80085FD16C08091C5
+:10139000E8008E778093E800C114D10449F0F6018B
+:1013A00080819181E80EF91EF182E08285E00FC014
+:1013B0000E94080B882321F30AC089918093F100D1
+:1013C00001501109FFEFEF1AFF0ADACF80E0DF9139
+:1013D000CF911F910F91FF90EF90DF90CF900895E4
+:1013E0002091ED013091EE012617370748F0611585
+:1013F000710539F42091E8002E772093E80001C0B0
+:10140000B90140E061157105A9F12091E60122239F
+:1014100009F443C0253009F442C02091E80023FDBF
+:1014200040C02091E80022FD32C02091E80020FF5A
+:10143000E9CF4091F3002091F20030E0342BFC0121
+:10144000CF016115710559F02830310540F48191C3
+:101450008093F100615071092F5F3F4FF1CF41E060
+:101460002830310509F040E02091E8002E772093E4
+:10147000E800C8CF4111C9CF0AC08091E601882396
+:1014800061F0853061F08091E80083FD0AC08091B1
+:10149000E80082FFF2CF80E0089582E0089583E0C3
+:1014A000089581E008952091ED013091EE01261715
+:1014B000370748F06115710539F42091E8002E775F
+:1014C0002093E80001C0B901FC0120E0611571051D
+:1014D00091F18091E601882309F440C0853009F438
+:1014E0003FC08091E80083FD3DC08091E80082FD0F
+:1014F0002FC08091E80080FFE9CF2091F300809118
+:10150000F20090E0922B6115710559F08830910539
+:1015100040F424912093F1003196615071090196B5
+:10152000F2CF21E0089709F020E08091E8008E7763
+:101530008093E800CBCF2111CCCF0AC08091E60187
+:10154000882361F0853061F08091E80083FD0AC056
+:101550008091E80082FFF2CF80E0089582E0089554
+:1015600083E0089581E00895982F973058F590937F
+:10157000E900981739F07091EC002091ED0050913E
+:10158000F00003C0242F762F50E021FF19C03091C6
+:10159000EB003E7F3093EB003091ED003D7F3093C8
+:1015A000ED003091EB0031603093EB007093EC0074
+:1015B0002093ED005093F0002091EE0027FF07C02C
+:1015C0009F5FD3CF8F708093E90081E0089580E022
+:1015D00008958091E70187FF11C08091E80082FDA6
+:1015E00005C08091E6018111F8CF11C08091E8001B
+:1015F0008B770BC08091E601882349F08091E80049
+:1016000080FFF8CF8091E8008E778093E8000895FE
+:101610002091E4003091E50095E64091EC00842FA4
+:10162000817040FF22C08091E80080FD1CC0809145
+:10163000E601882391F0853091F08091EB0085FDE3
+:1016400010C04091E4005091E5004217530729F380
+:101650009A01915011F784E0089582E0089583E0A3
+:10166000089581E0089580E008954091E80042FFE8
+:10167000DECF08950E94A80B0E94B00BE0EEF0E0D0
+:10168000808181608083E8EDF0E080818F778083C6
+:1016900019BCA7EDB0E08C918E7F8C9380818F7EFA
+:1016A00080831092E50108950F931F93CF93DF93EA
+:1016B0000E94A80B0E94B00BC8EDD0E088818F7704
+:1016C000888388818068888388818F7D888319BC1E
+:1016D0001092E6011092E2011092E4011092E301EF
+:1016E00000EE10E0F80180818B7F8083888181602B
+:1016F000888342E060E080E00E94B40AE1EEF0E01E
+:1017000080818E7F8083E2EEF0E080818160808343
+:10171000808188608083F80180818E7F80838881CA
+:1017200080618883DF91CF911F910F910895E8ED3B
+:10173000F0E080818F7E8083E7EDF0E08081816042
+:10174000808384E082BF81E08093E5010C94540B98
+:10175000E8EDF0E080818E7F80831092E2000895B2
+:101760001092DA001092E10008951F920F920FB6C6
+:101770000F9211242F933F934F935F936F937F9317
+:101780008F939F93AF93BF93EF93FF938091E1006B
+:1017900082FF0BC08091E20082FF07C08091E100D0
+:1017A0008B7F8093E1000E941C0E8091DA0080FF05
+:1017B0001FC08091D80080FF1BC08091DA008E7F0F
+:1017C0008093DA008091D90080FF0DC080E189BD4F
+:1017D00082E189BD09B400FEFDCF81E08093E6017E
+:1017E0000E94140805C019BC1092E6010E9422084C
+:1017F0008091E10080FF19C08091E20080FF15C058
+:101800008091E2008E7F8093E2008091E20080610F
+:101810008093E2008091D80080628093D80019BC48
+:1018200085E08093E6010E9426088091E10084FF14
+:1018300030C08091E20084FF2CC080E189BD82E14C
+:1018400089BD09B400FEFDCF8091D8008F7D8093C3
+:10185000D8008091E1008F7E8093E1008091E200CA
+:101860008F7E8093E2008091E20081608093E200AD
+:101870008091E201882311F084E007C08091E300A9
+:1018800087FD02C081E001C083E08093E6010E94F1
+:1018900028088091E10083FF29C08091E20083FF46
+:1018A00025C08091E100877F8093E10082E08093F2
+:1018B000E6011092E2018091E1008E7F8093E100C9
+:1018C0008091E2008E7F8093E2008091E20080614F
+:1018D0008093E20042E060E080E00E94B40A8091E0
+:1018E000F00088608093F0000E942508FF91EF913E
+:1018F000BF91AF919F918F917F916F915F914F9128
+:101900003F912F910F900FBE0F901F9018951F922F
+:101910000F920FB60F9211242F933F934F935F9323
+:101920006F937F938F939F93AF93BF93CF93DF93E7
+:10193000EF93FF93C091E900CF708091EC00D82F16
+:10194000D17080FDD0E81092E9008091F000877F8F
+:101950008093F00078940E94CB0C1092E900809163
+:10196000F00088608093F000CD2BCF70C093E90029
+:10197000FF91EF91DF91CF91BF91AF919F918F91A7
+:101980007F916F915F914F913F912F910F900FBE7B
+:101990000F901F9018951F93CF93DF93CDB7DEB7AD
+:1019A000AA970FB6F894DEBF0FBECDBFE7EEF1E009
+:1019B00088E08E0F9091F10091938E13FBCF0E94DF
+:1019C00044088091E80083FF1FC18091E701909156
+:1019D000E801492F50E04A30510508F015C1FA01DD
+:1019E000EA5AFF4F0C94BF22803881F0823809F008
+:1019F0000BC18091EB018F708093E9008091EB0027
+:101A000085FB882780F91092E90006C08091E301E8
+:101A10009091E401911182609091E800977F9093FA
+:101A2000E8008093F1001092F100C8C0282F2D7FAC
+:101A300009F0EAC0882319F0823061F0E5C0809196
+:101A4000E901813009F0E0C0933009F080E0809333
+:101A5000E4012BC08091E901811127C08091EB0145
+:101A60008F7009F4D1C08093E9002091EB0020FF32
+:101A70001CC0933021F48091EB00806214C09091DF
+:101A8000EB0090619093EB0021E030E0A90102C0EF
+:101A9000440F551F8A95E2F74093EA001092EA003E
+:101AA0008091EB0088608093EB001092E9008091B8
+:101AB000E800877F86C08111A7C01091E9011F77D8
+:101AC0008091E3008078812B8093E3008091E8008F
+:101AD000877F8093E8000E94E90A8091E80080FFF8
+:101AE000FCCF8091E30080688093E300111102C075
+:101AF00082E001C083E08093E60186C08058823096
+:101B000008F082C08091E9019091EA018C3D53E098
+:101B1000950779F583E08A838AE289834FB7F89441
+:101B2000DE01139620E03EE051E2E32FF0E0509317
+:101B30005700E49120FF03C0E295EF703F5FEF7024
+:101B40008E2F90E0EA3010F0C79601C0C0968D93BA
+:101B50009D932F5F243149F74FBF8091E800877F25
+:101B60008093E8006AE270E0CE0101960E94F009DD
+:101B700014C0AE014F5F5F4F6091EB010E943709C7
+:101B8000BC01892B09F440C09091E800977F9093A5
+:101B9000E80089819A810E94530A8091E8008B773E
+:101BA0008093E80031C0803879F58091E800877F24
+:101BB0008093E8008091E2018093F1008091E80039
+:101BC0008E778093E8000E94E90A1EC081111CC034
+:101BD0009091E9019230C0F48091E800877F809372
+:101BE000E8009093E2010E94E90A8091E2018111EC
+:101BF00006C08091E30087FD02C081E001C084E05F
+:101C00008093E6010E9430088091E80083FF0AC0BB
+:101C10008091E800877F8093E8008091EB008062EC
+:101C20008093EB00AA960FB6F894DEBF0FBECDBF2F
+:101C3000DF91CF911F9108950895CF938091E60190
+:101C40008823A1F0C091E900CF709091EC00892F1A
+:101C5000817090FD80E8C82B1092E9008091E80027
+:101C600083FD0E94CB0CCF70C093E900CF91089503
+:101C700090936901809368010895E0916801F09163
+:101C80006901309721F00190F081E02D099480E006
+:101C90000895E0916801F0916901309721F0028088
+:101CA000F381E02D09940895E0916801F0916901B4
+:101CB000309721F00480F581E02D0994089520915A
+:101CC0006601309167018217930771F09093670165
+:101CD00080936601E0916801F0916901309721F0ED
+:101CE0000680F781E02D09940895209164013091D8
+:101CF00065018217930771F09093650180936401E9
+:101D0000E0916801F0916901309721F00084F1853C
+:101D1000E02D0994089508950C948B0E0E94881A62
+:101D20000E940E040C944E1BCF92DF92EF92FF9212
+:101D30000F931F93CF93DF93CDB7DEB72B970FB6DB
+:101D4000F894DEBF0FBECDBF0E9426048BE6C82EDE
+:101D500081E0D82E00E010E0E02E802F0E941405D4
+:101D6000F60141916F01F42EF826B1F40F5F1F4F79
+:101D70000E30110589F78FEF89838A831B820E94B9
+:101D8000911A8160782F9D838C8349815A816B8160
+:101D90008D810E94370F40C09091CD0191FF04C00A
+:101DA0008B870E941A058B8520E030E04F2D50E094
+:101DB000922FBA01022E02C0759567950A94E2F738
+:101DC00060FF24C02E83EF8221E030E0690102C071
+:101DD000CC0CDD1C9A95E2F790E08C219D21892B9B
+:101DE00009F420E028870E94911A8160782F9A8751
+:101DF00089874E815F8168858A850E94370FF80147
+:101E0000E559FE4F8081C826C08206C02F5F3F4F34
+:101E10002630310569F6AACF0E94351E10916A015D
+:101E20000E943D0E1817A1F00E943D0E80936A019A
+:101E30002B960FB6F894DEBF0FBECDBFDF91CF91CA
+:101E40001F910F91FF90EF90DF90CF900C9433078C
+:101E50002B960FB6F894DEBF0FBECDBFDF91CF91AA
+:101E60001F910F91FF90EF90DF90CF900895CF9347
+:101E7000DF93CDB7DEB72B970FB6F894DEBF0FBE5A
+:101E8000CDBF4F83588769877A878B87DE0111968C
+:101E900086E0FD0111928A95E9F785E0FE0137960B
+:101EA00001900D928A95E1F749815A816B817C817D
+:101EB0008D819E810E9458162B960FB6F894DEBF36
+:101EC0000FBECDBFDF91CF9108950895CF938823A2
+:101ED00009F4C2C0C82F823859F40E943D0E81FD1A
+:101EE000BBC089E30E94F4180E94C11989E30CC0A9
+:101EF000833879F40E943D0E80FDAEC083E50E94D8
+:101F0000F4180E94C11983E50E943619CF910C94F0
+:101F1000C119843859F40E943D0E82FD9DC087E4AA
+:101F20000E94F4180E94C11987E4EECF8CEF8C0F49
+:101F3000813A48F48C2F0E947B2081118DC08C2F18
+:101F40000E94F418E3CF80E28C0F883048F4C77009
+:101F500081E001C0880FCA95EAF70E947A19D6CFAE
+:101F60008BE58C0F833078F4C53A29F0C63A31F00E
+:101F700083E890E005C081E890E002C082E890E04C
+:101F8000CF910C945F0E88E58C0F833108F064C00C
+:101F9000C83A39F1C93A41F1CA3A49F1CB3A51F15B
+:101FA000CC3A59F1CD3A61F1C03B69F1CE3A71F1C9
+:101FB000CF3A79F1C13B81F1C23B89F1C33B91F149
+:101FC000C43B99F1C53BA1F1C63BA9F1C73BB1F1B7
+:101FD000C83BB9F1C93BC1F1CA3BC9F180E090E00F
+:101FE00038C082EE90E035C089EE90E032C08AEED3
+:101FF00090E02FC085EB90E02CC086EB90E029C0EC
+:1020000087EB90E026C08CEC90E023C08DEC90E054
+:1020100020C083E891E01DC08AE891E01AC082E9FF
+:1020200091E017C084E991E014C081E292E011C010
+:1020300083E292E00EC084E292E00BC085E292E07F
+:1020400008C086E292E005C087E292E002C08AE220
+:1020500092E0CF910C94750ECF910895882309F4E6
+:102060004BC0823859F40E943D0E81FF45C089E380
+:102070000E94F4180E94C11989E30CC0833871F4DE
+:102080000E943D0E80FF38C083E50E94F4180E9434
+:10209000C11983E50E9436190C94C119843859F48A
+:1020A0000E943D0E82FF28C087E40E94F4180E941F
+:1020B000C11987E4EFCF9CEF980F913A58F390E263
+:1020C000980F983050F4877091E001C0990F8A956D
+:1020D000EAF7892F0E948019DFCF9BE5980F933094
+:1020E00020F480E090E00C945F0E885A833120F455
+:1020F00080E090E00C94750E0895882321F00E94F2
+:102100007A190C94C1190895882321F00E9480192E
+:102110000C94C1190895BF92CF92DF92EF92FF9273
+:102120000F931F93CF93DF9300D000D000D0CDB793
+:10213000DEB725E0FC01DE01119601900D922A9593
+:10214000E1F7FC01D08011810281258122952F7059
+:1021500043815481452B09F4EDC21F3F21F4FFEF69
+:10216000DF1609F4E7C27C012E830E94650FD98235
+:102170001A8389819A810E94B318182FB92E0E9460
+:10218000B2180E9479172E81002319F00E94971926
+:102190002E81EB2DE295EF70F0E0E05AFF4F0C94AA
+:1021A000BF228B2D807F9B2D9F70F92E882319F0E5
+:1021B000F29480EFF822002349F0FF2009F467C26F
+:1021C0008F2D0E948A190E94C11961C2812F0E941D
+:1021D0002E10FF2009F4AEC28F2D0E949019269672
+:1021E0000FB6F894DEBF0FBECDBFDF91CF911F9128
+:1021F0000F91FF90EF90DF90CF90BF900C94C1199A
+:102200003B2D307F8B2D8F70303211F08295807F87
+:10221000112319F0113021F12CC00023B9F0222331
+:1022200009F4A0C1213009F09DC126960FB6F8949B
+:10223000DEBF0FBECDBFDF91CF911F910F91FF90F9
+:10224000EF90DF90CF90BF900C94AA19222319F041
+:10225000213009F46FC28E830E94AD198E8196C120
+:10226000002321F0223008F065C27CC1211162C236
+:102270008DC1002321F0222309F474C108C2222356
+:1022800009F484C119C22B2D26952695237030E0C0
+:102290002115310521F021303105D1F04BC2002349
+:1022A00021F0812F9B2D937002C080E090E0269654
+:1022B0000FB6F894DEBF0FBECDBFDF91CF911F9157
+:1022C0000F91FF90EF90DF90CF90BF900C945F0E36
+:1022D000002321F0812F9B2D937002C080E090E0BD
+:1022E00026960FB6F894DEBF0FBECDBFDF91CF911B
+:1022F0001F910F91FF90EF90DF90CF90BF900C94C3
+:10230000750E812F002319F00E943D1D02C00E940E
+:10231000A51D26960FB6F894DEBF0FBECDBFDF9188
+:10232000CF911F910F91FF90EF90DF90CF90BF90D2
+:102330000C942A1E8B2D837009F07BC00111FAC109
+:10234000812F829586958770880F880F912F9F70B7
+:10235000C92ED12CE12CF12C082E04C0CC0CDD1C94
+:10236000EE1CFF1C0A94D2F714FF12C04FE050E09D
+:1023700060E070E004C0440F551F661F771F8A9508
+:10238000D2F7CB01BA01609570958095909503C006
+:1023900060E070E0CB012B2D269526952370422F0F
+:1023A00050E042305105D9F04330510569F16C29B4
+:1023B0007D298E299F294130510551F126960FB66E
+:1023C000F894DEBF0FBECDBFDF91CF911F910F916B
+:1023D000FF90EF90DF90CF90BF900C94A0176C29E6
+:1023E0007D298E299F2926960FB6F894DEBF0FBE51
+:1023F000CDBFDF91CF911F910F91FF90EF90DF90B4
+:10240000CF90BF900C94BC170E94A017C701B601D3
+:1024100026960FB6F894DEBF0FBECDBFDF91CF91E9
+:102420001F910F91FF90EF90DF90CF90BF900C9491
+:102430008417002319F08B2D817001C086958823A5
+:1024400009F478C1812F829586958770880F880F4F
+:10245000912F9F70C92ED12CE12CF12C082E04C095
+:10246000CC0CDD1CEE1CFF1C0A94D2F714FF12C02A
+:102470004FE050E060E070E004C0440F551F661F5D
+:10248000771F8A95D2F7CB01BA0160957095809538
+:10249000909503C060E070E0CB012B2D269526952A
+:1024A0002370422F50E042305105D9F0433051059E
+:1024B00069F16C297D298E299F294130510551F1FF
+:1024C00026960FB6F894DEBF0FBECDBFDF91CF9139
+:1024D0001F910F91FF90EF90DF90CF90BF900C94E1
+:1024E0007A186C297D298E299F2926960FB6F89493
+:1024F000DEBF0FBECDBFDF91CF911F910F91FF9037
+:10250000EF90DF90CF90BF900C9496180E947A18AD
+:10251000C701B60126960FB6F894DEBF0FBECDBF39
+:10252000DF91CF911F910F91FF90EF90DF90CF90AF
+:10253000BF900C945E18103FD1F118F4103E50F487
+:10254000A1C0123F09F463C008F44CC0133F09F462
+:1025500073C098C01F708B2D8F710023A1F00E9453
+:10256000F717812F26960FB6F894DEBF0FBECDBFAA
+:10257000DF91CF911F910F91FF90EF90DF90CF905F
+:10258000BF900C947D100E941818812F26960FB6CC
+:10259000F894DEBF0FBECDBFDF91CF911F910F9199
+:1025A000FF90EF90DF90CF90BF900C9484100023A9
+:1025B000A9F02111BFC08B2D8F7126960FB6F8940C
+:1025C000DEBF0FBECDBFDF91CF911F910F91FF9066
+:1025D000EF90DF90CF90BF900C943D18223008F020
+:1025E000A9C0E9CF0023A9F08B2D8F7126960FB6D5
+:1025F000F894DEBF0FBECDBFDF91CF911F910F9139
+:10260000FF90EF90DF90CF90BF900C94F7170023CE
+:1026100059F38B2D8F7126960FB6F894DEBF0FBE3F
+:10262000CDBFDF91CF911F910F91FF90EF90DF9081
+:10263000CF90BF900C941818002399F08B2D8F71B8
+:1026400026960FB6F894DEBF0FBECDBFDF91CF91B7
+:102650001F910F91FF90EF90DF90CF90BF900C945F
+:10266000E21726960FB6F894DEBF0FBECDBFDF91FE
+:10267000CF911F910F91FF90EF90DF90CF90BF907F
+:102680000C94D8170023A9F0222309F4ADCF812F91
+:1026900026960FB6F894DEBF0FBECDBFDF91CF9167
+:1026A0001F910F91FF90EF90DF90CF90BF900C940F
+:1026B000660F222309F4ADCF812F26960FB6F8942A
+:1026C000DEBF0FBECDBFDF91CF911F910F91FF9065
+:1026D000EF90DF90CF90BF900C942E104B2D4F7049
+:1026E000612FC7010E94AE0226960FB6F894DEBF96
+:1026F0000FBECDBFDF91CF911F910F91FF90EF9053
+:10270000DF90CF90BF900C94FC164B2D4F70612F33
+:10271000C70126960FB6F894DEBF0FBECDBFDF917E
+:10272000CF911F910F91FF90EF90DF90CF90BF90CE
+:102730000C94DA0526960FB6F894DEBF0FBECDBF17
+:10274000DF91CF911F910F91FF90EF90DF90CF908D
+:10275000BF9008950E9497190E94A7190E946C19B2
+:102760000E94C1190E94DA1E0E942A1E80E090E099
+:102770000E945F0E80E090E00C94750E0E94871915
+:102780000C94AA130E94B318292F22952F7030E0C1
+:102790002C3031054CF42A3031056CF422503109CB
+:1027A0002230310588F407C02C30310549F02F3034
+:1027B000310531F009C0803E48F0803F29F406C061
+:1027C00093FB882780F9089580E0089581E00895BB
+:1027D000CF93DF9300D000D01F92CDB7DEB70F901C
+:1027E0000F900F900F900F90DF91CF910895CF939E
+:1027F000DF9300D000D000D0CDB7DEB726960FB65D
+:10280000F894DEBF0FBECDBFDF91CF9108951F9327
+:10281000CF93DF93C091790116E080917A01C817B8
+:1028200099F0D0E01C9FF0011D9FF00D1124E55898
+:10283000FE4F4081518162817381848195810E9424
+:10284000F7132196C770E9CFDF91CF911F910895BB
+:102850004091AB015091AC016091AD017091AE011E
+:102860008091AF019091B0010C94F7138091B00169
+:1028700082958F7009F054C08091AD01882309F4CE
+:102880004FC080917901A0917A016091AB01709164
+:10289000AC014091AE015091AF01B6E08A1709F446
+:1028A0003FC090E041155105C1F17F3F11F46F3FEA
+:1028B000A1F1B89FF001B99FF00D1124E558FE4F2A
+:1028C000218172132AC02081621327C02281211125
+:1028D00024C0238134812417350710F42150310995
+:1028E000241B350B283C3105C0F42091B0012F701A
+:1028F00020612093B00126E0289FF001299FF00D70
+:102900001124E058FE4F80818F70806180838BEAB4
+:1029100091E00E948B100C94071401968770BECF33
+:102920000895CF92DF92EF92FF920F931F93CF9370
+:10293000DF93CDB7DEB762970FB6F894DEBF0FBE58
+:10294000CDBF8C0185E0F801DE011D9601900D924E
+:102950008A95E1F7D8014C9111965C9111971296E6
+:102960006C9112971396CD90DC9014973091AB0137
+:102970007091AC018091AE019091AF01009709F484
+:102980006BC17F3F19F43F3F09F466C1E090AD0190
+:10299000EE2009F4C0C02091B001C816D90628F075
+:1029A000F601E81BF90BCF0104C0809590958C0DC2
+:1029B0009D1DFF24F394883C910578F0F12C207F35
+:1029C00009F0C6C07C2DD98AC88A89890E94E8137B
+:1029D0008BEA91E00E948B10B1C0822F807F09F0BA
+:1029E00046C0751314C0341312C0611110C02F708B
+:1029F00020612093B0010E9428148BEA91E00E948C
+:102A00008B108091B001D80115968C932EC0CD28E3
+:102A100019F15F3F11F44F3FF9F0F62E61111CC020
+:102A20008091790120917A0136E0821709F45AC029
+:102A300090E0389FF001399FF00D1124E558FE4FCA
+:102A40007181571306C07081471303C072817111E1
+:102A500003C001968770E9CFF62E662309F418C1EA
+:102A60008091B00181608093B001F12C11C1751388
+:102A700008C0341306C0611104C08091B001D801B0
+:102A8000C3C04D875E878D859E856A8B0E94C21369
+:102A90006A898823E1F16623D1F12091B001822F68
+:102AA00082958F7090E0029774F08091AB019091C5
+:102AB000AC0198878F831986DB86CA862C87CE0166
+:102AC00007960E948B1086E0F801ABEAB1E0019016
+:102AD0000D928A95E1F70E9436140E942814FF2473
+:102AE000F394D6C04D875E878D859E850E94B3186E
+:102AF000292F22952F7030E0223031050CF0BCC018
+:102B00009F7009F0B6C0805E883008F4C1C0C8016B
+:102B10000E948B10E4CFC816D90608F453C0F60102
+:102B2000E81BF90BCF01883C910508F450C0F12C4B
+:102B30007C2DD98AC88A89890E94E813EBEAF1E0E2
+:102B400086E0DF011D928A95E9F70E942814A0C053
+:102B5000751314C0341312C0611110C08091B001FC
+:102B6000F8018583C8010E948B1086E0EBEAF1E052
+:102B7000DF011D928A95E9F7FE2C8AC04D875E879A
+:102B80008D859E856A8B0E94C2136A89882309F409
+:102B9000BECF662309F4BBCF2091B001822F82956E
+:102BA0008F7090E002970CF48ECF8091AB019091E2
+:102BB000AC019A8389831B82DD82CC822E83CE0175
+:102BC00001967FCF809590958C0D9D1DACCFF62EF4
+:102BD000662309F49CCF75132EC034132CC02091AA
+:102BE000B00120FD1FC0822F82958F70D9F0D801CF
+:102BF00015962C9315978F3049F08F5F982F9295EB
+:102C0000907F822F8F70892B15968C93C8010E941C
+:102C10008B1086E0F801ABEAB1E001900D928A9545
+:102C2000E1F793CF86E0F801ABEAB1E001900D92B5
+:102C30008A95E1F72DC04D875E878D859E850E9420
+:102C4000C213811140CF8091B00181608093B001A7
+:102C5000C8010E948B101CC0662309F458CF4D8711
+:102C60005E878D859E850E94C213882309F44FCF0D
+:102C70002ACF811148CF0CC0243031050CF047CF4A
+:102C80009F7009F440CFF8019581907F09F03BCF08
+:102C90008F2D62960FB6F894DEBF0FBECDBFDF91C9
+:102CA000CF911F910F91FF90EF90DF90CF900895FB
+:102CB0001F93CF93DF93CDB7DEB72C970FB6F89461
+:102CC000DEBF0FBECDBF4F83588769877A878B875A
+:102CD0009C87CE0107960E949114882369F08F810A
+:102CE00098852A853B85232BF1F19F3F09F063C02E
+:102CF0008F3F09F060C037C086E0FE013796DE01E5
+:102D0000119601900D928A95E1F76F817885EA8599
+:102D1000FB85309741F17F3F11F46F3F21F1209106
+:102D20007A0130E0C90101968770992740917901B5
+:102D300050E08417950709F447C069837A83FD83BF
+:102D4000EC8396E0929FD001939FB00D1124A5587B
+:102D5000BE4FFE01319601900D929A95E1F7809356
+:102D60007A010E94071416E08091790190917A010E
+:102D70008917C1F1189FC001112485589E4F0E94E8
+:102D80009114882379F1E09179011E9FF0011124BB
+:102D9000E558FE4F40815181628173818481958124
+:102DA0000E94F7138091790190E00196877099272E
+:102DB00080937901D9CF4F81588569857A858B8534
+:102DC0009C850E94F713CFCF0E94BE1310927A0108
+:102DD00010927901EBEAF1E086E0DF011D928A951D
+:102DE000E9F7C1CF2C960FB6F894DEBF0FBECDBF6A
+:102DF000DF91CF911F910895EF92FF920F931F9350
+:102E0000CF93DF938C01892B09F46CC0F12CEE2455
+:102E1000E394E8012196F8018491843740F48430EA
+:102E200008F051C0813081F0823019F15BC08537E4
+:102E300009F444C0A8F19CE7980F903708F052C0FD
+:102E40008F770E942E1041C00E5F1F4FFE01C4916C
+:102E500080E28C0F883048F4C7708E2D01C0880F37
+:102E6000CA95EAF70E949A1914C08C2F0E94660F27
+:102E70002DC00E5F1F4FFE01C49180E28C0F883081
+:102E800058F4C7708E2D01C0880FCA95EAF70E94CA
+:102E9000A0190E94C1191AC08C2F0E942E1016C0B2
+:102EA0000E5F1F4FFE01C491CC2381F08FE99FE09C
+:102EB0000197F1F700C00000C150F6CF0E5F1F4F21
+:102EC000FE01F49003C00E94660F8E018F2D8823AF
+:102ED00009F49FCFEFE9FFE03197F1F700C0000060
+:102EE0008150F5CFDF91CF911F910F91FF90EF901F
+:102EF000089508956093B5017093B6018093B7016A
+:102F00009093B8010C94AA130F931F930091B501ED
+:102F10001091B6012091B7013091B801DC01CB01CD
+:102F2000802B912BA22BB32B8093B5019093B601EC
+:102F3000A093B701B093B8011F910F910C94AA13FD
+:102F40000F931F930091B5011091B6012091B70125
+:102F50003091B801DC01CB0180239123A223B3235C
+:102F60008093B5019093B601A093B701B093B801D7
+:102F70001F910F910C94AA130F931F930091B50109
+:102F80001091B6012091B7013091B801DC01CB015D
+:102F900080279127A227B3278093B5019093B6018C
+:102FA000A093B701B093B8011F910F910C94AA138D
+:102FB0001092B1011092B2011092B3011092B401BB
+:102FC0000C94AA1341E050E060E070E004C0440FAC
+:102FD000551F661F771F8A95D2F74093B101509312
+:102FE000B2016093B3017093B4010C94AA1341E051
+:102FF00050E060E070E004C0440F551F661F771F6B
+:103000008A95D2F78091B1019091B201A091B3015C
+:10301000B091B401482B592B6A2B7B2B4093B10103
+:103020005093B2016093B3017093B4010C94AA134E
+:1030300041E050E060E070E004C0440F551F661F9F
+:10304000771F8A95D2F7409550956095709580913D
+:10305000B1019091B201A091B301B091B4014823A4
+:1030600059236A237B234093B1015093B2016093AB
+:10307000B3017093B4010C94AA1341E050E060E0F6
+:1030800070E004C0440F551F661F771F8A95D2F762
+:103090008091B1019091B201A091B301B091B401BE
+:1030A000482759276A277B274093B1015093B201E3
+:1030B0006093B3017093B4010C94AA130F931F9300
+:1030C0000091B1011091B2012091B3013091B4018E
+:1030D000DC01CB01802B912BA22BB32B8093B10170
+:1030E0009093B201A093B301B093B4011F910F91DB
+:1030F0000C94AA130F931F930091B1011091B20188
+:103100002091B3013091B401DC01CB0180239123E4
+:10311000A223B3238093B1019093B201A093B30192
+:10312000B093B4011F910F910C94AA130F931F93A6
+:103130000091B1011091B2012091B3013091B4011D
+:10314000DC01CB0180279127A227B3278093B1010F
+:103150009093B201A093B301B093B4011F910F916A
+:103160000C94AA130895CF92DF92EF92FF920F93DF
+:103170001F93CF93DF938C01C090B501D090B6011F
+:10318000E090B701F090B8014091B1015091B201C7
+:103190006091B3017091B401C42AD52AE62AF72AB6
+:1031A000CFE1D0E0D701C6010C2E04C0B695A7959B
+:1031B000979587950A94D2F780FF07C0B8018C2FA6
+:1031C0000E94FD058130910531F4219758F7B8012F
+:1031D00080E00E94FD05DF91CF911F910F91FF903C
+:1031E000EF90DF90CF90089590910C01992321F0FA
+:1031F00090910D01911109C020910E0130910F01A4
+:10320000F90132969FEF40E01FC0982F9695969552
+:1032100096959F3050F5E0910E01F0910F01E90F66
+:10322000F11D877021E030E0A90102C0440F551F55
+:103230008A95E2F7CA019181892B818308959F3F86
+:1032400039F04F5F4E3041F051915813F8CF0DC017
+:103250005111F7CF942FF5CF9F3F39F0F901E90FC6
+:10326000F11D97FDFA9582830895089590910C01C0
+:10327000992321F090910D01911109C020910E0127
+:1032800030910F01F9013296205F3F4F1FC0982FF8
+:103290009695969596959F30F0F4E0910E01F091F9
+:1032A0000F01E90FF11D877021E030E0A90102C094
+:1032B000440F551F8A95E2F7CA01809591818923B1
+:1032C000818308953196E217F30729F090819813CE
+:1032D000F9CF1082F7CF089581E090E0E0910E01E0
+:1032E000F0910F01E80FF91F1082019680319105CE
+:1032F000A9F708959091CC01892B8093CC01089572
+:1033000080959091CC0189238093CC0108951092EF
+:10331000CC0108959091CB01892B8093CB01089526
+:1033200080959091CB0189238093CB0108951092D1
+:10333000CB0108959091CA01892B8093CA01089509
+:1033400080959091CA0189238093CA0108951092B3
+:10335000CA0108958093B90108951092B9010895A2
+:1033600080910E0190910F01FC0131969C01205F2C
+:103370003F4F80E0919191118F5FE217F307D1F7F2
+:103380000895E0910E01F0910F018091CC018083AE
+:10339000E0910E01F0910F0190818091CB01892B7A
+:1033A0008083E0910E01F0910F0190818091CA011C
+:1033B000892B80838091B901882361F0E0910E010F
+:1033C000F0910F019081892B80830E94B0198111A7
+:1033D0001092B90180910E0190910F010C94490E49
+:1033E000CF92DF92EF92FF926C01EE24FF24C11482
+:1033F000D104E104F10421F0C701B60120E101C0CC
+:1034000020E0C72ED82EE92EFF24C114D104E104F8
+:10341000F10419F0285FC701B6016B017C0154E08B
+:10342000F694E794D794C7945A95D1F7C114D10470
+:10343000E104F10419F02C5FC701B6016B017C01B6
+:1034400042E0F694E794D794C7944A95D1F7C11413
+:10345000D104E104F10419F02E5FC701B601DC01CB
+:10346000CB01B695A79597958795892B8A2B8B2BA2
+:1034700009F02F5F822FFF90EF90DF90CF9008959B
+:103480008091E601843039F11092CE0120E488E188
+:1034900090E00FB6F894A895809360000FBE20933B
+:1034A000600080E00E94330783B7817F846083BF20
+:1034B00083B7816083BF7894889583B78E7F83BFFD
+:1034C0000FB6F894A89580916000886180936000A1
+:1034D000109260000FBE089508950895CF930E9442
+:1034E0006C1A0E9426040E946D1AC0E08C2F0E9464
+:1034F0001405811104C0CF5FCE30C1F701C081E057
+:10350000CF9108950E94BE130E943D0E0C94330784
+:1035100082E084BD93E095BD9AEF97BD80936E00E5
+:1035200008952FB7F8948091CF019091D001A09188
+:10353000D101B091D2012FBF0895CF92DF92EF92C7
+:10354000FF920F931F932FB7F8944091CF015091A2
+:10355000D0016091D1017091D2012FBF6A017B012E
+:10356000EE24FF248C0120E030E0C016D106E206F4
+:10357000F30610F4415051099A01281B390BC90177
+:103580001F910F91FF90EF90DF90CF9008951F92C1
+:103590000F920FB60F9211248F939F93AF93BF9307
+:1035A0008091CF019091D001A091D101B091D20131
+:1035B0000196A11DB11D8093CF019093D001A093DE
+:1035C000D101B093D201BF91AF919F918F910F9094
+:1035D0000FBE0F901F9018950E943A0BF8942FEF92
+:1035E00087EA91E6215080409040E1F700C000005A
+:1035F00087E090EBDC018093EF019093F001A093C2
+:10360000F101B093F2019CE088E10FB6F894A8951F
+:10361000809360000FBE90936000FFCFEF92FF9207
+:103620000F931F93CF93DF93D82FC0E08C2F0E946E
+:10363000140500E010E0E82EF12CC701002E02C0B6
+:10364000959587950A94E2F780FD06C00F5F1F4F9E
+:103650000630110591F709C0602F7C2F80E00E9491
+:10366000DB05D813F3CF81E004C0CF5FCE30F1F695
+:1036700080E0DF91CF911F910F91FF90EF9008951F
+:10368000CF93C82F8CE20E940E1B882321F08C2F31
+:10369000CF910C940E1B80E0CF910895CF930E94A0
+:1036A000951C811102C00E947B1CC5E6C15049F0E7
+:1036B0000E9426048FE39CE90197F1F700C0000007
+:1036C000F5CF89E20E94401B811113C18AE20E945A
+:1036D000401B81110E947B1C85E00E94401B8111D0
+:1036E0000E94EC1A0E94A01C8093CD0187E00E94EA
+:1036F000401B8823A9F18BE10E94401B882351F0D5
+:103700008091CD0181FB222720F991E0922790FB47
+:1037100081F90EC08EE00E94401B882361F08091E9
+:10372000CD0182FB222720F991E0922790FB82F9BC
+:103730008093CD0115C080E10E94401B9091CD0186
+:10374000882341F093FB222720F981E0822780FB28
+:1037500093F904C0892F809580FB90F99093CD0157
+:103760008091CD010E94A41C0E94B21C8093E001B4
+:1037700080EE0E94401B882341F08091E001982F49
+:10378000909590FB80F98093E00189E30E94401BB3
+:10379000882359F08091E00181FB222720F991E0F4
+:1037A000922790FB81F98093E00182EE0E94401BFA
+:1037B000882359F08091E00182FB222720F991E0D3
+:1037C000922790FB82F98093E00186EE0E94401BD5
+:1037D000882359F08091E00183FB222720F991E0B2
+:1037E000922790FB83F98093E00183EE0E94401BB7
+:1037F000882359F08091E00184FB222720F991E091
+:10380000922790FB84F98093E00185E30E94401B9E
+:10381000882359F08091E00185FB222720F991E06F
+:10382000922790FB85F98093E00181E30E94401B81
+:10383000882359F08091E00186FB222720F991E04E
+:10384000922790FB86F98093E00181E10E94401B62
+:10385000882359F08091E00187FB222720F991E02D
+:10386000922790FB87F98093E0018091E0010E940C
+:10387000B61C8091E00187FB882780F980930D01B9
+:1038800087E20E94401BC82F8EE10E94401B8111DD
+:10389000C2608FE10E94401B8111C46080E20E94DF
+:1038A000401B8111C86081E20E94401B8111C061F0
+:1038B00082E20E94401B8111C06283E20E94401B91
+:1038C0008111C06484E20E94401B882311F0C0680B
+:1038D00002C0CC2329F08C2F0E94AD1C6C2F03C09A
+:1038E0000E94A91C682F70E080E090E0CF910C94BA
+:1038F0007A17CF9108956DEE7EEF80E090E00E9400
+:10390000F52260E082E090E00E94E72260E083E040
+:1039100090E00E94E72260E084E090E00E94E722CD
+:1039200060E085E090E00C94E72280E090E00E9467
+:10393000E12221E08D3E9E4F09F020E0822F089584
+:1039400082E090E00C94D922682F82E090E00C9401
+:10395000E72283E090E00C94D922682F83E090E086
+:103960000C94E72284E090E00C94D922682F84E044
+:1039700090E00C94E7228091D50180FF0BC060910C
+:10398000130185E0689FB0011124759567957595C1
+:1039900067952BC081FF09C06091130185E0689F86
+:1039A000B00111247595679520C082FF07C0609112
+:1039B000130185E0689FB001112417C09091D601D2
+:1039C0009923D1F060911201961788F72091130185
+:1039D00085E0289F90011124929FA001939F500D94
+:1039E000112470E0CA010E94AB226038710540F4D6
+:1039F0006115710539F002C065E070E0862F089509
+:103A00008FE7089581E008958091D50180FF08C077
+:103A10006091110170E0759567957595679521C066
+:103A200081FF06C06091110170E07595679519C01E
+:103A300082FF04C06091110170E010C09091D60126
+:103A40009923C1F0609110019617A0F780911101A0
+:103A5000899FC001112470E00E94AB22603871057B
+:103A600028F46115710521F0862F08958FE70895D8
+:103A700081E0089561E070E0F4CF803F21F40E947E
+:103A8000BB1C819504C0813F29F40E94BB1C80931C
+:103A9000D9010895823F21F40E94BB1C819504C086
+:103AA000833F29F40E94BB1C8093D8010895893F6D
+:103AB00019F40E94041D05C08A3F31F40E94041DC0
+:103AC00081958093DA0108958B3F21F40E94041DB3
+:103AD000819504C08C3F29F40E94041D8093DB0172
+:103AE0000895843F21F48091D701816017C0853FFC
+:103AF00021F48091D701826011C0863F21F480912A
+:103B0000D70184600BC0873F21F48091D701886082
+:103B100005C0883F31F48091D70180618093D7013F
+:103B200008958D3F21F48091D50181600BC08E3FB7
+:103B300021F48091D501826005C08F3F29F48091E6
+:103B4000D50184608093D5010895803F39F4809138
+:103B5000D90187FF6CC01092D90169C0813F29F457
+:103B60008091D9011816BCF362C09091D801823FB0
+:103B700029F497FF5CC01092D80159C0833F19F413
+:103B80001916CCF354C0893F41F48091DA0118161C
+:103B90000CF04DC01092DA014AC08A3F29F480919E
+:103BA000DA0187FF44C0F6CF8B3F39F48091DB0107
+:103BB00087FF3DC01092DB013AC08C3F29F4809111
+:103BC000DB011816BCF333C0843F21F48091D70188
+:103BD0008E7F17C0853F21F48091D7018D7F11C062
+:103BE000863F21F48091D7018B7F0BC0873F21F462
+:103BF0008091D701877F05C0883F31F48091D7013C
+:103C00008F7E8093D70113C08D3F21F48091D50121
+:103C10008E7F0BC08E3F21F48091D5018D7F05C032
+:103C20008F3F29F48091D5018B7F8093D5018091BE
+:103C3000D80181110EC08091D90181110AC08091F3
+:103C4000DA01811106C08091DB01811102C010925E
+:103C5000D601089587ED91E00E94540E0E94911ABA
+:103C60009093D4018093D30108951F93CF93DF9352
+:103C70008091D3019091D4010E949D1AAC01909142
+:103C8000D601992321F02091140130E006C0209143
+:103C900015018AE0289F900111244217530708F468
+:103CA00085C08091D801C091D901D091DA011091DD
+:103CB000DB01811107C0C11175C0D11173C0111191
+:103CC00071C074C09F3F19F09F5F9093D601181682
+:103CD00024F40E94BB1C8093D8018091D80187FFF7
+:103CE00005C00E94BB1C81958093D8011C1624F44A
+:103CF0000E94BB1C8093D9018091D90187FF05C028
+:103D00000E94BB1C81958093D9016091D8016623E4
+:103D100031F1C091D901CC2311F1062E000C770BA3
+:103D2000880B990B0E94B22123E333E343E35FE363
+:103D30000E9416220E947A216093D8016C2FCC0F2A
+:103D4000770B880B990B0E94B22123E333E343E303
+:103D50005FE30E9416220E947A216093D9011D160A
+:103D600024F40E94041D8093DA018091DA0187FF18
+:103D700005C00E94041D81958093DA01111624F478
+:103D80000E94041D8093DB018091DB0187FF05C049
+:103D90000E94041D81958093DB01DF91CF911F91DB
+:103DA0000C942A1E9F3F09F08FCF97CFDF91CF91C0
+:103DB0001F910895E7EDF1E085E0DF011D928A95FE
+:103DC000E9F71092D6011092D5010895833081F160
+:103DD00028F4813059F08230D1F00895853009F40B
+:103DE00049C0B8F1863009F456C008958091150194
+:103DF000262F30E0280F311D2F3F310524F4680FA6
+:103E00006093150108958FEF8093150108958091B7
+:103E10001401262F30E0280F311D2F3F310524F4E7
+:103E2000680F6093140108958FEF80931401089533
+:103E300080911301262F30E0280F311D2F3F3105CF
+:103E400024F4680F6093130108958FEF809313019A
+:103E5000089580911201262F30E0280F311D2F3F49
+:103E6000310524F4680F6093120108958FEF809359
+:103E70001201089580911101262F30E0280F311D85
+:103E80002F3F310524F4680F6093110108958FEFDF
+:103E900080931101089580911001262F30E0280FA2
+:103EA000311D2F3F310524F4680F609310010895F0
+:103EB0008FEF809310010895833011F128F4813041
+:103EC00049F0823091F00895853081F120F18630FB
+:103ED000C1F1089580911501681720F4861B809325
+:103EE0001501089510921501089580911401681725
+:103EF00020F4861B809314010895109214010895F4
+:103F000080911301681720F4861B80931301089594
+:103F100010921301089580911201681720F4861BF6
+:103F20008093120108951092120108958091110159
+:103F3000681720F4861B80931101089510921101D7
+:103F4000089580911001681720F4861B809310015A
+:103F500008951092100108950F931F938D3109F465
+:103F60006AC008F03FC08E3009F484C0C0F48730C6
+:103F700009F46DC068F4863009F0B5C08091CD01B8
+:103F8000817F8E7F8093CD0181E08093DD01ACC085
+:103F9000883009F457C08B3009F46AC0A4C0863158
+:103FA00009F466C078F4803109F477C0813109F0F2
+:103FB0009AC00E94BE1390910D0181E089278093E1
+:103FC0000D0156C0893109F453C08B3109F08BC003
+:103FD0008091CD0181FB222720F991E0922790FB6F
+:103FE00081F951C0853309F475C048F4873209F46A
+:103FF00071C008F45EC0893209F46CC074C08334A7
+:1040000030F48A3308F053C0883391F16CC08334A4
+:1040100009F460C0883409F066C00E94BE130FEF37
+:1040200013ED20E3015010402040E1F700C00000F4
+:104030000E94EC1A1DC00E9434210E943D0E0E9475
+:10404000330716C00E94A01C0E94B21C11C09091A0
+:10405000CD01892F8095817080FB90F929F09660C1
+:1040600098609093CD0140C0997F977F9093CD0148
+:1040700081E03AC08091CD0182FB222720F991E0B6
+:10408000922790FB82F98093CD01992389F3809147
+:10409000CD0181608093CD01EBCF8091CD0183FB79
+:1040A000222720F991E0922790FB83F9ECCF8953E6
+:1040B00001C08D5141E050E060E070E08A019B0159
+:1040C00004C0000F111F221F331F8A95D2F7C901A8
+:1040D000B80104C061E070E080E090E00E947A17CF
+:1040E0000E94BE13C5CF80E01F910F91089580E01C
+:1040F000089580E00895CF93C82F8091DD0181302D
+:1041000079F018F08230E9F187C0E0910E01F0916A
+:104110000F018081813169F0823209F07FC009C0CE
+:10412000E0910E01F0910F018081813111F0823216
+:1041300061F48C2F0E947720811104C08C2F0E9483
+:10414000AC1F1DC081E090E01AC08C2F0E94792026
+:10415000811114C0C43179F048F4CB3079F0C0310A
+:1041600009F060C082E08093DD0108C0C93219F017
+:10417000C83321F057C01092DD0154C081E0817036
+:1041800053C0C93289F118F5C43171F1A8F4C730B0
+:1041900009F046C08AE08093150194E190931401E0
+:1041A00093E0909313018093120188E080931101B2
+:1041B00088E28093100134C0CE51C63088F5EC2FD0
+:1041C000F0E0E65DFE4F80818093DC0129C0CE34B3
+:1041D000E9F020F4CB3421F56AE013C0C13579F061
+:1041E000C235F1F461E00DC08091DC01882319F043
+:1041F0001092DC0115C081E08093DD0115C061E003
+:1042000006C08091DC010E94E61E0AC06AE080912F
+:10421000DC010E945C1F04C01092DD0180E004C03C
+:1042200081E002C080E0ABCFCF910895E1E8F0E0FB
+:104230008081886080838081816080838FB7F894DB
+:1042400093E09093890090ED909388008FBF08953C
+:10425000EFE6F0E08081826080830895EFE6F0E091
+:1042600080818D7F80830895EFE6F0E0908182E089
+:104270008927808308951F920F920FB60F92112401
+:104280002F933F934F935F936F937F938F939F935E
+:10429000AF93BF93EF93FF938091DE019091DF0185
+:1042A00001969093DF018093DE01811103C082E0CB
+:1042B0000E943307E091DF01E695E695F0E0E657CE
+:1042C000FB4FE4918091DE018E1303C080E00E94D9
+:1042D0003307FF91EF91BF91AF919F918F917F91A4
+:1042E0006F915F914F913F912F910F900FBE0F9063
+:1042F0001F9018950E9481216894B1110C9410228E
+:1043000008950E94F52188F09F5798F0B92F9927BA
+:10431000B751B0F0E1F0660F771F881F991F1AF0B0
+:10432000BA95C9F714C0B13091F00E940F22B1E0E4
+:1043300008950C940F22672F782F8827B85F39F0E3
+:10434000B93FCCF3869577956795B395D9F73EF449
+:1043500090958095709561957F4F8F4F9F4F0895F1
+:10436000E89409C097FB3EF490958095709561950F
+:104370007F4F8F4F9F4F9923A9F0F92F96E9BB27C5
+:104380009395F695879577956795B795F111F8CF41
+:10439000FAF4BB0F11F460FF1BC06F5F7F4F8F4FAC
+:1043A0009F4F16C0882311F096E911C0772321F0A2
+:1043B0009EE8872F762F05C0662371F096E8862F3A
+:1043C00070E060E02AF09A95660F771F881FDAF791
+:1043D000880F9695879597F9089557FD9058440F43
+:1043E000551F59F05F3F71F04795880F97FB991F54
+:1043F00061F09F3F79F08795089512161306140611
+:10440000551FF2CF4695F1DF08C01616170618069D
+:10441000991FF1CF86957105610508940895E89478
+:10442000BB2766277727CB0197F908950E94292299
+:104430000C949A220E948C2238F00E94932220F041
+:10444000952311F00C9483220C94892211240C944E
+:1044500010220E94ED2170F3959FC1F3950F50E05B
+:10446000551F629FF001729FBB27F00DB11D639F26
+:10447000AA27F00DB11DAA1F649F6627B00DA11DCC
+:10448000661F829F2227B00DA11D621F739FB00D72
+:10449000A11D621F839FA00D611D221F749F3327E2
+:1044A000A00D611D231F849F600D211D822F762F7B
+:1044B0006A2F11249F5750409AF0F1F088234AF058
+:1044C000EE0FFF1FBB1F661F771F881F91505040C4
+:1044D000A9F79E3F510580F00C9483220C94102282
+:1044E0005F3FE4F3983ED4F3869577956795B7954B
+:1044F000F795E7959F5FC1F7FE2B880F911D969565
+:10450000879597F9089597F99F6780E870E060E0D4
+:1045100008959FEF80EC089500240A94161617065C
+:1045200018060906089500240A94121613061406A4
+:1045300005060895092E0394000C11F4882352F007
+:10454000BB0F40F4BF2B11F460FF04C06F5F7F4FBF
+:104550008F4F9F4F089597FB072E16F4009407D0B6
+:1045600077FD09D00E94C52207FC05D03EF4909546
+:1045700081959F4F0895709561957F4F0895EE0F37
+:10458000FF1F0590F491E02D0994AA1BBB1B51E17C
+:1045900007C0AA1FBB1FA617B70710F0A61BB70BB3
+:1045A000881F991F5A95A9F780959095BC01CD0158
+:1045B0000895F999FECF92BD81BDF89A992780B5EB
+:1045C0000895A8E1B0E042E050E00C94FC22262FD0
+:1045D000F999FECF1FBA92BD81BD20BD0FB6F894E8
+:1045E000FA9AF99A0FBE019608950E94E722272FA2
+:1045F0000C94E822DC01CB01FC01F999FECF06C046
+:10460000F2BDE1BDF89A319600B40D924150504090
+:08461000B8F70895F894FFCFFC
+:1046180020023507C307A0076C0738070101BA0154
+:1046280028080A03140A3F4D36394B04FE03C80311
+:104638008F0322033B0354036D03010203040506A1
+:044648000708090056
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout0.png b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout0.png
new file mode 100644
index 000000000..6a36f9bfa
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout0.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout1.png b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout1.png
new file mode 100644
index 000000000..c6e6d913c
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout1.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout2.png b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout2.png
new file mode 100644
index 000000000..23f56ff4c
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keyboard-layout2.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keymap.c b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keymap.c
new file mode 100644
index 000000000..82f55b4bc
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/dvorak_intl_squisher/keymap.c
@@ -0,0 +1,185 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | = | 1 | 2 | 3 | 4 | 5 | BrBck| | Play | 6 | 7 | 8 | 9 | 0 | \ / L2 |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Esc | ' | , | . | P | Y | Del | | Ins | F | G | C | R | L | / |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | BkSp | A | O | E | U | I |------| |------| D | H | T | N | S | - |
+ * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
+ * | LShift |:/Ctrl| Q | J | K | X | | | | B | M | W | V |Z/Ctrl| RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |Grv/L1| LAlt | LGui | Left | Right| | Up | Down | [ | ] | ~L1 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,---------------.
+ * | App | L1 | | L2 |PrntScr |
+ * ,------|------|------| |------+--------+------.
+ * | | | Home | | PgUp | | |
+ * | Space| Tab |------| |------| AltShf |Enter |
+ * | | | End | | PgDn | | |
+ * `--------------------' `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_WBAK,
+ KC_ESC, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_DELT,
+ KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I,
+ KC_LSFT, CTL_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, ALL_T(KC_NO),
+ LT(SYMB,KC_GRV),KC_LALT, KC_LGUI, KC_LEFT,KC_RGHT,
+ CTL_T(KC_APP), TG(1),
+ KC_HOME,
+ KC_SPC,KC_TAB,KC_END,
+ // right hand
+ KC_MPLY, KC_6, KC_7, KC_8, KC_9, KC_0, LT(MDIA, KC_BSLS),
+ KC_INS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
+ KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
+ MEH_T(KC_NO),KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z), KC_RSFT,
+ KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
+ TG(2), KC_PSCREEN,
+ KC_PGUP,
+ KC_PGDN,RALT(KC_RSFT), KC_ENT
+ ),
+/* Keymap 1: Symbol & Media Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | Prev | Next | | | . | 0 | = | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | |VolUp | | |
+ * | | |------| |------| Mute | |
+ * | | | | |VolDn | | |
+ * `--------------------' `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+ // left hand
+ KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
+ KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+ KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+ KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_MPRV,KC_MNXT,
+ KC_TRNS,KC_TRNS,
+ KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,
+ // right hand
+ KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
+ KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
+ KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
+ KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_VOLU,
+ KC_VOLD, KC_MUTE, KC_TRNS
+),
+/* Keymap 2: QWERTY Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | Q | W | E | R | T | | | | Y | U | I | O | P | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | A | S | D | F | G |------| |------| H | J | K | L | ; | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// MEDIA AND MOUSE
+KEYMAP( // layer 0 : default
+ // left hand
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS,
+ KC_TRNS, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_TRNS, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ // right hand
+ KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS,
+ KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),KC_TRNS,
+ KC_TRNS, KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ // TODO: Make this relevant to the ErgoDox EZ.
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ default:
+ // none
+ break;
+ }
+
+};
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
new file mode 100644
index 000000000..7076a6ecb
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
@@ -0,0 +1,710 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""Compiler for keymap.c files
+
+This scrip will generate a keymap.c file from a simple
+markdown file with a specific layout.
+
+Usage:
+ python compile_keymap.py INPUT_PATH [OUTPUT_PATH]
+"""
+from __future__ import division
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import os
+import io
+import re
+import sys
+import json
+import unicodedata
+import collections
+import itertools as it
+
+PY2 = sys.version_info.major == 2
+
+if PY2:
+ chr = unichr
+
+
+KEYBOARD_LAYOUTS = {
+ # These map positions in the parsed layout to
+ # positions in the KEYMAP MATRIX
+ 'ergodox_ez': [
+ [ 0, 1, 2, 3, 4, 5, 6], [38, 39, 40, 41, 42, 43, 44],
+ [ 7, 8, 9, 10, 11, 12, 13], [45, 46, 47, 48, 49, 50, 51],
+ [14, 15, 16, 17, 18, 19 ], [ 52, 53, 54, 55, 56, 57],
+ [20, 21, 22, 23, 24, 25, 26], [58, 59, 60, 61, 62, 63, 64],
+ [27, 28, 29, 30, 31 ], [ 65, 66, 67, 68, 69],
+ [ 32, 33], [70, 71 ],
+ [ 34], [72 ],
+ [ 35, 36, 37], [73, 74, 75 ],
+ ]
+}
+
+ROW_INDENTS = {
+ 'ergodox_ez': [0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 5, 0, 6, 0, 4, 0]
+}
+
+BLANK_LAYOUTS = [
+# Compact Layout
+"""
+.------------------------------------.------------------------------------.
+| | | | | | | | | | | | | | |
+!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+| | | | | | | | | | | | | | |
+!-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+| | | | | | |-----!-----! | | | | | |
+!-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+| | | | | | | | | | | | | | |
+'-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+""",
+
+# Wide Layout
+"""
+.---------------------------------------------. .---------------------------------------------.
+| | | | | | | | ! | | | | | | |
+!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
+| | | | | | | | ! | | | | | | |
+!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
+| | | | | | |-------! !-------! | | | | | |
+!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
+| | | | | | | | ! | | | | | | |
+'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
+ | | | | | | ! | | | | |
+ '------------------------------' '------------------------------'
+ .---------------. .---------------.
+ | | | ! | |
+ .-------+-------+-------! !-------+-------+-------.
+ ! ! | | ! | ! !
+ ! ! !-------! !-------! ! !
+ | | | | ! | | |
+ '-----------------------' '-----------------------'
+""",
+]
+
+
+DEFAULT_CONFIG = {
+ "keymaps_includes": [
+ "keymap_common.h",
+ ],
+ 'filler': "-+.'!:x",
+ 'separator': "|",
+ 'default_key_prefix': ["KC_"],
+}
+
+
+SECTIONS = [
+ 'layout_config',
+ 'layers',
+]
+
+
+# Markdown Parsing
+
+ONELINE_COMMENT_RE = re.compile(r"""
+ ^ # comment must be at the start of the line
+ \s* # arbitrary whitespace
+ // # start of the comment
+ (.*) # the comment
+ $ # until the end of line
+""", re.MULTILINE | re.VERBOSE
+)
+
+INLINE_COMMENT_RE = re.compile(r"""
+ ([\,\"\[\]\{\}\d]) # anythig that might end a expression
+ \s+ # comment must be preceded by whitespace
+ // # start of the comment
+ \s # and succeded by whitespace
+ (?:[^\"\]\}\{\[]*) # the comment (except things which might be json)
+ $ # until the end of line
+""", re.MULTILINE | re.VERBOSE)
+
+TRAILING_COMMA_RE = re.compile(r"""
+ , # the comma
+ (?:\s*) # arbitrary whitespace
+ $ # only works if the trailing comma is followed by newline
+ (\s*) # arbitrary whitespace
+ ([\]\}]) # end of an array or object
+""", re.MULTILINE | re.VERBOSE)
+
+
+def loads(raw_data):
+ if isinstance(raw_data, bytes):
+ raw_data = raw_data.decode('utf-8')
+
+ raw_data = ONELINE_COMMENT_RE.sub(r"", raw_data)
+ raw_data = INLINE_COMMENT_RE.sub(r"\1", raw_data)
+ raw_data = TRAILING_COMMA_RE.sub(r"\1\2", raw_data)
+ return json.loads(raw_data)
+
+
+def parse_config(path):
+ def reset_section():
+ section.update({
+ 'name': section.get('name', ""),
+ 'sub_name': "",
+ 'start_line': -1,
+ 'end_line': -1,
+ 'code_lines': [],
+ })
+
+ def start_section(line_index, line):
+ end_section()
+ if line.startswith("# "):
+ name = line[2:]
+ elif line.startswith("## "):
+ name = line[3:]
+ else:
+ name = ""
+
+ name = name.strip().replace(" ", "_").lower()
+ if name in SECTIONS:
+ section['name'] = name
+ else:
+ section['sub_name'] = name
+ section['start_line'] = line_index
+
+ def end_section():
+ if section['start_line'] >= 0:
+ if section['name'] == 'layout_config':
+ config.update(loads("\n".join(
+ section['code_lines']
+ )))
+ elif section['sub_name'].startswith('layer'):
+ layer_name = section['sub_name']
+ config['layer_lines'][layer_name] = section['code_lines']
+
+ reset_section()
+
+ def amend_section(line_index, line):
+ section['end_line'] = line_index
+ section['code_lines'].append(line)
+
+ config = DEFAULT_CONFIG.copy()
+ config.update({
+ 'layer_lines': collections.OrderedDict(),
+ 'macro_ids': {'UM'},
+ 'unicode_macros': {},
+ })
+
+ section = {}
+ reset_section()
+
+ with io.open(path, encoding="utf-8") as fh:
+ for i, line in enumerate(fh):
+ if line.startswith("#"):
+ start_section(i, line)
+ elif line.startswith(" "):
+ amend_section(i, line[4:])
+ else:
+ # TODO: maybe parse description
+ pass
+
+ end_section()
+ assert 'layout' in config
+ return config
+
+# header file parsing
+
+IF0_RE = re.compile(r"""
+ ^
+ #if 0
+ $.*?
+ #endif
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+COMMENT_RE = re.compile(r"""
+ /\*
+ .*?
+ \*/"
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+def read_header_file(path):
+ with io.open(path, encoding="utf-8") as fh:
+ data = fh.read()
+ data, _ = COMMENT_RE.subn("", data)
+ data, _ = IF0_RE.subn("", data)
+ return data
+
+
+def regex_partial(re_str_fmt, flags):
+ def partial(*args, **kwargs):
+ re_str = re_str_fmt.format(*args, **kwargs)
+ return re.compile(re_str, flags)
+ return partial
+
+
+KEYDEF_REP = regex_partial(r"""
+ #define
+ \s
+ (
+ (?:{}) # the prefixes
+ (?:\w+) # the key name
+ ) # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+ENUM_RE = re.compile(r"""
+ (
+ enum
+ \s\w+\s
+ \{
+ .*? # the enum content
+ \}
+ ;
+ ) # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+ENUM_KEY_REP = regex_partial(r"""
+ (
+ {} # the prefixes
+ \w+ # the key name
+ ) # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+def parse_keydefs(config, data):
+ prefix_options = "|".join(config['key_prefixes'])
+ keydef_re = KEYDEF_REP(prefix_options)
+ enum_key_re = ENUM_KEY_REP(prefix_options)
+ for match in keydef_re.finditer(data):
+ yield match.groups()[0]
+
+ for enum_match in ENUM_RE.finditer(data):
+ enum = enum_match.groups()[0]
+ for key_match in enum_key_re.finditer(enum):
+ yield key_match.groups()[0]
+
+
+def parse_valid_keys(config, out_path):
+ basepath = os.path.abspath(os.path.join(os.path.dirname(out_path)))
+ dirpaths = []
+ subpaths = []
+ while len(subpaths) < 6:
+ path = os.path.join(basepath, *subpaths)
+ dirpaths.append(path)
+ dirpaths.append(os.path.join(path, "tmk_core", "common"))
+ dirpaths.append(os.path.join(path, "quantum"))
+ subpaths.append('..')
+
+ includes = set(config['keymaps_includes'])
+ includes.add("keycode.h")
+
+ valid_keycodes = set()
+ for dirpath, include in it.product(dirpaths, includes):
+ include_path = os.path.join(dirpath, include)
+ if os.path.exists(include_path):
+ header_data = read_header_file(include_path)
+ valid_keycodes.update(
+ parse_keydefs(config, header_data)
+ )
+ return valid_keycodes
+
+
+# Keymap Parsing
+
+def iter_raw_codes(layer_lines, filler, separator):
+ filler_re = re.compile("[" + filler + " ]")
+ for line in layer_lines:
+ line, _ = filler_re.subn("", line.strip())
+ if not line:
+ continue
+ codes = line.split(separator)
+ for code in codes[1:-1]:
+ yield code
+
+
+def iter_indexed_codes(raw_codes, key_indexes):
+ key_rows = {}
+ key_indexes_flat = []
+
+ for row_index, key_indexes in enumerate(key_indexes):
+ for key_index in key_indexes:
+ key_rows[key_index] = row_index
+ key_indexes_flat.extend(key_indexes)
+ assert len(raw_codes) == len(key_indexes_flat)
+ for raw_code, key_index in zip(raw_codes, key_indexes_flat):
+ # we keep track of the row mostly for layout purposes
+ yield raw_code, key_index, key_rows[key_index]
+
+
+LAYER_CHANGE_RE = re.compile(r"""
+ (DF|TG|MO)\(\d+\)
+""", re.VERBOSE)
+
+
+MACRO_RE = re.compile(r"""
+ M\(\w+\)
+""", re.VERBOSE)
+
+
+UNICODE_RE = re.compile(r"""
+ U[0-9A-F]{4}
+""", re.VERBOSE)
+
+
+NON_CODE = re.compile(r"""
+ ^[^A-Z0-9_]$
+""", re.VERBOSE)
+
+
+def parse_uni_code(raw_code):
+ macro_id = "UC_" + (
+ unicodedata.name(raw_code)
+ .replace(" ", "_")
+ .replace("-", "_")
+ )
+ code = "M({})".format(macro_id)
+ uc_hex = "{:04X}".format(ord(raw_code))
+ return code, macro_id, uc_hex
+
+
+def parse_key_code(raw_code, key_prefixes, valid_keycodes):
+ if raw_code in valid_keycodes:
+ return raw_code
+
+ for prefix in key_prefixes:
+ code = prefix + raw_code
+ if code in valid_keycodes:
+ return code
+
+
+def parse_code(raw_code, key_prefixes, valid_keycodes):
+ if not raw_code:
+ return 'KC_TRNS', None, None
+
+ if LAYER_CHANGE_RE.match(raw_code):
+ return raw_code, None, None
+
+ if MACRO_RE.match(raw_code):
+ macro_id = raw_code[2:-1]
+ return raw_code, macro_id, None
+
+ if UNICODE_RE.match(raw_code):
+ hex_code = raw_code[1:]
+ return parse_uni_code(chr(int(hex_code, 16)))
+
+ if NON_CODE.match(raw_code):
+ return parse_uni_code(raw_code)
+
+ code = parse_key_code(raw_code, key_prefixes, valid_keycodes)
+ return code, None, None
+
+
+def parse_keymap(config, key_indexes, layer_lines, valid_keycodes):
+ keymap = {}
+ raw_codes = list(iter_raw_codes(
+ layer_lines, config['filler'], config['separator']
+ ))
+ indexed_codes = iter_indexed_codes(raw_codes, key_indexes)
+ key_prefixes = config['key_prefixes']
+ for raw_code, key_index, row_index in indexed_codes:
+ code, macro_id, uc_hex = parse_code(
+ raw_code, key_prefixes, valid_keycodes
+ )
+ # TODO: line numbers for invalid codes
+ err_msg = "Could not parse key '{}' on row {}".format(
+ raw_code, row_index
+ )
+ assert code is not None, err_msg
+ # print(repr(raw_code), repr(code), macro_id, uc_hex)
+ if macro_id:
+ config['macro_ids'].add(macro_id)
+ if uc_hex:
+ config['unicode_macros'][macro_id] = uc_hex
+ keymap[key_index] = (code, row_index)
+ return keymap
+
+
+def parse_keymaps(config, valid_keycodes):
+ keymaps = collections.OrderedDict()
+ key_indexes = config.get(
+ 'key_indexes', KEYBOARD_LAYOUTS[config['layout']]
+ )
+ # TODO: maybe validate key_indexes
+
+ for layer_name, layer_lines, in config['layer_lines'].items():
+ keymaps[layer_name] = parse_keymap(
+ config, key_indexes, layer_lines, valid_keycodes
+ )
+ return keymaps
+
+# keymap.c output
+
+USERCODE = """
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case L1:
+ ergodox_right_led_1_on();
+ break;
+ case L2:
+ ergodox_right_led_2_on();
+ break;
+ case L3:
+ ergodox_right_led_3_on();
+ break;
+ case L4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ break;
+ case L5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ // case L6:
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ // case L7:
+ // ergodox_right_led_1_on();
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ default:
+ ergodox_board_led_off();
+ break;
+ }
+};
+"""
+
+MACROCODE = """
+#define UC_MODE_WIN 0
+#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+
+// TODO: allow default mode to be configured
+static uint16_t unicode_mode = UC_MODE_WIN;
+
+uint16_t hextokeycode(uint8_t hex) {{
+ if (hex == 0x0) {{
+ return KC_P0;
+ }}
+ if (hex < 0xA) {{
+ return KC_P1 + (hex - 0x1);
+ }}
+ return KC_A + (hex - 0xA);
+}}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {{
+ switch (unicode_mode) {{
+ case UC_MODE_WIN:
+ register_code(KC_LALT);
+
+ register_code(KC_PPLS);
+ unregister_code(KC_PPLS);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LALT);
+ break;
+ case UC_MODE_LINUX:
+ register_code(KC_LCTL);
+ register_code(KC_LSFT);
+
+ register_code(KC_U);
+ unregister_code(KC_U);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LCTL);
+ unregister_code(KC_LSFT);
+ break;
+ case UC_MODE_OSX:
+ break;
+ }}
+}}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{
+ if (!record->event.pressed) {{
+ return MACRO_NONE;
+ }}
+ // MACRODOWN only works in this function
+ switch(id) {{
+ case UM:
+ unicode_mode = (unicode_mode + 1) % 2;
+ break;
+{macro_cases}
+{unicode_macro_cases}
+ default:
+ break;
+ }}
+ return MACRO_NONE;
+}};
+"""
+
+
+UNICODE_MACRO_TEMPLATE = """
+case {macro_id}:
+ unicode_action_function(0x{hi:02x}, 0x{lo:02x});
+ break;
+""".strip()
+
+
+def unicode_macro_cases(config):
+ for macro_id, uc_hex in config['unicode_macros'].items():
+ hi = int(uc_hex, 16) >> 8
+ lo = int(uc_hex, 16) & 0xFF
+ unimacro_keys = ", ".join(
+ "T({})".format(
+ "KP_" + digit if digit.isdigit() else digit
+ ) for digit in uc_hex
+ )
+ yield UNICODE_MACRO_TEMPLATE.format(
+ macro_id=macro_id, hi=hi, lo=lo
+ )
+
+
+def iter_keymap_lines(keymap, row_indents=None):
+ col_widths = {}
+ col = 0
+ # first pass, figure out the column widths
+ prev_row_index = None
+ for code, row_index in keymap.values():
+ if row_index != prev_row_index:
+ col = 0
+ if row_indents:
+ col = row_indents[row_index]
+ col_widths[col] = max(len(code), col_widths.get(col, 0))
+ prev_row_index = row_index
+ col += 1
+
+ # second pass, yield the cell values
+ col = 0
+ prev_row_index = None
+ for key_index in sorted(keymap):
+ code, row_index = keymap[key_index]
+ if row_index != prev_row_index:
+ col = 0
+ yield "\n"
+ if row_indents:
+ for indent_col in range(row_indents[row_index]):
+ pad = " " * (col_widths[indent_col] - 4)
+ yield (" /*-*/" + pad)
+ col = row_indents[row_index]
+ else:
+ yield pad
+ yield " {}".format(code)
+ if key_index < len(keymap) - 1:
+ yield ","
+ # This will be yielded on the next iteration when
+ # we know that we're not at the end of a line.
+ pad = " " * (col_widths[col] - len(code))
+ prev_row_index = row_index
+ col += 1
+
+
+def iter_keymap_parts(config, keymaps):
+ # includes
+ for include_path in config['keymaps_includes']:
+ yield '#include "{}"\n'.format(include_path)
+
+ yield "\n"
+
+ # definitions
+ for i, macro_id in enumerate(sorted(config['macro_ids'])):
+ yield "#define {} {}\n".format(macro_id, i)
+
+ yield "\n"
+
+ for i, layer_name in enumerate(config['layer_lines']):
+ yield '#define L{0:<3} {0:<5} // {1}\n'.format(i, layer_name)
+
+ yield "\n"
+
+ # keymaps
+ yield "const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n"
+
+ for i, layer_name in enumerate(config['layer_lines']):
+ # comment
+ layer_lines = config['layer_lines'][layer_name]
+ prefixed_lines = " * " + " * ".join(layer_lines)
+ yield "/*\n{} */\n".format(prefixed_lines)
+
+ # keymap codes
+ keymap = keymaps[layer_name]
+ row_indents = ROW_INDENTS.get(config['layout'])
+ keymap_lines = "".join(iter_keymap_lines(keymap, row_indents))
+ yield "[L{0}] = KEYMAP({1}\n),\n".format(i, keymap_lines)
+
+ yield "};\n\n"
+
+ # no idea what this is for
+ yield "const uint16_t PROGMEM fn_actions[] = {};\n"
+
+ # macros
+ yield MACROCODE.format(
+ macro_cases="",
+ unicode_macro_cases="\n".join(unicode_macro_cases(config)),
+ )
+
+ # TODO: dynamically create blinking lights
+ yield USERCODE
+
+
+def main(argv=sys.argv[1:]):
+ if not argv or '-h' in argv or '--help' in argv:
+ print(__doc__)
+ return 0
+
+ in_path = os.path.abspath(argv[0])
+ if not os.path.exists(in_path):
+ print("No such file '{}'".format(in_path))
+ return 1
+
+ if len(argv) > 1:
+ out_path = os.path.abspath(argv[1])
+ else:
+ dirname = os.path.dirname(in_path)
+ out_path = os.path.join(dirname, "keymap.c")
+
+ config = parse_config(in_path)
+ valid_keys = parse_valid_keys(config, out_path)
+ keymaps = parse_keymaps(config, valid_keys)
+
+ with io.open(out_path, mode="w", encoding="utf-8") as fh:
+ for part in iter_keymap_parts(config, keymaps):
+ fh.write(part)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex
new file mode 100644
index 000000000..ee1d30967
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex
@@ -0,0 +1,1240 @@
+:100000000C9412040C9456040C9456040C9456044C
+:100010000C9456040C9456040C9456040C945604F8
+:100020000C9456040C9456040C944F0F0C9421100D
+:100030000C9456040C9456040C9456040C945604D8
+:100040000C9456040C94D6240C9456040C94560428
+:100050000C9456040C94751E0C9456040C9456047F
+:100060000C9456040C9456040C9456040C945604A8
+:100070000C9456040C9456040C9456040C94560498
+:100080000C9456040C9456040C9456040C94560488
+:100090000C9456040C9456040C9456040C94560478
+:1000A0000C9456040C9456040C945604A305700545
+:1000B0005B05B505DC050F06F105F7050C063A06EC
+:1000C0002F06FA0532064605EB0523062C066D05BC
+:1000D0006405B205A905910567052605BE05140648
+:1000E0001D0629069705C705A60540051A06E5055C
+:1000F00088059D0594057C0520068B053105E805DE
+:100100008205C1052005AC055E054C057605730525
+:10011000CA059A05060637058505AF052305B80506
+:1001200003060906D3055505EE0543056A054F0587
+:10013000C405F40535062905A005BB05FD05CD055B
+:1001400052052606E2053D058E055805D9056105CF
+:1001500000063A05D005DF052C0549053F061706C0
+:1001600079053405D6057F0514058610A81093116E
+:10017000A8109311EA100D119311621175116E14EC
+:100180006E149C149C14DE141A151A171A173215C3
+:100190001A1729162916F4161A171A1708170552CE
+:1001A000045201520352010000001E001B001800FF
+:1001B0002F00010029001F0013000C003300E30092
+:1001C000E1002000090004003400E2002A002100C0
+:1001D0001A0008000600E000650022000A00120074
+:1001E0001900000049002E004A0000004D000000E8
+:1001F00002542E02025400002B0000005E30230047
+:100200000B001600050000004C0024000D0011003A
+:100210001000E4004B0025000E0015003600E6003B
+:100220002C0026000F001700370050002800270080
+:1002300014000700520051004E0035001C002D0034
+:100240001D004F000000010001000100010001003D
+:1002500000001E02300238020100010001001F02EE
+:10026000641438003000010001002002240223023F
+:1002700027020100010001002414251401000100DF
+:1002800001000100271426140100000001000100F4
+:100290000100000001000000010001000100000059
+:1002A0000100000001000100310021022D140000B6
+:1002B000010001006400250222020100010001008A
+:1002C0006402260236020100010001000100301420
+:1002D00037023830010035021F023102553002303A
+:1002E0000100010001002D0201003D30000001006D
+:1002F000010001000100010000003A0001000100BE
+:100300000100010001003B000100010001000100AB
+:1003100001003C00010001000100010001003D005E
+:10032000010001000100010001003E000100010088
+:100330000100000001004400010000000100000075
+:1003400001004500010000005300000001003F00D3
+:100350000100010001000000010040005F005C009E
+:10036000590062000100410060005D005A008500F4
+:100370000100420061005E005B0063000100430079
+:100380005500560057005800010067005400560001
+:1003900057005800000001000100010001000100A9
+:1003A00000004D30393001005B3001000100513058
+:1003B00058303C303B300100010050300130141403
+:1003C0005D30010001004A30593008145C300100F2
+:1003D0000100493057300430003000000100053082
+:1003E0000100000001000000010001000100000008
+:1003F0000100000001004F305A3037301E0200006B
+:1004000001004E3001004B30010001000100483076
+:10041000563054305330010001004C30010003309D
+:100420003A300100010052300100010001000100DA
+:1004300001000100010001000100010000000100B5
+:100440000100010001000100000042302030343082
+:1004500001000100010046302E302630333001000B
+:10046000010045302D301E300100010001004030F8
+:100470002B3022300100010001003F3025302C30AC
+:100480000100000001000100010000000100000067
+:1004900001000100010000000100000001004430E3
+:1004A000233031301F3000000100433035302A3016
+:1004B0002930010001003E302730303001000100BA
+:1004C0000100413028303230010001000100473086
+:1004D000010021300100010001000100363024300C
+:1004E0002F300100000001000100010001000100A7
+:1004F0000000010008301B30010001000100010074
+:1005000015300D301A3001000100010014300630A2
+:10051000010001000100010012300A300100010059
+:10052000010001000C301330010000000100010047
+:1005300001000000010000000100010001000000B6
+:1005400001000000010001000B30183007300000EE
+:10055000010001001C3011301030010001000100C9
+:100560000E30173001000100010001000F3019307A
+:10057000010001000100010001000930010001003B
+:10058000010001001D3001001630010000000100D3
+:100590000100010001000100000001000100010054
+:1005A0000100010001000100010001000100010043
+:1005B0000100010001000100010001000100010033
+:1005C0000100010001000100010001000100010023
+:1005D0000100000001000100010000000100000016
+:1005E0000100010001000000010000000100010005
+:1005F00001000100010000000100010001000100F4
+:1006000001000100010001000100010001000100E2
+:1006100001000100010001000100010001000100D2
+:1006200001000100010001000100010001000100C2
+:1006300001000100000016034500720067006F0012
+:1006400044006F007800200045005A0000001603A7
+:100650004500720067006F0044006F0078002000C2
+:1006600045005A0000000403090409026D0004015A
+:1006700000A0FA0904000001030101000921110191
+:100680000001223F000705810308000A0904010058
+:100690000103010200092111010001224D0007059B
+:1006A000820308000A090402000103000000092176
+:1006B000110100012236000705830308000A09041E
+:1006C000030001030000000921110100012239008B
+:1006D000070584031000011201100100000008ED5D
+:1006E000FE071301000102000105010906A1010531
+:1006F0000719E029E7150025019508750181020514
+:100700000819012905950575019102950175039157
+:1007100001050719002977150025019578750181D4
+:1007200002C005010980A101850216010026B7005B
+:100730001A01002AB700751095018100C0050C0947
+:1007400001A1018503160100269C021A01002A9CC2
+:1007500002751095018100C005010902A10109017E
+:10076000A100050919012905150025019505750147
+:100770008102950175038101050109300931158157
+:10078000257F95027508810609381581257F950119
+:1007900075088106050C0A38021581257F950175BB
+:1007A000088106C0C005010906A101050719E02955
+:1007B000E7150025019508750181029501750881ED
+:1007C0000105081901290595057501910295017525
+:1007D0000391010507190029FF150025FF950675EE
+:1007E000088100C0000000000000000000000001BF
+:1007F0000204060A0F17202C3A4A5D71879DB3C781
+:10080000DAE9F5FCFFFCF5E9DAC7B39D87715D4ACB
+:100810003A2C20170F0A0604020100000000000015
+:100820000000000011241FBECFEFDAE0DEBFCDBF15
+:1008300004B603FE24C08091F1019091F201A091D1
+:10084000F301B091F4018730904BA740B04BB9F45D
+:100850001092F1011092F2011092F3011092F40142
+:1008600014BE84B7877F84BF88E10FB6F894809365
+:100870006000109260000FBEE0E0FFE3099511E018
+:10088000A0E0B1E0E0E3FDE402C005900D92A433E6
+:10089000B107D9F711E0A4E3B1E001C01D92A13F77
+:1008A000B107E1F70E94950C0C9496260C94000079
+:1008B000282F882341F090E02A3018F4885A9F4F5F
+:1008C00008950697089582E690E008950F931F9388
+:1008D000CF93DF938C01EB0180913401909135012E
+:1008E000009709F448C0019709F089C080EE0E9482
+:1008F000F71281EE0E94F71288E10E94F71288E158
+:100900000E94BF13C801807F992724E096958795A0
+:100910002A95E1F70E945804182F0E94F712812FA0
+:100920000E94BF13802F8F700E945804182F0E94BE
+:10093000F712812F0E94BF13CE01807F992734E0E8
+:10094000969587953A95E1F70E945804D82F0E9412
+:10095000F7128D2F0E94BF138C2F8F700E945804A6
+:10096000C82F0E94F7128C2F0E94BF1380EE0E94A6
+:10097000BF1381EE3EC082EE0E94F71287E50E940F
+:10098000F71287E50E94BF13C801807F992744E0D2
+:10099000969587954A95E1F70E945804182F0E9472
+:1009A000F712812F0E94BF13802F8F700E9458046E
+:1009B000182F0E94F712812F0E94BF13CE01807F53
+:1009C000992754E0969587955A95E1F70E94580427
+:1009D000D82F0E94F7128D2F0E94BF138C2F8F707B
+:1009E0000E945804C82F0E94F7128C2F0E94BF1338
+:1009F00082EEDF91CF911F910F910C94BF13DF9185
+:100A0000CF911F910F910895FC018281882309F4F1
+:100A10003CC1862F90E08F35910508F036C1FC016E
+:100A2000EA5AFF4F0C944B26809134019091350186
+:100A3000019681709927909335018093340125C1E7
+:100A40006FEB70E019C160E970E008C061EA70E026
+:100A500013C163E870E00BC16BE570E081E290E0E8
+:100A600012C16BEB70E008C163E570E0F7CF6EEB8D
+:100A700070E002C164E070E0D4C069EB70E001C1D5
+:100A800062EB70E0F9C065E870E0F1C069E970E020
+:100A9000F3C065E570E0E2CF68EC70E0EDC069E8B6
+:100AA00070E0E5C064E770E0E2C062E970E0D6CFD4
+:100AB00066E770E0DCC063E970E0D0CF60EC70E026
+:100AC000DBC062EB70E0DDC069EA70E0D5C068EAC7
+:100AD00070E0D2C064E870E0CAC06DE970E0CCC0DC
+:100AE00067EF70E0CEC063EC70E0C6C061EC70E010
+:100AF000C3C069E570E0B2CF63EB70E0BDC064E5F0
+:100B000070E0ACCF6DEB70E0B7C066EB70E0B4C0E6
+:100B100065EB70E0B1C06AEB70E0AEC067E770E013
+:100B2000A6C060EA70E0A8C062EC70E0A5C06EE903
+:100B300070E0A2C068EB70E09FC067EB70E09CC003
+:100B400062E870E094C063E470E06BC061EB70E059
+:100B500093C066EA70E090C066EC70E08DC06EE114
+:100B600070E05FC06FE970E087C068E070E059C076
+:100B700067ED70E086C060E870E079C063EA70E01D
+:100B80007BC069EC70E078C061E870E070C066E935
+:100B900070E072C064EC70E06FC065E770E067C041
+:100BA00063E070E03EC061EB70E06BC06EEB70E044
+:100BB00068C063EB70E065C065E070E032C061E979
+:100BC00070E04CCF69E770E052C064EB70E054C055
+:100BD0006CEB70E051C06AE970E04EC068E870E00C
+:100BE00046C061E970E048C067E870E040C062E973
+:100BF00070E042C067E970E03FC068E770E037C06E
+:100C000060E770E034C069E070E00BC065EC70E054
+:100C100033C060E670E005C067EA70E02DC060E0B8
+:100C200070E082E290E02FC064EA70E025C06CEBD7
+:100C300070E027C067EC70E01FC068E970E01CC07E
+:100C400069EB70E019C06BE970E016C06FE770E007
+:100C50000EC065EA70E010C06CE970E00DC065E997
+:100C600070E00AC063E970E007C066E870E080E207
+:100C700090E009C064E970E083E090E004C06DEBAF
+:100C800070E080E090E00E94660480E090E00895CB
+:100C900008956091B3017091B4018091B501909174
+:100CA000B6010E94A11D56985E9825982D98269809
+:100CB0002E9827982F988330A9F028F4813051F08E
+:100CC000823069F012C0843041F0853071F4259A89
+:100CD0002D9A08C0259A2D9A0895259A2D9A269A1C
+:100CE0002E9A0895279A2F9A089556985E980895F7
+:100CF0000C94490656985E9825982D9826982E981B
+:100D000027982F988FEF90E0909389008093880028
+:100D100090938B0080938A0090938D0080938C0039
+:100D2000259A2D9A2FEF80E792E021508040904045
+:100D3000E1F700C00000269A2E9A2FEF80E792E09C
+:100D4000215080409040E1F700C00000279A2F9A80
+:100D50002FEF80E792E0215080409040E1F700C003
+:100D6000000025982D982FEF80E792E021508040D9
+:100D70009040E1F700C0000026982E982FEF80E702
+:100D800092E0215080409040E1F700C00000279899
+:100D90002F9856985E9825982D9826982E982798E3
+:100DA0002F98089589EA8093800089E080938100DC
+:100DB00024982C983F988AB18F748AB96E98479A74
+:100DC0008BB1806B8BB9769A0E947A060C94480698
+:100DD00080E2809300018091360181110EC00E9453
+:100DE000370781E0809336012FEF83ED90E32150A8
+:100DF00080409040E1F700C0000080E40E943D0781
+:100E00008093000181112EC00E946707809300012A
+:100E1000811128C00E94670780930001811122C0C0
+:100E20008FE30E9467078093000181111BC00E941D
+:100E30005F0780E40E943D0780930001811112C08A
+:100E40008CE00E9467078093000181110BC00E9413
+:100E5000670780930001811105C08FE30E94670737
+:100E6000809300010E945F07809100010895109215
+:100E7000B9008AE08093B800089594EA9093BC008A
+:100E80009091BC0097FFFCCF9091B900987F98306B
+:100E900021F0903111F081E008958093BB0084E847
+:100EA0008093BC008091BC0087FFFCCF8091B9008B
+:100EB000887F883111F0803471F780E0089584E9EB
+:100EC0008093BC008091BC0084FDFCCF089580938A
+:100ED000BB0084E88093BC008091BC0087FFFCCFFE
+:100EE0009091B900987F81E0983209F480E00895EC
+:100EF00084E88093BC008091BC0087FFFCCF809188
+:100F0000BB00089580910001811115C080E40E940A
+:100F10003D078093000181110CC082E10E946707A8
+:100F200080930001811105C08FEF0E9467078093B5
+:100F300000010E945F0784B1807F84B985B1807F02
+:100F400085B98AB1837F8AB98BB1837F8BB93E988B
+:100F5000469808950E94E806809300010E94820747
+:100F600080B38C7080BB81B3836F81BBE6E4F1E01A
+:100F7000A8E3B1E011921D9281E0E435F807D1F7C2
+:100F80000C94D206BF92CF92DF92EF92FF920F9312
+:100F90001F93CF93DF9380910001882379F0809194
+:100FA00037018F5F80933701811108C00E94E806E6
+:100FB00080930001811102C00E947A0608E311E0CB
+:100FC000C0E0D0E0DD24D39482E0C82EEE24E39488
+:100FD000F12CC73000F580910001811162C080E4DE
+:100FE0000E943D0780930001811112C082E10E949E
+:100FF00067078093000181110BC0C7010C2E01C04F
+:10100000880F0A94EAF780950E9467078093000191
+:101010000E945F0746C0CA30A1F028F4C83059F0DA
+:10102000C93061F005C0CC3089F070F0CD3089F066
+:10103000209A289810C0219A29980DC0229A2A989F
+:101040000AC0239A2B9807C0529A01C0539A5B9802
+:1010500002C03E9A4698E0EAEA95F1F78FB1799995
+:101060005AC092E081708D25892B7C9B02C090E054
+:1010700001C094E0892B7D9B02C090E001C098E004
+:10108000892B7E9B02C090E001C090E1892B9FB12B
+:101090009095991F9927991F9295990F907E892B6A
+:1010A0000FC08091000181114BC080E40E943D0778
+:1010B00080930001882389F1B12C0E945F078B2D5A
+:1010C000F8019081981719F08083C09201010E9465
+:1010D000820721960F5F1F4FCE30D10509F079CFDF
+:1010E00080910101882371F181508093010188234F
+:1010F00039F08FE99FE00197F1F700C0000022C0AE
+:10110000A6E4B1E0E8E3F1E081918D9391E0E6346B
+:10111000F907D1F717C090E0A5CF83E10E946707D8
+:10112000809300018111C8CF81E40E943D07809324
+:1011300000018111C1CF0E947807B82EB094BDCFB5
+:1011400080E0BECF0E94780681E0DF91CF911F91B1
+:101150000F91FF90EF90DF90CF90BF900895E82F10
+:10116000F0E0EA5BFE4F8081089508958B3B910586
+:1011700078F4883A910540F5853A9105D0F48430A9
+:10118000910508F0B1C08130910509F4ADC06BC084
+:10119000803E910508F467C0883E910508F4A4C01C
+:1011A0009C01205F31092031310508F05CC0906559
+:1011B0000895853A910509F459C0863A910509F4D4
+:1011C00058C083E890E40895883A910509F454C022
+:1011D000893A910509F453C08A3A910509F452C03D
+:1011E0008B3A910509F451C08C3A910509F450C02D
+:1011F0008D3A910509F44FC0803B910509F44EC02A
+:101200008E3A910509F44DC08F3A910509F44CC00E
+:10121000813B910509F44BC0823B910509F44AC01A
+:10122000833B910509F449C0843B910509F448C00A
+:10123000853B910509F447C0863B910509F446C0FA
+:10124000873B910509F445C0883B910509F444C0EA
+:10125000893B910509F443C08A3B910509F042C0DE
+:101260008AE296E4089580E090E0089581E890E4B1
+:10127000089582E890E4089582EE94E4089589EE5A
+:1012800094E408958AEE94E4089585EB94E4089537
+:1012900086EB94E4089587EB94E408958CEC94E451
+:1012A00008958DEC94E4089583E895E408958AE820
+:1012B00095E4089582E995E4089584E995E4089514
+:1012C00081E296E4089583E296E4089584E296E448
+:1012D000089585E296E4089586E296E4089587E20B
+:1012E00096E4089580E094E40895089596E0799F47
+:1012F000F001112494E5899FE00DF11D1124E60F02
+:10130000F11DEE0FFF1FE256FE4F85919491089557
+:10131000880F991F825E9F4FFC01859194910895DB
+:10132000880F991F82569E4FFC01859194910895D4
+:1013300026E0729FF001112444E5849FE00DF11D29
+:101340001124E60FF11DEE0FFF1FE256FE4F25910F
+:101350003491C9019A9581159F4110F4C9010895EE
+:10136000C90190528115904128F4C9019F700E94D3
+:1013700090090895C90190538115904120F4C90145
+:101380009927906C0895211580E5380769F40E942B
+:101390003D179FEF24E34CE0915020404040E1F79F
+:1013A00000C000000C949A1E213080E5380731F40B
+:1013B0008091CF0181608093CF010895C90190553C
+:1013C0008115904108F050C0832F99278F7099277D
+:1013D00081309105D9F4A9014370552702C0880FC7
+:1013E000991F4A95E2F79C68A90164E0440F551FD4
+:1013F0006A95E1F744275370842B952B73E0220FF5
+:10140000331F7A95E1F7207633271DC0823091058E
+:1014100029F4922F8827816F906A0895833091056F
+:10142000A9F4A9014370552781E090E002C0880F1C
+:10143000991F4A95E2F79C6843E0220F331F4A95B3
+:10144000E1F7207E3770822B932B08950497F1F4F7
+:10145000A9014370552781E090E002C0880F991FD1
+:101460004A95E2F79A68E8CFC901905781159041F3
+:1014700020F4C9019F7090620895C90190588115A8
+:10148000904120F4C9019F70906A0895203E310573
+:10149000E0F4203C310558F52133310509F470C0E2
+:1014A00048F42932310509F464C02A32310509F4BF
+:1014B0006EC074C029333105F1F022383105D9F0FE
+:1014C0002533310509F44EC069C0233E310589F149
+:1014D00038F4203E3105C1F0223E3105E1F05EC016
+:1014E000263E310569F1273E3105A9F157C0C901F2
+:1014F0000E94880908958091E20180FD02C081FF69
+:101500004DC080EE90E04BC08091E20180FFF9CFAA
+:1015100089E390E044C08091E20182FF0EC0809197
+:10152000E20184FF03C080E090E039C083EE90E0E8
+:1015300036C08091E20182FFF2CF82EE90E02FC0B0
+:101540008091E20183FF0BC08091E20184FDEBCF2B
+:1015500087EE90E024C08091E20183FFF5CF86EE14
+:1015600090E01DC08091E20185FF07C089E290E014
+:1015700016C08091E20185FFF9CF85E390E00FC0AE
+:101580008091E20186FF07C08AE290E008C0809166
+:10159000E20186FFF9CF81E390E001C0C9010E941A
+:1015A000B608089508950C94D20A809164010895B4
+:1015B000CF93DF9300D01F92CDB7DEB72091E80123
+:1015C000243019F523E029839B838A832093E90043
+:1015D0008FEF9091E800815095FD06C095ED9A95AA
+:1015E000F1F700008111F5CF8091E80085FF0DC073
+:1015F00040E050E063E070E0CE0101960E94420DB1
+:101600008091E8008E778093E8000F900F900F9004
+:10161000DF91CF910895CF93DF9300D01F92CDB784
+:10162000DEB72091E801243021F522E029839B8355
+:101630008A8383E08093E9008FEF9091E8008150E6
+:1016400095FD06C095ED9A95F1F700008111F5CF53
+:101650008091E80085FF0DC040E050E063E070E05D
+:10166000CE0101960E94420D8091E8008E77809312
+:10167000E8000F900F900F90DF91CF910895209187
+:10168000E8012430F1F422E02093E9002FEF3091BB
+:10169000E800215035FD06C035ED3A95F1F7000020
+:1016A0002111F5CF2091E80025FF0BC040E050E06C
+:1016B00065E070E00E94420D8091E8008E77809393
+:1016C000E8000895CF93DF93EC018091E801843026
+:1016D00009F046C090910C019923D9F090910D0129
+:1016E0009923B9F08093E9008FEF9091E800815041
+:1016F00095FD06C095E19A95F1F700008111F5CFAF
+:101700008091E80085FF2CC040E050E060E170E08F
+:1017100017C081E08093E9008FEF9091E80081503D
+:1017200095FD06C095ED9A95F1F700008111F5CF72
+:101730008091E80085FF14C040E050E068E070E070
+:10174000CE010E94420D8091E8008E778093E800E0
+:1017500080E1FE01A4E5B1E001900D928A95E1F7E8
+:10176000DF91CF9108958091E701811109C00E9416
+:10177000D40E0E94310F8091E20084608093E200D9
+:1017800008951092E701089508950C94C3240E94CF
+:10179000311E0E94C9240E94CE110C94D30A42E04B
+:1017A00061EC81E00E944E0E42E061EC82E00E941A
+:1017B0004E0E42E061EC83E00E944E0E42E161EC8D
+:1017C00084E00C944E0E8091EA01833009F455C0F8
+:1017D00030F4813071F0823009F48EC008958A307F
+:1017E00009F47AC08B3009F460C0893009F09CC0DC
+:1017F00020C08091E901813A09F096C08091E8000B
+:10180000877F8093E8008091ED019091EE01892B14
+:1018100021F060E080E090E003C060E184E591E0C9
+:1018200070E00E948B0D8091E8008B778093E80038
+:1018300008958091E901813209F076C08091ED012F
+:101840009091EE01009719F0039709F06DC0809117
+:10185000E800877F8093E8008091E80082FD05C062
+:101860008091E8018111F8CF5FC08091F1008093F1
+:1018700064018091E8008B7753C08091E901813A3F
+:1018800009F052C08091ED019091EE01892B09F091
+:101890004BC08091E800877F8093E8008091E8004A
+:1018A00080FFFCCF80910C0136C08091E90181322C
+:1018B000D9F58091ED019091EE01892BA9F58091E8
+:1018C000E800877F8093E8000E94830E8091EB01FF
+:1018D00080930C010C943D178091E901813221F530
+:1018E0008091E800877F8093E8000E94830E8091BA
+:1018F000EC018093650108958091E901813AA1F49A
+:101900008091E800877F8093E8008091E80080FF65
+:10191000FCCF809165018093F1008091E8008E7783
+:101920008093E8000C94830E089584B7877F84BF6A
+:1019300088E10FB6F89480936000109260000FBEAB
+:1019400090E080E80FB6F894809361009093610076
+:101950000FBE0E941D120E94D40E0E94310F809172
+:10196000E20084608093E20078940E94AC110E94AF
+:101970001F1282E091E00E94C9110E94B12480915F
+:10198000E801853069F40E94F41D8091E601882306
+:10199000B1F30E941C1E882391F30E942C0DEFCFFF
+:1019A0000E942512ECCF292F332723303105A9F0CF
+:1019B0006CF42130310509F442C02230310509F0C0
+:1019C00043C08DE690E02AE636E042C02132310580
+:1019D000C9F02232310519F137C0992781309105BC
+:1019E00041F08230910541F0892B71F5E6E6F6E091
+:1019F00005C0EEE4F6E002C0E6E3F6E0849190E094
+:101A00009F0126C0643000F5E62FF0E0EE0FFF1FC7
+:101A1000EE5DFE4F2081318189E090E019C0643095
+:101A200098F4E62FF0E0DF01AA0FBB1FA65EBE4FC1
+:101A30002D913C91EA5EFE4F808190E009C082E1E9
+:101A400090E027ED36E004C080E090E020E030E058
+:101A5000FA0131832083089580E189BD82E189BD47
+:101A600009B400FEFDCF8091D8008F7D8093D8000F
+:101A70008091E00082608093E0008091E00081FD31
+:101A8000FCCF0895CF92DF92EF92FF920F931F93B6
+:101A9000CF93DF937C018B01EA010E94A40E811198
+:101AA00031C0209731F088819981081B190BE80E0D
+:101AB000F91EC12CD12C0115110519F18091E800F6
+:101AC00085FD14C08091E8008E778093E800209710
+:101AD00041F0888199818C0D9D1D9983888385E0D3
+:101AE00011C00E94A40E882331F30CC0F70181912C
+:101AF0007F018093F10001501109FFEFCF1ADF0A37
+:101B0000DACF80E0DF91CF911F910F91FF90EF909E
+:101B1000DF90CF9008952091EF013091F0012617CA
+:101B2000370748F06115710539F42091E8002E77E8
+:101B30002093E80001C0B901FC0120E061157105A6
+:101B4000B9F18091E801882309F440C0853009F497
+:101B50003FC08091E80083FD3DC08091E80082FF96
+:101B600006C08091E80082FF26C080E00895809141
+:101B7000E80080FFE3CF2091F3008091F20090E035
+:101B8000922B6115710551F08830910538F421913F
+:101B90002093F100615071090196F3CF21E008977D
+:101BA00009F020E08091E8008E778093E800C6CFAE
+:101BB0002111C7CFD6CF8091E801882339F0853035
+:101BC00039F08091E80083FFCCCF04C082E0089513
+:101BD00083E0089581E008952091EF013091F001B4
+:101BE0002617370748F06115710539F42091E80090
+:101BF0002E772093E80001C0B901FC0120E06115B7
+:101C00007105C1F18091E801882309F441C0853054
+:101C100009F440C08091E80083FD3EC08091E80057
+:101C200082FF06C08091E80082FF27C080E008950F
+:101C30008091E80080FFE3CF2091F3008091F200D3
+:101C400090E0922B6115710559F08830910540F4B0
+:101C500024912093F1003196615071090196F2CFE1
+:101C600021E0089709F020E08091E8008E778093CA
+:101C7000E800C5CF2111C6CFD5CF8091E8018823D8
+:101C800039F0853039F08091E80083FFCBCF04C074
+:101C900082E0089583E0089581E00895982F9730B9
+:101CA00058F59093E900981739F07091EC00209165
+:101CB000ED005091F00003C0242F762F50E021FF5B
+:101CC00019C03091EB003E7F3093EB003091ED0076
+:101CD0003D7F3093ED003091EB0031603093EB00AD
+:101CE0007093EC002093ED005093F0002091EE00F3
+:101CF00027FF07C09F5FD3CF8F708093E90081E0FB
+:101D0000089580E008958091E90187FD05C08091E4
+:101D1000E80080FF0EC012C08091E80082FD05C07F
+:101D20008091E8018111F8CF08958091E8008B77C8
+:101D300008C08091E8018111EACF08958091E80000
+:101D40008E778093E80008958091E4009091E500FB
+:101D500045E62091EC0020FF21C02091E80020FD05
+:101D600021C02091E801222389F0253089F02091BB
+:101D7000EB0025FD0FC02091E4003091E50028170D
+:101D8000390739F3415041F0C901E3CF82E00895AA
+:101D900083E0089581E0089584E008952091E800AB
+:101DA00022FFDFCF80E008950E94420F0E944A0F79
+:101DB000E0EEF0E0808181608083E8EDF0E08081FA
+:101DC0008F77808319BCA7EDB0E08C918E7F8C93C8
+:101DD00080818F7E80831092E70108950F931F9377
+:101DE000CF93DF930E94420F0E944A0FC8EDD0E0CC
+:101DF00088818F77888388818068888388818F7DB8
+:101E0000888319BC1092E8011092E4011092E60157
+:101E10001092E50100EE10E0F80180818B7F808355
+:101E200088818160888342E060E080E00E944E0EFD
+:101E3000E1EEF0E080818E7F8083E2EEF0E0808151
+:101E400081608083808188608083F80180818E7FBB
+:101E50008083888180618883DF91CF911F910F916A
+:101E60000895E8EDF0E080818F7E8083E7EDF0E07B
+:101E700080818160808384E082BF81E08093E7017C
+:101E80000C94EE0EE8EDF0E080818E7F808310925E
+:101E9000E20008951092DA001092E10008951F9276
+:101EA0000F920FB60F9211242F933F934F935F938E
+:101EB0006F937F938F939F93AF93BF93EF93FF9312
+:101EC0008091E10082FF0BC08091E20082FF07C099
+:101ED0008091E1008B7F8093E1000E94AB118091A3
+:101EE000DA0080FF1FC08091D80080FF1BC0809166
+:101EF000DA008E7F8093DA008091D90080FF0DC0D8
+:101F000080E189BD82E189BD09B400FEFDCF81E099
+:101F10008093E8010E94B30B05C019BC1092E80140
+:101F20000E94C10B8091E10080FF19C08091E20006
+:101F300080FF15C08091E2008E7F8093E200809147
+:101F4000E20080618093E2008091D80080628093FB
+:101F5000D80019BC85E08093E8010E94C50B8091F0
+:101F6000E10084FF30C08091E20084FF2CC080E15A
+:101F700089BD82E189BD09B400FEFDCF8091D80002
+:101F80008F7D8093D8008091E1008F7E8093E10067
+:101F90008091E2008F7E8093E2008091E200816078
+:101FA0008093E2008091E401882311F084E007C06F
+:101FB0008091E30087FF02C083E001C081E080934D
+:101FC000E8010E94C70B8091E10083FF29C0809146
+:101FD000E20083FF25C08091E100877F8093E100CC
+:101FE00082E08093E8011092E4018091E1008E7F0D
+:101FF0008093E1008091E2008E7F8093E2008091E7
+:10200000E20080618093E20042E060E080E00E94B4
+:102010004E0E8091F00088608093F0000E94C40B07
+:10202000FF91EF91BF91AF919F918F917F916F91B0
+:102030005F914F913F912F910F900FBE0F901F9086
+:1020400018951F920F920FB60F9211242F933F9362
+:102050004F935F936F937F938F939F93AF93BF93B0
+:10206000CF93EF93FF93C091E900CF708091EC0084
+:102070001092E9008091F000877F8093F0007894BF
+:102080000E945D101092E9008091F00088608093BA
+:10209000F000C093E900FF91EF91CF91BF91AF9114
+:1020A0009F918F917F916F915F914F913F912F9170
+:1020B0000F900FBE0F901F9018951F93CF93DF9333
+:1020C000CDB7DEB7AA970FB6F894DEBF0FBECDBF6F
+:1020D000E9EEF1E08091F100819321E0E13FF20728
+:1020E000C9F70E94E30B8091E80083FF1CC1209197
+:1020F000E9013091EA01832F90E08A30910508F0E0
+:1021000012C1FC01EB54FF4F0C944B26203881F098
+:10211000223809F008C18091ED018F708093E900A9
+:102120008091EB0085FB882780F91092E90006C0BA
+:102130008091E5019091E601911182609091E80013
+:10214000977F9093E8008093F1001092F100C5C052
+:10215000822F8D7F09F0E7C0222319F0223061F031
+:10216000E2C08091EB01813009F0DDC0333009F02D
+:1021700080E08093E60128C08091EB01811124C0AA
+:102180002091ED012F7009F4CEC02093E9008091D9
+:10219000EB0080FF19C08091EB00333011F48062B6
+:1021A00011C080618093EB0081E090E0022E01C0BD
+:1021B000880F0A94EAF78093EA001092EA0080916F
+:1021C000EB0088608093EB001092E9008091E800BA
+:1021D000877F86C02111A7C01091EB011F778091E6
+:1021E000E3008078812B8093E3008091E800877F73
+:1021F0008093E8000E94830E8091E80080FFFCCF6E
+:102200008091E30080688093E300112311F083E064
+:1022100001C082E08093E80186C02058223008F097
+:1022200082C08091EB019091EC018C3D23E09207FC
+:1022300079F583E08A838AE289834FB7F894DE01D7
+:10224000139620E03EE051E2E32FF0E05093570078
+:10225000E49120FF03C0E295EF703F5FEF708E2F97
+:1022600090E0EA3010F0C79601C0C0968D939D9320
+:102270002F5F243149F74FBF8091E800877F80931B
+:10228000E8006AE270E0CE0101960E948B0D14C056
+:10229000AE014F5F5F4F6091ED010E94D30C00973C
+:1022A00009F441C02091E800277F2093E800BC0199
+:1022B00089819A810E94EC0D8091E8008B77809350
+:1022C000E80031C0203879F58091E800877F80935D
+:1022D000E8008091E4018093F1008091E8008E771E
+:1022E0008093E8000E94830E1EC021111CC09091B3
+:1022F000EB019230C0F48091E800877F8093E80082
+:102300009093E4010E94830E8091E401811104C046
+:102310008091E30087FF02C084E001C081E08093E8
+:10232000E8010E94CF0B8091E80083FF0AC08091F2
+:10233000E800877F8093E8008091EB0080628093C3
+:10234000EB00AA960FB6F894DEBF0FBECDBFDF91AB
+:10235000CF911F9108950895CF938091E80188232C
+:10236000B1F08091E9008F709091EC0090FF02C075
+:1023700090E801C090E0C92FC82B1092E90080912D
+:10238000E80083FD0E945D10CF70C093E900CF91FB
+:10239000089590936B0180936A010895E0916A011A
+:1023A000F0916B01309721F00190F081E02D0994BC
+:1023B00080E00895E0916A01F0916B01309721F07F
+:1023C0000280F381E02D09940895E0916A01F09173
+:1023D0006B01309721F00480F581E02D0994089578
+:1023E00020916801309169018217930771F09093F1
+:1023F000690180936801E0916A01F0916B01309767
+:1024000021F00680F781E02D09940895209166015E
+:10241000309167018217930771F090936701809361
+:102420006601E0916A01F0916B01309721F0008420
+:10243000F185E02D0994089508950C941C120E94D2
+:10244000371E0E94AA070C94FD1ECF92DF92EF92D6
+:10245000FF920F931F93CF93DF93CDB7DEB72B97E8
+:102460000FB6F894DEBF0FBECDBF0E94C2073DE697
+:10247000E32E31E0F32E00E010E0C02E802F0E940A
+:10248000AF08F701D1907F01D826B1F40F5F1F4F3D
+:102490000E30110591F78FEF89838A831B820E948A
+:1024A000401E8160782F9D838C8349815A816B8186
+:1024B0008D810E94C81241C09091CF0191FF04C04C
+:1024C0008B870E94B5088B8520E030E04D2D50E0D1
+:1024D000922FBA01022E02C0759567950A94E2F711
+:1024E00060FF25C02E83CF82EE24E394F12C02C03E
+:1024F000EE0CFF1C9A95E2F790E08E219F2121E0DF
+:10250000892B09F420E028870E94401E8160782FE3
+:102510009A8789874E815F8168858A850E94C81263
+:10252000F801E359FE4F80818E25808306C02F5F1E
+:102530003F4F2630310561F6A9CF0E94E12110916D
+:102540006C010E94CE111817A1F00E94CE11809349
+:102550006C012B960FB6F894DEBF0FBECDBFDF9196
+:10256000CF911F910F91FF90EF90DF90CF900C943F
+:10257000D30A2B960FB6F894DEBF0FBECDBFDF9106
+:10258000CF911F910F91FF90EF90DF90CF90089522
+:10259000CF93DF93CDB7DEB72B970FB6F894DEBF9E
+:1025A0000FBECDBF4F83588769877A878B87DE013F
+:1025B000119686E0FD0111928A95E9F785E0FE010A
+:1025C000379601900D928A95E1F749815A816B8186
+:1025D0007C818D819E810E94091A2B960FB6F894FA
+:1025E000DEBF0FBECDBFDF91CF9108950895CF9389
+:1025F000C82F882309F4C1C0823859F40E94CE1133
+:1026000081FDBBC089E30E94A81C0E94721D89E362
+:102610000CC0833879F40E94CE1180FDAEC083E5F2
+:102620000E94A81C0E94721D83E50E94E81CCF91A5
+:102630000C94721D843859F40E94CE1182FD9DC005
+:1026400087E40E94A81C0E94721D87E4EECF8CEFE5
+:102650008C0F813A48F48C2F0E94192481118DC06F
+:102660008C2F0E94A81CE3CF80E28C0F883048F4A6
+:10267000C77081E001C0880FCA95EAF70E94291D42
+:10268000D6CF8BE58C0F833078F4C53A29F0C63A63
+:1026900031F482E890E005C081E890E002C083E870
+:1026A00090E0CF910C94F01188E58C0F833108F005
+:1026B00064C0C83A39F1C93A41F1CA3A49F1CB3A52
+:1026C00051F1CC3A59F1CD3A61F1C03B69F1CE3AC2
+:1026D00071F1CF3A79F1C13B81F1C23B89F1C33B42
+:1026E00091F1C43B99F1C53BA1F1C63BA9F1C73BB0
+:1026F000B1F1C83BB9F1C93BC1F1CA3BC9F58AE2A6
+:1027000092E038C082EE90E035C089EE90E032C0B1
+:102710008AEE90E02FC085EB90E02CC086EB90E035
+:1027200029C087EB90E026C08CEC90E023C08DECB4
+:1027300090E020C083E891E01DC08AE891E01AC0D3
+:1027400082E991E017C084E991E014C081E292E04F
+:1027500011C083E292E00EC084E292E00BC085E2F9
+:1027600092E008C086E292E005C087E292E002C0F3
+:1027700080E090E0CF910C940612CF9108958823C9
+:1027800009F44BC0823859F40E94CE1181FF45C034
+:1027900089E30E94A81C0E94721D89E30CC0833843
+:1027A00071F40E94CE1180FF38C083E50E94A81CFE
+:1027B0000E94721D83E50E94E81C0C94721D8438EF
+:1027C00059F40E94CE1182FF28C087E40E94A81C01
+:1027D0000E94721D87E4EFCF9CEF980F913A58F357
+:1027E00090E2980F983050F4877091E001C0990FF3
+:1027F0008A95EAF7892F0E942F1DDFCF9BE5980F5E
+:10280000933020F480E090E00C94F011885A8331EA
+:1028100020F480E090E00C9406120895882321F0C3
+:102820000E94291D0C94721D0895882321F00E9496
+:102830002F1D0C94721D0895CF92DF92EF92FF929C
+:102840000F931F93CF93DF93CDB7DEB728970FB6C3
+:10285000F894DEBF0FBECDBF8C0185E0F801DE012C
+:10286000119601900D928A95E1F7F801D080E180F0
+:10287000F280258122952F7083819481892B39F0F4
+:10288000FFEFEF1206C081E0DF1203C003C081E05A
+:1028900001C080E080FDCEC2C8012F830E94F612E5
+:1028A000D982EA8289819A810E94661C9E838887E8
+:1028B0000E94651C0E94381B2F814E816885FF2075
+:1028C00029F00E94461D68854E812F81E42FE295F4
+:1028D000EF70F0E0E154FF4F0C944B26842F807F83
+:1028E000142F1F70882311F01295107FFF2059F0CC
+:1028F000112309F454C2812F68870E94391D0E9458
+:10290000721D68854CC2862F0E94BF13112309F4E3
+:1029100091C2812F0E943F1D28960FB6F894DEBF0A
+:102920000FBECDBFDF91CF911F910F91FF90EF9020
+:10293000DF90CF900C94721D342F307F842F8F70D6
+:10294000303211F08295807F662319F0613019F1E1
+:102950002BC0FF20B1F0222309F493C1213009F0EC
+:1029600090C128960FB6F894DEBF0FBECDBFDF91A1
+:10297000CF911F910F91FF90EF90DF90CF900C942B
+:10298000591D222319F0213009F454C28E830E946C
+:102990005C1D8E8189C1FF2021F0223008F04AC2DF
+:1029A00070C1211147C280C1FF2021F0222309F408
+:1029B00068C1F5C1222309F477C105C2242F2695E9
+:1029C0002695237030E02115310521F021303105A5
+:1029D000C9F030C2FF2021F0862F942F937002C0DF
+:1029E00080E090E028960FB6F894DEBF0FBECDBF12
+:1029F000DF91CF911F910F91FF90EF90DF90CF90DB
+:102A00000C94F011FF2021F0862F942F937002C0B8
+:102A100080E090E028960FB6F894DEBF0FBECDBFE1
+:102A2000DF91CF911F910F91FF90EF90DF90CF90AA
+:102A30000C940612862FFF2019F00E94E92002C094
+:102A40000E94512128960FB6F894DEBF0FBECDBF6D
+:102A5000DF91CF911F910F91FF90EF90DF90CF907A
+:102A60000C94D621842F837009F076C0F110E2C156
+:102A7000262F229526952770220F220F862F8F70E2
+:102A8000C82ED12CE12CF12C022E04C0CC0CDD1C64
+:102A9000EE1CFF1C0A94D2F764FF10C06FE070E0D8
+:102AA00080E090E004C0660F771F881F991F2A9569
+:102AB000D2F7609570958095909503C060E070E0C6
+:102AC000CB01242F269526952370422F50E04230CB
+:102AD0005105D1F04330510559F16C297D298E29DA
+:102AE0009F294130510541F128960FB6F894DEBF79
+:102AF0000FBECDBFDF91CF911F910F91FF90EF904F
+:102B0000DF90CF900C945D1B6C297D298E299F2925
+:102B100028960FB6F894DEBF0FBECDBFDF91CF91E0
+:102B20001F910F91FF90EF90DF90CF900C94771B47
+:102B30000E945D1BC701B60128960FB6F894DEBF50
+:102B40000FBECDBFDF91CF911F910F91FF90EF90FE
+:102B5000DF90CF900C94431BFF2019F0842F8170DD
+:102B600001C08695882309F465C1262F22952695F4
+:102B70002770220F220F862F8F70C82ED12CE12CA8
+:102B8000F12C022E04C0CC0CDD1CEE1CFF1C0A94A0
+:102B9000D2F764FF10C06FE070E080E090E004C006
+:102BA000660F771F881F991F2A95D2F76095709539
+:102BB0008095909503C060E070E0CB01242F2695AE
+:102BC00026952370422F50E042305105D1F043301A
+:102BD000510559F16C297D298E299F2941305105D4
+:102BE00041F128960FB6F894DEBF0FBECDBFDF913E
+:102BF000CF911F910F91FF90EF90DF90CF900C94A9
+:102C0000311C6C297D298E299F2928960FB6F894AE
+:102C1000DEBF0FBECDBFDF91CF911F910F91FF900F
+:102C2000EF90DF90CF900C944B1C0E94311CC70199
+:102C3000B60128960FB6F894DEBF0FBECDBFDF9168
+:102C4000CF911F910F91FF90EF90DF90CF900C9458
+:102C5000171C603FC9F118F4603E50F49BC0623FFE
+:102C600009F460C008F44AC0633F09F46FC092C021
+:102C7000162F1F70842F8F71FF2099F00E94B01BB8
+:102C8000812F28960FB6F894DEBF0FBECDBFDF911F
+:102C9000CF911F910F91FF90EF90DF90CF900C9408
+:102CA0000E140E94D11B812F28960FB6F894DEBF18
+:102CB0000FBECDBFDF91CF911F910F91FF90EF908D
+:102CC000DF90CF900C941514FF20A1F02111B2C019
+:102CD000842F8F7128960FB6F894DEBF0FBECDBF3C
+:102CE000DF91CF911F910F91FF90EF90DF90CF90E8
+:102CF0000C94F61B223008F09DC0EACFFF20A1F013
+:102D0000842F8F7128960FB6F894DEBF0FBECDBF0B
+:102D1000DF91CF911F910F91FF90EF90DF90CF90B7
+:102D20000C94B01BFF2061F3842F8F7128960FB68F
+:102D3000F894DEBF0FBECDBFDF91CF911F910F91F1
+:102D4000FF90EF90DF90CF900C94D11BFF2091F07B
+:102D5000842F8F7128960FB6F894DEBF0FBECDBFBB
+:102D6000DF91CF911F910F91FF90EF90DF90CF9067
+:102D70000C949B1B28960FB6F894DEBF0FBECDBFF8
+:102D8000DF91CF911F910F91FF90EF90DF90CF9047
+:102D90000C94911BFF20A1F0222309F4B1CF862FC0
+:102DA00028960FB6F894DEBF0FBECDBFDF91CF914E
+:102DB0001F910F91FF90EF90DF90CF900C94F7123E
+:102DC000222309F4B1CF862F28960FB6F894DEBFE0
+:102DD0000FBECDBFDF91CF911F910F91FF90EF906C
+:102DE000DF90CF900C94BF134F70C8010E94040570
+:102DF00028960FB6F894DEBF0FBECDBFDF91CF91FE
+:102E00001F910F91FF90EF90DF90CF900C94B61A26
+:102E10004F70C80128960FB6F894DEBF0FBECDBF25
+:102E2000DF91CF911F910F91FF90EF90DF90CF90A6
+:102E30000C94750928960FB6F894DEBF0FBECDBF6F
+:102E4000DF91CF911F910F91FF90EF90DF90CF9086
+:102E500008950E94461D0E94561D0E941B1D0E943F
+:102E6000721D0E9482220E94D62180E090E00E9482
+:102E7000F01180E090E00C9406120E94361D0C9434
+:102E800029170E94661C292F22952F7030E02C30C4
+:102E900031054CF42A3031056CF4225031092230CE
+:102EA000310590F407C02C30310551F02F30310539
+:102EB00039F00AC0803E10F0803F31F481E008957F
+:102EC00093FB882780F9089580E00895CF93DF93DE
+:102ED00000D000D01F92CDB7DEB70F900F900F90AB
+:102EE0000F900F90DF91CF910895CF93DF9300D093
+:102EF00000D000D0CDB7DEB726960FB6F894DEBF6F
+:102F00000FBECDBFDF91CF9108951F93CF93DF9375
+:102F1000C0917B0116E080917C01C81799F0D0E048
+:102F20001C9FF0011D9FF00D1124E358FE4F4081BE
+:102F3000518162817381848195810E9475172196E8
+:102F4000C770E9CFDF91CF911F9108954091AD01F6
+:102F50005091AE016091AF017091B0018091B101CB
+:102F60009091B2010C947517CF938091B201829524
+:102F70008F7009F05FC08091AF01882309F45AC0B7
+:102F800020917B01A0917C016091AD017091AE0117
+:102F90008091B0019091B10131E06F3F09F030E0D4
+:102FA000B32FC6E02A1709F445C0009721F07F3FF0
+:102FB00021F44B2F03C041E001C040E030E040FD70
+:102FC00035C0C29FF001C39FF00D1124E358FE4F9E
+:102FD000418174132BC04081641328C04281411188
+:102FE00025C0438154814817590710F441505109B5
+:102FF000481B590B483C5105C8F48091B2018F70B1
+:1030000080618093B20186E0829FF001839FF00D82
+:103010001124EE57FE4F80818F70806180838DEA8E
+:1030200091E00E941C14CF910C9485172F5F3F4FA5
+:103030002770B8CFCF910895CF92DF92EF92FF9291
+:103040000F931F93CF93DF93CDB7DEB762970FB681
+:10305000F894DEBF0FBECDBF8C0185E0F801DE0124
+:103060001D9601900D928A95E1F7D8014C91119629
+:103070005C91119712966C9112971396ED90FC90BB
+:1030800014977091AD01E091AE012091B0013091A3
+:10309000B1012115310531F0EF3F31F481E07F3F7F
+:1030A00019F403C081E001C080E0B82FB170CB2ECD
+:1030B00080FD6CC1D090AF01DD2009F4F5C0F09126
+:1030C000B201E216F30638F0C701821B930B883C6D
+:1030D000910548F09BC0209530952E0D3F1D283C52
+:1030E000310508F093C08F2F807F09F052C0E5139F
+:1030F00014C0741312C0D62E61110FC0FF70F0619E
+:10310000F093B2010E94A6178DEA91E00E941C1470
+:103110008091B201F80185836CC1EF2831F05F3FE7
+:1031200031F481E04F3F19F403C081E001C080E039
+:1031300080FD03C081E0862701C080E0F82FF17098
+:10314000FF2E80FF1CC080917B0120917C0136E026
+:10315000821709F428C190E0389FF001399FF00DE3
+:103160001124E358FE4F7181571306C07081471335
+:1031700003C07281671303C001968770E9CFD62E12
+:10318000662309F436C18091B20181608093B20157
+:1031900053C0E51308C0741306C0611104C0D80100
+:1031A0001596FC93AEC04D875E878D859E856A8B94
+:1031B0000E9441176A89882329F1D62E662311F1CE
+:1031C0002091B201822F82958F7090E002970CF4CB
+:1031D00060C08091AD019091AE0198878F83198670
+:1031E000FB86EA862C87CE01079651C0E51731F1A0
+:1031F0004D875E878D859E856A8B0E9441176A89FF
+:1032000081112EC0C8010E941C14A4C08F2F807F82
+:1032100069F77E2DF98AE88A89890E9466178DEA06
+:1032200091E00E941C14EDEAF1E086E0DF011D92BE
+:103230008A95E9F70E94A617D12CDBC07413D8CF6A
+:103240006111D6CFD8011596FC93C8010E941C14B9
+:10325000EDEAF1E086E0DF011D928A95E9F7C9C049
+:10326000D62E662379F22091B201822F82958F703B
+:1032700090E0029774F08091AD019091AE019A8335
+:1032800089831B82FD82EC822E83CE0101960E94EF
+:103290001C1486E0F801ADEAB1E001900D928A9528
+:1032A000E1F70E94B4176FC0E216F30628F0C701D9
+:1032B000821B930B9C0104C0209530952E0D3F1D61
+:1032C000283C310508F052C0D62E662309F49ACF67
+:1032D000E5132CC074132AC08091B20180FD1DC07B
+:1032E000982F92959F70C9F0D80115968C931597D9
+:1032F0009F3039F09F5F9295907F8F70892B159644
+:103300008C93C8010E941C1486E0F801ADEAB1E07C
+:1033100001900D928A95E1F736C086E0F801ADEA9A
+:10332000B1E001900D928A95E1F763C04D875E8709
+:103330008D859E850E944117882379F086E0F801EB
+:10334000ADEAB1E001900D928A95E1F70E94B417C1
+:103350000E94A617DD24D3944CC08091B2018160F5
+:103360008093B201C8010E941C1443C07E2DF98ACB
+:10337000E88A89890E946617EDEAF1E086E0DF01BC
+:103380001D928A95E9F70E94A61733C0662309F4B7
+:1033900039CF4D875E878D859E850E944117882392
+:1033A00009F430CFCBCF4D875E878D859E850E94F7
+:1033B000661C292F22952F7030E0223031052CF425
+:1033C0009F7041F0811106C00CC0243031052CF4EF
+:1033D0009F7049F4805E883020F0C8010E941C1460
+:1033E000CF2CDC2C06C0D80115969C91907F91F7CC
+:1033F000F8CF8D2D62960FB6F894DEBF0FBECDBF0D
+:10340000DF91CF911F910F91FF90EF90DF90CF90C0
+:1034100008951F93CF93DF93CDB7DEB72C970FB6E8
+:10342000F894DEBF0FBECDBF4F83588769877A8778
+:103430008B879C87CE0107960E941C188823C1F0B9
+:103440002F8138858A859B85892B31F03F3F11F08C
+:1034500080E003C02F3FE1F781E0811147C04F8139
+:10346000588569857A858B859C850E9475173EC035
+:1034700086E0FE013796DE01119601900D928A9545
+:10348000E1F7FF81E8854A855B854115510531F0FB
+:10349000EF3F31F481E0FF3F19F403C081E001C048
+:1034A00080E080FD23C020917C0130E0C9010196BD
+:1034B0008770992760917B0170E086179707F1F17B
+:1034C000F983EA835D834C8396E0929FD001939FBA
+:1034D000B00D1124A358BE4FFE01319601900D92FC
+:1034E0009A95E1F780937C010E94851716E0809100
+:1034F0007B0190917C01891779F1189FC0011124FB
+:1035000083589E4F0E941C18882331F1E0917B0163
+:103510001E9FF0011124E358FE4F408151816281CA
+:103520007381848195810E94751780917B0190E061
+:1035300001968770992780937B01D9CF0E943D1710
+:1035400010927C0110927B01EDEAF1E086E0DF0150
+:103550001D928A95E9F7CACF2C960FB6F894DEBF74
+:103560000FBECDBFDF91CF911F910895EF92FF92D3
+:103570000F931F93CF93DF939C01009709F471C0C1
+:10358000F12CEE24E394E9012196F901849184372A
+:1035900040F4843008F056C0813081F0823021F14F
+:1035A00060C0853709F449C0C0F19CE7980F903797
+:1035B00008F057C08F770E94BF1346C089010E5F85
+:1035C0001F4FFE01849190E2980F983050F487705D
+:1035D000FE2D01C0FF0F8A95EAF78F2F0E94491D2B
+:1035E00015C00E94F71214C089010E5F1F4FFE0123
+:1035F000849190E2980F983068F48770FE2D01C096
+:10360000FF0F8A95EAF78F2F0E944F1D0E94721DAF
+:10361000E8011AC00E94BF13FBCF2E5F3F4FFE018F
+:10362000C491CC2341F08FE99FE00197F1F700C0EE
+:103630000000C150F6CFE90107C0FE01F490E90196
+:10364000229602C00E94F7128F2D882341F0EFE9E5
+:10365000FFE03197F1F700C000008150F6CF9E01E6
+:1036600092CFDF91CF911F910F91FF90EF9008952E
+:1036700008956093B7017093B8018093B901909356
+:10368000BA010C9429170F931F930091B701109161
+:10369000B8012091B9013091BA01062B172B282BC4
+:1036A000392B0093B7011093B8012093B9013093DF
+:1036B000BA011F910F910C9429170F931F9300913A
+:1036C000B7011091B8012091B9013091BA010623D8
+:1036D0001723282339230093B7011093B8012093AF
+:1036E000B9013093BA011F910F910C9429170F93D0
+:1036F0001F930091B7011091B8012091B901309149
+:10370000BA0106271727282739270093B7011093F6
+:10371000B8012093B9013093BA011F910F910C9415
+:1037200029171092B3011092B4011092B5011092B2
+:10373000B6010C94291741E050E060E070E004C04D
+:10374000440F551F661F771F8A95D2F74093B30128
+:103750005093B4016093B5017093B6010C9429178E
+:1037600041E050E060E070E004C0440F551F661F68
+:10377000771F8A95D2F78091B3019091B401A091FF
+:10378000B501B091B601842B952BA62BB72B809356
+:10379000B3019093B401A093B501B093B6010C941A
+:1037A000291741E050E060E070E004C0440F551F6D
+:1037B000661F771F8A95D2F7409550956095709552
+:1037C0008091B3019091B401A091B501B091B6017F
+:1037D00084239523A623B7238093B3019093B40148
+:1037E000A093B501B093B6010C94291741E050E0C5
+:1037F00060E070E004C0440F551F661F771F8A9574
+:10380000D2F78091B3019091B401A091B501B0912C
+:10381000B60184279527A627B7278093B3019093F5
+:10382000B401A093B501B093B6010C9429170F937E
+:103830001F930091B3011091B4012091B501309113
+:10384000B601062B172B282B392B0093B3011093AD
+:10385000B4012093B5013093B6011F910F910C94E0
+:1038600029170F931F930091B3011091B401209178
+:10387000B5013091B601062317232823392300937D
+:10388000B3011093B4012093B5013093B6011F9199
+:103890000F910C9429170F931F930091B30110916E
+:1038A000B4012091B5013091B601062717272827CA
+:1038B00039270093B3011093B4012093B5013093DD
+:1038C000B6011F910F910C9429170895CF92DF92A2
+:1038D000EF92FF920F931F93CF93DF93EC01C09071
+:1038E000B701D090B801E090B901F090BA01809191
+:1038F000B3019091B401A091B501B091B601C82A6D
+:10390000D92AEA2AFB2A0FE110E0B701A601002E0E
+:1039100004C076956795579547950A94D2F740FF6E
+:1039200007C0BE01802F0E9498098130910539F4AB
+:103930000150110950F7BE0180E00E949809DF9103
+:10394000CF911F910F91FF90EF90DF90CF9008954E
+:1039500090910C019923D9F090910D019923B9F020
+:10396000982F9695969596959F3088F5E0910E0143
+:10397000F0910F01E90FF11D877021E030E001C0E7
+:10398000220F8A95EAF78181822B818308954091E5
+:103990000E0150910F0120E030E09FEFFA01E20F9D
+:1039A000F31F6281681799F09F3F19F4611101C0FC
+:1039B000922F2F5F3F4F2E30310581F79F3F39F017
+:1039C000FA01E90FF11D97FDFA9582830895089594
+:1039D00090910C019923E1F090910D019923C1F090
+:1039E000982F9695969596959F3020F5E0910E012B
+:1039F000F0910F01E90FF11D877021E030E001C067
+:103A0000220F8A95EAF72095818128232183089542
+:103A100040910E0150910F0120E030E0FA01E20FD9
+:103A2000F31F9281981301C012822F5F3F4F2E30F7
+:103A30003105A1F7089581E090E0E0910E01F09149
+:103A40000F01E80FF91F1082019680319105A9F747
+:103A500008959091CE01982B9093CE010895809572
+:103A60009091CE0198239093CE0108951092CE01AB
+:103A700008959091CD01982B9093CD010895809554
+:103A80009091CD0198239093CD0108951092CD018E
+:103A900008959091CC01982B9093CC010895809536
+:103AA0009091CC0198239093CC0108951092CC0171
+:103AB00008958093BB0108951092BB010895409131
+:103AC0000E0150910F0120E030E080E0FA01E20F9A
+:103AD000F31F918191118F5F2F5F3F4F2F30310581
+:103AE000A9F70895E0910E01F0910F018091CE01A8
+:103AF0008083E0910E01F0910F0180819091CD01C2
+:103B0000892B8083E0910E01F0910F0180819091CB
+:103B1000CC01892B80839091BB01992361F0E091C6
+:103B20000E01F0910F018081892B80830E945F1D1F
+:103B300081111092BB0180910E0190910F010C94A4
+:103B4000DA11CF92DF92EF92FF920F931F936C01E5
+:103B5000EE24FF24C114D104E104F10421F46B012B
+:103B60007C0180E001C080E133272F2D1E2D0D2D1B
+:103B7000011511052105310519F0885F68017901EA
+:103B800097018601A4E03695279517950795AA9584
+:103B9000D1F7011511052105310519F08C5F680178
+:103BA000790197018601F2E03695279517950795DB
+:103BB000FA95D1F7011511052105310519F08E5F30
+:103BC00068017901B701A6017695679557954795E4
+:103BD000452B462B472B09F08F5F1F910F91FF90CC
+:103BE000EF90DF90CF9008958091E801843009F143
+:103BF0001092D00120E488E190E00FB6F894A895E7
+:103C0000809360000FBE2093600083B7817F846043
+:103C100083BF83B7816083BF7894889583B78E7F95
+:103C200083BF88E10FB6F894809360001092600023
+:103C30000FBE089508950895CF930E941A1E0E9402
+:103C4000C2070E941B1EC0E08C2F0E94AF0881118A
+:103C500005C0CF5FCE30C1F780E001C081E0CF91D9
+:103C600008950E943D170E94CE110C94D30A82E061
+:103C700084BD93E095BD9AEF97BD80936E00089543
+:103C80002FB7F8948091D1019091D201A091D301E6
+:103C9000B091D4012FBF0895CF92DF92EF92FF929F
+:103CA0000F931F932FB7F8944091D1015091D201F7
+:103CB0006091D3017091D4012FBF6A017B01EE2482
+:103CC000FF248C0120E030E0C016D106E206F306A6
+:103CD00010F441505109481B590BCA011F910F9113
+:103CE000FF90EF90DF90CF9008951F920F920FB644
+:103CF0000F9211248F939F93AF93BF938091D10123
+:103D00009091D201A091D301B091D4010196A11D4F
+:103D1000B11D8093D1019093D201A093D301B093B0
+:103D2000D401BF91AF919F918F910F900FBE0F90D3
+:103D30001F9018950E94D40EF8942FEF87EA91E611
+:103D4000215080409040E1F700C0000087E090EBF8
+:103D5000DC018093F1019093F201A093F301B09301
+:103D6000F4012CE088E190E00FB6F894A8958093D8
+:103D700060000FBE20936000FFCFEF92FF920F9381
+:103D80001F93CF93DF93E82EF12C8F2D0E94AF0865
+:103D9000C0E0D0E0082F10E098010C2E02C035954D
+:103DA00027950A94E2F720FD05C02196C630D1057B
+:103DB00099F709C06C2F7F2D80E00E947609E812E8
+:103DC000F4CF81E005C0F3948EE0F812DECF80E0FE
+:103DD000DF91CF911F910F91FF90EF900895CF93B6
+:103DE000C82F8CE20E94BD1E882321F08C2FCF911A
+:103DF0000C94BD1E80E0CF910895CF930E94422085
+:103E0000811102C00E942820C5E6C15049F00E94DD
+:103E1000C2078FE39CE90197F1F700C00000F5CFDE
+:103E200089E20E94EF1E811111C18AE20E94EF1EF9
+:103E300081110E94282085E00E94EF1E81110E94BE
+:103E40009A1E0E944D208093CF0187E00E94EF1EB2
+:103E5000882399F18BE10E94EF1E882351F0909105
+:103E6000CF0191FB882780F921E0822780FB91F91F
+:103E700022C08EE00E94EF1E882351F09091CF0166
+:103E800092FB882780F921E0822780FB92F913C0FA
+:103E900080E10E94EF1E9091CF01882341F093FBB7
+:103EA000882780F921E0822780FB93F904C0892FBD
+:103EB000809580FB90F99093CF018091CF010E9473
+:103EC00051200E945F208093E20180EE0E94EF1E4D
+:103ED000882341F08091E201982F909590FB80F922
+:103EE0008093E20189E30E94EF1E882359F09091AC
+:103EF000E20191FB882780F921E0822780FB91F97C
+:103F00009093E20182EE0E94EF1E882359F0909177
+:103F1000E20192FB882780F921E0822780FB92F959
+:103F20009093E20186EE0E94EF1E882359F0909153
+:103F3000E20193FB882780F921E0822780FB93F937
+:103F40009093E20183EE0E94EF1E882359F0909136
+:103F5000E20194FB882780F921E0822780FB94F915
+:103F60009093E20185E30E94EF1E882359F090911F
+:103F7000E20195FB882780F921E0822780FB95F9F3
+:103F80009093E20181E30E94EF1E882359F0909103
+:103F9000E20196FB882780F921E0822780FB96F9D1
+:103FA0009093E20181E10E94EF1E882359F09091E5
+:103FB000E20197FB882780F921E0822780FB97F9AF
+:103FC0009093E2018091E2010E9463208091E201DE
+:103FD00087FB882780F980930D0187E20E94EF1EFE
+:103FE000C82F8EE10E94EF1E8111C2608FE10E94F6
+:103FF000EF1E8111C46080E20E94EF1E8111C86033
+:1040000081E20E94EF1E8111C06182E20E94EF1ED8
+:104010008111C06283E20E94EF1E8111C06484E2BC
+:104020000E94EF1E882311F0C06802C0CC2329F043
+:104030008C2F0E945A206C2F03C00E945620682F9C
+:1040400070E080E090E0CF910C94391BCF910895FF
+:104050006DEE7EEF80E090E00E94812660E082E0DD
+:1040600090E00E94732660E083E090E00E94732657
+:1040700060E084E090E00E94732660E085E090E0DC
+:104080000C94732680E090E00E946D2621E08D3E26
+:104090009E4F09F020E0822F089582E090E00C947A
+:1040A0006526682F82E090E00C94732683E090E010
+:1040B0000C946526682F83E090E00C94732684E0CE
+:1040C00090E00C946526682F84E090E00C947326B1
+:1040D0008091D70180FF0BC06091130185E0689F3C
+:1040E000B001112475956795759567952AC081FF74
+:1040F00009C06091130185E0689FB0011124759596
+:1041000067951FC082FF07C06091130185E0689F1B
+:10411000B001112416C04091D8014423C9F0609128
+:104120001201461788F72091130185E0289F90011E
+:104130001124429FC001439F900D112470E00E9402
+:1041400037266038710540F46115710539F002C0F9
+:1041500065E070E0862F08958FE7089581E0089567
+:104160008091D70180FF08C06091110170E07595C2
+:1041700067957595679521C081FF06C06091110113
+:1041800070E07595679519C082FF04C060911101B8
+:1041900070E010C08091D8018823C1F060911001B7
+:1041A0008617A0F790911101989FC001112470E02B
+:1041B0000E9437266038710528F46115710521F0D9
+:1041C000862F08958FE7089581E0089561E070E0FB
+:1041D000F4CF803F21F40E946820819504C0813F84
+:1041E00029F40E9468208093DB010895823F21F426
+:1041F0000E946820819504C0833F29F40E946820B2
+:104200008093DA010895893F19F40E94B02005C017
+:104210008A3F31F40E94B02081958093DC0108959B
+:104220008B3F21F40E94B020819504C08C3F29F47B
+:104230000E94B0208093DD010895843F21F4809195
+:10424000D901816017C0853F21F48091D901826036
+:1042500011C0863F21F48091D90184600BC0873F53
+:1042600021F48091D901886005C0883F31F48091A4
+:10427000D90180618093D90108958D3F21F4809107
+:10428000D70181600BC08E3F21F48091D7018260FD
+:1042900005C08F3F29F48091D70184608093D701B6
+:1042A0000895803F39F48091DB0187FF6CC0109244
+:1042B000DB0169C0813F29F48091DB011816BCF352
+:1042C00062C09091DA01823F29F497FF5CC010929E
+:1042D000DA0159C0833F19F41916CCF354C0893F51
+:1042E00041F48091DC0118160CF04DC01092DC01F5
+:1042F0004AC08A3F29F48091DC0187FF44C0F6CF91
+:104300008B3F39F48091DD0187FF3DC01092DD01C4
+:104310003AC08C3F29F48091DD011816BCF333C0FC
+:10432000843F21F48091D9018E7F17C0853F21F40D
+:104330008091D9018D7F11C0863F21F48091D901F0
+:104340008B7F0BC0873F21F48091D901877F05C007
+:10435000883F31F48091D9018F7E8093D90113C0B9
+:104360008D3F21F48091D7018E7F0BC08E3F21F4C9
+:104370008091D7018D7F05C08F3F29F48091D701AF
+:104380008B7F8093D7018091DA0181110EC08091DB
+:10439000DB0181110AC08091DC01811106C080918E
+:1043A000DD01811102C01092D801089589ED91E0DC
+:1043B0000E94E5110E94401E9093D6018093D50182
+:1043C00008951F93CF93DF938091D5019091D601EB
+:1043D0000E944C1E4091D801442321F020911401E9
+:1043E00030E006C0209115015AE0259F900111246C
+:1043F0008217930708F482C08091DA011091DB01E3
+:10440000D091DC01C091DD01811107C0111105C0FF
+:10441000D11103C0CC2309F471C04F3F19F04F5F95
+:104420004093D801181624F40E9468208093DA0182
+:104430008091DA0187FF05C00E94682081958093F2
+:10444000DA01111624F40E9468208093DB01809128
+:10445000DB0187FF05C00E94682081958093DB0106
+:104460006091DA01662339F11091DB01112319F112
+:10447000772767FD7095872F972F0E94482523E3A4
+:1044800033E343E35FE30E94AC250E94152560936C
+:10449000DA01612F772767FD7095872F972F0E948C
+:1044A000482523E333E343E35FE30E94AC250E9406
+:1044B00015256093DB011D1624F40E94B020809323
+:1044C000DC018091DC0187FF05C00E94B02081954E
+:1044D0008093DC011C1624F40E94B0208093DD013F
+:1044E0008091DD0187FF05C00E94B02081958093F7
+:1044F000DD01DF91CF911F910C94D621DF91CF91F7
+:104500001F910895E9EDF1E085E0DF011D928A95A4
+:10451000E9F71092D8011092D7010895833081F104
+:1045200028F4813059F08230D1F00895853009F4B3
+:1045300049C0B8F1863009F456C00895209115019C
+:10454000862F90E0820F911D8F3F910520F4620F1E
+:104550006093150108958FEF8093150108952091C0
+:104560001401862F90E0820F911D8F3F910520F45A
+:10457000620F6093140108958FEF809314010895E2
+:1045800020911301862F90E0820F911D8F3F91059E
+:1045900020F4620F6093130108958FEF809313014D
+:1045A000089520911201862F90E0820F911D8F3F78
+:1045B000910520F4620F6093120108958FEF8093AC
+:1045C0001201089520911101862F90E0820F911D14
+:1045D0008F3F910520F4620F6093110108958FEFD2
+:1045E00080931101089520911001862F90E0820F91
+:1045F000911D8F3F910520F4620F60931001089583
+:104600008FEF809310010895833011F128F48130E9
+:1046100049F0823091F00895853081F120F18630A3
+:10462000C1F1089580911501681720F4861B8093CD
+:1046300015010895109215010895809114016817CD
+:1046400020F4861B8093140108951092140108959C
+:1046500080911301681720F4861B8093130108953D
+:1046600010921301089580911201681720F4861B9F
+:104670008093120108951092120108958091110102
+:10468000681720F4861B8093110108951092110180
+:10469000089580911001681720F4861B8093100103
+:1046A00008951092100108958D3109F442C020F54B
+:1046B0008E3009F47CC070F4873009F45EC020F4B9
+:1046C000863009F442C033C08830D1F18B3009F410
+:1046D000AAC02DC0863109F4A6C038F4803109F48F
+:1046E00070C0813109F47EC022C0893109F49BC0B9
+:1046F0008B3109F452C01BC0853309F48CC048F4D7
+:10470000873209F488C008F478C0893209F483C07C
+:104710000EC0833438F48A3308F06DC0883309F44E
+:1047200082C005C0833409F476C08834C1F080E0CB
+:1047300008950E94CF240E94CE110E94D30A73C014
+:104740000E944D200E945F206EC08091CF01817F2A
+:104750008E7F8093CF0181E08093DF0108950E94D6
+:104760003D172FEF83ED90E3215080409040E1F71B
+:1047700000C000000E949A1E56C09091CF01892F60
+:104780008095817080FB90F919F09660986027C041
+:10479000997F977F9093CF0146C09091CF0191FB75
+:1047A000882780F921E0822780FB91F913C090913E
+:1047B000CF0192FB882780F921E0822780FB92F9C4
+:1047C00009C09091CF0193FB882780F921E08227CF
+:1047D00080FB93F99093CF01882329F19160909306
+:1047E000CF0108950E943D1780910D0191E0892726
+:1047F00080930D0118C027EC01C023EE280F61E063
+:1048000070E080E090E004C0660F771F881F991F5A
+:104810002A95D2F704C061E070E080E090E00E9449
+:10482000391B0E943D1781E0089580E0089580E0E3
+:104830000895CF93C82F8091DF01813079F018F06F
+:104840008230D1F184C0A0910E01B0910F018C9102
+:10485000813169F0823209F07CC009C0A0910E015B
+:10486000B0910F018C91813111F0823249F48C2F7B
+:104870000E94152481111DC08C2F0E9454231AC040
+:104880008C2F0E941724811114C0C43179F048F490
+:10489000CB3079F0C03109F060C082E08093DF0155
+:1048A00008C0C93219F0C83321F057C01092DF0197
+:1048B00054C081E0817053C0C93289F118F5C43108
+:1048C00071F1A8F4C73009F046C08AE08093150161
+:1048D00094E19093140193E090931301809312015B
+:1048E00088E08093110188E28093100134C0CE519A
+:1048F000C63088F5EC2FF0E0E65DFE4F80818093B6
+:10490000DE0129C0CE34E9F020F4CB3421F56AE091
+:1049100013C0C13579F0C235F1F461E00DC080916A
+:10492000DE01882319F01092DE0115C081E080932A
+:10493000DF0115C061E006C08091DE010E948E2279
+:104940000AC06AE08091DE010E94042304C0109234
+:10495000DF0180E004C081E002C080E0ABCFCF91F6
+:104960000895E1E8F0E08081886080838081816043
+:1049700080838FB7F89493E09093890090ED9093A3
+:1049800088008FBF0895EFE6F0E080818260808329
+:104990000895EFE6F0E080818D7F80830895EFE653
+:1049A000F0E0808192E08927808308951F920F9222
+:1049B0000FB60F9211242F933F934F935F936F93F2
+:1049C0007F938F939F93AF93BF93EF93FF938091C8
+:1049D000E0019091E10101969093E1018093E00163
+:1049E000811103C082E00E94D30AE091E101E695C3
+:1049F000E695F0E0EC51F84FE4918091E0018E13E0
+:104A000003C080E00E94D30AFF91EF91BF91AF9164
+:104A10009F918F917F916F915F914F913F912F91D6
+:104A20000F900FBE0F901F90189504D06894B1118D
+:104A30008DC0089570D088F09F5790F0B92F9927B6
+:104A4000B751A0F0D1F0660F771F881F991F1AF099
+:104A5000BA95C9F712C0B13081F077D0B1E00895AE
+:104A600074C0672F782F8827B85F39F0B93FCCF32F
+:104A7000869577956795B395D9F73EF4909580958F
+:104A8000709561957F4F8F4F9F4F0895E89409C0AF
+:104A900097FB3EF490958095709561957F4F8F4F71
+:104AA0009F4F9923A9F0F92F96E9BB279395F69587
+:104AB000879577956795B795F111F8CFFAF4BB0F05
+:104AC00011F460FF1BC06F5F7F4F8F4F9F4F16C069
+:104AD000882311F096E911C0772321F09EE8872FF3
+:104AE000762F05C0662371F096E8862F70E060E0AF
+:104AF0002AF09A95660F771F881FDAF7880F969528
+:104B0000879597F9089557FD9058440F551F59F010
+:104B10005F3F71F04795880F97FB991F61F09F3FAA
+:104B200079F087950895121613061406551FF2CFD3
+:104B30004695F1DF08C0161617061806991FF1CF23
+:104B400086957105610508940895E894BB2766274A
+:104B50007727CB0197F908950BD078C069D028F05A
+:104B60006ED018F0952309F05AC05FC01124EECF23
+:104B7000CADFA0F3959FD1F3950F50E0551F629FB8
+:104B8000F001729FBB27F00DB11D639FAA27F00DA6
+:104B9000B11DAA1F649F6627B00DA11D661F829FCD
+:104BA0002227B00DA11D621F739FB00DA11D621FB2
+:104BB000839FA00D611D221F749F3327A00D611DCF
+:104BC000231F849F600D211D822F762F6A2F1124B1
+:104BD0009F5750408AF0E1F088234AF0EE0FFF1F04
+:104BE000BB1F661F771F881F91505040A9F79E3F3B
+:104BF000510570F014C0AACF5F3FECF3983EDCF390
+:104C0000869577956795B795F795E7959F5FC1F777
+:104C1000FE2B880F911D9695879597F9089597F922
+:104C20009F6780E870E060E008959FEF80EC089552
+:104C300000240A941616170618060906089500247B
+:104C40000A9412161306140605060895092E0394F5
+:104C5000000C11F4882352F0BB0F40F4BF2B11F469
+:104C600060FF04C06F5F7F4F8F4F9F4F089597FB8A
+:104C7000072E16F4009407D077FD09D00E94512624
+:104C800007FC05D03EF4909581959F4F089570954F
+:104C900061957F4F0895EE0FFF1F0590F491E02D71
+:104CA0000994AA1BBB1B51E107C0AA1FBB1FA61773
+:104CB000B70710F0A61BB70B881F991F5A95A9F7C5
+:104CC00080959095BC01CD010895F999FECF92BDD4
+:104CD00081BDF89A992780B50895A8E1B0E042E037
+:104CE00050E00C948826262FF999FECF1FBA92BD6A
+:104CF00081BD20BD0FB6F894FA9AF99A0FBE0196BD
+:104D000008950E947326272F0C947426DC01CB0192
+:104D1000FC01F999FECF06C0F2BDE1BDF89A3196CB
+:104D200000B40D9241505040B8F70895F894FFCF69
+:104D30002002D50A620B3F0B0B0BD80A0101BC0104
+:104D400028080A03140A3F4D3639A50758072207D9
+:104D5000E9067C069506AE06C706010203040506B1
+:044D60000708090037
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c b/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c
new file mode 100644
index 000000000..d8911af41
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c
@@ -0,0 +1,783 @@
+#include "ergodox_ez.h"
+#include "action_layer.h"
+#include "keymap_common.h"
+#include "keymap_extras/keymap_german.h"
+
+#define UC_ASYMPTOTICALLY_EQUAL_TO 0
+#define UC_DIVISION_SIGN 1
+#define UC_DOWNWARDS_ARROW 2
+#define UC_ELEMENT_OF 3
+#define UC_EMPTY_SET 4
+#define UC_FOR_ALL 5
+#define UC_GREEK_CAPITAL_LETTER_ALPHA 6
+#define UC_GREEK_CAPITAL_LETTER_BETA 7
+#define UC_GREEK_CAPITAL_LETTER_CHI 8
+#define UC_GREEK_CAPITAL_LETTER_DELTA 9
+#define UC_GREEK_CAPITAL_LETTER_EPSILON 10
+#define UC_GREEK_CAPITAL_LETTER_ETA 11
+#define UC_GREEK_CAPITAL_LETTER_GAMMA 12
+#define UC_GREEK_CAPITAL_LETTER_IOTA 13
+#define UC_GREEK_CAPITAL_LETTER_KAPPA 14
+#define UC_GREEK_CAPITAL_LETTER_LAMDA 15
+#define UC_GREEK_CAPITAL_LETTER_MU 16
+#define UC_GREEK_CAPITAL_LETTER_NU 17
+#define UC_GREEK_CAPITAL_LETTER_OMEGA 18
+#define UC_GREEK_CAPITAL_LETTER_OMICRON 19
+#define UC_GREEK_CAPITAL_LETTER_PHI 20
+#define UC_GREEK_CAPITAL_LETTER_PI 21
+#define UC_GREEK_CAPITAL_LETTER_PSI 22
+#define UC_GREEK_CAPITAL_LETTER_RHO 23
+#define UC_GREEK_CAPITAL_LETTER_SIGMA 24
+#define UC_GREEK_CAPITAL_LETTER_TAU 25
+#define UC_GREEK_CAPITAL_LETTER_THETA 26
+#define UC_GREEK_CAPITAL_LETTER_UPSILON 27
+#define UC_GREEK_CAPITAL_LETTER_XI 28
+#define UC_GREEK_CAPITAL_LETTER_ZETA 29
+#define UC_GREEK_SMALL_LETTER_ALPHA 30
+#define UC_GREEK_SMALL_LETTER_BETA 31
+#define UC_GREEK_SMALL_LETTER_CHI 32
+#define UC_GREEK_SMALL_LETTER_DELTA 33
+#define UC_GREEK_SMALL_LETTER_EPSILON 34
+#define UC_GREEK_SMALL_LETTER_ETA 35
+#define UC_GREEK_SMALL_LETTER_FINAL_SIGMA 36
+#define UC_GREEK_SMALL_LETTER_GAMMA 37
+#define UC_GREEK_SMALL_LETTER_IOTA 38
+#define UC_GREEK_SMALL_LETTER_KAPPA 39
+#define UC_GREEK_SMALL_LETTER_LAMDA 40
+#define UC_GREEK_SMALL_LETTER_MU 41
+#define UC_GREEK_SMALL_LETTER_NU 42
+#define UC_GREEK_SMALL_LETTER_OMEGA 43
+#define UC_GREEK_SMALL_LETTER_OMICRON 44
+#define UC_GREEK_SMALL_LETTER_PHI 45
+#define UC_GREEK_SMALL_LETTER_PI 46
+#define UC_GREEK_SMALL_LETTER_PSI 47
+#define UC_GREEK_SMALL_LETTER_RHO 48
+#define UC_GREEK_SMALL_LETTER_SIGMA 49
+#define UC_GREEK_SMALL_LETTER_TAU 50
+#define UC_GREEK_SMALL_LETTER_THETA 51
+#define UC_GREEK_SMALL_LETTER_UPSILON 52
+#define UC_GREEK_SMALL_LETTER_XI 53
+#define UC_GREEK_SMALL_LETTER_ZETA 54
+#define UC_INFINITY 55
+#define UC_LEFTWARDS_ARROW 56
+#define UC_MULTIPLICATION_SIGN 57
+#define UC_NOT_AN_ELEMENT_OF 58
+#define UC_NOT_EQUAL_TO 59
+#define UC_PLUS_MINUS_SIGN 60
+#define UC_RIGHTWARDS_ARROW 61
+#define UC_SUBSCRIPT_EIGHT 62
+#define UC_SUBSCRIPT_FIVE 63
+#define UC_SUBSCRIPT_FOUR 64
+#define UC_SUBSCRIPT_NINE 65
+#define UC_SUBSCRIPT_ONE 66
+#define UC_SUBSCRIPT_SEVEN 67
+#define UC_SUBSCRIPT_SIX 68
+#define UC_SUBSCRIPT_THREE 69
+#define UC_SUBSCRIPT_TWO 70
+#define UC_SUBSCRIPT_ZERO 71
+#define UC_SUPERSCRIPT_EIGHT 72
+#define UC_SUPERSCRIPT_FIVE 73
+#define UC_SUPERSCRIPT_FOUR 74
+#define UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N 75
+#define UC_SUPERSCRIPT_NINE 76
+#define UC_SUPERSCRIPT_ONE 77
+#define UC_SUPERSCRIPT_SEVEN 78
+#define UC_SUPERSCRIPT_SIX 79
+#define UC_SUPERSCRIPT_THREE 80
+#define UC_SUPERSCRIPT_TWO 81
+#define UC_SUPERSCRIPT_ZERO 82
+#define UC_THERE_DOES_NOT_EXIST 83
+#define UC_THERE_EXISTS 84
+#define UC_UPWARDS_ARROW 85
+#define UC_VULGAR_FRACTION_ONE_EIGHTH 86
+#define UC_VULGAR_FRACTION_ONE_FIFTH 87
+#define UC_VULGAR_FRACTION_ONE_HALF 88
+#define UC_VULGAR_FRACTION_ONE_QUARTER 89
+#define UC_VULGAR_FRACTION_ONE_SIXTH 90
+#define UC_VULGAR_FRACTION_ONE_THIRD 91
+#define UC_VULGAR_FRACTION_THREE_QUARTERS 92
+#define UC_VULGAR_FRACTION_TWO_THIRDS 93
+#define UM 94
+
+#define L0 0 // layer_0
+#define L1 1 // layer_1
+#define L2 2 // layer_2
+#define L3 3 // layer_3
+#define L4 4 // layer_4
+#define L5 5 // layer_5
+#define L6 6 // layer_6
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * .------------------------------------.------------------------------------.
+ * |MO(5)| 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |MO(4)| X | P | F | W | G |HOME |TG(2)| H | J | K | L | Q | Z |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | SS |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * |MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT|
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * |INS |TG(2)| !M(UM)|DELT |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | APP | ! PGUP| ! !
+ * ! ! !-----! !-----! ! !
+ * |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE|
+ * '-----------------' '-----------------'
+ */
+[L0] = KEYMAP(
+ MO(5), DE_1, DE_2, DE_3, DE_4, DE_5, DE_ACUT,
+ MO(4), DE_X, DE_P, DE_F, DE_W, DE_G, KC_HOME,
+ MO(1), DE_U, DE_I, DE_A, DE_E, DE_O,
+ MO(3), DE_UE, DE_OE, DE_AE, DE_C, DE_V, KC_END,
+ KC_TRNS, KC_TRNS, KC_LGUI, KC_LALT, KC_LCTL,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_INS, TG(2),
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_APP,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, KC_LSFT, KC_ESC,
+ DE_GRV, DE_6, DE_7, DE_8, DE_9, DE_0, DE_CIRC,
+ TG(2), DE_H, DE_J, DE_K, DE_L, DE_Q, DE_Z,
+ /*-*/ DE_S, DE_N, DE_R, DE_T, DE_D, DE_SS,
+ KC_TAB, DE_B, DE_M, DE_COMM, DE_DOT, KC_UP, DE_Y,
+ /*-*/ /*-*/ KC_RCTL, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT,
+ M(UM), KC_DELT,
+ KC_PGUP,
+ KC_PGDN, KC_ENTER, KC_SPACE
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | |EXLM|DQOT|PARA| | | | | | | | |RING| |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | |ASTR|PIPE|SLSH|LCBR|RCBR| | |HASH|LESS|MORE| |DQOT| |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | |PLUS|EQL | | | | |BSLS|PERC|SCLN|COLN| ↑ | |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | ← | ↓ | → |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L1] = KEYMAP(
+ KC_TRNS, DE_EXLM, DE_DQOT, DE_PARA, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, DE_ASTR, DE_PIPE, DE_SLSH, DE_LCBR, DE_RCBR, KC_TRNS,
+ KC_TRNS, DE_UNDS, DE_MINS, DE_AMPR, DE_LBRC, DE_RBRC,
+ KC_TRNS, KC_TRNS, DE_PLUS, DE_EQL, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_RING, KC_TRNS,
+ KC_TRNS, DE_HASH, DE_LESS, DE_MORE, KC_TRNS, DE_DQOT, KC_TRNS,
+ /*-*/ DE_DLR, DE_LPRN, DE_RPRN, DE_TILD, DE_QUOT, DE_QST,
+ KC_TRNS, DE_BSLS, DE_PERC, DE_SCLN, DE_COLN, M(UC_UPWARDS_ARROW), KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, M(UC_LEFTWARDS_ARROW), M(UC_DOWNWARDS_ARROW), M(UC_RIGHTWARDS_ARROW),
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | | | | | | | | | P7 | P8 | P9 |PAST|PSLS |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | |-----!-----! | P4 | P5 | P6 |PMNS|PMNS |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | | | NLCK| | P1 | P2 | P3 |PPLS|PPLS |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! P0 |PCMM|PDOT|PENT|PENT|
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L2] = KEYMAP(
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_PEQL,
+ KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS,
+ /*-*/ KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PMNS,
+ KC_NLCK, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PPLS,
+ /*-*/ /*-*/ KC_P0, KC_PCMM, KC_PDOT, KC_PENT, KC_PENT,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | ¹ | ² | ³ | ⁴ | ⁵ | ∀ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | × | ½ | ÷ | ¼ | ⅕ | | | ⅙ | | ⅛ | | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | ± | AT |EURO| ∅ |-----!-----! ∞ | ⁿ | ∃ | ∈ | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | ⅓ | ≠ | ⅔ | ¾ | ≃ | | |EXLM| | ∄ | ∉ | | |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L3] = KEYMAP(
+ KC_TRNS, M(UC_SUPERSCRIPT_ONE), M(UC_SUPERSCRIPT_TWO), M(UC_SUPERSCRIPT_THREE), M(UC_SUPERSCRIPT_FOUR), M(UC_SUPERSCRIPT_FIVE), M(UC_FOR_ALL),
+ KC_TRNS, M(UC_MULTIPLICATION_SIGN), M(UC_VULGAR_FRACTION_ONE_HALF), M(UC_DIVISION_SIGN), M(UC_VULGAR_FRACTION_ONE_QUARTER), M(UC_VULGAR_FRACTION_ONE_FIFTH), KC_TRNS,
+ KC_TRNS, KC_TRNS, M(UC_PLUS_MINUS_SIGN), DE_AT, DE_EURO, M(UC_EMPTY_SET),
+ KC_TRNS, M(UC_VULGAR_FRACTION_ONE_THIRD), M(UC_NOT_EQUAL_TO), M(UC_VULGAR_FRACTION_TWO_THIRDS), M(UC_VULGAR_FRACTION_THREE_QUARTERS), M(UC_ASYMPTOTICALLY_EQUAL_TO), KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_SUPERSCRIPT_SIX), M(UC_SUPERSCRIPT_SEVEN), M(UC_SUPERSCRIPT_EIGHT), M(UC_SUPERSCRIPT_NINE), M(UC_SUPERSCRIPT_ZERO), KC_TRNS,
+ KC_TRNS, M(UC_VULGAR_FRACTION_ONE_SIXTH), KC_TRNS, M(UC_VULGAR_FRACTION_ONE_EIGHTH), KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ M(UC_INFINITY), M(UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N), M(UC_THERE_EXISTS), M(UC_ELEMENT_OF), KC_TRNS, KC_TRNS,
+ KC_TRNS, DE_EXLM, KC_TRNS, M(UC_THERE_DOES_NOT_EXIST), M(UC_NOT_AN_ELEMENT_OF), KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | ₁ | ₂ | ₃ | ₄ | ₅ | | | ₆ | ₇ | ₈ | ₉ | ₀ | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | χ | π | φ | ω | γ | | | η | ξ | κ | λ | | ζ |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | υ | ι | α | ε | ο |-----!-----! σ | ν | ρ | τ | δ | ς |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | θ | | | | | | β | μ | | | | ψ |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L4] = KEYMAP(
+ KC_TRNS, M(UC_SUBSCRIPT_ONE), M(UC_SUBSCRIPT_TWO), M(UC_SUBSCRIPT_THREE), M(UC_SUBSCRIPT_FOUR), M(UC_SUBSCRIPT_FIVE), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_CHI), M(UC_GREEK_SMALL_LETTER_PI), M(UC_GREEK_SMALL_LETTER_PHI), M(UC_GREEK_SMALL_LETTER_OMEGA), M(UC_GREEK_SMALL_LETTER_GAMMA), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_UPSILON), M(UC_GREEK_SMALL_LETTER_IOTA), M(UC_GREEK_SMALL_LETTER_ALPHA), M(UC_GREEK_SMALL_LETTER_EPSILON), M(UC_GREEK_SMALL_LETTER_OMICRON),
+ KC_TRNS, KC_TRNS, M(UC_GREEK_SMALL_LETTER_THETA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_SUBSCRIPT_SIX), M(UC_SUBSCRIPT_SEVEN), M(UC_SUBSCRIPT_EIGHT), M(UC_SUBSCRIPT_NINE), M(UC_SUBSCRIPT_ZERO), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_ETA), M(UC_GREEK_SMALL_LETTER_XI), M(UC_GREEK_SMALL_LETTER_KAPPA), M(UC_GREEK_SMALL_LETTER_LAMDA), KC_TRNS, M(UC_GREEK_SMALL_LETTER_ZETA),
+ /*-*/ M(UC_GREEK_SMALL_LETTER_SIGMA), M(UC_GREEK_SMALL_LETTER_NU), M(UC_GREEK_SMALL_LETTER_RHO), M(UC_GREEK_SMALL_LETTER_TAU), M(UC_GREEK_SMALL_LETTER_DELTA), M(UC_GREEK_SMALL_LETTER_FINAL_SIGMA),
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_BETA), M(UC_GREEK_SMALL_LETTER_MU), KC_TRNS, KC_TRNS, KC_TRNS, M(UC_GREEK_SMALL_LETTER_PSI),
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | | | | | | | | | | | | | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | Χ | Π | Φ | Ω | Γ | | | Η | Ξ | Κ | Λ | | Ζ |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | Υ | Ι | Α | Ε | Ο |-----!-----! Σ | Ν | Ρ | Τ | Δ | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | Θ | | | | | | Β | Μ | | | | Ψ |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L5] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_CHI), M(UC_GREEK_CAPITAL_LETTER_PI), M(UC_GREEK_CAPITAL_LETTER_PHI), M(UC_GREEK_CAPITAL_LETTER_OMEGA), M(UC_GREEK_CAPITAL_LETTER_GAMMA), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_UPSILON), M(UC_GREEK_CAPITAL_LETTER_IOTA), M(UC_GREEK_CAPITAL_LETTER_ALPHA), M(UC_GREEK_CAPITAL_LETTER_EPSILON), M(UC_GREEK_CAPITAL_LETTER_OMICRON),
+ KC_TRNS, KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_THETA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ETA), M(UC_GREEK_CAPITAL_LETTER_XI), M(UC_GREEK_CAPITAL_LETTER_KAPPA), M(UC_GREEK_CAPITAL_LETTER_LAMDA), KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ZETA),
+ /*-*/ M(UC_GREEK_CAPITAL_LETTER_SIGMA), M(UC_GREEK_CAPITAL_LETTER_NU), M(UC_GREEK_CAPITAL_LETTER_RHO), M(UC_GREEK_CAPITAL_LETTER_TAU), M(UC_GREEK_CAPITAL_LETTER_DELTA), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_BETA), M(UC_GREEK_CAPITAL_LETTER_MU), KC_TRNS, KC_TRNS, KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_PSI),
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | | | | | | | | | | | | | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | | | | | | | | | | | | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | |-----!-----! | | | | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | | | | | | | | | |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L6] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {};
+
+#define UC_MODE_WIN 0
+#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+
+// TODO: allow default mode to be configured
+static uint16_t unicode_mode = UC_MODE_WIN;
+
+uint16_t hextokeycode(uint8_t hex) {
+ if (hex == 0x0) {
+ return KC_P0;
+ }
+ if (hex < 0xA) {
+ return KC_P1 + (hex - 0x1);
+ }
+ return KC_A + (hex - 0xA);
+}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {
+ switch (unicode_mode) {
+ case UC_MODE_WIN:
+ register_code(KC_LALT);
+
+ register_code(KC_PPLS);
+ unregister_code(KC_PPLS);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LALT);
+ break;
+ case UC_MODE_LINUX:
+ register_code(KC_LCTL);
+ register_code(KC_LSFT);
+
+ register_code(KC_U);
+ unregister_code(KC_U);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LCTL);
+ unregister_code(KC_LSFT);
+ break;
+ case UC_MODE_OSX:
+ break;
+ }
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+ if (!record->event.pressed) {
+ return MACRO_NONE;
+ }
+ // MACRODOWN only works in this function
+ switch(id) {
+ case UM:
+ unicode_mode = (unicode_mode + 1) % 2;
+ break;
+
+case UC_GREEK_SMALL_LETTER_OMICRON:
+ unicode_action_function(0x03, 0xbf);
+ break;
+case UC_LEFTWARDS_ARROW:
+ unicode_action_function(0x21, 0x90);
+ break;
+case UC_GREEK_CAPITAL_LETTER_RHO:
+ unicode_action_function(0x03, 0xa1);
+ break;
+case UC_SUBSCRIPT_THREE:
+ unicode_action_function(0x20, 0x83);
+ break;
+case UC_VULGAR_FRACTION_ONE_EIGHTH:
+ unicode_action_function(0x21, 0x5b);
+ break;
+case UC_GREEK_SMALL_LETTER_LAMDA:
+ unicode_action_function(0x03, 0xbb);
+ break;
+case UC_VULGAR_FRACTION_ONE_THIRD:
+ unicode_action_function(0x21, 0x53);
+ break;
+case UC_GREEK_SMALL_LETTER_XI:
+ unicode_action_function(0x03, 0xbe);
+ break;
+case UC_THERE_DOES_NOT_EXIST:
+ unicode_action_function(0x22, 0x04);
+ break;
+case UC_SUPERSCRIPT_ONE:
+ unicode_action_function(0x00, 0xb9);
+ break;
+case UC_GREEK_SMALL_LETTER_BETA:
+ unicode_action_function(0x03, 0xb2);
+ break;
+case UC_SUBSCRIPT_FIVE:
+ unicode_action_function(0x20, 0x85);
+ break;
+case UC_GREEK_CAPITAL_LETTER_IOTA:
+ unicode_action_function(0x03, 0x99);
+ break;
+case UC_VULGAR_FRACTION_ONE_FIFTH:
+ unicode_action_function(0x21, 0x55);
+ break;
+case UC_GREEK_SMALL_LETTER_PSI:
+ unicode_action_function(0x03, 0xc8);
+ break;
+case UC_SUBSCRIPT_NINE:
+ unicode_action_function(0x20, 0x89);
+ break;
+case UC_SUPERSCRIPT_FOUR:
+ unicode_action_function(0x20, 0x74);
+ break;
+case UC_RIGHTWARDS_ARROW:
+ unicode_action_function(0x21, 0x92);
+ break;
+case UC_SUPERSCRIPT_SIX:
+ unicode_action_function(0x20, 0x76);
+ break;
+case UC_DOWNWARDS_ARROW:
+ unicode_action_function(0x21, 0x93);
+ break;
+case UC_GREEK_SMALL_LETTER_PI:
+ unicode_action_function(0x03, 0xc0);
+ break;
+case UC_SUPERSCRIPT_TWO:
+ unicode_action_function(0x00, 0xb2);
+ break;
+case UC_GREEK_CAPITAL_LETTER_OMEGA:
+ unicode_action_function(0x03, 0xa9);
+ break;
+case UC_GREEK_CAPITAL_LETTER_PSI:
+ unicode_action_function(0x03, 0xa8);
+ break;
+case UC_SUBSCRIPT_FOUR:
+ unicode_action_function(0x20, 0x84);
+ break;
+case UC_GREEK_CAPITAL_LETTER_NU:
+ unicode_action_function(0x03, 0x9d);
+ break;
+case UC_DIVISION_SIGN:
+ unicode_action_function(0x00, 0xf7);
+ break;
+case UC_GREEK_SMALL_LETTER_SIGMA:
+ unicode_action_function(0x03, 0xc3);
+ break;
+case UC_GREEK_SMALL_LETTER_RHO:
+ unicode_action_function(0x03, 0xc1);
+ break;
+case UC_VULGAR_FRACTION_ONE_SIXTH:
+ unicode_action_function(0x21, 0x59);
+ break;
+case UC_GREEK_SMALL_LETTER_GAMMA:
+ unicode_action_function(0x03, 0xb3);
+ break;
+case UC_VULGAR_FRACTION_TWO_THIRDS:
+ unicode_action_function(0x21, 0x54);
+ break;
+case UC_GREEK_SMALL_LETTER_NU:
+ unicode_action_function(0x03, 0xbd);
+ break;
+case UC_GREEK_SMALL_LETTER_ZETA:
+ unicode_action_function(0x03, 0xb6);
+ break;
+case UC_GREEK_SMALL_LETTER_EPSILON:
+ unicode_action_function(0x03, 0xb5);
+ break;
+case UC_GREEK_SMALL_LETTER_KAPPA:
+ unicode_action_function(0x03, 0xba);
+ break;
+case UC_SUPERSCRIPT_SEVEN:
+ unicode_action_function(0x20, 0x77);
+ break;
+case UC_GREEK_CAPITAL_LETTER_PI:
+ unicode_action_function(0x03, 0xa0);
+ break;
+case UC_GREEK_SMALL_LETTER_FINAL_SIGMA:
+ unicode_action_function(0x03, 0xc2);
+ break;
+case UC_GREEK_CAPITAL_LETTER_XI:
+ unicode_action_function(0x03, 0x9e);
+ break;
+case UC_GREEK_SMALL_LETTER_THETA:
+ unicode_action_function(0x03, 0xb8);
+ break;
+case UC_GREEK_SMALL_LETTER_ETA:
+ unicode_action_function(0x03, 0xb7);
+ break;
+case UC_SUBSCRIPT_TWO:
+ unicode_action_function(0x20, 0x82);
+ break;
+case UC_ASYMPTOTICALLY_EQUAL_TO:
+ unicode_action_function(0x22, 0x43);
+ break;
+case UC_GREEK_SMALL_LETTER_ALPHA:
+ unicode_action_function(0x03, 0xb1);
+ break;
+case UC_GREEK_CAPITAL_LETTER_PHI:
+ unicode_action_function(0x03, 0xa6);
+ break;
+case UC_GREEK_SMALL_LETTER_PHI:
+ unicode_action_function(0x03, 0xc6);
+ break;
+case UC_INFINITY:
+ unicode_action_function(0x22, 0x1e);
+ break;
+case UC_GREEK_CAPITAL_LETTER_OMICRON:
+ unicode_action_function(0x03, 0x9f);
+ break;
+case UC_ELEMENT_OF:
+ unicode_action_function(0x22, 0x08);
+ break;
+case UC_MULTIPLICATION_SIGN:
+ unicode_action_function(0x00, 0xd7);
+ break;
+case UC_SUBSCRIPT_ZERO:
+ unicode_action_function(0x20, 0x80);
+ break;
+case UC_GREEK_CAPITAL_LETTER_SIGMA:
+ unicode_action_function(0x03, 0xa3);
+ break;
+case UC_GREEK_SMALL_LETTER_OMEGA:
+ unicode_action_function(0x03, 0xc9);
+ break;
+case UC_SUBSCRIPT_ONE:
+ unicode_action_function(0x20, 0x81);
+ break;
+case UC_GREEK_CAPITAL_LETTER_ZETA:
+ unicode_action_function(0x03, 0x96);
+ break;
+case UC_GREEK_SMALL_LETTER_TAU:
+ unicode_action_function(0x03, 0xc4);
+ break;
+case UC_SUPERSCRIPT_FIVE:
+ unicode_action_function(0x20, 0x75);
+ break;
+case UC_THERE_EXISTS:
+ unicode_action_function(0x22, 0x03);
+ break;
+case UC_PLUS_MINUS_SIGN:
+ unicode_action_function(0x00, 0xb1);
+ break;
+case UC_VULGAR_FRACTION_THREE_QUARTERS:
+ unicode_action_function(0x00, 0xbe);
+ break;
+case UC_SUPERSCRIPT_THREE:
+ unicode_action_function(0x00, 0xb3);
+ break;
+case UC_EMPTY_SET:
+ unicode_action_function(0x22, 0x05);
+ break;
+case UC_UPWARDS_ARROW:
+ unicode_action_function(0x21, 0x91);
+ break;
+case UC_SUPERSCRIPT_NINE:
+ unicode_action_function(0x20, 0x79);
+ break;
+case UC_GREEK_SMALL_LETTER_DELTA:
+ unicode_action_function(0x03, 0xb4);
+ break;
+case UC_GREEK_SMALL_LETTER_MU:
+ unicode_action_function(0x03, 0xbc);
+ break;
+case UC_GREEK_CAPITAL_LETTER_KAPPA:
+ unicode_action_function(0x03, 0x9a);
+ break;
+case UC_SUBSCRIPT_EIGHT:
+ unicode_action_function(0x20, 0x88);
+ break;
+case UC_GREEK_CAPITAL_LETTER_ALPHA:
+ unicode_action_function(0x03, 0x91);
+ break;
+case UC_SUBSCRIPT_SEVEN:
+ unicode_action_function(0x20, 0x87);
+ break;
+case UC_GREEK_CAPITAL_LETTER_BETA:
+ unicode_action_function(0x03, 0x92);
+ break;
+case UC_GREEK_CAPITAL_LETTER_ETA:
+ unicode_action_function(0x03, 0x97);
+ break;
+case UC_SUPERSCRIPT_EIGHT:
+ unicode_action_function(0x20, 0x78);
+ break;
+case UC_SUPERSCRIPT_ZERO:
+ unicode_action_function(0x20, 0x70);
+ break;
+case UC_NOT_AN_ELEMENT_OF:
+ unicode_action_function(0x22, 0x09);
+ break;
+case UC_GREEK_SMALL_LETTER_UPSILON:
+ unicode_action_function(0x03, 0xc5);
+ break;
+case UC_NOT_EQUAL_TO:
+ unicode_action_function(0x22, 0x60);
+ break;
+case UC_GREEK_CAPITAL_LETTER_CHI:
+ unicode_action_function(0x03, 0xa7);
+ break;
+case UC_FOR_ALL:
+ unicode_action_function(0x22, 0x00);
+ break;
+case UC_GREEK_CAPITAL_LETTER_TAU:
+ unicode_action_function(0x03, 0xa4);
+ break;
+case UC_VULGAR_FRACTION_ONE_QUARTER:
+ unicode_action_function(0x00, 0xbc);
+ break;
+case UC_GREEK_SMALL_LETTER_CHI:
+ unicode_action_function(0x03, 0xc7);
+ break;
+case UC_GREEK_CAPITAL_LETTER_THETA:
+ unicode_action_function(0x03, 0x98);
+ break;
+case UC_GREEK_SMALL_LETTER_IOTA:
+ unicode_action_function(0x03, 0xb9);
+ break;
+case UC_GREEK_CAPITAL_LETTER_LAMDA:
+ unicode_action_function(0x03, 0x9b);
+ break;
+case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N:
+ unicode_action_function(0x20, 0x7f);
+ break;
+case UC_GREEK_CAPITAL_LETTER_UPSILON:
+ unicode_action_function(0x03, 0xa5);
+ break;
+case UC_GREEK_CAPITAL_LETTER_MU:
+ unicode_action_function(0x03, 0x9c);
+ break;
+case UC_GREEK_CAPITAL_LETTER_EPSILON:
+ unicode_action_function(0x03, 0x95);
+ break;
+case UC_GREEK_CAPITAL_LETTER_GAMMA:
+ unicode_action_function(0x03, 0x93);
+ break;
+case UC_SUBSCRIPT_SIX:
+ unicode_action_function(0x20, 0x86);
+ break;
+case UC_GREEK_CAPITAL_LETTER_DELTA:
+ unicode_action_function(0x03, 0x94);
+ break;
+case UC_VULGAR_FRACTION_ONE_HALF:
+ unicode_action_function(0x00, 0xbd);
+ break;
+ default:
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case L1:
+ ergodox_right_led_1_on();
+ break;
+ case L2:
+ ergodox_right_led_2_on();
+ break;
+ case L3:
+ ergodox_right_led_3_on();
+ break;
+ case L4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ break;
+ case L5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ // case L6:
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ // case L7:
+ // ergodox_right_led_1_on();
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ default:
+ ergodox_board_led_off();
+ break;
+ }
+};
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md b/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md
new file mode 100644
index 000000000..2c9e0a837
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md
@@ -0,0 +1,188 @@
+# ManuNeo Ergodox Keyboard Layout
+
+Compile this file to a `keymap.c` file using `compile_keymap.py`
+
+ python compile_keymap.py keymaps/german-manuneo/keymap.md
+
+Tested with python 2.7 and python 3.4
+
+
+# Layout Config
+
+ {
+ "layout": "ergodox_ez",
+ "keymaps_includes": [
+ "ergodox_ez.h",
+ "action_layer.h",
+ "keymap_common.h",
+ "keymap_extras/keymap_german.h",
+ ],
+ "key_prefixes": ["DE_", "KC_"],
+ "macros": {
+ // TODO: implement macros
+ // "MUC": "",
+ },
+ // TODO: implement default unicode mode
+ }
+
+
+# Layers
+
+
+## Layer 0
+
+ .------------------------------------.------------------------------------.
+ |MO(5)| 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ |MO(4)| X | P | F | W | G |HOME |TG(2)| H | J | K | L | Q | Z |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | SS |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ |MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT|
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ |INS |TG(2)| !M(UM)|DELT |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | APP | ! PGUP| ! !
+ ! ! !-----! !-----! ! !
+ |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE|
+ '-----------------' '-----------------'
+
+
+## Layer 1
+
+ .------------------------------------.------------------------------------.
+ | |EXLM|DQOT|PARA| | | | | | | | |RING| |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | |ASTR|PIPE|SLSH|LCBR|RCBR| | |HASH|LESS|MORE| |DQOT| |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | |PLUS|EQL | | | | |BSLS|PERC|SCLN|COLN| ↑ | |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | ← | ↓ | → |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 2
+
+ .------------------------------------.------------------------------------.
+ | | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | | | | | | | | | P7 | P8 | P9 |PAST|PSLS |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | |-----!-----! | P4 | P5 | P6 |PMNS|PMNS |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | | | NLCK| | P1 | P2 | P3 |PPLS|PPLS |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! P0 |PCMM|PDOT|PENT|PENT|
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+
+## Layer 3
+
+http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html
+
+ .------------------------------------.------------------------------------.
+ | | ¹ | ² | ³ | ⁴ | ⁵ | ∀ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | × | ½ | ÷ | ¼ | ⅕ | | | ⅙ | | ⅛ | | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | ± | AT |EURO| ∅ |-----!-----! ∞ | ⁿ | ∃ | ∈ | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | ⅓ | ≠ | ⅔ | ¾ | ≃ | | |EXLM| | ∄ | ∉ | | |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 4
+
+
+ .------------------------------------.------------------------------------.
+ | | ₁ | ₂ | ₃ | ₄ | ₅ | | | ₆ | ₇ | ₈ | ₉ | ₀ | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | χ | π | φ | ω | γ | | | η | ξ | κ | λ | | ζ |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | υ | ι | α | ε | ο |-----!-----! σ | ν | ρ | τ | δ | ς |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | θ | | | | | | β | μ | | | | ψ |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 5
+
+ .------------------------------------.------------------------------------.
+ | | | | | | | | | | | | | | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | Χ | Π | Φ | Ω | Γ | | | Η | Ξ | Κ | Λ | | Ζ |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | Υ | Ι | Α | Ε | Ο |-----!-----! Σ | Ν | Ρ | Τ | Δ | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | Θ | | | | | | Β | Μ | | | | Ψ |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 6
+
+ .------------------------------------.------------------------------------.
+ | | | | | | | | | | | | | | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | | | | | | | | | | | | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | |-----!-----! | | | | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | | | | | | | | | |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
diff --git a/keyboard/ergodox_ez/keymaps/j3rn/keymap.c b/keyboard/ergodox_ez/keymaps/j3rn/keymap.c
index b5463cb72..6e271321d 100644
--- a/keyboard/ergodox_ez/keymaps/j3rn/keymap.c
+++ b/keyboard/ergodox_ez/keymaps/j3rn/keymap.c
@@ -14,11 +14,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | - | | = | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * |Ctrl/Esc| A | S | D | F | G |------| |------| H | J | K | L |; / L2| ' |
+ * |Ctrl/Esc|A / L2| S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | ~L1 | '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
+ * | ~L1 | ~L2 |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | App | Home | | PgUp |Ctrl/Esc|
@@ -34,9 +34,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS,
- CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G,
+ CTL_T(KC_ESC), LT(MDIA, KC_A),KC_S, KC_D, KC_F, KC_G,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
- KC_FN1, KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
+ KC_FN1, KC_FN2, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
ALT_T(KC_APP), KC_HOME,
KC_END,
@@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// right hand
KC_RBRC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_EQL, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
- KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),KC_QUOT,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1,
@@ -99,13 +99,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | | | | MsUp | | | | | | | | | | | |
+ * | | | | | | | | | | | | Lclk | Rclk | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
+ * | | | | | | |------| |------|MsLeft|MsDown| MsUp |MsRght| | Play |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | | | | | | | | Prev | Next | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
+ * | | | | | | |VolUp |VolDn | Mute | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
@@ -116,19 +116,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
-KEYMAP(
+[MDIA] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS,
+ KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_MPLY,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
@@ -138,7 +138,8 @@ KEYMAP(
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
+ [1] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Layer 1 (Symbols)
+ [2] = ACTION_LAYER_TAP_TOGGLE(MDIA) // FN2 - Momentary Layer 2 (Media)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
diff --git a/keyboard/ergodox_ez/keymaps/j3rn/readme.md b/keyboard/ergodox_ez/keymaps/j3rn/readme.md
index b0c4d267b..fc4b64042 100644
--- a/keyboard/ergodox_ez/keymaps/j3rn/readme.md
+++ b/keyboard/ergodox_ez/keymaps/j3rn/readme.md
@@ -1,10 +1,10 @@
-# J3RN's Mac-centric Ergodox EZ keymap
+# J3RN's Mac-centric ErgoDox EZ keymap
## Motivation
-Essentially, I wanted to switch to a layout that was less jarring than the default Ergodox EZ layout, and did not require finger gymnastics to perform common OS X shortcuts (most of which involve the CMD (LGui) key).
+Essentially, I wanted to switch to a layout that was less jarring than the default ErgoDox EZ layout, and did not require finger gymnastics to perform common OS X shortcuts (most of which involve the CMD (LGui) key).
-## How is it different from the default Ergodox EZ layout?
+## How is it different from the default ErgoDox EZ layout?
This layout more closely resembles that of the Mac keyboard, and has some other goodness baked in. Here is a rundown of what that means:
@@ -18,6 +18,7 @@ This layout more closely resembles that of the Mac keyboard, and has some other
### Other changes
- **The button to the left of "A" is Ctrl/Esc instead of Backspace.** This is actually how I have the keyboard on my Macbook set up to be, since it's loads more convenient than a CAPS LOCK key. This is the Ctrl key I find myself using most.
+- **Mouse uses Vim-style navigation**. To activate "Media mode," hold the 'a' key. This allows you to move the mouse around with hjkl just like in Vim. Additionally, right and left click are the conveniently placed 'i' and 'o' keys.
- **The key to the right of "5" and the key to left of "6" are "[" and "]", respectively, instead of Left and Right.** There is a more convenient set of Left and Right already present. Truth be told, I don't really use these keys, as they are a stretch to reach.
- **The Toggle L1 keys have been replaced by the otherwise displaced "-" and "=".** They are laid out, left-to-right, in the same order as on the Mac keyboard. Honestly, they are not terribly conveniently placed, and their placement might change in a later version. I found that I did not toggle L1 frequently at all, and found using the momentary keys to access L1 to fit my workflow better.
- **The "~"/L1 key in the bottom-left is now just momentary L1.** The "~" key was moved to the top-left as mentioned before, and I like to keep my multi-use keys to a minimum due to the latency for them to switch from "press" to "hold."
diff --git a/keyboard/ergodox_ez/keymaps/msc/img/code_layer.png b/keyboard/ergodox_ez/keymaps/msc/img/code_layer.png
new file mode 100644
index 000000000..7b5efaae7
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/msc/img/code_layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/msc/img/main_layer.png b/keyboard/ergodox_ez/keymaps/msc/img/main_layer.png
new file mode 100644
index 000000000..65f92dda1
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/msc/img/main_layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/msc/img/media_layer.png b/keyboard/ergodox_ez/keymaps/msc/img/media_layer.png
new file mode 100644
index 000000000..a69799b07
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/msc/img/media_layer.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/msc/keymap.c b/keyboard/ergodox_ez/keymaps/msc/keymap.c
new file mode 100644
index 000000000..e567e513f
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/msc/keymap.c
@@ -0,0 +1,184 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define MDIA 2 // media keys
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | BkSp | A | S | D | F | G |------| |------| H | J | K | L | ; |' / Cmd |
+ * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
+ * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | Cmd | Alt |AltShf| Left | Right| | Left | Down | Up |Right | L2 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | App | LGui | | Alt |Ctrl/Esc|
+ * ,------|------|------| |------+--------+------.
+ * | | | Home | | PgUp | | |
+ * | Space|Backsp|------| |------| Tab |Enter |
+ * | |ace | End | | PgDn | | |
+ * `--------------------' `----------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
+ KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB),
+ KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
+ KC_LGUI,KC_LALT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
+ ALT_T(KC_APP), KC_LGUI,
+ KC_HOME,
+ KC_SPC,KC_BSPC,KC_END,
+ // right hand
+ KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN,GUI_T(KC_QUOT),
+ MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
+ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(MDIA),
+ KC_LALT, CTL_T(KC_ESC),
+ KC_PGUP,
+ KC_PGDN,KC_TAB, KC_ENT
+ ),
+/* Keymap 1: Symbol Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | . | 0 | = | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// SYMBOLS
+[SYMB] = KEYMAP(
+ // left hand
+ KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
+ KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
+ KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
+ KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,
+ KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,
+ // right hand
+ KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
+ KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
+ KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
+ KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* Keymap 2: Media and mouse keys
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | | MsUp | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | Mute | | | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | Prev |VolDn |VolUp | Next | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | |Brwser|
+ * | Lclk | Rclk |------| |------| |Back |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// MEDIA AND MOUSE
+[MDIA] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_BTN1, KC_BTN2, KC_TRNS,
+ // right hand
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY,
+ KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_WBAK
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ // TODO: Make this relevant to the ErgoDox EZ.
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ default:
+ // none
+ break;
+ }
+
+};
diff --git a/keyboard/ergodox_ez/keymaps/msc/msc.hex b/keyboard/ergodox_ez/keymaps/msc/msc.hex
new file mode 100644
index 000000000..a466a37af
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/msc/msc.hex
@@ -0,0 +1,1118 @@
+:100000000C9465020C94A9020C94A9020C94A90208
+:100010000C94A9020C94A9020C94A9020C94A902B4
+:100020000C94A9020C94A9020C94AD0B0C947F0CB7
+:100030000C94A9020C94A9020C94A9020C94A90294
+:100040000C94A9020C9404210C94A9020C94A9020A
+:100050000C94A9020C94951A0C94A9020C94A90270
+:100060000C94A9020C94A9020C94A9020C94A90264
+:100070000C94A9020C94A9020C94A9020C94A90254
+:100080000C94A9020C94A9020C94A9020C94A90244
+:100090000C94A9020C94A9020C94A9020C94A90234
+:1000A0000C94A9020C94A9020C94A902EC0C0E0D5C
+:1000B000FC0D0E0DFC0D530D760DFC0DCB0DDE0D64
+:1000C000C010C010EF10EF10321170118913891396
+:1000D000891189138A128A125D1389138913741383
+:1000E0000000F0A12E004C002A00E100E300000017
+:1000F0001E00140004001D71E2004D001F001A00D4
+:1001000016001B00E1042A0020000800070006007A
+:1001100050002C0021001500090019004F004A0072
+:10012000220017000A000500000065745000015409
+:100130000000007F0000E3004F0001540000007742
+:100140000000E20023001C000B00110000002971D8
+:10015000240018000D00100050004B0025000C007A
+:100160000E00360051002800260012000F00370054
+:1001700052002B0027001300330038714F004E004F
+:100180002D0031003478E500025400000100010028
+:1001900001000100010000003A001E0220022202BC
+:1001A000010001003B001F022102230201000100A7
+:1001B0003C002F0226022F00010001003D0030020A
+:1001C00027023000010001003E00310235003502F7
+:1001D000000001000100010000000100000001001A
+:1001E0000100010000000100000001003F0052007A
+:1001F00051002402000001004000240021001E00E4
+:10020000010001004100250022001F00370001000D
+:1002100042002600230020002700010043002502A1
+:100220002E0231002E0001004400450001000100B3
+:1002300001000000010001000100010001000000B8
+:1002400001000100010001000100010001000100A6
+:10025000F20001000100F5000100F000F1000100D2
+:100260000100F40001000100F300010001000100A1
+:100270000100010001000100000001000100010077
+:100280000000010000000100010001000000010069
+:100290000000010001000100010001000000010058
+:1002A000010001000100A800AC00010001000100F4
+:1002B00001000100AA00B6000100010001000100D8
+:1002C000A90001000100010001000100AB000100D4
+:1002D00001000100AE00010001000000160345000E
+:1002E000720067006F0044006F0078002000450036
+:1002F0005A00000016034500720067006F004400BA
+:100300006F007800200045005A0000000403090433
+:1003100009026D00040100A0FA09040000010301B4
+:100320000100092111010001223F00070581030896
+:10033000000A090401000103010200092111010062
+:1003400001224D000705820308000A09040200018A
+:100350000300000009211101000122360007058376
+:100360000308000A09040300010300000009211129
+:100370000100012239000705840310000112011059
+:100380000100000008EDFE07130100010200010555
+:10039000010906A101050719E029E71500250195C6
+:1003A0000875018102050819012905950575019156
+:1003B000029501750391010507190029771500259C
+:1003C00001957875018102C005010980A1018502AE
+:1003D00016010026B7001A01002AB7007510950112
+:1003E0008100C0050C0901A1018503160100269CAE
+:1003F000021A01002A9C02751095018100C00501B6
+:100400000902A1010901A100050919012905150029
+:10041000250195057501810295017503810105018D
+:10042000093009311581257F950275088106093843
+:100430001581257F950175088106050C0A3802157E
+:1004400081257F950175088106C0C005010906A1B7
+:1004500001050719E029E7150025019508750181B7
+:100460000295017508810105081901290595057591
+:100470000191029501750391010507190029FF15E6
+:100480000025FF950675088100C0000000000000EF
+:100490000000000000010204060A0F17202C3A4A4F
+:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2
+:1004B000B39D87715D4A3A2C20170F0A060402018A
+:1004C0000000000000000000000011241FBECFEF5C
+:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A
+:1004E0009091EF01A091F001B091F1018730904B14
+:1004F000A740B04BB9F41092EE011092EF011092A8
+:10050000F0011092F10114BE84B7877F84BF88E1A7
+:100510000FB6F89480936000109260000FBEE0E088
+:10052000FFE3099511E0A0E0B1E0ECE8F5E402C0DA
+:1005300005900D92A433B107D9F711E0A4E3B1E01F
+:1005400001C01D92AE3EB107E1F70E94F1080C9484
+:10055000C4220C94000061110BC0FC01828188232D
+:1005600021F085EE0E945D0F03C085EE0E942510EC
+:1005700080E090E0089508956091B1017091B2011A
+:100580008091B3019091B4010E94C41956985E986D
+:1005900025982D9826982E9827982F98813019F015
+:1005A000823021F00895259A2D9A0895269A2E9A40
+:1005B00008950C94BC0256985E9825982D9826981C
+:1005C0002E9827982F988FEF90E090938900809332
+:1005D000880090938B0080938A0090938D00809385
+:1005E0008C00259A2D9A2FEF80E792E021508040D1
+:1005F0009040E1F700C00000269A2E9A2FEF80E786
+:1006000092E0215080409040E1F700C00000279A1E
+:100610002F9A2FEF80E792E0215080409040E1F741
+:1006200000C0000025982D982FEF80E792E0215020
+:1006300080409040E1F700C0000026982E982FEFF0
+:1006400080E792E0215080409040E1F700C0000038
+:1006500027982F9856985E9825982D9826982E982A
+:1006600027982F98089589EA8093800089E08093E5
+:10067000810024982C983F988AB18F748AB96E981B
+:10068000479A8BB1806B8BB9769A0E94DB020C94EF
+:10069000BB0280E2809300018091340181110EC081
+:1006A0000E94980381E0809334012FEF83ED90E363
+:1006B000215080409040E1F700C0000080E40E949B
+:1006C0009E038093000181112EC00E94C803809375
+:1006D0000001811128C00E94C8038093000181118C
+:1006E00022C08FE30E94C8038093000181111BC0C8
+:1006F0000E94C00380E40E949E0380930001811148
+:1007000012C08CE00E94C8038093000181110BC0CD
+:100710000E94C80380930001811105C08FE30E94ED
+:10072000C803809300010E94C003809100010895D6
+:100730001092B9008AE08093B800089594EA9093EB
+:10074000BC009091BC0097FFFCCF9091B900987FBE
+:10075000983021F0903111F081E008958093BB0032
+:1007600084E88093BC008091BC0087FFFCCF80911F
+:10077000B900887F883111F0803471F780E00895E6
+:1007800084E98093BC008091BC0084FDFCCF089577
+:100790008093BB0084E88093BC008091BC0087FFFD
+:1007A000FCCF9091B900987F81E0983209F480E005
+:1007B000089584E88093BC008091BC0087FFFCCF43
+:1007C0008091BB00089580910001811115C080E4E3
+:1007D0000E949E038093000181110CC082E10E945F
+:1007E000C80380930001811105C08FEF0E94C803E8
+:1007F000809300010E94C00384B1807F84B985B1D9
+:10080000807F85B98AB1837F8AB98BB1837F8BB9A9
+:100810003E98469808950E944903809300010E94E3
+:10082000E30380B38C7080BB81B3836F81BBA6E38D
+:10083000B1E0E4E4F1E08EE08E0F11921D928E1390
+:10084000FCCF0C943303BF92CF92DF92EF92FF92D2
+:100850000F931F93CF93DF9380910001882379F04A
+:10086000809135018F5F80933501811108C00E940E
+:10087000490380930001811102C00E94DB0206E35C
+:1008800011E0C0E0D0E0DD24D39482E0C82EEE2455
+:10089000E394F12CC730D10500F58091000181115E
+:1008A00064C080E40E949E0380930001811112C005
+:1008B00082E10E94C8038093000181110BC0C7012F
+:1008C0000C2E01C0880F0A94EAF780950E94C80395
+:1008D000809300010E94C00348C0CA30A1F028F4F0
+:1008E000C83059F0C93061F005C0CC3089F070F0E3
+:1008F000CD3089F0209A289810C0219A29980DC0EF
+:10090000229A2A980AC0239A2B9807C0529A01C0AB
+:10091000539A5B9802C03E9A469890EA9A95F1F7EE
+:100920009FB1799902C082E001C080E091709D255D
+:10093000982B7C9902C084E001C080E0892B7D99CE
+:1009400002C038E001C030E0832B7E9902C020E174
+:1009500001C020E0822B9FB19095991F9927991F84
+:100960009295990F907E892B0FC080910001811183
+:1009700049C080E40E949E0380930001882379F19E
+:10098000B12C0E94C0038B2DF8019081981719F0AB
+:100990008083C09201010E94E30321960F5F1F4FE5
+:1009A000CE30D10509F076CF80910101882361F125
+:1009B000815080930101882339F08FE99FE00197EE
+:1009C000F1F700C0000020C0A4E4B1E0E6E3F1E0EC
+:1009D000CF01825F91919D938E13FCCF15C083E16F
+:1009E0000E94C803809300018111CACF81E40E9454
+:1009F0009E03809300018111C3CF0E94D903B82EBA
+:100A0000B094BFCF80E0C0CF0E94D90281E0DF91D7
+:100A1000CF911F910F91FF90EF90DF90CF90BF90FB
+:100A20000895E82FF0E0EC5BFE4F80810895089573
+:100A30008B3B910578F4883A910540F5853A91050C
+:100A4000D0F48430910508F0B1C08130910509F4EB
+:100A5000ADC06BC0803E910508F467C0883E91052B
+:100A600008F4A4C09C01205F31092031310508F051
+:100A70005CC090650895853A910509F459C0863A9D
+:100A8000910509F058C082E890E40895883A9105EC
+:100A900009F454C0893A910509F453C08A3A910582
+:100AA00009F452C08B3A910509F451C08C3A910572
+:100AB00009F450C08D3A910509F44FC0803B91056F
+:100AC00009F44EC08E3A910509F44DC08F3A910554
+:100AD00009F44CC0813B910509F44BC0823B910560
+:100AE00009F44AC0833B910509F449C0843B910550
+:100AF00009F448C0853B910509F447C0863B910540
+:100B000009F446C0873B910509F445C0883B91052F
+:100B100009F444C0893B910509F443C08A3B91051F
+:100B200009F442C080E094E4089580E090E00895E4
+:100B300081E890E4089583E890E4089582EE94E4D7
+:100B4000089589EE94E408958AEE94E4089585EB7F
+:100B500094E4089586EB94E4089587EB94E4089573
+:100B60008CEC94E408958DEC94E4089583E895E486
+:100B700008958AE895E4089582E995E4089584E962
+:100B800095E4089581E296E4089583E296E4089559
+:100B900084E296E4089585E296E4089586E296E478
+:100BA000089587E296E408958AE296E40895089508
+:100BB00096E0799FF001112494E5899FE00DF11DE5
+:100BC0001124E60FF11DEE0FFF1FEC51FF4F859131
+:100BD00094910895880F991FFC01E05AF040859187
+:100BE00094910895880F991FFC01E052FF4F859161
+:100BF0009491089526E0729FF001112444E5849FAA
+:100C0000E00DF11D1124E60FF11DEE0FFF1FEC5159
+:100C1000FF4F859194919C013A9521154FE134073E
+:100C200008F41AC13F512115304120F49F700E94F1
+:100C3000F20508959C0130532115304118F499278D
+:100C4000906C0895811520E5920769F40E94AB131A
+:100C50004FEF84E39CE0415080409040E1F700C0BA
+:100C600000000C94BA1A813020E5920731F480918B
+:100C7000CC0181608093CC0108959C0130552115F1
+:100C8000304108F051C0292F33272F7033272130EE
+:100C90003105D9F4AC014370552702C0220F331F30
+:100CA0004A95E2F73C68AC0164E0440F551F6A9531
+:100CB000E1F744275370242B352B73E0880F991FDD
+:100CC0007A95E1F7807699271DC02230310529F405
+:100CD000982F8827816F906A089523303105A9F4F1
+:100CE000AC014370552721E030E002C0220F331FD2
+:100CF0004A95E2F73C6843E0880F991F4A95E1F76F
+:100D0000807E9770822B932B089524303105E1F477
+:100D1000AC014370552721E030E002C0220F331FA1
+:100D20004A95E2F73A68E7CF9C01305721153041E8
+:100D300018F49F70906208959C013058211530413D
+:100D400018F49F70906A0895803E9105E0F4803C0D
+:100D5000910558F58133910509F46FC048F4893243
+:100D6000910509F463C08A32910509F46DC072C01F
+:100D700089339105E9F082389105D1F085339105E9
+:100D800009F44DC067C0833E910581F138F4803E7F
+:100D90009105B9F0823E9105D9F05CC0863E91057F
+:100DA00061F1873E9105A1F155C00E94EA050895C1
+:100DB0002091DF0120FD02C021FF4CC080EE90E0B9
+:100DC00049C08091DF0180FFF9CF89E390E042C004
+:100DD0008091DF0182FF0EC08091DF0184FF03C09C
+:100DE00080E090E037C083EE90E034C08091DF0176
+:100DF00082FFF2CF82EE90E02DC08091DF0183FF71
+:100E00000BC08091DF0184FDEBCF87EE90E022C024
+:100E10008091DF0183FFF5CF86EE90E01BC08091CB
+:100E2000DF0185FF07C089E290E014C08091DF01F7
+:100E300085FFF9CF85E390E00DC08091DF0186FF4B
+:100E400007C08AE290E006C08091DF0186FFF9CFFB
+:100E500081E390E00E941805089508950C942D07F1
+:100E6000809162010895CF93DF9300D01F92CDB798
+:100E7000DEB79C018091E501843019F593E09983F8
+:100E80003B832A839093E9008FEF9091E800815093
+:100E900095FD06C095ED9A95F1F700008111F5CF0B
+:100EA0008091E80085FF0DC040E050E063E070E015
+:100EB000CE0101960E949D098091E8008E77809373
+:100EC000E8000F900F900F90DF91CF910895CF938E
+:100ED000DF9300D01F92CDB7DEB72091E50124301B
+:100EE00021F522E029839B838A8383E08093E900B4
+:100EF0008FEF9091E800815095FD06C095ED9A9591
+:100F0000F1F700008111F5CF8091E80085FF0DC059
+:100F100040E050E063E070E0CE0101960E949D0940
+:100F20008091E8008E778093E8000F900F900F90EB
+:100F3000DF91CF9108952091E5012430F1F422E072
+:100F40002093E9002FEF3091E800215035FD06C0D5
+:100F500035ED3A95F1F700002111F5CF2091E80029
+:100F600025FF0BC040E050E065E070E00E949D0965
+:100F70008091E8008E778093E8000895CF93DF9307
+:100F8000EC019091E501943009F046C080910C018C
+:100F90008823D9F080910D018823B9F09093E9005E
+:100FA0008FEF9091E800815095FD06C095E19A95EC
+:100FB000F1F700008111F5CF8091E80085FF2CC08A
+:100FC00040E050E060E170E017C081E08093E9000C
+:100FD0008FEF9091E800815095FD06C095ED9A95B0
+:100FE000F1F700008111F5CF8091E80085FF14C072
+:100FF00040E050E068E070E0CE010E949D098091E1
+:10100000E8008E778093E80080E1FE01A2E5B1E080
+:1010100001900D928A95E1F7DF91CF91089580912B
+:10102000E401811109C00E94320B0E948F0B809154
+:10103000E20084608093E20008951092E401089534
+:1010400008950C94F1200E94501A0E94F7200E94EB
+:10105000350E0C942E0742E061EC81E00E94AC0A50
+:1010600042E061EC82E00E94AC0A42E061EC83E085
+:101070000E94AC0A42E161EC84E00C94AC0A8091DD
+:10108000E701833009F455C030F4813071F08230CB
+:1010900009F48EC008958A3009F47AC08B3009F4BF
+:1010A00060C0893009F09CC020C08091E601813A7F
+:1010B00009F096C08091E800877F8093E8008091D6
+:1010C000EA019091EB01892B21F460E182E591E046
+:1010D00003C060E080E090E070E00E94E809809149
+:1010E000E8008B778093E80008958091E6018132D3
+:1010F00009F076C08091EA019091EB01009719F018
+:10110000039709F06DC08091E800877F8093E80025
+:101110008091E80082FD05C08091E5018111F8CF42
+:101120005FC08091F100809362018091E8008B772D
+:1011300053C08091E601813A09F052C08091EA01E2
+:101140009091EB01892B09F04BC08091E800877FDB
+:101150008093E8008091E80080FFFCCF80910C0133
+:1011600036C08091E6018132D9F58091EA019091F3
+:10117000EB01892BA9F58091E800877F8093E80037
+:101180000E94E10A8091E80180930C010C94AB135A
+:101190008091E601813221F58091E800877F80937C
+:1011A000E8000E94E10A8091E901809363010895BB
+:1011B0008091E601813AA1F48091E800877F8093D5
+:1011C000E8008091E80080FFFCCF8091630180936C
+:1011D000F1008091E8008E778093E8000C94E10A9A
+:1011E000089584B7877F84BF88E10FB6F894809311
+:1011F0006000109260000FBE90E080E80FB6F89497
+:1012000080936100909361000FBE0E94840E0E9443
+:10121000320B0E948F0B8091E20084608093E20089
+:1012200078940E94150E0E94860E82E091E00E9442
+:10123000300E0E94DF208091E501853069F40E9424
+:10124000141A8091E3018823B1F30E943C1A882389
+:1012500091F30E948709EFCF0E948C0EECCF292FCB
+:10126000332723303105C9F064F42130310581F092
+:101270002230310509F043C08DE690E020E133E0F3
+:1012800042C021323105F1F02232310541F137C03F
+:1012900082E190E02DE733E036C099278130910557
+:1012A00041F08230910541F0892B49F5ECE0F3E003
+:1012B00005C0E4EFF2E002C0ECEDF2E0849190E0D2
+:1012C0009F0121C06430D8F4E62FF0E0EE0FFF1F3D
+:1012D000EE5DFE4F2081318189E090E014C06430E2
+:1012E00070F470E0FB01EE0FFF1FE65EFE4F208101
+:1012F0003181FB01EA5EFE4F808190E004C080E016
+:1013000090E020E030E0FA0131832083089580E10D
+:1013100089BD82E189BD09B400FEFDCF8091D8006E
+:101320008F7D8093D8008091E00082608093E00000
+:101330008091E00081FDFCCF0895CF92DF92EF9283
+:10134000FF920F931F93CF93DF93EC018B016A0100
+:101350000E94000B811133C0C114D10439F0F60191
+:1013600080819181081B190BC80FD91FE12CF12C2A
+:101370000115110519F18091E80085FD16C08091D5
+:10138000E8008E778093E800C114D10449F0F6019B
+:1013900080819181E80EF91EF182E08285E00FC024
+:1013A0000E94000B882321F30AC089918093F100E9
+:1013B00001501109FFEFEF1AFF0ADACF80E0DF9149
+:1013C000CF911F910F91FF90EF90DF90CF900895F4
+:1013D0002091EC013091ED012617370748F0611597
+:1013E000710539F42091E8002E772093E80001C0C0
+:1013F000B90140E061157105A9F12091E5012223B1
+:1014000009F443C0253009F442C02091E80023FDCF
+:1014100040C02091E80022FD32C02091E80020FF6A
+:10142000E9CF4091F3002091F20030E0342BFC0131
+:10143000CF016115710559F02830310540F48191D3
+:101440008093F100615071092F5F3F4FF1CF41E070
+:101450002830310509F040E02091E8002E772093F4
+:10146000E800C8CF4111C9CF0AC08091E5018823A7
+:1014700061F0853061F08091E80083FD0AC08091C1
+:10148000E80082FFF2CF80E0089582E0089583E0D3
+:10149000089581E008952091EC013091ED01261727
+:1014A000370748F06115710539F42091E8002E776F
+:1014B0002093E80001C0B901FC0120E0611571052D
+:1014C00091F18091E501882309F440C0853009F449
+:1014D0003FC08091E80083FD3DC08091E80082FD1F
+:1014E0002FC08091E80080FFE9CF2091F300809128
+:1014F000F20090E0922B6115710559F0883091054A
+:1015000040F424912093F1003196615071090196C5
+:10151000F2CF21E0089709F020E08091E8008E7773
+:101520008093E800CBCF2111CCCF0AC08091E50198
+:10153000882361F0853061F08091E80083FD0AC066
+:101540008091E80082FFF2CF80E0089582E0089564
+:1015500083E0089581E00895982F973058F590938F
+:10156000E900981739F07091EC002091ED0050914E
+:10157000F00003C0242F762F50E021FF19C03091D6
+:10158000EB003E7F3093EB003091ED003D7F3093D8
+:10159000ED003091EB0031603093EB007093EC0084
+:1015A0002093ED005093F0002091EE0027FF07C03C
+:1015B0009F5FD3CF8F708093E90081E0089580E032
+:1015C00008958091E60187FF11C08091E80082FDB7
+:1015D00005C08091E5018111F8CF11C08091E8002C
+:1015E0008B770BC08091E501882349F08091E8005A
+:1015F00080FFF8CF8091E8008E778093E80008950F
+:101600002091E4003091E50095E64091EC00842FB4
+:10161000817040FF22C08091E80080FD1CC0809155
+:10162000E501882391F0853091F08091EB0085FDF4
+:1016300010C04091E4005091E5004217530729F390
+:101640009A01915011F784E0089582E0089583E0B3
+:10165000089581E0089580E008954091E80042FFF8
+:10166000DECF08950E94A00B0E94A80BE0EEF0E0F0
+:10167000808181608083E8EDF0E080818F778083D6
+:1016800019BCA7EDB0E08C918E7F8C9380818F7E0A
+:1016900080831092E40108950F931F93CF93DF93FB
+:1016A0000E94A00B0E94A80BC8EDD0E088818F7724
+:1016B000888388818068888388818F7D888319BC2E
+:1016C0001092E5011092E1011092E3011092E20103
+:1016D00000EE10E0F80180818B7F8083888181603B
+:1016E000888342E060E080E00E94AC0AE1EEF0E036
+:1016F00080818E7F8083E2EEF0E080818160808354
+:10170000808188608083F80180818E7F80838881DA
+:1017100080618883DF91CF911F910F910895E8ED4B
+:10172000F0E080818F7E8083E7EDF0E08081816052
+:10173000808384E082BF81E08093E4010C944C0BB1
+:10174000E8EDF0E080818E7F80831092E2000895C2
+:101750001092DA001092E10008951F920F920FB6D6
+:101760000F9211242F933F934F935F936F937F9327
+:101770008F939F93AF93BF93EF93FF938091E1007B
+:1017800082FF0BC08091E20082FF07C08091E100E0
+:101790008B7F8093E1000E94140E8091DA0080FF1D
+:1017A0001FC08091D80080FF1BC08091DA008E7F1F
+:1017B0008093DA008091D90080FF0DC080E189BD5F
+:1017C00082E189BD09B400FEFDCF81E08093E5018F
+:1017D0000E940F0805C019BC1092E5010E941D0867
+:1017E0008091E10080FF19C08091E20080FF15C068
+:1017F0008091E2008E7F8093E2008091E200806120
+:101800008093E2008091D80080628093D80019BC58
+:1018100085E08093E5010E9421088091E10084FF2A
+:1018200030C08091E20084FF2CC080E189BD82E15C
+:1018300089BD09B400FEFDCF8091D8008F7D8093D3
+:10184000D8008091E1008F7E8093E1008091E200DA
+:101850008F7E8093E2008091E20081608093E200BD
+:101860008091E101882311F084E007C08091E300BA
+:1018700087FD02C081E001C083E08093E5010E9402
+:1018800023088091E10083FF29C08091E20083FF5B
+:1018900025C08091E100877F8093E10082E0809302
+:1018A000E5011092E1018091E1008E7F8093E100DB
+:1018B0008091E2008E7F8093E2008091E20080615F
+:1018C0008093E20042E060E080E00E94AC0A8091F8
+:1018D000F00088608093F0000E942008FF91EF9153
+:1018E000BF91AF919F918F917F916F915F914F9138
+:1018F0003F912F910F900FBE0F901F9018951F9240
+:101900000F920FB60F9211242F933F934F935F9333
+:101910006F937F938F939F93AF93BF93CF93DF93F7
+:10192000EF93FF93C091E900CF708091EC00D82F26
+:10193000D17080FDD0E81092E9008091F000877F9F
+:101940008093F00078940E94C30C1092E90080917B
+:10195000F00088608093F000CD2BCF70C093E90039
+:10196000FF91EF91DF91CF91BF91AF919F918F91B7
+:101970007F916F915F914F913F912F910F900FBE8B
+:101980000F901F9018951F93CF93DF93CDB7DEB7BD
+:10199000AA970FB6F894DEBF0FBECDBFE6EEF1E01A
+:1019A00088E08E0F9091F10091938E13FBCF0E94EF
+:1019B0003F088091E80083FF1FC18091E60190916C
+:1019C000E701492F50E04A30510508F015C1FA01EE
+:1019D000EA5AFF4F0C947922803881F0823809F05E
+:1019E0000BC18091EA018F708093E9008091EB0038
+:1019F00085FB882780F91092E90006C08091E201FA
+:101A00009091E301911182609091E800977F90930B
+:101A1000E8008093F1001092F100C8C0282F2D7FBC
+:101A200009F0EAC0882319F0823061F0E5C08091A6
+:101A3000E801813009F0E0C0933009F080E0809344
+:101A4000E3012BC08091E801811127C08091EA0158
+:101A50008F7009F4D1C08093E9002091EB0020FF42
+:101A60001CC0933021F48091EB00806214C09091EF
+:101A7000EB0090619093EB0021E030E0A90102C0FF
+:101A8000440F551F8A95E2F74093EA001092EA004E
+:101A90008091EB0088608093EB001092E9008091C8
+:101AA000E800877F86C08111A7C01091E8011F77E9
+:101AB0008091E3008078812B8093E3008091E8009F
+:101AC000877F8093E8000E94E10A8091E80080FF10
+:101AD000FCCF8091E30080688093E300111102C085
+:101AE00082E001C083E08093E50186C080588230A7
+:101AF00008F082C08091E8019091E9018C3D53E0AB
+:101B0000950779F583E08A838AE289834FB7F89451
+:101B1000DE01139620E03EE051E2E32FF0E0509327
+:101B20005700E49120FF03C0E295EF703F5FEF7034
+:101B30008E2F90E0EA3010F0C79601C0C0968D93CA
+:101B40009D932F5F243149F74FBF8091E800877F35
+:101B50008093E8006AE270E0CE0101960E94E809F5
+:101B600014C0AE014F5F5F4F6091EA010E942F09E0
+:101B7000BC01892B09F440C09091E800977F9093B5
+:101B8000E80089819A810E944B0A8091E8008B7756
+:101B90008093E80031C0803879F58091E800877F34
+:101BA0008093E8008091E1018093F1008091E8004A
+:101BB0008E778093E8000E94E10A1EC081111CC04C
+:101BC0009091E8019230C0F48091E800877F809383
+:101BD000E8009093E1010E94E10A8091E101811106
+:101BE00006C08091E30087FD02C081E001C084E06F
+:101BF0008093E5010E942B088091E80083FF0AC0D2
+:101C00008091E800877F8093E8008091EB008062FC
+:101C10008093EB00AA960FB6F894DEBF0FBECDBF3F
+:101C2000DF91CF911F9108950895CF938091E501A1
+:101C30008823A1F0C091E900CF709091EC00892F2A
+:101C4000817090FD80E8C82B1092E9008091E80037
+:101C500083FD0E94C30CCF70C093E900CF9108951B
+:101C600090936901809368010895E0916801F09173
+:101C70006901309721F00190F081E02D099480E016
+:101C80000895E0916801F0916901309721F0028098
+:101C9000F381E02D09940895E0916801F0916901C4
+:101CA000309721F00480F581E02D0994089520916A
+:101CB0006601309167018217930771F09093670175
+:101CC00080936601E0916801F0916901309721F0FD
+:101CD0000680F781E02D09940895209164013091E8
+:101CE00065018217930771F09093650180936401F9
+:101CF000E0916801F0916901309721F00084F1854D
+:101D0000E02D0994089508950C94830E0E94561AAC
+:101D10000E940B040C941C1BCF92DF92EF92FF9257
+:101D20000F931F93CF93DF93CDB7DEB72B970FB6EB
+:101D3000F894DEBF0FBECDBF0E9423048BE6C82EF1
+:101D400081E0D82E00E010E0E02E802F0E941105E7
+:101D5000F60141916F01F42EF826B1F40F5F1F4F89
+:101D60000E30110589F78FEF89838A831B820E94C9
+:101D70005F1A8160782F9D838C8349815A816B81A2
+:101D80008D810E942F0F40C09091CC0191FF04C023
+:101D90008B870E9417058B8520E030E04F2D50E0A7
+:101DA000922FBA01022E02C0759567950A94E2F748
+:101DB00060FF24C02E83EF8221E030E0690102C081
+:101DC000CC0CDD1C9A95E2F790E08C219D21892BAB
+:101DD00009F420E028870E945F1A8160782F9A8793
+:101DE00089874E815F8168858A850E942F0FF8015F
+:101DF000E559FE4F8081C826C08206C02F5F3F4F45
+:101E00002630310569F6AACF0E94031E10916A019F
+:101E10000E94350E1817A1F00E94350E80936A01BA
+:101E20002B960FB6F894DEBF0FBECDBFDF91CF91DA
+:101E30001F910F91FF90EF90DF90CF900C942E07A1
+:101E40002B960FB6F894DEBF0FBECDBFDF91CF91BA
+:101E50001F910F91FF90EF90DF90CF900895CF9357
+:101E6000DF93CDB7DEB72B970FB6F894DEBF0FBE6A
+:101E7000CDBF4F83588769877A878B87DE0111969C
+:101E800086E0FD0111928A95E9F785E0FE0137961B
+:101E900001900D928A95E1F749815A816B817C818D
+:101EA0008D819E810E9445162B960FB6F894DEBF59
+:101EB0000FBECDBFDF91CF910895CF93882309F452
+:101EC000C2C0C82F823859F40E94350E81FDBBC0B4
+:101ED00089E30E94E1180E949E1989E30CC08338AF
+:101EE00079F40E94350E80FDAEC083E50E94E118B2
+:101EF0000E949E1983E50E942319CF910C949E198C
+:101F0000843859F40E94350E82FD9DC087E40E94FA
+:101F1000E1180E949E1987E4EECF8CEF8C0F813A76
+:101F200048F48C2F0E94442081118DC08C2F0E9478
+:101F3000E118E3CF80E28C0F883048F4C77081E06D
+:101F400001C0880FCA95EAF70E946719D6CF8BE5C2
+:101F50008C0F833078F4C53A29F0C63A31F083E823
+:101F600090E005C081E890E002C082E890E0CF9167
+:101F70000C94570E88E58C0F833108F064C0C83A82
+:101F800039F1C93A41F1CA3A49F1CB3A51F1CC3A67
+:101F900059F1CD3A61F1C03B69F1CE3A71F1CF3AD6
+:101FA00079F1C13B81F1C23B89F1C33B91F1C43B63
+:101FB00099F1C53BA1F1C63BA9F1C73BB1F1C83BC3
+:101FC000B9F1C93BC1F1CA3BC9F180E090E038C02A
+:101FD00082EE90E035C089EE90E032C08AEE90E06B
+:101FE0002FC085EB90E02CC086EB90E029C087EBFA
+:101FF00090E026C08CEC90E023C08DEC90E020C0F7
+:1020000083E891E01DC08AE891E01AC082E991E07E
+:1020100017C084E991E014C081E292E011C083E22C
+:1020200092E00EC084E292E00BC085E292E008C02C
+:1020300086E292E005C087E292E002C08AE292E086
+:10204000CF910C946D0ECF910895882309F44BC065
+:10205000823859F40E94350E81FF45C089E30E9401
+:10206000E1180E949E1989E30CC0833871F40E9424
+:10207000350E80FF38C083E50E94E1180E949E194A
+:1020800083E50E9423190C949E19843859F40E9408
+:10209000350E82FF28C087E40E94E1180E949E1935
+:1020A00087E4EFCF9CEF980F913A58F390E2980FA6
+:1020B000983050F4877091E001C0990F8A95EAF743
+:1020C000892F0E946D19DFCF9BE5980F933020F484
+:1020D00080E090E00C94570E885A833120F480E021
+:1020E00090E00C946D0E0895882321F00E946719EA
+:1020F0000C949E190895882321F00E946D190C9468
+:102100009E190895BF92CF92DF92EF92FF920F93A4
+:102110001F93CF93DF9300D000D000D0CDB7DEB7B0
+:1021200025E0FC01DE01119601900D922A95E1F760
+:10213000FC01408131810281258122952F706381CC
+:102140007481672B09F4E5C23F3F19F44F3F09F44E
+:10215000E0C27C0149833A8389819A812E830E945F
+:10216000A018182FB92E0E949F180E946617EB2DF9
+:10217000E295EF70F0E0E05AFF4F2E810C94792247
+:102180008B2D807F9B2D9F70F92E882319F0F29460
+:1021900080EFF822002349F0FF2009F467C28F2D59
+:1021A0000E9477190E949E1961C2812F0E942510FA
+:1021B000FF2009F4AEC28F2D0E947D1926960FB61E
+:1021C000F894DEBF0FBECDBFDF91CF911F910F916D
+:1021D000FF90EF90DF90CF90BF900C949E193B2D15
+:1021E000307F8B2D8F70303211F08295807F1123DC
+:1021F00019F0113021F12CC00023B9F0222309F489
+:10220000A0C1213009F09DC126960FB6F894DEBF1B
+:102210000FBECDBFDF91CF911F910F91FF90EF9037
+:10222000DF90CF90BF900C948719222319F02130B2
+:1022300009F46FC28E830E948A198E8196C1002391
+:1022400021F0223008F065C27CC1211162C28DC12B
+:10225000002321F0222309F474C108C2222309F4C7
+:1022600084C119C22B2D26952695237030E02115A7
+:10227000310521F021303105D1F04BC2002321F08E
+:10228000812F9B2D937002C080E090E026960FB6C0
+:10229000F894DEBF0FBECDBFDF91CF911F910F919C
+:1022A000FF90EF90DF90CF90BF900C94570E0023DB
+:1022B00021F0812F9B2D937002C080E090E0269644
+:1022C0000FB6F894DEBF0FBECDBFDF91CF911F9147
+:1022D0000F91FF90EF90DF90CF90BF900C946D0E18
+:1022E000812F002319F00E940B1D02C00E94731D54
+:1022F00026960FB6F894DEBF0FBECDBFDF91CF910B
+:102300001F910F91FF90EF90DF90CF90BF900C94B2
+:10231000F81D8B2D837009F07BC00111FAC1812F4C
+:10232000829586958770880F880F912F9F70C92E90
+:10233000D12CE12CF12C082E04C0CC0CDD1CEE1CA1
+:10234000FF1C0A94D2F714FF12C04FE050E060E087
+:1023500070E004C0440F551F661F771F8A95D2F79F
+:10236000CB01BA01609570958095909503C060E0AF
+:1023700070E0CB012B2D269526952370422F50E03F
+:1023800042305105D9F04330510569F16C297D295E
+:102390008E299F294130510551F126960FB6F894A8
+:1023A000DEBF0FBECDBFDF91CF911F910F91FF9088
+:1023B000EF90DF90CF90BF900C948D176C297D2902
+:1023C0008E299F2926960FB6F894DEBF0FBECDBF8B
+:1023D000DF91CF911F910F91FF90EF90DF90CF9001
+:1023E000BF900C94A9170E948D17C701B6012696BD
+:1023F0000FB6F894DEBF0FBECDBFDF91CF911F9116
+:102400000F91FF90EF90DF90CF90BF900C947117D9
+:10241000002319F08B2D817001C08695882309F463
+:1024200078C1812F829586958770880F880F912FAC
+:102430009F70C92ED12CE12CF12C082E04C0CC0C9D
+:10244000DD1CEE1CFF1C0A94D2F714FF12C04FE0F3
+:1024500050E060E070E004C0440F551F661F771F16
+:102460008A95D2F7CB01BA016095709580959095C9
+:1024700003C060E070E0CB012B2D269526952370DC
+:10248000422F50E042305105D9F04330510569F1F7
+:102490006C297D298E299F294130510551F12696BD
+:1024A0000FB6F894DEBF0FBECDBFDF91CF911F9165
+:1024B0000F91FF90EF90DF90CF90BF900C94671832
+:1024C0006C297D298E299F2926960FB6F894DEBFA8
+:1024D0000FBECDBFDF91CF911F910F91FF90EF9075
+:1024E000DF90CF90BF900C9483180E946718C701AB
+:1024F000B60126960FB6F894DEBF0FBECDBFDF91B2
+:10250000CF911F910F91FF90EF90DF90CF90BF90F0
+:102510000C944B18103FD1F118F4103E50F4A1C0A8
+:10252000123F09F463C008F44CC0133F09F473C0B0
+:1025300098C01F708B2D8F710023A1F00E94E417AB
+:10254000812F26960FB6F894DEBF0FBECDBFDF9168
+:10255000CF911F910F91FF90EF90DF90CF90BF90A0
+:102560000C9474100E940518812F26960FB6F894CB
+:10257000DEBF0FBECDBFDF91CF911F910F91FF90B6
+:10258000EF90DF90CF90BF900C947B100023A9F0C8
+:102590002111BFC08B2D8F7126960FB6F894DEBF28
+:1025A0000FBECDBFDF91CF911F910F91FF90EF90A4
+:1025B000DF90CF90BF900C942A18223008F0A9C069
+:1025C000E9CF0023A9F08B2D8F7126960FB6F894D2
+:1025D000DEBF0FBECDBFDF91CF911F910F91FF9056
+:1025E000EF90DF90CF90BF900C94E417002359F345
+:1025F0008B2D8F7126960FB6F894DEBF0FBECDBF20
+:10260000DF91CF911F910F91FF90EF90DF90CF90CE
+:10261000BF900C940518002399F08B2D8F7126968E
+:102620000FB6F894DEBF0FBECDBFDF91CF911F91E3
+:102630000F91FF90EF90DF90CF90BF900C94CF1749
+:1026400026960FB6F894DEBF0FBECDBFDF91CF91B7
+:102650001F910F91FF90EF90DF90CF90BF900C945F
+:10266000C5170023A9F0222309F4ADCF812F2696A8
+:102670000FB6F894DEBF0FBECDBFDF91CF911F9193
+:102680000F91FF90EF90DF90CF90BF900C945D0F73
+:10269000222309F4ADCF812F26960FB6F894DEBF22
+:1026A0000FBECDBFDF91CF911F910F91FF90EF90A3
+:1026B000DF90CF90BF900C9425104B2D4F70612F61
+:1026C000C7010E94AB0226960FB6F894DEBF0FBE7C
+:1026D000CDBFDF91CF911F910F91FF90EF90DF90D1
+:1026E000CF90BF900C94E9164B2D4F70612FC7010E
+:1026F00026960FB6F894DEBF0FBECDBFDF91CF9107
+:102700001F910F91FF90EF90DF90CF90BF900C94AE
+:10271000D70526960FB6F894DEBF0FBECDBFDF916A
+:10272000CF911F910F91FF90EF90DF90CF90BF90CE
+:1027300008950E9484190E9459190E949E190E94AE
+:10274000A91E0E94F81D80E090E00E94570E80E0D4
+:1027500090E00C946D0E0E9474190C9499130E94D1
+:10276000A018292F22952F7030E02C3031054CF421
+:102770002A3031056CF4225031092230310588F4B9
+:1027800007C02C30310549F02F30310531F009C038
+:10279000803E48F0803F29F406C093FB882780F9EB
+:1027A000089580E0089581E00895CF93DF9300D0ED
+:1027B00000D01F92CDB7DEB70F900F900F900F9003
+:1027C0000F90DF91CF910895CF93DF9300D000D089
+:1027D00000D0CDB7DEB726960FB6F894DEBF0FBE99
+:1027E000CDBFDF91CF9108951F93CF93DF93C09119
+:1027F000790116E080917A01C81799F0D0E01C9F0A
+:10280000F0011D9FF00D1124E558FE4F40815181CC
+:1028100062817381848195810E94E4132196C7703F
+:10282000E9CFDF91CF911F9108954091AB01509175
+:10283000AC016091AD017091AE018091AF019091BA
+:10284000B0010C94E4138091B00182958F7009F06F
+:1028500054C08091AD01882309F44FC08091790163
+:10286000A0917A016091AB017091AC014091AE01F1
+:102870005091AF01B6E08A1709F43FC090E04115CE
+:102880005105C1F17F3F11F46F3FA1F1B89FF001F5
+:10289000B99FF00D1124E558FE4F218172132AC013
+:1028A0002081621327C02281211124C02381348119
+:1028B0002417350710F421503109241B350B283C0F
+:1028C0003105C0F42091B0012F7020612093B00138
+:1028D00026E0289FF001299FF00D1124E058FE4FBB
+:1028E00080818F70806180838BEA91E00E948210EA
+:1028F0000C94F41301968770BECF0895CF92DF92A7
+:10290000EF92FF920F931F93CF93DF93CDB7DEB774
+:1029100062970FB6F894DEBF0FBECDBF8C0185E085
+:10292000F801DE011D9601900D928A95E1F7D8011C
+:102930004C9111965C91119712966C911297139687
+:10294000CD90DC9014973091AB017091AC018091E7
+:10295000AE019091AF01009709F46BC17F3F19F46C
+:102960003F3F09F466C1E090AD01EE2009F4C0C01C
+:102970002091B001C816D90628F0F601E81BF90B22
+:10298000CF0104C0809590958C0D9D1DFF24F3947C
+:10299000883C910578F0F12C207F09F0C6C07C2D91
+:1029A000D98AC88A89890E94D5138BEA91E00E944E
+:1029B0008210B1C0822F807F09F046C0751314C009
+:1029C000341312C0611110C02F7020612093B00128
+:1029D0000E9415148BEA91E00E9482108091B00150
+:1029E000D80115968C932EC0CD2819F15F3F11F4B4
+:1029F0004F3FF9F0F62E61111CC0809179012091B2
+:102A00007A0136E0821709F45AC090E0389FF0014D
+:102A1000399FF00D1124E558FE4F7181571306C000
+:102A20007081471303C07281711103C001968770D2
+:102A3000E9CFF62E662309F418C18091B0018160B8
+:102A40008093B001F12C11C1751308C0341306C076
+:102A5000611104C08091B001D801C3C04D875E8769
+:102A60008D859E856A8B0E94AF136A898823E1F168
+:102A70006623D1F12091B001822F82958F7090E072
+:102A8000029774F08091AB019091AC0198878F838D
+:102A90001986DB86CA862C87CE0107960E94821093
+:102AA00086E0F801ABEAB1E001900D928A95E1F77A
+:102AB0000E9423140E941514FF24F394D6C04D875E
+:102AC0005E878D859E850E94A018292F22952F70E4
+:102AD00030E0223031050CF0BCC09F7009F0B6C068
+:102AE000805E883008F4C1C0C8010E948210E4CF23
+:102AF000C816D90608F453C0F601E81BF90BCF013C
+:102B0000883C910508F450C0F12C7C2DD98AC88AE4
+:102B100089890E94D513EBEAF1E086E0DF011D927E
+:102B20008A95E9F70E941514A0C0751314C03413D8
+:102B300012C0611110C08091B001F8018583C801F5
+:102B40000E94821086E0EBEAF1E0DF011D928A9597
+:102B5000E9F7FE2C8AC04D875E878D859E856A8B3E
+:102B60000E94AF136A89882309F4BECF662309F453
+:102B7000BBCF2091B001822F82958F7090E0029799
+:102B80000CF48ECF8091AB019091AC019A83898334
+:102B90001B82DD82CC822E83CE0101967FCF809571
+:102BA00090958C0D9D1DACCFF62E662309F49CCF1D
+:102BB00075132EC034132CC02091B00120FD1FC00E
+:102BC000822F82958F70D9F0D80115962C93159786
+:102BD0008F3049F08F5F982F9295907F822F8F7062
+:102BE000892B15968C93C8010E94821086E0F8010B
+:102BF000ABEAB1E001900D928A95E1F793CF86E0C0
+:102C0000F801ABEAB1E001900D928A95E1F72DC091
+:102C10004D875E878D859E850E94AF13811140CFC1
+:102C20008091B00181608093B001C8010E94821040
+:102C30001CC0662309F458CF4D875E878D859E851D
+:102C40000E94AF13882309F44FCF2ACF811148CFB8
+:102C50000CC0243031050CF047CF9F7009F440CFF1
+:102C6000F8019581907F09F03BCF8F2D62960FB6CA
+:102C7000F894DEBF0FBECDBFDF91CF911F910F91B2
+:102C8000FF90EF90DF90CF9008951F93CF93DF9345
+:102C9000CDB7DEB72C970FB6F894DEBF0FBECDBF11
+:102CA0004F83588769877A878B879C87CE010796E1
+:102CB0000E947E14882369F08F8198852A853B8540
+:102CC000232BF1F19F3F09F063C08F3F09F060C0F3
+:102CD00037C086E0FE013796DE01119601900D9215
+:102CE0008A95E1F76F817885EA85FB85309741F118
+:102CF0007F3F11F46F3F21F120917A0130E0C9014B
+:102D00000196877099274091790150E084179507C3
+:102D100009F447C069837A83FD83EC8396E0929F30
+:102D2000D001939FB00D1124A558BE4FFE013196DE
+:102D300001900D929A95E1F780937A010E94F41325
+:102D400016E08091790190917A018917C1F1189F5D
+:102D5000C001112485589E4F0E947E14882379F16A
+:102D6000E09179011E9FF0011124E558FE4F40814A
+:102D7000518162817381848195810E94E4138091E5
+:102D8000790190E001968770992780937901D9CFD6
+:102D90004F81588569857A858B859C850E94E413CF
+:102DA000CFCF0E94AB1310927A0110927901EBEA17
+:102DB000F1E086E0DF011D928A95E9F7C1CF2C96FC
+:102DC0000FB6F894DEBF0FBECDBFDF91CF911F913C
+:102DD0000895EF92FF920F931F93CF93DF938C018F
+:102DE000892B09F46CC0F12CEE24E394E8012196C0
+:102DF000F8018491843740F4843008F051C0813068
+:102E000081F0823019F15BC0853709F444C0A8F124
+:102E10009CE7980F903708F052C08F770E942510DA
+:102E200041C00E5F1F4FFE01C49180E28C0F8830BD
+:102E300048F4C7708E2D01C0880FCA95EAF70E942A
+:102E4000771914C08C2F0E945D0F2DC00E5F1F4F8D
+:102E5000FE01C49180E28C0F883058F4C7708E2D2B
+:102E600001C0880FCA95EAF70E947D190E949E1939
+:102E70001AC08C2F0E94251016C00E5F1F4FFE0136
+:102E8000C491CC2381F08FE99FE00197F1F700C056
+:102E90000000C150F6CF0E5F1F4FFE01F49003C03B
+:102EA0000E945D0F8E018F2D882309F49FCFEFE9DB
+:102EB000FFE03197F1F700C000008150F5CFDF91BE
+:102EC000CF911F910F91FF90EF9008950895609317
+:102ED000B5017093B6018093B7019093B8010C943B
+:102EE00099130F931F930091B5011091B601209192
+:102EF000B7013091B801DC01CB01802B912BA22BC3
+:102F0000B32B8093B5019093B601A093B701B09312
+:102F1000B8011F910F910C9499130F931F93009177
+:102F2000B5011091B6012091B7013091B801DC01D3
+:102F3000CB0180239123A223B3238093B5019093E7
+:102F4000B601A093B701B093B8011F910F910C94F3
+:102F500099130F931F930091B5011091B601209121
+:102F6000B7013091B801DC01CB0180279127A2275E
+:102F7000B3278093B5019093B601A093B701B093A6
+:102F8000B8011F910F910C9499131092B1011092F6
+:102F9000B2011092B3011092B4010C94991341E064
+:102FA00050E060E070E004C0440F551F661F771FBB
+:102FB0008A95D2F74093B1015093B2016093B30167
+:102FC0007093B4010C94991341E050E060E070E01C
+:102FD00004C0440F551F661F771F8A95D2F7809152
+:102FE000B1019091B201A091B301B091B401482B0D
+:102FF000592B6A2B7B2B4093B1015093B201609304
+:10300000B3017093B4010C94991341E050E060E077
+:1030100070E004C0440F551F661F771F8A95D2F7D2
+:1030200040955095609570958091B1019091B20155
+:10303000A091B301B091B401482359236A237B23A3
+:103040004093B1015093B2016093B3017093B40106
+:103050000C94991341E050E060E070E004C0440F2C
+:10306000551F661F771F8A95D2F78091B101909105
+:10307000B201A091B301B091B401482759276A2742
+:103080007B274093B1015093B2016093B3017093D9
+:10309000B4010C9499130F931F930091B1011091F7
+:1030A000B2012091B3013091B401DC01CB01802B3E
+:1030B000912BA22BB32B8093B1019093B201A093DB
+:1030C000B301B093B4011F910F910C9499130F9316
+:1030D0001F930091B1011091B2012091B301309181
+:1030E000B401DC01CB0180239123A223B32380937D
+:1030F000B1019093B201A093B301B093B4011F91B9
+:103100000F910C9499130F931F930091B10110919B
+:10311000B2012091B3013091B401DC01CB018027D1
+:103120009127A227B3278093B1019093B201A09376
+:10313000B301B093B4011F910F910C9499130895AA
+:10314000CF92DF92EF92FF920F931F93CF93DF9373
+:103150008C01C090B501D090B601E090B701F0901D
+:10316000B8014091B1015091B2016091B3017091E9
+:10317000B401C42AD52AE62AF72ACFE1D0E0D70144
+:10318000C6010C2E04C0B695A795979587950A940D
+:10319000D2F780FF07C0B8018C2F0E94FA0581305A
+:1031A000910531F4219758F7B80180E00E94FA05A3
+:1031B000DF91CF911F910F91FF90EF90DF90CF9013
+:1031C000089590910C01992321F090910D01911196
+:1031D00009C020910E0130910F01F90132969FEF45
+:1031E00040E01FC0982F9695969596959F3050F584
+:1031F000E0910E01F0910F01E90FF11D877021E0C0
+:1032000030E0A90102C0440F551F8A95E2F7CA01B8
+:103210009181892B818308959F3F39F04F5F4E3014
+:1032200041F051915813F8CF0DC05111F7CF942FA1
+:10323000F5CF9F3F39F0F901E90FF11D97FDFA95A0
+:1032400082830895089590910C01992321F0909123
+:103250000D01911109C020910E0130910F01F9016A
+:103260003296205F3F4F1FC0982F96959695969562
+:103270009F30F0F4E0910E01F0910F01E90FF11D84
+:10328000877021E030E0A90102C0440F551F8A95E4
+:10329000E2F7CA018095918189238183089531964F
+:1032A000E217F30729F090819813F9CF1082F7CF36
+:1032B000089581E090E0E0910E01F0910F01E80F98
+:1032C000F91F1082019680319105A9F70895909118
+:1032D000CB01892B8093CB01089580959091CB01F0
+:1032E00089238093CB0108951092CB01089590918A
+:1032F000CA01892B8093CA01089580959091CA01D3
+:1033000089238093CA0108951092CA010895809379
+:10331000B90108951092B901089580910E0190911C
+:103320000F01FC0131969C01205F3F4F80E091919D
+:1033300091118F5FE217F307D1F70895E0910E0125
+:10334000F0910F018091CB018083E0910E01F0910B
+:103350000F0190818091CA01892B80838091B901EE
+:10336000882361F0E0910E01F0910F019081892B8B
+:1033700080830E948D1981111092B90180910E01F4
+:1033800090910F010C94410ECF92DF92EF92FF9239
+:103390006C01EE24FF24C114D104E104F10421F0F6
+:1033A000C701B60120E101C020E0C72ED82EE92ECA
+:1033B000FF24C114D104E104F10419F0285FC7010E
+:1033C000B6016B017C0154E0F694E794D794C7945E
+:1033D0005A95D1F7C114D104E104F10419F02C5F1E
+:1033E000C701B6016B017C0142E0F694E794D794E3
+:1033F000C7944A95D1F7C114D104E104F10419F03E
+:103400002E5FC701B601DC01CB01B695A795979554
+:103410008795892B8A2B8B2B09F02F5F822FFF90AA
+:10342000EF90DF90CF9008958091E501843009F10D
+:103430001092CD0120E488E190E00FB6F894A895B1
+:10344000809360000FBE2093600083B7817F84600B
+:1034500083BF83B7816083BF7894889583B78E7F5D
+:1034600083BF88E10FB6F8948093600010926000EB
+:103470000FBE089508950895CF930E943A1A0E94AE
+:1034800023040E943B1AC0E08C2F0E941105811179
+:1034900004C0CF5FCE30C1F701C081E0CF91089565
+:1034A0000E94AB130E94350E0C942E0782E084BD5F
+:1034B00093E095BD9AEF97BD80936E0008952FB766
+:1034C000F8948091CE019091CF01A091D001B0915C
+:1034D000D1012FBF0895CF92DF92EF92FF920F9309
+:1034E0001F932FB7F8944091CE015091CF01609176
+:1034F000D0017091D1012FBF6A017B01EE24FF241E
+:103500008C0120E030E0C016D106E206F30610F48C
+:10351000415051099A01281B390BC9011F910F9184
+:10352000FF90EF90DF90CF9008951F920F920FB60B
+:103530000F9211248F939F93AF93BF938091CE01ED
+:103540009091CF01A091D001B091D1010196A11D20
+:10355000B11D8093CE019093CF01A093D001B09381
+:10356000D101BF91AF919F918F910F900FBE0F909E
+:103570001F9018950E94320BF8942FEF87EA91E67E
+:10358000215080409040E1F700C0000087E090EBC0
+:10359000DC018093EE019093EF01A093F001B093D2
+:1035A000F1019CE088E10FB6F894A8958093600043
+:1035B0000FBE90936000FFCFEF92FF920F931F9387
+:1035C000CF93DF93D82FC0E08C2F0E94110500E02D
+:1035D00010E0E82EF12CC701002E02C095958795CA
+:1035E0000A94E2F780FD06C00F5F1F4F06301105F9
+:1035F00091F709C0602F7C2F80E00E94D805D81376
+:10360000F3CF81E004C0CF5FCE30F1F680E0DF91F0
+:10361000CF911F910F91FF90EF900895CF93C82FF6
+:103620008CE20E94DC1A882321F08C2FCF910C941D
+:10363000DC1A80E0CF910895CF930E94631C811122
+:1036400002C00E94491CC5E6C15049F00E942304F3
+:103650008FE39CE90197F1F700C00000F5CF89E204
+:103660000E940E1B811113C18AE20E940E1B811160
+:103670000E94491C85E00E940E1B81110E94BA1A0B
+:103680000E946E1C8093CC0187E00E940E1B882351
+:10369000A9F18BE10E940E1B882351F08091CC018F
+:1036A00081FB222720F991E0922790FB81F90EC03F
+:1036B0008EE00E940E1B882361F08091CC0182FB7A
+:1036C000222720F991E0922790FB82F98093CC0188
+:1036D00015C080E10E940E1B9091CC01882341F01F
+:1036E00093FB222720F981E0822780FB93F904C015
+:1036F000892F809580FB90F99093CC018091CC012B
+:103700000E94721C0E94801C8093DF0180EE0E9448
+:103710000E1B882341F08091DF01982F909590FB3C
+:1037200080F98093DF0189E30E940E1B882359F002
+:103730008091DF0181FB222720F991E0922790FB05
+:1037400081F98093DF0182EE0E940E1B882359F0DD
+:103750008091DF0182FB222720F991E0922790FBE4
+:1037600082F98093DF0186EE0E940E1B882359F0B8
+:103770008091DF0183FB222720F991E0922790FBC3
+:1037800083F98093DF0183EE0E940E1B882359F09A
+:103790008091DF0184FB222720F991E0922790FBA2
+:1037A00084F98093DF0185E30E940E1B882359F082
+:1037B0008091DF0185FB222720F991E0922790FB81
+:1037C00085F98093DF0181E30E940E1B882359F065
+:1037D0008091DF0186FB222720F991E0922790FB60
+:1037E00086F98093DF0181E10E940E1B882359F046
+:1037F0008091DF0187FB222720F991E0922790FB3F
+:1038000087F98093DF018091DF010E94841C809101
+:10381000DF0187FB882780F980930D0187E20E94F2
+:103820000E1BC82F8EE10E940E1B8111C2608FE11A
+:103830000E940E1B8111C46080E20E940E1B811148
+:10384000C86081E20E940E1B8111C06182E20E9469
+:103850000E1B8111C06283E20E940E1B8111C064A5
+:1038600084E20E940E1B882311F0C06802C0CC23A2
+:1038700029F08C2F0E947B1C6C2F03C00E94771CA8
+:10388000682F70E080E090E0CF910C946717CF91A3
+:1038900008956DEE7EEF80E090E00E94AF2260E040
+:1038A00082E090E00E94A12260E083E090E00E942C
+:1038B000A12260E084E090E00E94A12260E085E027
+:1038C00090E00C94A12280E090E00E949B2221E0F5
+:1038D0008D3E9E4F09F020E0822F089582E090E017
+:1038E0000C949322682F82E090E00C94A12283E054
+:1038F00090E00C949322682F83E090E00C94A12236
+:1039000084E090E00C949322682F84E090E00C9483
+:10391000A1228091D40180FF0BC06091130185E04A
+:10392000689FB001112475956795759567952BC0B3
+:1039300081FF09C06091130185E0689FB0011124E7
+:103940007595679520C082FF07C06091130185E0DF
+:10395000689FB001112417C09091D5019923D1F02F
+:1039600060911201961788F72091130185E0289F36
+:1039700090011124929FA001939F500D112470E09B
+:10398000CA010E9465226038710540F46115710515
+:1039900039F002C065E070E0862F08958FE7089542
+:1039A00081E008958091D40180FF08C060911101E9
+:1039B00070E0759567957595679521C081FF06C084
+:1039C0006091110170E07595679519C082FF04C080
+:1039D0006091110170E010C09091D5019923C1F060
+:1039E000609110019617A0F780911101899FC00185
+:1039F000112470E00E9465226038710528F4611579
+:103A0000710521F0862F08958FE7089581E00895CC
+:103A100061E070E0F4CF803F21F40E94891C819521
+:103A200004C0813F29F40E94891C8093D801089525
+:103A3000823F21F40E94891C819504C0833F29F4B0
+:103A40000E94891C8093D7010895893F19F40E9430
+:103A5000D21C05C08A3F31F40E94D21C819580930C
+:103A6000D90108958B3F21F40E94D21C819504C096
+:103A70008C3F29F40E94D21C8093DA010895843F80
+:103A800021F48091D601816017C0853F21F4809197
+:103A9000D601826011C0863F21F48091D6018460F6
+:103AA0000BC0873F21F48091D601886005C0883F14
+:103AB00031F48091D60180618093D60108958D3FC5
+:103AC00021F48091D40181600BC08E3F21F480915C
+:103AD000D401826005C08F3F29F48091D4018460B5
+:103AE0008093D4010895803F39F48091D80187FFF5
+:103AF0006CC01092D80169C0813F29F48091D8012F
+:103B00001816BCF362C09091D701823F29F497FF49
+:103B10005CC01092D70159C0833F19F41916CCF339
+:103B200054C0893F41F48091D90118160CF04DC062
+:103B30001092D9014AC08A3F29F48091D90187FFA8
+:103B400044C0F6CF8B3F39F48091DA0187FF3DC046
+:103B50001092DA013AC08C3F29F48091DA011816EC
+:103B6000BCF333C0843F21F48091D6018E7F17C00F
+:103B7000853F21F48091D6018D7F11C0863F21F4CD
+:103B80008091D6018B7F0BC0873F21F48091D601B5
+:103B9000877F05C0883F31F48091D6018F7E809366
+:103BA000D60113C08D3F21F48091D4018E7F0BC0CC
+:103BB0008E3F21F48091D4018D7F05C08F3F29F481
+:103BC0008091D4018B7F8093D4018091D7018111A2
+:103BD0000EC08091D80181110AC08091D901811154
+:103BE00006C08091DA01811102C01092D5010895BA
+:103BF00086ED91E00E944C0E0E945F1A9093D301D3
+:103C00008093D20108951F93CF93DF938091D201C7
+:103C10009091D3010E946B1AAC019091D501992328
+:103C200021F02091140130E006C0209115018AE0B6
+:103C3000289F900111244217530708F486C08091F1
+:103C4000D701C091D801D091D9011091DA01811129
+:103C500007C0C11176C0D11174C0111172C075C0F6
+:103C60009F3F19F09F5F9093D501181624F40E948E
+:103C7000891C8093D7018091D70187FF05C00E94DE
+:103C8000891C81958093D7011C1624F40E94891CFD
+:103C90008093D8018091D80187FF05C00E94891CBC
+:103CA00081958093D8016091D701662339F1C09145
+:103CB000D801CC2319F1772767FD7095872F972FAF
+:103CC0000E94762123E333E343E35FE30E94DA219A
+:103CD0000E9443216093D7016C2F772767FD709571
+:103CE000872F972F0E94762123E333E343E35FE39B
+:103CF0000E94DA210E9443216093D8011D1624F40A
+:103D00000E94D21C8093D9018091D90187FF05C000
+:103D10000E94D21C81958093D901111624F40E942F
+:103D2000D21C8093DA018091DA0187FF05C00E94DE
+:103D3000D21C81958093DA01DF91CF911F910C9471
+:103D4000F81D9F3F09F08ECF96CFDF91CF911F9145
+:103D50000895E6EDF1E085E0DF011D928A95E9F72F
+:103D60001092D5011092D4010895833081F128F486
+:103D7000813059F08230D1F00895853009F449C07E
+:103D8000B8F1863009F456C0089580911501262FA8
+:103D900030E0280F311D2F3F310524F4680F609368
+:103DA000150108958FEF80931501089580911401F6
+:103DB000262F30E0280F311D2F3F310524F4680FE6
+:103DC0006093140108958FEF8093140108958091FA
+:103DD0001301262F30E0280F311D2F3F310524F429
+:103DE000680F6093130108958FEF80931301089576
+:103DF00080911201262F30E0280F311D2F3F310511
+:103E000024F4680F6093120108958FEF80931201DC
+:103E1000089580911101262F30E0280F311D2F3F8A
+:103E2000310524F4680F6093110108958FEF80939A
+:103E30001101089580911001262F30E0280F311DC7
+:103E40002F3F310524F4680F6093100108958FEF20
+:103E5000809310010895833011F128F4813049F0E6
+:103E6000823091F00895853081F120F18630C1F1E2
+:103E7000089580911501681720F4861B8093150121
+:103E8000089510921501089580911401681720F487
+:103E9000861B809314010895109214010895809157
+:103EA0001301681720F4861B809313010895109264
+:103EB0001301089580911201681720F4861B8093E6
+:103EC000120108951092120108958091110168174E
+:103ED00020F4861B8093110108951092110108951A
+:103EE00080911001681720F4861B809310010895BB
+:103EF0001092100108950F931F938D3109F46BC038
+:103F000008F03FC08E3009F47DC0C0F4873009F45A
+:103F10006EC068F4863009F0AFC08091CC01817F1B
+:103F20008E7F8093CC0181E08093DC01A6C0883035
+:103F300009F458C08B3009F49BC09EC0863109F447
+:103F400097C078F4803109F470C0813109F094C0D1
+:103F50000E94AB1390910D0181E0892780930D01A0
+:103F600087C0893109F484C08B3109F085C0809104
+:103F7000CC0181FB222720F991E0922790FB81F967
+:103F80004AC0853309F45BC048F4873209F457C04E
+:103F900008F45AC0893209F452C06EC0833438F430
+:103FA0008A3308F067C0883309F462C065C083347F
+:103FB00009F445C0883409F05FC00E94AB130FEFCD
+:103FC00013ED20E3015010402040E1F700C0000055
+:103FD0000E94BA1A4DC00E94FD200E94350E0E9418
+:103FE0002E0746C00E946E1C0E94801C41C090910A
+:103FF000CC01892F817090FF12C0917F9E7F90939A
+:10400000CC013BC08091CC0182FB222720F991E0BA
+:10401000922790FB82F98093CC01992349F18091FA
+:10402000CC0181608093CC0123C08091CC0183FBC3
+:10403000222720F991E0922790FB83F9ECCF61E0F1
+:1040400070E080E090E010C08D5141E050E060E011
+:1040500070E08A019B0104C0000F111F221F331F53
+:104060008A95D2F7C901B8010E9467170E94AB1365
+:1040700081E003C08953E9CF80E01F910F9108953B
+:1040800080E0089580E00895CF93C82F8091DC01EF
+:10409000813079F018F08230E9F187C0E0910E01AB
+:1040A000F0910F018081813169F0823209F07FC087
+:1040B00009C0E0910E01F0910F018081813111F072
+:1040C000823261F48C2F0E944020811104C08C2F19
+:1040D0000E947B1F1DC081E090E01AC08C2F0E94BF
+:1040E0004220811114C0C43179F048F4CB3079F00A
+:1040F000C03109F060C082E08093DC0108C0C932A1
+:1041000019F0C83321F057C01092DC0154C081E08F
+:10411000817053C0C93289F118F5C43171F1A8F426
+:10412000C73009F046C08AE08093150194E190936E
+:10413000140193E0909313018093120188E080931F
+:10414000110188E28093100134C0CE51C63088F549
+:10415000EC2FF0E0E65DFE4F80818093DB0129C00B
+:10416000CE34E9F020F4CB3421F56AE013C0C13538
+:1041700079F0C235F1F461E00DC08091DB01882354
+:1041800019F01092DB0115C081E08093DC0115C0AD
+:1041900061E006C08091DB010E94B51E0AC06AE0A2
+:1041A0008091DB010E942B1F04C01092DC0180E093
+:1041B00004C081E002C080E0ABCFCF910895E1E878
+:1041C000F0E08081886080838081816080838FB708
+:1041D000F89493E09093890090ED909388008FBFBE
+:1041E0000895EFE6F0E08081826080830895EFE635
+:1041F000F0E080818D7F80830895EFE6F0E090818C
+:1042000082E08927808308951F920F920FB60F9244
+:1042100011242F933F934F935F936F937F938F93CB
+:104220009F93AF93BF93EF93FF938091DD019091A4
+:10423000DE0101969093DE018093DD01811103C0C0
+:1042400082E00E942E07E091DE01E695E695F0E01F
+:10425000E657FB4FE4918091DD018E1303C080E0AF
+:104260000E942E07FF91EF91BF91AF919F918F9187
+:104270007F916F915F914F913F912F910F900FBE62
+:104280000F901F90189504D06894B1118DC00895B7
+:1042900070D088F09F5790F0B92F9927B751A0F0B0
+:1042A000D1F0660F771F881F991F1AF0BA95C9F7CA
+:1042B00012C0B13081F077D0B1E0089574C0672F9B
+:1042C000782F8827B85F39F0B93FCCF3869577957A
+:1042D0006795B395D9F73EF4909580957095619563
+:1042E0007F4F8F4F9F4F0895E89409C097FB3EF48E
+:1042F00090958095709561957F4F8F4F9F4F992333
+:10430000A9F0F92F96E9BB279395F69587957795B0
+:104310006795B795F111F8CFFAF4BB0F11F460FF70
+:104320001BC06F5F7F4F8F4F9F4F16C0882311F0C8
+:1043300096E911C0772321F09EE8872F762F05C0DC
+:10434000662371F096E8862F70E060E02AF09A9577
+:10435000660F771F881FDAF7880F9695879597F96C
+:10436000089557FD9058440F551F59F05F3F71F065
+:104370004795880F97FB991F61F09F3F79F08795CC
+:104380000895121613061406551FF2CF4695F1DF55
+:1043900008C0161617061806991FF1CF86957105E5
+:1043A000610508940895E894BB2766277727CB0119
+:1043B00097F908950BD078C069D028F06ED018F026
+:1043C000952309F05AC05FC01124EECFCADFA0F3D5
+:1043D000959FD1F3950F50E0551F629FF001729F9A
+:1043E000BB27F00DB11D639FAA27F00DB11DAA1FB9
+:1043F000649F6627B00DA11D661F829F2227B00D06
+:10440000A11D621F739FB00DA11D621F839FA00D90
+:10441000611D221F749F3327A00D611D231F849FE0
+:10442000600D211D822F762F6A2F11249F57504037
+:104430008AF0E1F088234AF0EE0FFF1FBB1F661FD2
+:10444000771F881F91505040A9F79E3F510570F08B
+:1044500014C0AACF5F3FECF3983EDCF386957795C6
+:104460006795B795F795E7959F5FC1F7FE2B880F86
+:10447000911D9695879597F9089597F99F6780E81C
+:1044800070E060E008959FEF80EC089500240A94A6
+:104490001616170618060906089500240A9412161F
+:1044A0001306140605060895092E0394000C11F452
+:1044B000882352F0BB0F40F4BF2B11F460FF04C0FF
+:1044C0006F5F7F4F8F4F9F4F089597FB072E16F416
+:1044D000009407D077FD09D00E947F2207FC05D009
+:1044E0003EF4909581959F4F0895709561957F4F0B
+:1044F0000895EE0FFF1F0590F491E02D0994AA1B7B
+:10450000BB1B51E107C0AA1FBB1FA617B70710F0BE
+:10451000A61BB70B881F991F5A95A9F780959095F0
+:10452000BC01CD010895F999FECF92BD81BDF89AE5
+:10453000992780B50895A8E1B0E042E050E00C94DE
+:10454000B622262FF999FECF1FBA92BD81BD20BD9C
+:104550000FB6F894FA9AF99A0FBE019608950E9440
+:10456000A122272F0C94A222DC01CB01FC01F99996
+:10457000FECF06C0F2BDE1BDF89A319600B40D92AF
+:0C45800041505040B8F70895F894FFCF68
+:10458C0020023007BE079B07670733070101BA01FA
+:10459C0028080A03140A3F4D36394B04FE03C8039E
+:1045AC008F0322033B0354036D030102030405062E
+:0445BC0007080900E3
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/msc/readme.md b/keyboard/ergodox_ez/keymaps/msc/readme.md
new file mode 100644
index 000000000..0d14fcbd2
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/msc/readme.md
@@ -0,0 +1,32 @@
+# MSC Configuration
+
+### Based mostly on the ErgoDox EZ default layout with optimizations for coding on osx.
+
+#### Expecting the user to rely on Coder Layer this keymap removes some of the duplicate symbol keys in the lower portions of the board and replaces them with arrow keys and modifiers. The Media Layer is also updated to match the change in the arrow keys and the left and right click buttons are moved under the thumb position. The Media layer is now reached with toggle button in the lower right.
+
+### Main Layer
+
+![Main Layer](img/main_layer.png)
+
+### Code Layer
+
+![Code Layer](img/code_layer.png)
+
+### Media Layer
+
+![Media Layer](img/media_layer.png)
+
+## Changelog
+
+Version 1.0
+
+- Changed the temp code layer key in the bottom right to toggle media layer
+- Changed the temp media key to only be ";"
+- Changed right hand bottom row to match vim home row nav directions
+- Changed media keys to match arrow key changes
+- Changed media left and right click to spacebar and backspace locations
+- Changed bottom left to Cmd
+- Changed single quote on left bottom row to alt
+
+#### Coming Soon:
+- A new layer for Blender editing with a focus on left hand shortcut and a righthand num pad to control the view in Blender.
diff --git a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c
index b31d0edcd..dffcb21da 100644
--- a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c
+++ b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c
@@ -13,9 +13,11 @@
#define M_CTRL_CMDV 1
#define M_CTRL_CMDC 2
#define M_MEH_SH_ACUT 3
-#define M_DE_PLUS_CTRLALT 12
-#define M_DE_CIRC_CTRLCMD 13
+#define M_DE_OSX_PLUS_CTRLALT 12
+#define M_DE_OSX_CIRC_CTRLCMD 13
#define M_TOGGLE_5 14
+#define M_CTL_SFT_HASH 15
+#define M_LGUI_SHFT 16
#define SM_SMILE 4
#define SM_SMIRK 5
@@ -30,19 +32,19 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
- * ,--------------------------------------------------. ,--------------------------------------------------.
- * | ESC | 1 | 2 | 3 | 4 | 5 |CMD-V | |CMD-C | 6 | 7 | 8 | 9 | 0 | ß |
- * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | LALT | A | S | D | F | G |------| |------| H | J | K | L | ö | ä/RALT|
- * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------|
- * | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift |
- * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * |</L1| ^° |AltShf| Left | Right| | Up | Down | CMD-SHIFT | + | #/L1 |
- * `----------------------------------' `----------------------------------'
+ * ,-----------------------------------------------------. ,--------------------------------------------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 |CTL_SFT/#| |CTL_SFT/#| 6 | 7 | 8 | 9 | 0 | ß |
+ * |--------+------+------+------+------+----------------| |---------+------+------+------+------+------+--------|
+ * | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | LALT | A | S | D | F | G |---------| |---------| H | J | K | L | ö | ä/RALT|
+ * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------|
+ * | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift |
+ * `--------+------+------+------+------+----------------' `-------------+------+------+------+------+--------'
+ * |</L1| ^°/CTRL_CMD | +/CTRL_ALT | UP | DOWN| | Left | Right | CMD-SHFT| ALT-SHIFT | +/L1 |
+ * `------------------------------------------' `---------------------------------------------'
* ,-------------. ,---------------.
- * | MDIA | Meh | | Hyper| NUM |
+ * |`/Meh | Media| | NUM | ´/Hyper |
* ,------|------|------| |------+--------+------.
* | | | Home | | PgUp | | |
* | Back-| Del |------| |------| Enter | Space|
@@ -53,21 +55,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// Otherwise, it needs KC_*
[BASE] = KEYMAP( // layer 0 : default
// left hand
- KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, M(M_CTRL_CMDV),
- KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, KC_LGUI,
- KC_LALT, DE_A, DE_S, DE_D, DE_F, DE_G,
- KC_LSFT, CTL_T(DE_Y), DE_X, DE_C, DE_V, DE_B, KC_LALT,
- LT(SYMB,DE_LESS), M(M_DE_CIRC_CTRLCMD), M(M_DE_PLUS_CTRLALT), LALT(KC_LSFT), LGUI(KC_LSFT),
- M(M_MEH_SH_ACUT), TG(2),
+ KC_ESC, DE_OSX_1, DE_OSX_2, DE_OSX_3, DE_OSX_4, DE_OSX_5, M(M_CTL_SFT_HASH),
+ KC_TAB, DE_OSX_Q, DE_OSX_W, DE_OSX_E, DE_OSX_R, DE_OSX_T, KC_LGUI,
+ KC_LALT, DE_OSX_A, DE_OSX_S, DE_OSX_D, DE_OSX_F, DE_OSX_G,
+ KC_LSFT, CTL_T(DE_OSX_Y), DE_OSX_X, DE_OSX_C, DE_OSX_V, DE_OSX_B, KC_LALT,
+ LT(SYMB,DE_OSX_LESS), M(M_DE_OSX_CIRC_CTRLCMD), M(M_DE_OSX_PLUS_CTRLALT), KC_UP, KC_DOWN,
+ M(M_MEH_SH_ACUT), TG(MDIA),
KC_HOME,
KC_BSPC,KC_DEL, LT(SMLY,KC_END),
// right hand
- M(M_CTRL_CMDC), DE_6, DE_7, DE_8, DE_9, DE_0, DE_SS,
- KC_RGUI, DE_Z, DE_U, DE_I, DE_O, DE_P, DE_UE,
- DE_H, DE_J, DE_K, DE_L, DE_OE, ALT_T(DE_AE),
- KC_RALT, DE_N, DE_M, DE_COMM,DE_DOT, CTL_T(DE_MINS), KC_RSFT,
- KC_LEFT, KC_UP,KC_DOWN,KC_RIGHT, LT(SYMB,DE_HASH),
- TG(4), ALL_T(DE_ACUT),
+ M(M_CTL_SFT_HASH), DE_OSX_6, DE_OSX_7, DE_OSX_8, DE_OSX_9, DE_OSX_0, DE_OSX_SS,
+ KC_RGUI, DE_OSX_Z, DE_OSX_U, DE_OSX_I, DE_OSX_O, DE_OSX_P, DE_OSX_UE,
+ DE_OSX_H, DE_OSX_J, DE_OSX_K, DE_OSX_L, DE_OSX_OE, ALT_T(DE_OSX_AE),
+ KC_RALT, DE_OSX_N, DE_OSX_M, DE_OSX_COMM,DE_OSX_DOT, CTL_T(DE_OSX_MINS), KC_RSFT,
+ KC_LEFT, KC_RIGHT,LGUI(KC_LSFT),LALT(KC_LSFT), LT(SYMB,DE_OSX_PLUS),
+ TG(NUMB), ALL_T(DE_OSX_ACUT),
KC_PGUP,
KC_PGDN,KC_ENT, KC_SPC
),
@@ -76,42 +78,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | L5 | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | | < | > | ! | ? | | | | | \ | [ | ] | | | # | F12 |
+ * | | < | > | ! | ? | | | | | \ | [ | ] | < | > | ! |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | # | $ | \ | / | . |------| |------| / | ( | ) | { | } | |
+ * | | # | $ | \ | / | . |------| |------| / | ( | ) | { | } | # |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | | ^ | % | | | ~ | | | | & | < | > | " | ' | ? |
+ * | | | ^ | % | | | ~ | | | | | | ~ | ^ | UP | | $ |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | | | | | | | | | . | ! | |
+ * | | | | | | | ' | LEFT| DOWN | RIGHT | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
- * | | | | | |
+ * | | | | F13 | F12 |
* ,------|------|------| |------+------+------.
- * | | | | | | | |
+ * | | | | | F14 | | |
* | | |------| |------| | |
- * | | | | | | | |
+ * | | | | | F15 | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = KEYMAP(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
- KC_TRNS,DE_LESS,DE_MORE,DE_EXLM,DE_QST, KC_TRNS,KC_TRNS,
- KC_TRNS,DE_HASH,DE_DLR, DE_BSLS,DE_SLSH,KC_DOT,
- KC_TRNS,KC_TRNS,DE_LESS,DE_PERC,DE_PIPE,DE_TILD,KC_TRNS,
+ KC_TRNS,DE_OSX_LESS,DE_OSX_MORE,DE_OSX_EXLM,DE_OSX_QST, KC_TRNS,KC_TRNS,
+ KC_TRNS,DE_OSX_HASH,DE_OSX_DLR, DE_OSX_BSLS,DE_OSX_SLSH,KC_DOT,
+ KC_TRNS,KC_TRNS,DE_OSX_LESS,DE_OSX_PERC,DE_OSX_PIPE,DE_OSX_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_DEL,KC_TRNS,
// right hand
- M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
- KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), LALT(KC_7), DE_HASH, KC_F12,
- DE_SLSH, DE_LPRN, DE_RPRN, LALT(KC_8), LALT(KC_9), KC_TRNS,
- KC_TRNS, DE_AMPR, KC_GRV, LSFT(KC_GRV), DE_DQOT, DE_QUOT, DE_QST,
- KC_TRNS,KC_DOT, KC_EXLM, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS,
- KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS
+ M(M_TOGGLE_5), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), DE_OSX_LESS, DE_OSX_MORE, DE_OSX_EXLM,
+ DE_OSX_SLSH, DE_OSX_LPRN, DE_OSX_RPRN, LALT(KC_8), LALT(KC_9), DE_OSX_HASH,
+ KC_TRNS, DE_OSX_PIPE, DE_OSX_TILD, DE_OSX_CIRC, KC_UP, DE_OSX_MINS, LSFT(KC_4),
+ DE_OSX_QUOT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS,
+ KC_F13, KC_F12,
+ KC_F14,
+ KC_F15, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
@@ -135,7 +137,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
-KEYMAP(
+[MDIA] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D,
@@ -177,7 +179,7 @@ KEYMAP(
* | | | | | | | |
* `--------------------' `----------------------'
*/
-KEYMAP(
+[SMLY] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -197,7 +199,7 @@ KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS
),
//number pad
-KEYMAP(
+[NUMB] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS,
@@ -209,9 +211,9 @@ KEYMAP(
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, LSFT(KC_RBRC), KC_F12,
- KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_MINS,
+ KC_DOWN, KC_4, KC_5, KC_6, KC_RBRC, DE_OSX_MINS,
KC_TRNS, LSFT(KC_6), KC_1, KC_2, KC_3, LSFT(KC_7), KC_TRNS,
- KC_0,KC_DOT, KC_0, DE_EQL, KC_TRNS,
+ KC_0,KC_DOT, KC_COMM, DE_OSX_EQL, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
@@ -238,7 +240,7 @@ KEYMAP(
* | | | F4 | | | | |
* `--------------------' `----------------------'
*/
-KEYMAP(
+[EGOS] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -308,11 +310,30 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
if (timer_elapsed(start) > 150){
return MACRO(U(LCTRL),U(LSFT),U(LALT),END);
} else {
- return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_ACUT here, as macro needs KC_ prefix
+ return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_OSX_ACUT here, as macro needs KC_ prefix
}
}
break;
- case M_DE_CIRC_CTRLCMD:
+ case M_LGUI_SHFT:
+ if (record->event.pressed){
+ return MACRO(D(LGUI),D(LSFT),END);
+ }else{
+ return MACRO(U(LGUI),U(LSFT),END);
+ }
+ break;
+ case M_CTL_SFT_HASH:
+ if (record->event.pressed) {
+ start=timer_read();
+ return MACRO(D(LCTRL),D(LSFT),END);
+ } else {
+ if (timer_elapsed(start) > 150){
+ return MACRO(U(LCTRL),U(LSFT),END);
+ } else {
+ return MACRO(U(LCTRL),U(LSFT),T(BSLS),END);
+ }
+ }
+ break;
+ case M_DE_OSX_CIRC_CTRLCMD:
if (record->event.pressed) {
start = timer_read();
return MACRO(D(LCTRL),D(LGUI),END);
@@ -324,7 +345,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
}
}
break;
- case M_DE_PLUS_CTRLALT:
+ case M_DE_OSX_PLUS_CTRLALT:
if (record->event.pressed) {
start = timer_read();
return MACRO(D(LCTRL),D(LALT),END);
diff --git a/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex b/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex
index fde7201c1..c7cb8d863 100644
--- a/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex
+++ b/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex
@@ -1,1199 +1,1197 @@
-:100000000C94F0030C9437040C9437040C943704CC
-:100010000C9437040C9437040C9437040C94370474
-:100020000C9437040C9437040C94370E0C94090F7D
-:100030000C9437040C9437040C9437040C94370454
-:100040000C9437040C947D230C9437040C943704DF
-:100050000C9437040C940F1D0C9437040C94370443
-:100060000C9437040C9437040C9437040C94370424
-:100070000C9437040C9437040C9437040C94370414
-:100080000C9437040C9437040C9437040C94370404
-:100090000C9437040C9437040C9437040C943704F4
-:1000A0000C9437040C9437040C943704470451041F
-:1000B00069048104C904CF04F004D504EB04E1040D
-:1000C000E604DB04B1049904F504760F980F8B1055
-:1000D000980F8B10DD0F00108B1055106810521305
-:1000E000521381138113C413FE130B160B1617142E
-:1000F0000B160C150C15DF150B160B16F61501E17A
-:100100000137023702E10138023801E201250225F8
-:1001100002E20001E10137023702E1013802380151
-:10012000E10130023002E10001E10137023702E172
-:100130000138023801E10107020702E1000135023E
-:1001400035012002200001E10137023702E10138C8
-:10015000023801E10125022502E10001E101360238
-:100160003602E10138023801E10125022502E100F1
-:1001700001E10136023602E10138023801E10126CF
-:10018000022602E10001E10137023702E1013802F3
-:100190003801E10126022602E10002E002E201301C
-:1001A00002300002E002E20001E001E20002E002AF
-:1001B000E3016402640002E002E30001E001E30005
-:1001C00002E002E2012E022E02E10002E002E10260
-:1001D000E20001E001E101E20002E001E3010602C8
-:1001E0000602E30002E00001E00002E001E3011981
-:1001F000021902E30002E00001E0000000F0A1F0BB
-:10020000A329002B00E200E100358100001E00144C
-:100210000004001D710D304D831F001A0016001BD5
-:10022000000C304C002000080007000600E1042A02
-:10023000002100150009001900E1084A00220017FA
-:10024000000A000500000003300130E3000000E276
-:1002500000000002540230E7000000E60000000445
-:100260005423001C000B00110000002E7F240018F6
-:10027000000D00100050004B0025000C000E003651
-:100280000052002C00260012000F003700510028F9
-:100290000027001300330038714F004E002D002F4F
-:1002A000003474E50031810000010001000100010B
-:1002B00000010000003A003500310001000100019A
-:1002C000003B0035022102350001004C003C001EBD
-:1002D0000224062202010001003D002D0224022416
-:1002E00004010001003E000100370011040000017C
-:1002F000000100010000000100000001000E3001BB
-:100300000000000100000001003F00240624022339
-:100310000200000100400022042502350001000116
-:100320000041002304260235023700010042002468
-:100330000425041F021E020100430031002604317F
-:1003400002010001004400450001002D02010000EF
-:100350000001000100010001000100000001000196
-:100360000001000100010001000100F400F200FBA7
-:1003700000010001000100F000F100FA000100019D
-:10038000000100F500F300FC00010001000100F98C
-:1003900000FA00F600000001000100010000000169
-:1003A0000000000100A800010000000100000001A1
-:1003B0000001000100A900AA0000000100010001E5
-:1003C000000100010001000100010001000100AC7A
-:1003D000000100B600010001000100AB0050000167
-:1003E00000010001000100520051000100AE0001B7
-:1003F00000010001004F00000001000100010001A8
-:1004000000010000000100010001000100010001E5
-:1004100000010001000100010001000100010001D4
-:1004200000010001000100010001000100010001C4
-:1004300000010001000100010001000100000001B5
-:100440000001000100000001000000010004300173
-:1004500000000001000000010005300630093001F5
-:1004600000000001000A300B3008300100010001DB
-:10047000000100073001000100010001000100013E
-:100480000001000100010001000100010001000164
-:100490000001000100010001000100010001000055
-:1004A0000001000100010001000100000001000145
-:1004B00000010001000100010001000100500001E5
-:1004C0000001000100010052005100010001000183
-:1004D00000010001004F00010001000100010001C6
-:1004E0000001000100000001000100010000000106
-:1004F00000000001000100010000000100000001F7
-:10050000003F00520051002302000001004000247F
-:100510000021001E00270001004100250022001FCD
-:1005200000370001004200260023002000270001C0
-:10053000004300300230002402270201004400453D
-:1005400000380001000100000001000100E100018D
-:1005500000E0000000010001000100010001003D79
-:100560000001000100010001000100E000010001A4
-:10057000000100010001002C000100010001000148
-:100580000001003C00010001000100010000003AF0
-:1005900000010001000000010000003B000E3001DE
-:1005A0000000000100000001000100010001000145
-:1005B0000000000100010001000100010001000134
-:1005C0000001000100010001000100010001000123
-:1005D0000001000100010001000100010001000113
-:1005E0000001000100010001000100010001000004
-:1005F0000016034500720067006F0044006F00782A
-:1006000000200045005A00000016034500720067F4
-:10061000006F0044006F007800200045005A000081
-:10062000000403090409026D00040100A0FA090492
-:1006300000000103010100092111010001223F0016
-:100640000705810308000A090401000103010200F3
-:10065000092111010001224D000705820308000A4B
-:100660000904020001030000000921110100012218
-:1006700036000705830308000A090403000103008C
-:10068000000009211101000122390007058403102F
-:1006900000011201100100000008EDFE0713010027
-:1006A0000102000105010906A101050719E029E77A
-:1006B0001500250195087501810205081901290514
-:1006C00095057501910295017503910105071900C2
-:1006D000297715002501957875018102C00501096A
-:1006E00080A101850216010026B7001A01002AB771
-:1006F00000751095018100C0050C0901A101850359
-:10070000160100269C021A01002A9C027510950110
-:100710008100C005010902A1010901A10005091913
-:1007200001290515002501950575018102950175C1
-:100730000381010501093009311581257F95027575
-:1007400008810609381581257F9501750881060500
-:100750000C0A38021581257F950175088106C0C0F5
-:1007600005010906A101050719E029E71500250182
-:100770009508750181029501750881010508190127
-:1007800029059505750191029501750391010507EC
-:10079000190029FF150025FF950675088100C00086
-:1007A00000000000000000000000010204060A0F23
-:1007B00017202C3A4A5D71879DB3C7DAE9F5FCFF33
-:1007C000FCF5E9DAC7B39D87715D4A3A2C20170F13
-:1007D0000A06040201000000000000000000000002
-:1007E00011241FBECFEFDAE0DEBFCDBF04B603FE9B
-:1007F00027C08091EF019091F001A091F101B0919B
-:10080000F2018730904BA740B04BD1F41092EF012A
-:100810001092F0011092F1011092F20114BE84B70F
-:10082000877F84BF0FB6F894A89580916000886197
-:1008300080936000109260000FBEE0E0FFE3099536
-:1008400011E0A0E0B1E0ECE9FAE402C005900D92FD
-:10085000A433B107D9F721E0A4E3B1E001C01D92B0
-:10086000AF3EB207E1F70E947E0B0C944C250C942E
-:100870000000462F50E04F30510508F0DEC0FA016D
-:10088000EA5AFF4FDC0112968C910C9401258823C3
-:1008900021F085EE0E94EC11D0C085EE0E94B412CA
-:1008A000CCC0882349F00E94D91C909335018093D5
-:1008B000340188EF91E008958091340190913501E1
-:1008C0000E94E51C873991050CF0A8C08AEE91E0E2
-:1008D0000895882349F00E94D91C90933501809394
-:1008E000340187EE91E008958091340190913501B3
-:1008F0000E94E51C873991050CF093C089ED91E0C9
-:100900000895882349F00E94D91C90933501809363
-:10091000340182ED91E00895809134019091350188
-:100920000E94E51C873991050CF07EC080EC91E0B7
-:100930000895882349F00E94D91C90933501809333
-:1009400034018BEB91E00895809134019091350151
-:100950000E94E51C873991050CF069C08DEA91E091
-:100960000895882349F00E94D91C90933501809303
-:10097000340188EA91E00895809134019091350125
-:100980000E94E51C873991050CF054C08AE991E07A
-:100990000895882309F451C085E891E008958823DB
-:1009A00009F44BC080E791E00895882309F445C01D
-:1009B0008BE591E00895882309F43FC086E491E037
-:1009C00008958823D1F18DE391E008958823A9F15A
-:1009D00088E291E00895882381F183E191E0089510
-:1009E000882359F18EEF90E00895882331F18091AA
-:1009F000B3019091B401A091B501B091B60120E28C
-:100A0000822780729927AA27BB278093B3019093EE
-:100A1000B401A093B501B093B6010FC085EF91E08A
-:100A2000089584EE91E008958BEC91E0089586EBB3
-:100A300091E0089583EA91E0089580E090E00895C0
-:100A400008956091B3017091B4018091B5019091C6
-:100A5000B6010E943C1C56985E9825982D982698C1
-:100A60002E9827982F988330C1F028F4813041F0D8
-:100A7000823049F00895843049F0853051F008956E
-:100A8000259A2D9A0895269A2E9A0895259A2D9A98
-:100A900004C0259A2D9A269A2E9A279A2F9A08955D
-:100AA0000C94210556985E9825982D9826982E9896
-:100AB00027982F988FEF90E090938900809388007B
-:100AC00090938B0080938A0090938D0080938C008C
-:100AD000259A2D9A2FEF80E792E021508040904098
-:100AE000E1F700C00000269A2E9A2FEF80E792E0EF
-:100AF000215080409040E1F700C00000279A2F9AD3
-:100B00002FEF80E792E0215080409040E1F700C055
-:100B1000000025982D982FEF80E792E0215080402B
-:100B20009040E1F700C0000026982E982FEF80E754
-:100B300092E0215080409040E1F700C000002798EB
-:100B40002F9856985E9825982D9826982E98279835
-:100B50002F98089589EA8093800089E0809381002E
-:100B600024982C983F988AB18F748AB96E98479AC6
-:100B70008BB1806B8BB9769A0E9452050C9420053C
-:100B800080E2809300018091360181110EC00E94A5
-:100B90000F0681E0809336012FEF83ED90E3215023
-:100BA00080409040E1F700C0000080E40E941506FC
-:100BB0008093000181112EC00E943F0680930001A6
-:100BC000811128C00E943F0680930001811122C03C
-:100BD0008FE30E943F068093000181111BC00E9499
-:100BE000370680E40E94150680930001811112C02F
-:100BF0008CE00E943F068093000181110BC00E948F
-:100C00003F0680930001811105C08FE30E943F06DB
-:100C1000809300010E943706809100010895109290
-:100C2000B9008AE08093B800089594EA9093BC00DC
-:100C30009091BC0097FFFCCF9091B900987F9830BD
-:100C400021F0903111F081E008958093BB0084E899
-:100C50008093BC008091BC0087FFFCCF8091B900DD
-:100C6000887F883111F0803471F780E0089584E93D
-:100C70008093BC008091BC0084FDFCCF08958093DC
-:100C8000BB0084E88093BC008091BC0087FFFCCF50
-:100C90009091B900987F81E0983209F480E008953E
-:100CA00084E88093BC008091BC0087FFFCCF8091DA
-:100CB000BB00089580910001811115C080E40E945D
-:100CC00015068093000181110CC082E10E943F064D
-:100CD00080930001811105C08FEF0E943F06809331
-:100CE00000010E94370684B1807F84B985B1807F7E
-:100CF00085B98AB1837F8AB98BB1837F8BB93E98DE
-:100D0000469808950E94C005809300010E945A06EB
-:100D100080B38C7080BB81B3836F81BBE6E4F1E06C
-:100D2000A8E3B1E011921D9281E0E435F807D1F714
-:100D30000C94AA059F92AF92BF92CF92DF92EF924E
-:100D4000FF920F931F93CF93DF938091000188232D
-:100D500079F0809137018F5F80933701811108C04E
-:100D60000E94C00580930001811102C00E945205BB
-:100D700088E3E82E81E0F82E8701C0E0D0E0BB24B4
-:100D8000B39492E0A92ECC24C394D12CC730D105C2
-:100D900000F580910001811164C080E40E94150675
-:100DA00080930001811112C082E10E943F0680936E
-:100DB000000181110BC0C6010C2E01C0880F0A94DE
-:100DC000EAF780950E943F06809300010E94370653
-:100DD00048C0CA30A1F028F4C83059F0C93061F0D9
-:100DE00005C0CC3089F070F0CD3089F0209A289879
-:100DF00010C0219A29980DC0229A2A980AC0239AD5
-:100E00002B9807C0529A01C0539A5B9802C03E9A31
-:100E10004698E0EAEA95F1F78FB181708B257999D0
-:100E200002C032E001C030E0832B7C9902C034E084
-:100E300001C030E0832B7D9902C028E001C020E092
-:100E4000822B7E9902C090E101C090E0892B9FB176
-:100E50009095991F9927991F9295990F907E892BAC
-:100E60000FC08091000181114AC080E40E941506E4
-:100E700080930001882381F1912C0E943706892DEF
-:100E8000D8019C91981719F08C93A09201010E94AF
-:100E90005A0621960F5F1F4FCE30D10509F076CF4D
-:100EA00080910101882369F1815080930101882399
-:100EB00039F0EFE9FFE03197F1F700C0000021C001
-:100EC000E6E4F1E0D7018D917D018193B6E4EB1664
-:100ED000B1E0FB06B9F715C083E10E943F0680939D
-:100EE00000018111C9CF81E40E94150680930001A1
-:100EF0008111C2CF0E945006982E9094BECF80E000
-:100F0000BFCF0E94500581E0DF91CF911F910F91DB
-:100F1000FF90EF90DF90CF90BF90AF909F9008959B
-:100F2000E82FF0E0EA5BFE4F8081089508958B3B47
-:100F3000910580F4883A910548F5853A9105D8F4F1
-:100F40008430910508F0B2C0019709F06EC081E0CD
-:100F500090E00895803E910508F467C0883E9105B1
-:100F600008F4A4C09C01205F31092031310508F04C
-:100F70005CC090650895853A910509F459C0863A98
-:100F8000910509F058C082E890E40895883A9105E7
-:100F900009F454C0893A910509F453C08A3A91057D
-:100FA00009F452C08B3A910509F451C08C3A91056D
-:100FB00009F450C08D3A910509F44FC0803B91056A
-:100FC00009F44EC08E3A910509F44DC08F3A91054F
-:100FD00009F44CC0813B910509F44BC0823B91055B
-:100FE00009F44AC0833B910509F449C0843B91054B
-:100FF00009F448C0853B910509F447C0863B91053B
-:1010000009F446C0873B910509F445C0883B91052A
-:1010100009F444C0893B910509F443C08A3B91051A
-:1010200009F442C080E094E4089580E090E00895DF
-:1010300081E890E4089583E890E4089582EE94E4D2
-:10104000089589EE94E408958AEE94E4089585EB7A
-:1010500094E4089586EB94E4089587EB94E408956E
-:101060008CEC94E408958DEC94E4089583E895E481
-:1010700008958AE895E4089582E995E4089584E95D
-:1010800095E4089581E296E4089583E296E4089554
-:1010900084E296E4089585E296E4089586E296E473
-:1010A000089587E296E408958AE296E40895089503
-:1010B00024E5829FC0011124FC0126E0729FE00D0F
-:1010C000F11D1124E60FF11DEE0FFF1FEF5FFD4F25
-:1010D000859194910895880F991FFC01E558FF4F61
-:1010E000859194910895880F991FFC01E550FE4F5A
-:1010F00085919491089524E5829FC0011124FC01FB
-:1011000046E0749FE00DF11D1124E60FF11DEE0F76
-:10111000FF1FEF5FFD4F859194919C013A9521153A
-:101120004FE1340708F425C13F512115304120F427
-:101130009F700E94730808959C013053211530411F
-:1011400018F49927906C0895811520E5920769F4A9
-:101150000E942D164FEF84E39CE041508040904068
-:10116000E1F700C000000C94341D813020E59207A7
-:1011700031F48091CE0181608093CE0108959C016D
-:1011800030552115304108F05CC0292F33272F70CE
-:10119000332721303105E9F4AC0164E0440F551FD9
-:1011A0006A95E1F744275370BC016370772702C04A
-:1011B000220F331F6A95E2F73C68242B352B73E02E
-:1011C000880F991F7A95E1F780769927822B932BC8
-:1011D00008952230310529F4982F8827816F906A6D
-:1011E000089523303105A1F4AC0133E0440F551FBD
-:1011F0003A95E1F7407E57708370992721E030E0FF
-:1012000002C0220F331F8A95E2F7C9019C6816C0FD
-:101210002430310531F5AC0123E0440F551F2A95E8
-:10122000E1F7407E57708370992721E030E002C0DB
-:10123000220F331F8A95E2F7C9019A68842B952BF8
-:1012400008959C0130572115304118F49F70906229
-:1012500008959C0130582115304118F49F70906A10
-:101260000895803E9105E0F4803C910558F5813366
-:10127000910509F46FC048F48932910509F463C0FF
-:101280008A32910509F46DC072C089339105E9F085
-:1012900082389105D1F08533910509F44DC067C0BE
-:1012A000833E910581F138F4803E9105B9F0823E8C
-:1012B0009105D9F05CC0863E910561F1873E9105AC
-:1012C000A1F155C00E946B0808952091E00120FD16
-:1012D00002C021FF4CC080EE90E049C08091E00147
-:1012E00080FFF9CF89E390E042C08091E00182FF66
-:1012F0000EC08091E00184FF03C080E090E037C021
-:1013000083EE90E034C08091E00182FFF2CF82EE64
-:1013100090E02DC08091E00183FF0BC08091E0013F
-:1013200084FDEBCF87EE90E022C08091E00183FF47
-:10133000F5CF86EE90E01BC08091E00185FF07C0ED
-:1013400089E290E014C08091E00185FFF9CF85E348
-:1013500090E00DC08091E00186FF07C08AE290E036
-:1013600006C08091E00186FFF9CF81E390E00E9402
-:10137000970708950895809164010895CF93DF93AE
-:1013800000D01F92CDB7DEB79C018091E60184307A
-:1013900019F593E099833B832A839093E9008FEFBB
-:1013A0009091E800815095FD06C095ED9A95F1F772
-:1013B00000008111F5CF8091E80085FF0DC040E06D
-:1013C00050E063E070E0CE0101960E942B0C80910A
-:1013D000E8008E778093E8000F900F900F90DF91D8
-:1013E000CF910895CF93DF9300D01F92CDB7DEB792
-:1013F0002091E601243021F522E029839B838A8312
-:1014000083E08093E9008FEF9091E800815095FD93
-:1014100006C095ED9A95F1F700008111F5CF809106
-:10142000E80085FF0DC040E050E063E070E0CE01D1
-:1014300001960E942B0C8091E8008E778093E80043
-:101440000F900F900F90DF91CF9108959C018091A4
-:10145000E6018430F9F482E08093E9009FEF809107
-:10146000E800915085FD06C085ED8A95F1F70000F2
-:101470009111F5CF8091E80085FF0CC040E050E06D
-:1014800065E070E0C9010E942B0C8091E8008E7726
-:101490008093E8000895CF93DF93EC018091E601FB
-:1014A000843009F046C090910C019923D9F09091B5
-:1014B0000D019923B9F08093E9008FEF9091E80036
-:1014C000815095FD06C095E19A95F1F700008111D4
-:1014D000F5CF8091E80085FF2CC040E050E060E14E
-:1014E00070E017C081E08093E9008FEF9091E800F1
-:1014F000815095FD06C095ED9A95F1F70000811198
-:10150000F5CF8091E80085FF14C040E050E068E02E
-:1015100070E0CE010E942B0C8091E8008E778093C2
-:10152000E80080E1FE01A4E5B1E001900D928A950A
-:10153000E1F7DF91CF9108958091E501811109C014
-:101540000E94BC0D0E94190E8091E200846080937D
-:10155000E20008951092E501089508950C946A231D
-:101560000E94CA1C0E9470230E94C4100C94BA09E5
-:1015700042E061EC81E00E94350D42E061EC82E0E6
-:101580000E94350D42E061EC83E00E94350D42E19E
-:1015900061EC84E00C94350D8091E801833009F40E
-:1015A00055C030F4813071F0823009F48EC0089556
-:1015B0008A3009F47AC08B3009F460C0893009F0B0
-:1015C0009CC020C08091E701813A09F096C08091CB
-:1015D000E800877F8093E8008091EB019091EC0117
-:1015E000892B21F460E184E591E003C060E080E0B4
-:1015F00090E070E00E94760C8091E8008B778093F9
-:10160000E80008958091E701813209F076C0809169
-:10161000EB019091EC01009719F0039709F06DC070
-:101620008091E800877F8093E8008091E80082FD48
-:1016300005C08091E6018111F8CF5FC08091F10073
-:10164000809364018091E8008B7753C08091E7011B
-:10165000813A09F052C08091EB019091EC01892B05
-:1016600009F04BC08091E800877F8093E80080916B
-:10167000E80080FFFCCF80910C0136C08091E7012B
-:101680008132D9F58091EB019091EC01892BA9F57C
-:101690008091E800877F8093E8000E946A0D809126
-:1016A000E90180930C010C942D168091E7018132A1
-:1016B00021F58091E800877F8093E8000E946A0D01
-:1016C0008091EA018093650108958091E701813A54
-:1016D000A1F48091E800877F8093E8008091E80082
-:1016E00080FFFCCF809165018093F1008091E8003C
-:1016F0008E778093E8000C946A0D089584B7877FF5
-:1017000084BF0FB6F894A89580916000886180939B
-:101710006000109260000FBE90E080E80FB6F89471
-:1017200080936100909361000FBE0E9413110E948C
-:10173000BC0D0E94190E8091E20084608093E2004B
-:1017400078940E94A4100E94151182E091E00E94FA
-:10175000BF100E9458238091E601853069F40E94F1
-:101760008C1C8091E4018823B1F30E94B61C88236D
-:1017700091F30E94150CEFCF0E941B11ECCF292F83
-:10178000332723303105C9F060F42130310581F071
-:101790002230310509F041C08DE690E025E236E0C7
-:1017A00040C021323105E1F02232310531F135C03E
-:1017B00082E190E022E936E034C09927813091053A
-:1017C00049F028F0029749F5E1EFF5E005C0E1E2C4
-:1017D000F6E002C0E9E0F6E0849190E09F0121C0CC
-:1017E0006430D8F4E62FF0E0EE0FFF1FEE5DFE4F01
-:1017F0002081318189E090E014C0643070F470E0A1
-:10180000FB01EE0FFF1FE65EFE4F20813181FB01E1
-:10181000EA5EFE4F808190E004C080E090E020E02E
-:1018200030E0FA0131832083089580E189BD82E1AF
-:1018300089BD09B400FEFDCF8091D8008F7D8093D3
-:10184000D8008091E00082608093E0008091E00009
-:1018500081FDFCCF0895CF92DF92EF92FF920F931C
-:101860001F93CF93DF93EC018B016A010E94890DD6
-:10187000811133C0C114D10439F0F6018081918106
-:10188000081B190BC80FD91FE12CF12C01151105EC
-:1018900019F18091E80085FD16C08091E8008E77EF
-:1018A0008093E800C114D10449F0F6018081918150
-:1018B000E80EF91EF182E08285E00FC00E94890DDA
-:1018C000882321F30AC089918093F1000150110906
-:1018D000FFEFEF1AFF0ADACF80E0DF91CF911F917F
-:1018E0000F91FF90EF90DF90CF9008952091ED0140
-:1018F0003091EE012617370748F06115710539F46C
-:101900002091E8002E772093E80001C0B901FC0186
-:1019100020E06115710579F18091E6018823F1F1EC
-:101920008530F1F18091E80083FD3CC08091E800B2
-:1019300082FD2EC08091E80080FFEBCF2091F30064
-:101940008091F20090E0922B6115710551F0883082
-:10195000910538F421912093F100615071090196AD
-:10196000F3CF21E0089709F020E08091E8008E771E
-:101970008093E800CECF2111CFCF0AC08091E6013D
-:10198000882361F0853061F08091E80083FD0AC012
-:101990008091E80082FFF2CF80E0089582E0089510
-:1019A00083E0089581E008952091ED013091EE01EA
-:1019B0002617370748F06115710539F42091E800C2
-:1019C0002E772093E80001C0B901FC0120E06115E9
-:1019D000710591F18091E601882309F440C08530BA
-:1019E00009F43FC08091E80083FD3DC08091E8008C
-:1019F00082FD2FC08091E80080FFE9CF2091F300A5
-:101A00008091F20090E0922B6115710559F08830B9
-:101A1000910540F424912093F100319661507109B1
-:101A20000196F2CF21E0089709F020E08091E800CC
-:101A30008E778093E800CBCF2111CCCF0AC0809164
-:101A4000E601882361F0853061F08091E80083FD34
-:101A50000AC08091E80082FFF2CF80E0089582E022
-:101A6000089583E0089581E00895982F973068F5F0
-:101A70009093E900981739F07091EC002091ED00F7
-:101A80005091F00003C0242F762F50E021FD02C0BA
-:101A90009F5FECCF3091EB003E7F3093EB003091B5
-:101AA000ED003D7F3093ED003091EB0031603093DD
-:101AB000EB007093EC002093ED005093F000209128
-:101AC000EE0027FDE5CF80E008958F708093E90058
-:101AD00081E008958091E70187FF11C08091E800BF
-:101AE00082FD05C08091E6018111F8CF11C080917F
-:101AF000E8008B770BC08091E601882349F0809144
-:101B0000E80080FFF8CF8091E8008E778093E800AE
-:101B100008952091E4003091E50095E64091EC00B5
-:101B2000842F817040FF23C08091E80080FD1DC09C
-:101B30008091E601882399F0853099F08091EB003F
-:101B400085FD11C04091E4005091E5002417350750
-:101B500029F3915011F09A01E1CF84E0089582E0D9
-:101B6000089583E0089581E0089580E0089540910C
-:101B7000E80042FFDDCF08950E942A0E0E94320E37
-:101B8000E0EEF0E0808181608083E8EDF0E080812C
-:101B90008F77808319BCA7EDB0E08C918E7F8C93FA
-:101BA00080818F7E80831092E50108950F931F93AB
-:101BB000CF93DF930E942A0E0E94320EC8EDD0E030
-:101BC00088818F77888388818068888388818F7DEA
-:101BD000888319BC1092E6011092E2011092E40190
-:101BE0001092E30100EE10E0F80180818B7F80838A
-:101BF00088818160888342E060E080E00E94350D4A
-:101C0000E1EEF0E080818E7F8083E2EEF0E0808183
-:101C100081608083808188608083F80180818E7FED
-:101C20008083888180618883DF91CF911F910F919C
-:101C30000895E8EDF0E080818F7E8083E7EDF0E0AD
-:101C400080818160808384E082BF81E08093E501B0
-:101C50000C94D60DE8EDF0E080818E7F80831092A9
-:101C6000E20008951092DA001092E10008951F92A8
-:101C70000F920FB60F9211242F933F934F935F93C0
-:101C80006F937F938F939F93AF93BF93EF93FF9344
-:101C90008091E10082FF0BC08091E20082FF07C0CB
-:101CA0008091E1008B7F8093E1000E94A3108091DE
-:101CB000DA0080FF1FC08091D80080FF1BC0809198
-:101CC000DA008E7F8093DA008091D90080FF0DC00A
-:101CD00080E189BD82E189BD09B400FEFDCF81E0CC
-:101CE0008093E6010E949C0A05C019BC1092E6018F
-:101CF0000E94AA0A8091E10080FF19C08091E20051
-:101D000080FF15C08091E2008E7F8093E200809179
-:101D1000E20080618093E2008091D800806280932D
-:101D2000D80019BC85E08093E6010E94AE0A80913C
-:101D3000E10084FF30C08091E20084FF2CC080E18C
-:101D400089BD82E189BD09B400FEFDCF8091D80034
-:101D50008F7D8093D8008091E1008F7E8093E10099
-:101D60008091E2008F7E8093E2008091E2008160AA
-:101D70008093E2008091E201882311F084E007C0A3
-:101D80008091E30087FD02C081E001C083E0809381
-:101D9000E6010E94B00A8091E10083FF29C0809192
-:101DA000E20083FF25C08091E100877F8093E100FE
-:101DB00082E08093E6011092E2018091E1008E7F43
-:101DC0008093E1008091E2008E7F8093E200809119
-:101DD000E20080618093E20042E060E080E00E94E7
-:101DE000350D8091F00088608093F0000E94AD0A6C
-:101DF000FF91EF91BF91AF919F918F917F916F91E3
-:101E00005F914F913F912F910F900FBE0F901F90B8
-:101E100018951F920F920FB60F9211242F933F9394
-:101E20004F935F936F937F938F939F93AF93BF93E2
-:101E3000CF93DF93EF93FF93C091E900CF70809130
-:101E4000EC00D82FD17080FDD0E81092E90080918D
-:101E5000F000877F8093F00078940E944D0F1092DD
-:101E6000E9008091F00088608093F000CD2BCF7066
-:101E7000C093E900FF91EF91DF91CF91BF91AF91B6
-:101E80009F918F917F916F915F914F913F912F9192
-:101E90000F900FBE0F901F9018951F93CF93DF9355
-:101EA000CDB7DEB7AA970FB6F894DEBF0FBECDBF91
-:101EB000E7EEF1E08091F100819321E0EF3EF2073F
-:101EC000C9F70E94CC0A8091E80083FF24C1809169
-:101ED000E7019091E801492F50E04A30510508F0A0
-:101EE0001AC1FA01EB59FF4F0C940125803881F09B
-:101EF000823809F010C18091EB018F708093E90066
-:101F00008091EB0085FB882780F91092E90006C0DC
-:101F10008091E3019091E401911182609091E80039
-:101F2000977F9093E8008093F1001092F100C8C071
-:101F3000282F2D7F09F0EFC0882319F0823061F03F
-:101F4000EAC08091E901813009F0E5C0933009F0E1
-:101F500080E08093E4012BC08091E901811127C0CA
-:101F60008091EB018F7009F4D6C08093E900209135
-:101F7000EB0020FF1CC0933021F48091EB008062C5
-:101F800014C09091EB0090619093EB0021E030E061
-:101F9000A90102C0440F551F8A95E2F74093EA0059
-:101FA0001092EA008091EB0088608093EB00109221
-:101FB000E9008091E800877F86C08111ACC0109154
-:101FC000E9011F778091E3008078812B8093E30003
-:101FD0008091E800877F8093E8000E946A0D8091DD
-:101FE000E80080FFFCCF8091E30080688093E300ED
-:101FF000111102C082E001C083E08093E6018BC032
-:102000008058823008F087C08091E9019091EA0100
-:102010008C3D53E0950779F583E08A838AE28983D2
-:102020004FB7F894DE01139620E03EE051E2E32F33
-:10203000F0E050935700E49120FF03C0E295EF7069
-:102040003F5FEF708E2F90E0EA3010F0C79601C02E
-:10205000C0968D939D932F5F243149F74FBF809198
-:10206000E800877F8093E8006AE270E0CE01019685
-:102070000E94760C14C0AE014F5F5F4F6091EB0180
-:102080000E94BF0BBC01892B09F445C09091E80068
-:10209000977F9093E80089819A810E94D40C809167
-:1020A000E8008B778093E80036C08038A1F58091F6
-:1020B000E800877F8093E8008091E2018093F1003F
-:1020C0008091E8008E778093E8000E946A0D23C01B
-:1020D000811121C08091E9019091EA01992702972D
-:1020E000D4F48091E800877F8093E8008091E90133
-:1020F0008093E2010E946A0D8091E201811106C085
-:102100008091E30087FD02C081E001C084E08093FC
-:10211000E6010E94B80A8091E80083FF0AC080911E
-:10212000E800877F8093E8008091EB0080628093D5
-:10213000EB00AA960FB6F894DEBF0FBECDBFDF91BD
-:10214000CF911F9108950895CF938091E601882340
-:10215000A1F0C091E900CF709091EC00892F8170BF
-:1021600090FD80E8C82B1092E9008091E80083FD83
-:102170000E944D0FCF70C093E900CF9108959093C6
-:102180006B0180936A010895E0916A01F0916B01FF
-:10219000309721F00190F081E02D099480E00895BE
-:1021A000E0916A01F0916B01309721F00280F38198
-:1021B000E02D09940895E0916A01F0916B01309748
-:1021C00021F00480F581E02D0994089520916801A3
-:1021D000309169012817390771F090936901809354
-:1021E0006801E0916A01F0916B01309721F006805F
-:1021F000F781E02D099408952091660130916701DF
-:102200002817390771F09093670180936601E09178
-:102210006A01F0916B01309721F00084F185E02D87
-:102220000994089508950C9412110E94D01C0E94E4
-:1022300082060C94961DCF92DF92EF92FF920F933D
-:102240001F93CF93DF93CDB7DEB72B970FB6F894DC
-:10225000DEBF0FBECDBF0E949A068DE6C82E81E07C
-:10226000D82E00E010E0E02E802F0E949007F601AB
-:1022700041916F01F82EF426B1F40F5F1F4F0E301D
-:10228000110589F78FEF89838A831B820E94D91CED
-:102290008160782F9D838C8349815A816B818D81E8
-:1022A0000E94BE1140C09091CE0191FF04C08B8767
-:1022B0000E9496078B8520E030E04F2D50E0922F52
-:1022C000BA01022E02C0759567950A94E2F760FF85
-:1022D00024C02E83EF8221E030E0690102C0CC0CE3
-:1022E000DD1C9A95E2F790E08C219D21892B09F461
-:1022F00020E028870E94D91C8160782F9A878987DF
-:102300004E815F8168858A850E94BE11F801E3597C
-:10231000FE4F8081C826C08206C02F5F3F4F263007
-:10232000310569F6AACF0E947D200E94C4109091C9
-:102330006C018917A1F00E94C41080936C012B9648
-:102340000FB6F894DEBF0FBECDBFDF91CF911F91C6
-:102350000F91FF90EF90DF90CF900C94BA092B96DD
-:102360000FB6F894DEBF0FBECDBFDF91CF911F91A6
-:102370000F91FF90EF90DF90CF900895CF93DF9370
-:10238000CDB7DEB72B970FB6F894DEBF0FBECDBF2B
-:102390004F83588769877A878B87DE01119686E09D
-:1023A000FD0111928A95E9F785E0FE0137960190CB
-:1023B0000D928A95E1F749815A816B817C818D81EB
-:1023C0009E810E94C1182B960FB6F894DEBF0FBEF7
-:1023D000CDBFDF91CF910895CF93C82F882309F403
-:1023E000C1C0823859F40E94C41081FDBBC089E38A
-:1023F0000E945E1B0E94161C89E30CC0833879F48E
-:102400000E94C41080FDAEC083E50E945E1B0E9446
-:10241000161C83E50E949D1BCF910C94161C8438DA
-:1024200059F40E94C41082FD9DC087E40E945E1B87
-:102430000E94161C87E4EECF8CEF8C0F813A48F493
-:102440008C2F0E94BD2281118DC08C2F0E945E1B9B
-:10245000E3CF80E28C0F883048F4C77081E001C080
-:10246000880FCA95EAF70E94DF1BD6CF8BE58C0F49
-:10247000833078F4C53A29F0C63A31F083E890E029
-:1024800005C081E890E002C082E890E0CF910C9412
-:10249000E61088E58C0F833108F064C0C83A39F142
-:1024A000C93A41F1CA3A49F1CB3A51F1CC3A59F122
-:1024B000CD3A61F1C03B69F1CE3A71F1CF3A79F191
-:1024C000C13B81F1C23B89F1C33B91F1C43B99F11E
-:1024D000C53BA1F1C63BA9F1C73BB1F1C83BB9F17E
-:1024E000C93BC1F1CA3BC9F180E090E038C082EE3F
-:1024F00090E035C089EE90E032C08AEE90E02FC0C7
-:1025000085EB90E02CC086EB90E029C087EB90E053
-:1025100026C08CEC90E023C08DEC90E020C083E8D6
-:1025200091E01DC08AE891E01AC082E991E017C0ED
-:1025300084E991E014C081E292E011C083E292E06C
-:102540000EC084E292E00BC085E292E008C086E211
-:1025500092E005C087E292E002C08AE292E0CF9169
-:102560000C94FC10CF910895882309F44BC0823855
-:1025700059F40E94C41081FF45C089E30E945E1B8C
-:102580000E94161C89E30CC0833871F40E94C410A9
-:1025900080FF38C083E50E945E1B0E94161C83E505
-:1025A0000E949D1B0C94161C843859F40E94C41080
-:1025B00082FF28C087E40E945E1B0E94161C87E4ED
-:1025C000EFCF9CEF980F913A58F390E2980F983024
-:1025D00050F4877091E001C0990F8A95EAF7892F2E
-:1025E0000E94E51BDFCF9BE5980F933020F480E03D
-:1025F00090E00C94E610885A833120F480E090E05B
-:102600000C94FC100895882321F00E94DF1B0C9489
-:10261000161C0895882321F00E94E51B0C94161CBB
-:102620000895BF92CF92DF92EF92FF920F931F9384
-:10263000CF93DF9300D000D000D0CDB7DEB77C01C0
-:1026400085E0F701DE01119601900D928A95E1F780
-:10265000F70183819481892B09F4DDC29081818106
-:102660008F3F19F49F3F09F4D6C2F70102812581FB
-:1026700022952F7099838A8389819A812E830E9463
-:102680001D1B182FB92E0E941C1B0E94E319EB2D55
-:10269000E295EF704E2F50E0FA01E159FF4F2E8185
-:1026A0000C9401258B2D807F9B2D9F70F92E882304
-:1026B00019F0F29480EFF822002349F0FF2009F48A
-:1026C00057C28F2D0E94EF1B0E94161C51C2812FF2
-:1026D0000E94B412FF2009F49EC28F2D0E94F51BA8
-:1026E00026960FB6F894DEBF0FBECDBFDF91CF9117
-:1026F0001F910F91FF90EF90DF90CF90BF900C94BF
-:10270000161C3B2D307F8B2D8F70303211F082954F
-:10271000807F112319F0113021F12CC00023B9F072
-:10272000222309F490C1213009F08DC126960FB6FD
-:10273000F894DEBF0FBECDBFDF91CF911F910F91F7
-:10274000FF90EF90DF90CF90BF900C94FF1B22235F
-:1027500019F0213009F45FC28E830E94021C8E8121
-:1027600086C1002321F0223008F055C26CC121112E
-:1027700052C27DC1002321F0222309F464C1F8C1B3
-:10278000222309F474C109C28B2D86958695837026
-:1027900019F08130D1F03FC2002321F0812F9B2D11
-:1027A000937002C080E090E026960FB6F894DEBFEA
-:1027B0000FBECDBFDF91CF911F910F91FF90EF9092
-:1027C000DF90CF90BF900C94E610002321F0812F72
-:1027D0009B2D937002C080E090E026960FB6F8948F
-:1027E000DEBF0FBECDBFDF91CF911F910F91FF9044
-:1027F000EF90DF90CF90BF900C94FC10812F0023BE
-:1028000019F00E94851F02C00E94ED1F26960FB688
-:10281000F894DEBF0FBECDBFDF91CF911F910F9116
-:10282000FF90EF90DF90CF90BF900C9472208B2D93
-:10283000837009F075C00111EEC1812F82958695D4
-:102840008770880F880F912F9F70C92ED12CE12C93
-:10285000F12C082E04C0CC0CDD1CEE1CFF1C0A94CD
-:10286000D2F714FF12C00FE010E020E030E004C007
-:10287000000F111F221F331F8A95D2F7C901B8011B
-:10288000609570958095909503C060E070E0CB01F5
-:102890004B2D4695469543704230C1F060F56C294A
-:1028A0007D298E299F29413051F126960FB6F89443
-:1028B000DEBF0FBECDBFDF91CF911F910F91FF9073
-:1028C000EF90DF90CF90BF900C940A1A6C297D296D
-:1028D0008E299F2926960FB6F894DEBF0FBECDBF76
-:1028E000DF91CF911F910F91FF90EF90DF90CF90EC
-:1028F000BF900C94261A0E940A1AC701B6012696A8
-:102900000FB6F894DEBF0FBECDBFDF91CF911F9100
-:102910000F91FF90EF90DF90CF90BF900C94EE1945
-:10292000002319F08B2D817001C08695882309F44E
-:1029300072C1812F829586958770880F880F912F9D
-:102940009F70C92ED12CE12CF12C082E04C0CC0C88
-:10295000DD1CEE1CFF1C0A94D2F714FF12C00FE01E
-:1029600010E020E030E004C0000F111F221F331FD1
-:102970008A95D2F7C901B8016095709580959095B8
-:1029800003C060E070E0CB014B2D46954695437047
-:102990004230C1F060F56C297D298E299F29413094
-:1029A00051F126960FB6F894DEBF0FBECDBFDF9172
-:1029B000CF911F910F91FF90EF90DF90CF90BF903C
-:1029C0000C94E41A6C297D298E299F2926960FB62E
-:1029D000F894DEBF0FBECDBFDF91CF911F910F9155
-:1029E000FF90EF90DF90CF90BF900C94001B0E945F
-:1029F000E41AC701B60126960FB6F894DEBF0FBEE3
-:102A0000CDBFDF91CF911F910F91FF90EF90DF909D
-:102A1000CF90BF900C94C81A103FD1F118F4103E1B
-:102A200050F4A1C0123F09F463C008F44CC0133F36
-:102A300009F473C098C01F708B2D8F710023A1F013
-:102A40000E94611A812F26960FB6F894DEBF0FBE42
-:102A5000CDBFDF91CF911F910F91FF90EF90DF904D
-:102A6000CF90BF900C9403130E94821A812F269658
-:102A70000FB6F894DEBF0FBECDBFDF91CF911F918F
-:102A80000F91FF90EF90DF90CF90BF900C940A13BE
-:102A90000023A9F02111BFC08B2D8F7126960FB690
-:102AA000F894DEBF0FBECDBFDF91CF911F910F9184
-:102AB000FF90EF90DF90CF90BF900C94A71A223038
-:102AC00008F0A9C0E9CF0023A9F08B2D8F712696BD
-:102AD0000FB6F894DEBF0FBECDBFDF91CF911F912F
-:102AE0000F91FF90EF90DF90CF90BF900C94611A00
-:102AF000002359F38B2D8F7126960FB6F894DEBF05
-:102B00000FBECDBFDF91CF911F910F91FF90EF903E
-:102B1000DF90CF90BF900C94821A002399F08B2DF8
-:102B20008F7126960FB6F894DEBF0FBECDBFDF9132
-:102B3000CF911F910F91FF90EF90DF90CF90BF90BA
-:102B40000C944C1A26960FB6F894DEBF0FBECDBF7C
-:102B5000DF91CF911F910F91FF90EF90DF90CF9079
-:102B6000BF900C94421A0023A9F0222309F4ADCFA0
-:102B7000812F26960FB6F894DEBF0FBECDBFDF9132
-:102B8000CF911F910F91FF90EF90DF90CF90BF906A
-:102B90000C94EC11222309F4ADCF812F26960FB6A9
-:102BA000F894DEBF0FBECDBFDF91CF911F910F9183
-:102BB000FF90EF90DF90CF90BF900C94B4124B2D0C
-:102BC0004F70612FC7010E94390426960FB6F89402
-:102BD000DEBF0FBECDBFDF91CF911F910F91FF9050
-:102BE000EF90DF90CF90BF900C9466194B2D4F70F3
-:102BF000612FC70126960FB6F894DEBF0FBECDBF7A
-:102C0000DF91CF911F910F91FF90EF90DF90CF90C8
-:102C1000BF900C94570826960FB6F894DEBF0FBEEF
-:102C2000CDBFDF91CF911F910F91FF90EF90DF907B
-:102C3000CF90BF9008950E94FC1B0E94D11B0E9460
-:102C4000161C0E9422210E94722080E090E00E94C7
-:102C5000E61080E090E00C94FC100E94EC1B0C94B9
-:102C60001B160E941D1B292F22952F702C3030F42B
-:102C70002A3048F42250223078F405C02C3041F03C
-:102C80002F3031F009C0803E48F0803F29F406C063
-:102C900093FB882780F9089580E0089581E00895E6
-:102CA000CF93DF9300D000D01F92CDB7DEB70F9047
-:102CB0000F900F900F900F90DF91CF910895CF93C9
-:102CC000DF9300D000D000D0CDB7DEB726960FB688
-:102CD000F894DEBF0FBECDBFDF91CF9108951F9353
-:102CE000CF93DF93C0917B0116E080917C01C817E0
-:102CF00099F0D0E01C9FF0011D9FF00D1124E358C6
-:102D0000FE4F4081518162817381848195810E944F
-:102D10005F162196C770E9CFDF91CF911F9108957B
-:102D20004091AD015091AE016091AF017091B00141
-:102D30008091B1019091B2010C945F168091B20123
-:102D400082958F7009F054C08091AF01882309F4F7
-:102D50004FC080917B01A0917C014091B0015091C6
-:102D6000B1016091AD017091AE01B6E08A1709F42E
-:102D70003FC090E041155105C1F17F3F11F46F3F15
-:102D8000A1F1B89FF001B99FF00D1124E358FE4F57
-:102D9000218127132AC02081261327C022812111D7
-:102DA00024C0238134812417350710F421503109C0
-:102DB000241B350B283C3105C0F42091B2012F7043
-:102DC00020612093B20126E0289FF001299FF00D99
-:102DD0001124EE57FE4F80818F70806180838DEAD1
-:102DE00091E00E9411130C946F1601968770BECF6C
-:102DF0000895CF92DF92EF92FF920F931F93CF939C
-:102E0000DF93CDB7DEB762970FB6F894DEBF0FBE83
-:102E1000CDBF8C0185E0F801DE011D9601900D9279
-:102E20008A95E1F7D8014C9111965C911197129611
-:102E30006C918091B0019091B101009709F475C136
-:102E40003091AD017091AE017F3F19F43F3F09F41D
-:102E50006CC1F801C380D480E090AF01EE2009F48A
-:102E6000BEC02091B201C816D90628F0D601A81B11
-:102E7000B90BCD0104C0809590958C0D9D1DFF244C
-:102E8000F394883C910578F0F12C207F09F0C4C0C0
-:102E90007C2DD98AC88A89890E9450168DEA91E0D2
-:102EA0000E941113AFC0822F807F09F045C05713D5
-:102EB00013C0431311C061110FC02F702061209304
-:102EC000B2010E9490168DEA91E00E941113809148
-:102ED000B201F80185832EC0CD2819F15F3F11F4AE
-:102EE0004F3FF9F0F62E61111CC080917B012091BB
-:102EF0007C0136E0821709F45BC090E0389FF00156
-:102F0000399FF00D1124E358FE4F7181571306C00D
-:102F10007081471303C07281711103C001968770DD
-:102F2000E9CFF62E662309F41CC18091B2018160BD
-:102F30008093B201F12C15C1571309C0431307C088
-:102F4000611105C08091B201F8018583C8C04D8729
-:102F50005E878D859E856A8B0E9431166A898823DB
-:102F6000D1F16623C1F12091B201822F82958F7039
-:102F700090E0029774F08091AD019091AE01988736
-:102F80008F831986DB86CA862C87CE0107960E941E
-:102F9000111386E0F801ADEAB1E001900D928A9537
-:102FA000E1F70E949E160E949016FF24F394D9C068
-:102FB0004D875E878D859E850E941D1B292F22953A
-:102FC0002F70223008F0C1C09F7009F0BBC0805E36
-:102FD000883008F4C6C0C8010E941113E6CFC81695
-:102FE000D90608F453C0F601E81BF90BCF01883C61
-:102FF000910508F450C0F12C7C2DD98AC88A8989A2
-:103000000E945016EDEAF1E086E0DF011D928A95FC
-:10301000E9F70E949016A5C0571314C0431312C0BD
-:10302000611110C08091B201F8018583C8010E942E
-:10303000111386E0EDEAF1E0DF011D928A95E9F7D0
-:10304000FE2C8FC04D875E878D859E856A8B0E9482
-:1030500031166A89882309F4BECF662309F4BBCFF1
-:103060002091B201822F82958F7090E002970CF42C
-:1030700090CF8091AD019091AE019A8389831B829C
-:10308000DD82CC822E83CE01019681CF80959095F2
-:103090008C0D9D1DACCFF62E662309F49CCF5713E3
-:1030A00033C0431331C02091B20120FD24C0822FD0
-:1030B00082958F70482F50E041155105E1F0D801FD
-:1030C00015962C9315974F30510549F08F5F982F27
-:1030D0009295907F822F8F70892B15968C93C801C3
-:1030E0000E94111386E0F801ADEAB1E001900D9263
-:1030F0008A95E1F78ECF86E0F801ADEAB1E0019064
-:103100000D928A95E1F72DC04D875E878D859E854E
-:103110000E94311681113DCF8091B2018160809370
-:10312000B201C8010E9411131CC0662309F453CFD9
-:103130004D875E878D859E850E943116882309F410
-:103140004ACF27CF811143CF0CC0243008F043CFA2
-:103150009F7009F43CCFD80115969C91907F09F09F
-:1031600036CF8F2D62960FB6F894DEBF0FBECDBF5F
-:10317000DF91CF911F910F91FF90EF90DF90CF9053
-:1031800008951F93CF93DF93CDB7DEB72C970FB67B
-:10319000F894DEBF0FBECDBF4F83588769877A870B
-:1031A0008B879C87CE0107960E94F916882371F0C1
-:1031B0008A859B85892B09F441C088858F3F09F05A
-:1031C00065C08F818F3F09F061C038C086E0FE0185
-:1031D0003796DE01119601900D928A95E1F76A8586
-:1031E0007B856115710551F1FF81E885EF3F11F491
-:1031F000FF3F21F120917C0130E0C90101968770E9
-:10320000992740917B0150E08417950709F447C046
-:10321000F983EA837D836C8396E0929FD001939F2C
-:10322000B00D1124A358BE4FFE01319601900D92AE
-:103230009A95E1F780937C010E946F1616E08091C9
-:103240007B0190917C018917B9F1189FC00111246D
-:1032500083589E4F0E94F916882371F1E0917B01FB
-:103260001E9FF0011124E358FE4F4081518162817D
-:103270007381848195810E945F1680917B0190E02B
-:1032800001968770992780937B01D9CF4F8158850C
-:1032900069857A858B859C850E945F16CFCF0E94B9
-:1032A0002D1610927C0110927B01EDEAF1E086E090
-:1032B000DF011D928A95E9F72C960FB6F894DEBFD0
-:1032C0000FBECDBFDF91CF911F910895EF92FF9276
-:1032D0000F931F93CF93DF938C01892B09F46CC05C
-:1032E000F12CEE24E394E8012196F80184918437CF
-:1032F00040F4843008F051C0813081F0823019F1FF
-:103300005BC0853709F444C0A8F19CE7980F90375B
-:1033100008F052C08F770E94B41241C00E5F1F4F59
-:10332000FE01849190E2980F983050F48770FE2D42
-:1033300001C0FF0F8A95EAF78F2F0E94EF1B14C080
-:103340000E94EC112DC00E5F1F4FFE01849190E290
-:10335000980F983060F48770FE2D01C0FF0F8A959A
-:10336000EAF78F2F0E94F51B0E94161C19C00E94BD
-:10337000B41216C00E5F1F4FFE01C491CC2381F022
-:103380008FE99FE00197F1F700C00000C150F6CF30
-:103390000E5F1F4FFE01F49003C00E94EC118E01DE
-:1033A0008F2D882309F49FCFEFE9FFE03197F1F7E4
-:1033B00000C000008150F5CFDF91CF911F910F9198
-:1033C000FF90EF90089508956093B7017093B8014E
-:1033D0008093B9019093BA010C941B160F931F931D
-:1033E0000091B7011091B8012091B9013091BA0153
-:1033F000DC01CB01802B912BA22BB32B8093B70147
-:103400009093B801A093B901B093BA011F910F91A5
-:103410000C941B160F931F930091B7011091B801E4
-:103420002091B9013091BA01DC01CB0180239123B5
-:10343000A223B3238093B7019093B801A093B9015D
-:10344000B093BA011F910F910C941B160F931F9309
-:103450000091B7011091B8012091B9013091BA01E2
-:10346000DC01CB0180279127A227B3278093B701E6
-:103470009093B801A093B901B093BA011F910F9135
-:103480000C941B161092B3011092B4011092B50166
-:103490001092B6010C941B1641E050E060E070E021
-:1034A00004C0440F551F661F771F8A95D2F74093BB
-:1034B000B3015093B4016093B5017093B6010C94BD
-:1034C0001B1641E050E060E070E004C0440F551F5F
-:1034D000661F771F8A95D2F78091B3019091B4014E
-:1034E000A091B501B091B601482B592B6A2B7B2BCB
-:1034F0004093B3015093B4016093B5017093B6014A
-:103500000C941B1641E050E060E070E004C0440FF2
-:10351000551F661F771F8A95D2F740955095609585
-:1035200070958091B3019091B401A091B501B091D3
-:10353000B601482359236A237B234093B301509358
-:10354000B4016093B5017093B6010C941B1641E071
-:1035500050E060E070E004C0440F551F661F771F05
-:103560008A95D2F78091B3019091B401A091B501F1
-:10357000B091B601482759276A277B274093B301AA
-:103580005093B4016093B5017093B6010C941B166F
-:103590000F931F930091B3011091B4012091B501D5
-:1035A0003091B601DC01CB01802B912BA22BB32BE8
-:1035B0008093B3019093B401A093B501B093B60189
-:1035C0001F910F910C941B160F931F930091B30141
-:1035D0001091B4012091B5013091B601DC01CB010D
-:1035E00080239123A223B3238093B3019093B4014A
-:1035F000A093B501B093B6011F910F910C941B16C7
-:103600000F931F930091B3011091B4012091B50164
-:103610003091B601DC01CB0180279127A227B32787
-:103620008093B3019093B401A093B501B093B60118
-:103630001F910F910C941B160895CF92DF92EF9279
-:10364000FF920F931F93CF93DF938C01C090B30130
-:10365000D090B401E090B501F090B6018091B7012F
-:103660009091B801A091B901B091BA01C82AD92AA4
-:10367000EA2AFB2ACFE1D0E0D701C6010C2E04C014
-:10368000B695A795979587950A94D2F780FF07C0BE
-:10369000B8018C2F0E947B088130910531F421976D
-:1036A00058F7B80180E00E947B08DF91CF911F910D
-:1036B0000F91FF90EF90DF90CF90089590910C01C3
-:1036C0009923F1F090910D019923D1F0982F9695BF
-:1036D000969596959F3080F5E0910E01F0910F013F
-:1036E000E90FF11D877021E030E0A90102C0440F0D
-:1036F000551F8A95E2F7CA019181892B818308952C
-:1037000020910E0130910F01F90132969FEF40E0B8
-:103710005191851789F09F3F19F4511101C0942FE1
-:103720004F5F4E30A9F79F3F39F0F901E90FF11DC6
-:1037300097FDFA9582830895089590910C0199233D
-:10374000F9F090910D019923D9F0982F96959695BF
-:1037500096959F3028F5E0910E01F0910F01E90F49
-:10376000F11D877021E030E0A90102C0440F551F10
-:103770008A95E2F7CA018095918189238183089512
-:1037800020910E0130910F01F9013296205F3F4FD9
-:103790009081891301C010823196E217F307C1F7B7
-:1037A000089581E090E0E0910E01F0910F01E80FA3
-:1037B000F91F1082019680319105A9F70895909123
-:1037C000CD01892B8093CD01089580959091CD01F5
-:1037D00089238093CD0108951092CD010895909191
-:1037E000CC01892B8093CC01089580959091CC01D8
-:1037F00089238093CC0108951092CC010895809381
-:10380000BB0108951092BB01089580910E01909123
-:103810000F01FC0131969C01205F3F4F80E09191A8
-:1038200091118F5FE217F307D1F70895E0910E0130
-:10383000F0910F018091CD018083E0910E01F09114
-:103840000F0190818091CC01892B80838091BB01F5
-:10385000882361F0E0910E01F0910F019081892B96
-:1038600080830E94051C81111092BB0180910E0182
-:1038700090910F010C94D010CF92DF92EF92FF92B3
-:103880006C01EE24FF24C114D104E104F10421F001
-:10389000C701B60120E101C020E0C72ED82EE92ED5
-:1038A000FF24C114D104E104F10419F0285FC70119
-:1038B000B6016B017C0154E0F694E794D794C79469
-:1038C0005A95D1F7C114D104E104F10419F02C5F29
-:1038D000C701B6016B017C0142E0F694E794D794EE
-:1038E000C7944A95D1F7C114D104E104F10419F049
-:1038F0002E5FC701B601DC01CB01B695A795979560
-:103900008795892B8A2B8B2B09F02F5F822FFF90B5
-:10391000EF90DF90CF9008958091E601843011F10F
-:1039200020E488E190E00FB6F894A89580936000B9
-:103930000FBE2093600083B7817F846083BF83B70D
-:10394000816083BF7894889583B78E7F83BF0FB6DD
-:10395000F894A8958091600088618093600010922F
-:1039600060000FBE089508950C94B31CCF930E947D
-:10397000B41C0E949A060E94B31CC0E08C2F0E94C7
-:103980009007811104C0CF5FCE30C1F701C081E044
-:10399000CF9108950E942D160E94C4100C94BA096C
-:1039A00082E084BD93E095BD9AEF97BD80936E0051
-:1039B00008952FB7F8948091CF019091D001A091F4
-:1039C000D101B091D2012FBF0895CF92DF92EF9233
-:1039D000FF920F931F932FB7F8944091CF0150910E
-:1039E000D0016091D1017091D2012FBF6A017B019A
-:1039F000EE24FF248C0120E030E0C016D106E20660
-:103A0000F30610F4415051099A01281B390BC901E2
-:103A10001F910F91FF90EF90DF90CF9008951F922C
-:103A20000F920FB60F9211248F939F93AF93BF9372
-:103A30008091CF019091D001A091D101B091D2019C
-:103A40000196A11DB11D8093CF019093D001A09349
-:103A5000D101B093D201BF91AF919F918F910F90FF
-:103A60000FBE0F901F9018950E94BC0DF8942FEF79
-:103A700087EA91E6215080409040E1F700C00000C5
-:103A800087E090EBDC018093EF019093F001A0932D
-:103A9000F101B093F2019CE088E10FB6F894A8958B
-:103AA000809360000FBE90936000FFCFEF92FF9273
-:103AB0000F931F93CF93DF93D82FC0E08C2F0E94DA
-:103AC000900700E010E0E82EF12CC701002E02C0A4
-:103AD000959587950A94E2F780FD06C00F5F1F4F0A
-:103AE0000630110591F709C0602F7C2F80E00E94FD
-:103AF00058088D13F3CF81E004C0CF5FCE30F1F6CC
-:103B000080E0DF91CF911F910F91FF90EF9008958A
-:103B1000CF93C82F8CE20E94561D882321F08C2F52
-:103B2000CF910C94561D80E0CF910895CF930E94C1
-:103B3000DD1E811102C00E94C31EC5E6C15049F0BE
-:103B40000E949A068FE39CE90197F1F700C00000FC
-:103B5000F5CF89E20E94881D811113C18AE20E947B
-:103B6000881D81110E94C31E85E00E94881D81115D
-:103B70000E94341D0E94E81E8093CE0187E00E94BF
-:103B8000881D8823A9F18BE10E94881D882351F0AC
-:103B90008091CE0181FB222720F991E0922790FBB2
-:103BA00081F90EC08EE00E94881D882361F080910B
-:103BB000CE0182FB222720F991E0922790FB82F927
-:103BC0008093CE0115C080E10E94881D9091CE01A6
-:103BD000882341F093FB222720F981E0822780FB94
-:103BE00093F904C0892F809580FB90F99093CE01C2
-:103BF0008091CE010E94EC1E0E94FA1E8093E0018B
-:103C000080EE0E94881D882341F08091E001982F6A
-:103C1000909590FB80F98093E00189E30E94881DD4
-:103C2000882359F08091E00181FB222720F991E05F
-:103C3000922790FB81F98093E00182EE0E94881D1B
-:103C4000882359F08091E00182FB222720F991E03E
-:103C5000922790FB82F98093E00186EE0E94881DF6
-:103C6000882359F08091E00183FB222720F991E01D
-:103C7000922790FB83F98093E00183EE0E94881DD8
-:103C8000882359F08091E00184FB222720F991E0FC
-:103C9000922790FB84F98093E00185E30E94881DC0
-:103CA000882359F08091E00185FB222720F991E0DB
-:103CB000922790FB85F98093E00181E30E94881DA3
-:103CC000882359F08091E00186FB222720F991E0BA
-:103CD000922790FB86F98093E00181E10E94881D84
-:103CE000882359F08091E00187FB222720F991E099
-:103CF000922790FB87F98093E0018091E0010E9478
-:103D0000FE1E8091E00187FB882780F980930D01DA
-:103D100087E20E94881DC82F8EE10E94881D8111B4
-:103D2000C2608FE10E94881D8111C46080E20E9400
-:103D3000881D8111C86081E20E94881D8111C061C7
-:103D400082E20E94881D8111C06283E20E94881D68
-:103D50008111C06484E20E94881D882311F0C0682C
-:103D600002C0CC2329F08C2F0E94F51E6C2F03C0BB
-:103D70000E94F11E682F70E080E090E0CF910C94DB
-:103D8000E419CF9108956DEE7EEF80E090E00E94FF
-:103D9000372560E082E090E00E94292560E083E022
-:103DA00090E00E94292560E084E090E00E942925AF
-:103DB00060E085E090E00C94292580E090E00E948E
-:103DC000232521E08D3E9E4F09F020E0822F0895AB
-:103DD00082E090E00C941B25682F82E090E00C9428
-:103DE000292583E090E00C941B25682F83E090E068
-:103DF0000C94292584E090E00C941B25682F84E026
-:103E000090E00C9429258091D50180FF0BC0609132
-:103E1000130185E0689FB00111247595679575952C
-:103E200067952BC081FF09C06091130185E0689FF1
-:103E3000B00111247595679520C082FF07C060917D
-:103E4000130185E0689FB001112417C09091D6013D
-:103E50009923D1F060911201961788F720911301F0
-:103E600085E0289F90011124929FA001939F500DFF
-:103E7000112470E0CA010E94ED246038710540F4FD
-:103E80006115710519F406C065E070E0862F08958C
-:103E90008FE7089581E008958091D50180FF08C0E3
-:103EA0006091110170E0759567957595679521C0D2
-:103EB00081FF06C06091110170E07595679519C08A
-:103EC00082FF04C06091110170E010C09091D60192
-:103ED000992399F0609110019617A0F78091110134
-:103EE000899FC001112470E00E94ED2460387105A3
-:103EF00040F46115710519F406C061E070E0862F89
-:103F000008958FE7089581E00895803F21F40E948D
-:103F1000031F819504C0813F29F40E94031F8093F1
-:103F2000D9010895823F21F40E94031F819504C0A6
-:103F3000833F29F40E94031F8093D8010895893F8D
-:103F400019F40E944C1F05C08A3F31F40E944C1F97
-:103F500081958093DA0108958B3F21F40E944C1FD4
-:103F6000819504C08C3F29F40E944C1F8093DB0193
-:103F70000895843F21F48091D701816017C0853F67
-:103F800021F48091D701826011C0863F21F4809195
-:103F9000D70184600BC0873F21F48091D7018860EE
-:103FA00005C0883F31F48091D70180618093D701AB
-:103FB00008958D3F21F48091D50181600BC08E3F23
-:103FC00021F48091D501826005C08F3F29F4809152
-:103FD000D50184608093D5010895803F39F48091A4
-:103FE000D90187FF6CC01092D90169C0813F29F4C3
-:103FF0008091D9011816BCF362C09091D801823F1C
-:1040000029F497FF5CC01092D80159C0833F19F47E
-:104010001916CCF354C0893F41F48091DA01181687
-:104020000CF04DC01092DA014AC08A3F29F4809109
-:10403000DA0187FF44C0F6CF8B3F39F48091DB0172
-:1040400087FF3DC01092DB013AC08C3F29F480917C
-:10405000DB011816BCF333C0843F21F48091D701F3
-:104060008E7F17C0853F21F48091D7018D7F11C0CD
-:10407000863F21F48091D7018B7F0BC0873F21F4CD
-:104080008091D701877F05C0883F31F48091D701A7
-:104090008F7E8093D70113C08D3F21F48091D5018D
-:1040A0008E7F0BC08E3F21F48091D5018D7F05C09E
-:1040B0008F3F29F48091D5018B7F8093D50180912A
-:1040C000D80181110EC08091D90181110AC080915F
-:1040D000DA01811106C08091DB01811102C01092CA
-:1040E000D601089587ED91E00E94DB100E94D91C53
-:1040F0009093D4018093D30108951F93CF93DF93BE
-:104100008091D3019091D4010E94E51CAC01909163
-:10411000D601992321F02091140130E006C02091AE
-:1041200015018AE0289F900111244217530708F4D3
-:1041300085C08091D801C091D901D091DA01109148
-:10414000DB01811107C0C11175C0D11173C01111FC
-:1041500071C074C09F3F19F09F5F9093D6011816ED
-:1041600024F40E94031F8093D8018091D80187FF17
-:1041700005C00E94031F81958093D8011C1624F46A
-:104180000E94031F8093D9018091D90187FF05C048
-:104190000E94031F81958093D9016091D801662305
-:1041A00031F1C091D901CC2311F1062E000C770B0F
-:1041B000880B990B0E94F42323E333E343E35FE38B
-:1041C0000E9458240E94BC236093D8016C2FCC0F0E
-:1041D000770B880B990B0E94F42323E333E343E32B
-:1041E0005FE30E9458240E94BC236093D9011D16EE
-:1041F00024F40E944C1F8093DA018091DA0187FF3A
-:1042000005C00E944C1F81958093DA01111624F499
-:104210000E944C1F8093DB018091DB0187FF05C06A
-:104220000E944C1F81958093DB01DF91CF911F91FC
-:104230000C9472209F3F09F08FCFA0CFDF91CF91D8
-:104240001F910895E7EDF1E085E0DF011D928A9569
-:10425000E9F71092D6011092D5010895833081F1CB
-:1042600028F4813059F08230D1F00895853009F476
-:1042700049C0B8F1863009F456C0089580911501FF
-:10428000262F30E0280F311D2F3F310524F4680F11
-:104290006093150108958FEF809315010895809123
-:1042A0001401262F30E0280F311D2F3F310524F453
-:1042B000680F6093140108958FEF8093140108959F
-:1042C00080911301262F30E0280F311D2F3F31053B
-:1042D00024F4680F6093130108958FEF8093130106
-:1042E000089580911201262F30E0280F311D2F3FB5
-:1042F000310524F4680F6093120108958FEF8093C5
-:104300001201089580911101262F30E0280F311DF0
-:104310002F3F310524F4680F6093110108958FEF4A
-:1043200080931101089580911001262F30E0280F0D
-:10433000311D2F3F310524F4680F6093100108955B
-:104340008FEF809310010895833011F128F48130AC
-:1043500049F0823091F00895853081F120F1863066
-:10436000C1F1089580911501681720F4861B809390
-:104370001501089510921501089580911401681790
-:1043800020F4861B8093140108951092140108955F
-:1043900080911301681720F4861B80931301089500
-:1043A00010921301089580911201681720F4861B62
-:1043B00080931201089510921201089580911101C5
-:1043C000681720F4861B8093110108951092110143
-:1043D000089580911001681720F4861B80931001C6
-:1043E00008951092100108950F931F938D3109F4D1
-:1043F0006BC008F03FC08E3009F47DC0C0F4873038
-:1044000009F46EC068F4863009F0AFC08091CE0127
-:10441000817F8E7F8093CE0181E08093DD01A6C0F5
-:10442000883009F458C08B3009F49BC09EC0863197
-:1044300009F497C078F4803109F470C0813109F033
-:1044400094C00E942D1690910D0181E089278093E0
-:104450000D0187C0893109F484C08B3109F085C012
-:104460008091CE0181FB222720F991E0922790FBD9
-:1044700081F94AC0853309F45BC048F4873209F4F6
-:1044800057C008F45AC0893209F452C06EC0833450
-:1044900038F48A3308F067C0883309F462C065C015
-:1044A000833409F445C0883409F05FC00E942D169A
-:1044B0000FEF13ED20E3015010402040E1F700C062
-:1044C00000000E94341D4DC00E9476230E94C4103B
-:1044D0000E94BA0946C00E94E81E0E94FA1E41C00E
-:1044E0009091CE01892F817090FF12C0917F9E7FA5
-:1044F0009093CE013BC08091CE0182FB222720F910
-:1045000091E0922790FB82F98093CE01992349F1A3
-:104510008091CE0181608093CE0123C08091CE0135
-:1045200083FB222720F991E0922790FB83F9ECCFBF
-:1045300061E070E080E090E010C08D5141E050E01B
-:1045400060E070E08A019B0104C0000F111F221F70
-:10455000331F8A95D2F7C901B8010E94E4190E945D
-:104560002D1681E003C08953E9CF80E01F910F91A0
-:10457000089580E008950C94B922CF93C82F8091BC
-:10458000DD01813079F018F08230E9F187C0E091E7
-:104590000E01F0910F018081813169F0823209F0C2
-:1045A0007FC009C0E0910E01F0910F01808181313F
-:1045B00011F0823261F48C2F0E94BB22811104C061
-:1045C0008C2F0E94F4211DC081E090E01AC08C2F36
-:1045D0000E94B922811114C0C43179F048F4CB3063
-:1045E00079F0C03109F060C082E08093DD0108C03D
-:1045F000C93219F0C83321F057C01092DD0154C000
-:1046000081E0817053C0C93289F118F5C43171F16C
-:10461000A8F4C73009F046C08AE08093150194E100
-:104620009093140193E0909313018093120188E01A
-:104630008093110188E28093100134C0CE51C630BE
-:1046400088F5EC2FF0E0E65DFE4F80818093DC0181
-:1046500029C0CE34E9F020F4CB3421F56AE013C050
-:10466000C13579F0C235F1F461E00DC08091DC0113
-:10467000882319F01092DC0115C081E08093DD01E0
-:1046800015C061E006C08091DC010E942E210AC0A5
-:104690006AE08091DC010E94A42104C01092DD0137
-:1046A00080E004C081E002C080E0ABCFCF910895EC
-:1046B000E1E8F0E080818860808380818160808390
-:1046C0008FB7F89493E09093890090ED90938800D1
-:1046D0008FBF0895EFE6F0E08081826080830895C7
-:1046E000EFE6F0E080818D7F80830895EFE6F0E0D3
-:1046F000908182E08927808308951F920F920FB6E0
-:104700000F9211242F933F934F935F936F937F9357
-:104710008F939F93AF93BF93EF93FF938091DE01AD
-:104720009091DF0101969093DF018093DE0181116A
-:1047300003C082E00E94BA09E091DF01E695E695A8
-:10474000F0E0E156F84FE4918091DE018E1303C052
-:1047500080E00E94BA09FF91EF91BF91AF919F91C4
-:104760008F917F916F915F914F913F912F910F901A
-:104770000FBE0F901F9018950E94C3236894B1112B
-:104780000C94522408950E94372488F09F5798F083
-:10479000B92F9927B751B0F0E1F0660F771F881F46
-:1047A000991F1AF0BA95C9F714C0B13091F00E9460
-:1047B0005124B1E008950C945124672F782F882755
-:1047C000B85F39F0B93FCCF3869577956795B39587
-:1047D000D9F73EF490958095709561957F4F8F4FF6
-:1047E0009F4F0895E89409C097FB3EF490958095FB
-:1047F000709561957F4F8F4F9F4F9923A9F0F92FA7
-:1048000096E9BB279395F695879577956795B79524
-:10481000F111F8CFFAF4BB0F11F460FF1BC06F5F0A
-:104820007F4F8F4F9F4F16C0882311F096E911C01C
-:10483000772321F09EE8872F762F05C0662371F03D
-:1048400096E8862F70E060E02AF09A95660F771F51
-:10485000881FDAF7880F9695879597F9089557FD81
-:104860009058440F551F59F05F3F71F04795880FDE
-:1048700097FB991F61F09F3F79F087950895121675
-:1048800013061406551FF2CF4695F1DF08C0161621
-:1048900017061806991FF1CF8695710561050894D2
-:1048A0000895E894BB2766277727CB0197F90895E9
-:1048B0000E946B240C94DC240E94CE2438F00E94C9
-:1048C000D52420F0952311F00C94C5240C94CB240E
-:1048D00011240C9452240E942F2470F3959FC1F34D
-:1048E000950F50E0551F629FF001729FBB27F00D9E
-:1048F000B11D639FAA27F00DB11DAA1F649F6627F3
-:10490000B00DA11D661F829F2227B00DA11D621F41
-:10491000739FB00DA11D621F839FA00D611D221FFB
-:10492000749F3327A00D611D231F849F600D211DDF
-:10493000822F762F6A2F11249F5750409AF0F1F062
-:1049400088234AF0EE0FFF1FBB1F661F771F881FCB
-:1049500091505040A9F79E3F510580F00C94C5241A
-:104960000C9452245F3FE4F3983ED4F386957795F8
-:104970006795B795F795E7959F5FC1F7FE2B880F71
-:10498000911D9695879597F9089597F99F6780E807
-:1049900070E060E008959FEF80EC089500240A9491
-:1049A0001616170618060906089500240A9412160A
-:1049B0001306140605060895092E0394000C11F43D
-:1049C000882352F0BB0F40F4BF2B11F460FF04C0EA
-:1049D0006F5F7F4F8F4F9F4F089597FB072E16F401
-:1049E000009407D077FD09D00E94072507FC05D069
-:1049F0003EF4909581959F4F0895709561957F4FF6
-:104A00000895EE0FFF1F0590F491E02D0994AA1B65
-:104A1000BB1B51E107C0AA1FBB1FA617B70710F0A9
-:104A2000A61BB70B881F991F5A95A9F780959095DB
-:104A3000BC01CD010895F999FECF92BD81BDF89AD0
-:104A4000992780B50895A8E1B0E042E050E00C94C9
-:104A50003E25262FF999FECF1FBA92BD81BD20BDFC
-:104A60000FB6F894FA9AF99A0FBE019608950E942B
-:104A70002925272F0C942A25DC01CB01FC01F9996B
-:104A8000FECF06C0F2BDE1BDF89A319600B40D929A
-:0C4A900041505040B8F70895F894FFCF53
-:104A9C002002BB094B0A260AF209BE090101BC011E
-:104AAC0028080A03140A3F4D363960071307DD0640
-:104ABC00A4063706500669068206010203040506A1
-:044ACC0007080900CE
-:00000001FF
+:100000000C94F0030C9434040C9434040C943404D5
+:100010000C9434040C9434040C9434040C94340480
+:100020000C9434040C9434040C94210E0C94F30EB0
+:100030000C9434040C9434040C9434040C94340460
+:100040000C9434040C9478230C9434040C943404ED
+:100050000C9434040C94091D0C9434040C94340452
+:100060000C9434040C9434040C9434040C94340430
+:100070000C9434040C9434040C9434040C94340420
+:100080000C9434040C9434040C9434040C94340410
+:100090000C9434040C9434040C9434040C94340400
+:1000A0000C9434040C9434040C94340444044E042E
+:1000B00066047E04C604CC04ED04D204E804DE0425
+:1000C000E304D804AE049604F204600F820F7010AB
+:1000D000820F7010C70FEA0F70103F1052103413C8
+:1000E000341363136313A613E413FD15FD15FD13F9
+:1000F000FD15FE14FE14D115FD15FD15E81501E1E1
+:100100000137023702E10138023801E201250225F8
+:1001100002E20001E10137023702E1013802380151
+:10012000E10130023002E10001E10137023702E172
+:100130000138023801E10107020702E1000135023E
+:1001400035012002200001E10137023702E10138C8
+:10015000023801E10125022502E10001E101360238
+:100160003602E10138023801E10125022502E100F1
+:1001700001E10136023602E10138023801E10126CF
+:10018000022602E10001E10137023702E1013802F3
+:100190003801E10126022602E10002E002E201301C
+:1001A00002300002E002E20001E001E20002E002AF
+:1001B000E3016402640002E002E30001E001E30005
+:1001C00002E002E2012E022E02E10002E002E10260
+:1001D000E20001E001E101E20002E001E3010602C8
+:1001E0000602E30002E00001E00002E001E3011981
+:1001F000021902E30002E00001E0000000F0A1F0BB
+:10020000A329002B00E200E100358100001E00144C
+:100210000004001D710D304D831F001A0016001BD5
+:10022000000C304C00200008000700060052002A95
+:1002300000210015000900190051004A0022001792
+:10024000000A00050000000330E101E3000000E2C5
+:1002500000000002543100E7000000E60000000446
+:100260005423001C000B00110000002E7F240018F6
+:10027000000D00100050004B0025000C000E003651
+:10028000004F002C00260012000F003700E1082864
+:10029000002700130033003871E1044E002D002FB9
+:1002A000003474E50030810000010001000100010C
+:1002B00000010000003A003500310001000100019A
+:1002C000003B0035022102350001004C003C001EBD
+:1002D0000224062202010001003D002D0224022416
+:1002E00004010001003E000100370011040000017C
+:1002F000000100010000000100000001000E3001BB
+:100300000000000100000068003F002406240224D1
+:100310000400004500400022042502110431026956
+:100320000041002304260264005000010042003511
+:100330000025045200510001004300350226043814
+:10034000004F006A0044001E02310021020100003B
+:100350000001000100010001000100000001000196
+:100360000001000100010001000100F400F200FBA7
+:1003700000010001000100F000F100FA000100019D
+:10038000000100F500F300FC00010001000100F98C
+:1003900000FA00F600000001000100010000000169
+:1003A0000000000100A800010000000100000001A1
+:1003B0000001000100A900AA0000000100010001E5
+:1003C000000100010001000100010001000100AC7A
+:1003D000000100B600010001000100AB0050000167
+:1003E00000010001000100520051000100AE0001B7
+:1003F00000010001004F00000001000100010001A8
+:1004000000010000000100010001000100010001E5
+:1004100000010001000100010001000100010001D4
+:1004200000010001000100010001000100010001C4
+:1004300000010001000100010001000100000001B5
+:100440000001000100000001000000010004300173
+:1004500000000001000000010005300630093001F5
+:1004600000000001000A300B3008300100010001DB
+:10047000000100073001000100010001000100013E
+:100480000001000100010001000100010001000164
+:100490000001000100010001000100010001000055
+:1004A0000001000100010001000100000001000145
+:1004B00000010001000100010001000100500001E5
+:1004C0000001000100010052005100010001000183
+:1004D00000010001004F00010001000100010001C6
+:1004E0000001000100000001000100010000000106
+:1004F00000000001000100010000000100000001F7
+:10050000003F00520051002302000001004000247F
+:100510000021001E00270001004100250022001FCD
+:1005200000370001004200260023002000360001B1
+:10053000004300300230002402270201004400453D
+:1005400000380001000100000001000100E100018D
+:1005500000E0000000010001000100010001003D79
+:100560000001000100010001000100E000010001A4
+:10057000000100010001002C000100010001000148
+:100580000001003C00010001000100010000003AF0
+:1005900000010001000000010000003B000E3001DE
+:1005A0000000000100000001000100010001000145
+:1005B0000000000100010001000100010001000134
+:1005C0000001000100010001000100010001000123
+:1005D0000001000100010001000100010001000113
+:1005E0000001000100010001000100010001000004
+:1005F0000016034500720067006F0044006F00782A
+:1006000000200045005A00000016034500720067F4
+:10061000006F0044006F007800200045005A000081
+:10062000000403090409026D00040100A0FA090492
+:1006300000000103010100092111010001223F0016
+:100640000705810308000A090401000103010200F3
+:10065000092111010001224D000705820308000A4B
+:100660000904020001030000000921110100012218
+:1006700036000705830308000A090403000103008C
+:10068000000009211101000122390007058403102F
+:1006900000011201100100000008EDFE0713010027
+:1006A0000102000105010906A101050719E029E77A
+:1006B0001500250195087501810205081901290514
+:1006C00095057501910295017503910105071900C2
+:1006D000297715002501957875018102C00501096A
+:1006E00080A101850216010026B7001A01002AB771
+:1006F00000751095018100C0050C0901A101850359
+:10070000160100269C021A01002A9C027510950110
+:100710008100C005010902A1010901A10005091913
+:1007200001290515002501950575018102950175C1
+:100730000381010501093009311581257F95027575
+:1007400008810609381581257F9501750881060500
+:100750000C0A38021581257F950175088106C0C0F5
+:1007600005010906A101050719E029E71500250182
+:100770009508750181029501750881010508190127
+:1007800029059505750191029501750391010507EC
+:10079000190029FF150025FF950675088100C00086
+:1007A00000000000000000000000010204060A0F23
+:1007B00017202C3A4A5D71879DB3C7DAE9F5FCFF33
+:1007C000FCF5E9DAC7B39D87715D4A3A2C20170F13
+:1007D0000A06040201000000000000000000000002
+:1007E00011241FBECFEFDAE0DEBFCDBF04B603FE9B
+:1007F00024C08091F0019091F101A091F201B0919B
+:10080000F3018730904BA740B04BB9F41092F00140
+:100810001092F1011092F2011092F30114BE84B70C
+:10082000877F84BF88E10FB6F894809360001092B0
+:1008300060000FBEE0E0FFE3099511E0A0E0B1E049
+:10084000E4E7FAE402C005900D92A433B107D9F7AA
+:1008500011E0A4E3B1E001C01D92A03FB107E1F7B0
+:100860000E94650B0C9438250C940000462F50E034
+:100870004F30510508F0DEC0DC01FA01EA5AFF4FA3
+:1008800012968C910C94ED24882321F085EE0E9421
+:10089000D111D0C085EE0E949912CCC0882349F0B6
+:1008A0000E94D31C909335018093340188EF91E02E
+:1008B000089580913401909135010E94DF1C8739A1
+:1008C00091050CF0A8C08AEE91E00895882349F0C4
+:1008D0000E94D31C909335018093340187EE91E000
+:1008E000089580913401909135010E94DF1C873971
+:1008F00091050CF093C089ED91E00895882349F0AB
+:100900000E94D31C909335018093340182ED91E0D5
+:10091000089580913401909135010E94DF1C873940
+:1009200091050CF07EC080EC91E00895882349F099
+:100930000E94D31C90933501809334018BEB91E09E
+:10094000089580913401909135010E94DF1C873910
+:1009500091050CF069C08DEA91E00895882349F073
+:100960000E94D31C909335018093340188EA91E072
+:10097000089580913401909135010E94DF1C8739E0
+:1009800091050CF054C08AE991E00895882309F498
+:1009900051C085E891E00895882309F44BC080E7B1
+:1009A00091E00895882309F445C08BE591E008950E
+:1009B000882309F43FC086E491E008958823D1F1AB
+:1009C0008DE391E008958823A9F188E291E00895EC
+:1009D000882381F183E191E00895882359F18EEF16
+:1009E00090E00895882331F18091B3019091B40192
+:1009F000A091B501B091B60120E2822780729927BB
+:100A0000AA27BB278093B3019093B401A093B501AB
+:100A1000B093B6010FC085EF91E0089584EE91E0A8
+:100A200008958BEC91E0089586EB91E0089583EAB8
+:100A300091E0089580E090E0089508956091B301F9
+:100A40007091B4018091B5019091B6010E94381C5B
+:100A500056985E9825982D9826982E9827982F9826
+:100A60008330C1F028F4813041F0823049F008959C
+:100A7000843049F0853051F00895259A2D9A0895D3
+:100A8000269A2E9A0895259A2D9A04C0259A2D9A71
+:100A9000269A2E9A279A2F9A08950C941E055698F6
+:100AA0005E9825982D9826982E9827982F988FEF46
+:100AB00090E0909389008093880090938B008093BE
+:100AC0008A0090938D0080938C00259A2D9A2FEFA9
+:100AD00080E792E0215080409040E1F700C00000A4
+:100AE000269A2E9A2FEF80E792E021508040904086
+:100AF000E1F700C00000279A2F9A2FEF80E792E0DD
+:100B0000215080409040E1F700C0000025982D98CA
+:100B10002FEF80E792E0215080409040E1F700C045
+:100B2000000026982E982FEF80E792E02150804019
+:100B30009040E1F700C0000027982F9856985E98E3
+:100B400025982D9826982E9827982F98089589EA09
+:100B50008093800089E08093810024982C983F98AE
+:100B60008AB18F748AB96E98479A8BB1806B8BB9B2
+:100B7000769A0E944F050C941D0580E28093000137
+:100B80008091360181110EC00E940C0681E0809395
+:100B900036012FEF83ED90E3215080409040E1F744
+:100BA00000C0000080E40E941206809300018111C1
+:100BB0002EC00E943C0680930001811128C00E9433
+:100BC0003C0680930001811122C08FE30E943C0605
+:100BD0008093000181111BC00E94340680E40E94B2
+:100BE000120680930001811112C08CE00E943C0625
+:100BF0008093000181110BC00E943C06809300018C
+:100C0000811105C08FE30E943C06809300010E9481
+:100C100034068091000108951092B9008AE0809313
+:100C2000B800089594EA9093BC009091BC0097FF9F
+:100C3000FCCF9091B900987F983021F0903111F05D
+:100C400081E008958093BB0084E88093BC0080918C
+:100C5000BC0087FFFCCF8091B900887F883111F0FC
+:100C6000803471F780E0089584E98093BC0080911E
+:100C7000BC0084FDFCCF08958093BB0084E8809382
+:100C8000BC008091BC0087FFFCCF9091B900987F99
+:100C900081E0983209F480E0089584E88093BC00F4
+:100CA0008091BC0087FFFCCF8091BB0008958091AC
+:100CB0000001811115C080E40E941206809300019A
+:100CC00081110CC082E10E943C06809300018111D9
+:100CD00005C08FEF0E943C06809300010E943406FD
+:100CE00084B1807F84B985B1807F85B98AB1837FE3
+:100CF0008AB98BB1837F8BB93E98469808950E943C
+:100D0000BD05809300010E94570680B38C7080BBA4
+:100D100081B3836F81BBA8E3B1E0E6E4F1E08EE04C
+:100D20008E0F11921D928E13FCCF0C94A705BF92CB
+:100D3000CF92DF92EF92FF920F931F93CF93DF93A7
+:100D400080910001882379F0809137018F5F809333
+:100D50003701811108C00E94BD05809300018111F7
+:100D600002C00E944F0508E311E0C0E0D0E0DD249E
+:100D7000D39482E0C82EEE24E394F12CC730D10541
+:100D800000F580910001811164C080E40E94120688
+:100D900080930001811112C082E10E943C06809381
+:100DA000000181110BC0C7010C2E01C0880F0A94ED
+:100DB000EAF780950E943C06809300010E94340669
+:100DC00048C0CA30A1F028F4C83059F0C93061F0E9
+:100DD00005C0CC3089F070F0CD3089F0209A289889
+:100DE00010C0219A29980DC0229A2A980AC0239AE5
+:100DF0002B9807C0529A01C0539A5B9802C03E9A42
+:100E0000469890EA9A95F1F79FB1799902C082E0ED
+:100E100001C080E091709D25982B7C9902C084E0F0
+:100E200001C080E0892B7D9902C038E001C030E02C
+:100E3000832B7E9902C020E101C020E0822B9FB16C
+:100E40009095991F9927991F9295990F907E892BBC
+:100E50000FC080910001811149C080E40E941206F8
+:100E600080930001882379F1B12C0E9434068B2DE8
+:100E7000F8019081981719F08083C09201010E94B7
+:100E8000570621960F5F1F4FCE30D10509F076CF60
+:100E900080910101882361F18150809301018823B1
+:100EA00039F08FE99FE00197F1F700C0000020C002
+:100EB000A6E4B1E0E8E3F1E0CF01825F91919D9378
+:100EC0008E13FCCF15C083E10E943C068093000185
+:100ED0008111CACF81E40E94120680930001811122
+:100EE000C3CF0E944D06B82EB094BFCF80E0C0CFD4
+:100EF0000E944D0581E0DF91CF911F910F91FF90EE
+:100F0000EF90DF90CF90BF900895E82FF0E0EA5B7C
+:100F1000FE4F8081089508958B3B910578F4883ABF
+:100F2000910540F5853A9105D0F48430910508F09B
+:100F3000B1C08130910509F4ADC06BC0803E910510
+:100F400008F467C0883E910508F4A4C09C01205FA6
+:100F500031092031310508F05CC090650895853A6B
+:100F6000910509F459C0863A910509F058C082E804
+:100F700090E40895883A910509F454C0893A91059E
+:100F800009F453C08A3A910509F452C08B3A91058D
+:100F900009F451C08C3A910509F450C08D3A91057D
+:100FA00009F44FC0803B910509F44EC08E3A91057B
+:100FB00009F44DC08F3A910509F44CC0813B91056D
+:100FC00009F44BC0823B910509F44AC0833B91056B
+:100FD00009F449C0843B910509F448C0853B91055B
+:100FE00009F447C0863B910509F446C0873B91054B
+:100FF00009F445C0883B910509F444C0893B91053B
+:1010000009F443C08A3B910509F442C080E094E4AE
+:10101000089580E090E0089581E890E4089583E8E1
+:1010200090E4089582EE94E4089589EE94E408959E
+:101030008AEE94E4089585EB94E4089586EB94E4B5
+:10104000089587EB94E408958CEC94E408958DEC76
+:1010500094E4089583E895E408958AE895E4089572
+:1010600082E995E4089584E995E4089581E296E49F
+:10107000089583E296E4089584E296E4089585E273
+:1010800096E4089586E296E4089587E296E408954A
+:101090008AE296E40895089596E0799FF00111247C
+:1010A00094E5899FE00DF11D1124E60FF11DEE0F6F
+:1010B000FF1FEF5FFD4F859194910895880F991F51
+:1010C000FC01E558FF4F859194910895880F991F71
+:1010D000FC01E550FE4F85919491089526E0729FA2
+:1010E000F001112444E5849FE00DF11D1124E60F69
+:1010F000F11DEE0FFF1FEF5FFD4F859194919C0155
+:101100003A9521154FE1340708F41AC13F512115D2
+:10111000304120F49F700E94660808959C0130536E
+:101120002115304118F49927906C0895811520E518
+:10113000920769F40E941F164FEF84E39CE0415030
+:1011400080409040E1F700C000000C942E1D8130DB
+:1011500020E5920731F48091CE0181608093CE0129
+:1011600008959C0130552115304108F051C0292FB8
+:1011700033272F70332721303105D9F4AC01437068
+:10118000552702C0220F331F4A95E2F73C68AC0195
+:1011900064E0440F551F6A95E1F744275370242BF0
+:1011A000352B73E0880F991F7A95E1F780769927A0
+:1011B0001DC02230310529F4982F8827816F906A4D
+:1011C000089523303105A9F4AC014370552721E07F
+:1011D00030E002C0220F331F4A95E2F73C6843E03B
+:1011E000880F991F4A95E1F7807E9770822B932B89
+:1011F000089524303105E1F4AC014370552721E016
+:1012000030E002C0220F331F4A95E2F73A68E7CF79
+:101210009C0130572115304118F49F709062089559
+:101220009C0130582115304118F49F70906A089540
+:10123000803E9105E0F4803C910558F5813391059D
+:1012400009F46FC048F48932910509F463C08A3209
+:10125000910509F46DC072C089339105E9F08238B7
+:101260009105D1F08533910509F44DC067C0833EE7
+:10127000910581F138F4803E9105B9F0823E9105E7
+:10128000D9F05CC0863E910561F1873E9105A1F1E0
+:1012900055C00E945E0808952091E10120FD02C022
+:1012A00021FF4CC080EE90E049C08091E10180FFB9
+:1012B000F9CF89E390E042C08091E10182FF0EC046
+:1012C0008091E10184FF03C080E090E037C083EEAD
+:1012D00090E034C08091E10182FFF2CF82EE90E095
+:1012E0002DC08091E10183FF0BC08091E10184FD5D
+:1012F000EBCF87EE90E022C08091E10183FFF5CF34
+:1013000086EE90E01BC08091E10185FF07C089E275
+:1013100090E014C08091E10185FFF9CF85E390E072
+:101320000DC08091E10186FF07C08AE290E006C00F
+:101330008091E10186FFF9CF81E390E00E948C0764
+:10134000089508950C94A109809164010895CF93A4
+:10135000DF9300D01F92CDB7DEB79C018091E701EB
+:10136000843019F593E099833B832A839093E900B5
+:101370008FEF9091E800815095FD06C095ED9A950C
+:10138000F1F700008111F5CF8091E80085FF0DC0D5
+:1013900040E050E063E070E0CE0101960E94110C45
+:1013A0008091E8008E778093E8000F900F900F9067
+:1013B000DF91CF910895CF93DF9300D01F92CDB7E7
+:1013C000DEB72091E701243021F522E029839B83B9
+:1013D0008A8383E08093E9008FEF9091E800815049
+:1013E00095FD06C095ED9A95F1F700008111F5CFB6
+:1013F0008091E80085FF0DC040E050E063E070E0C0
+:10140000CE0101960E94110C8091E8008E778093A6
+:10141000E8000F900F900F90DF91CF9108952091E9
+:10142000E7012430F1F422E02093E9002FEF30911E
+:10143000E800215035FD06C035ED3A95F1F7000082
+:101440002111F5CF2091E80025FF0BC040E050E0CE
+:1014500065E070E00E94110C8091E8008E77809327
+:10146000E8000895CF93DF93EC019091E701943069
+:1014700009F046C080910C018823D9F080910D01BC
+:101480008823B9F09093E9008FEF9091E8008150A4
+:1014900095FD06C095E19A95F1F700008111F5CF11
+:1014A0008091E80085FF2CC040E050E060E170E0F2
+:1014B00017C081E08093E9008FEF9091E8008150A0
+:1014C00095FD06C095ED9A95F1F700008111F5CFD5
+:1014D0008091E80085FF14C040E050E068E070E0D3
+:1014E000CE010E94110C8091E8008E778093E80075
+:1014F00080E1FE01A4E5B1E001900D928A95E1F74B
+:10150000DF91CF9108958091E601811109C00E9479
+:10151000A60D0E94030E8091E20084608093E20099
+:1015200008951092E601089508950C9465230E9491
+:10153000C41C0E946B230E94A9100C94A20942E0D3
+:1015400061EC81E00E94200D42E061EC82E00E94AB
+:10155000200D42E061EC83E00E94200D42E161EC4D
+:1015600084E00C94200D8091E901833009F455C08A
+:1015700030F4813071F0823009F48EC008958A30E1
+:1015800009F47AC08B3009F460C0893009F09CC03E
+:1015900020C08091E801813A09F096C08091E8006E
+:1015A000877F8093E8008091EC019091ED01892B79
+:1015B00021F460E184E591E003C060E080E090E028
+:1015C00070E00E945C0C8091E8008B778093E800CB
+:1015D00008958091E801813209F076C08091EC0194
+:1015E0009091ED01009719F0039709F06DC080917B
+:1015F000E800877F8093E8008091E80082FD05C0C5
+:101600008091E7018111F8CF5FC08091F100809354
+:1016100064018091E8008B7753C08091E801813AA2
+:1016200009F052C08091EC019091ED01892B09F0F5
+:101630004BC08091E800877F8093E8008091E800AC
+:1016400080FFFCCF80910C0136C08091E80181328F
+:10165000D9F58091EC019091ED01892BA9F580914C
+:10166000E800877F8093E8000E94550D8091EA0191
+:1016700080930C010C941F168091E801813221F5B2
+:101680008091E800877F8093E8000E94550D80914B
+:10169000EB018093650108958091E801813AA1F4FE
+:1016A0008091E800877F8093E8008091E80080FFC8
+:1016B000FCCF809165018093F1008091E8008E77E6
+:1016C0008093E8000C94550D089584B7877F84BFFC
+:1016D00088E10FB6F89480936000109260000FBE0E
+:1016E00090E080E80FB6F8948093610090936100D9
+:1016F0000FBE0E94F8100E94A60D0E94030E80915A
+:10170000E20084608093E20078940E9489100E9435
+:10171000FA1082E091E00E94A4100E94532380916D
+:10172000E701853069F40E94881C8091E5018823D7
+:10173000B1F30E94B01C882391F30E94FB0BEFCF02
+:101740000E940011ECCF292F332723303105C9F037
+:1017500064F42130310581F02230310509F043C0B5
+:101760008DE690E025E236E042C021323105F1F00D
+:101770002232310541F137C082E190E022E936E0C2
+:1017800036C099278130910541F08230910541F0B2
+:10179000892B49F5E1E2F6E005C0E9E0F6E002C098
+:1017A000E1EFF5E0849190E09F0121C06430D8F42E
+:1017B000E62FF0E0EE0FFF1FEE5DFE4F208131813E
+:1017C00089E090E014C0643070F470E0FB01EE0F2B
+:1017D000FF1FE65EFE4F20813181FB01EA5EFE4F76
+:1017E000808190E004C080E090E020E030E0FA01E9
+:1017F00031832083089580E189BD82E189BD09B4E8
+:1018000000FEFDCF8091D8008F7D8093D80080911D
+:10181000E00082608093E0008091E00081FDFCCFD9
+:101820000895CF92DF92EF92FF920F931F93CF9381
+:10183000DF93EC018B016A010E94740D811133C0AA
+:10184000C114D10439F0F60180819181081B190B74
+:10185000C80FD91FE12CF12C0115110519F1809148
+:10186000E80085FD16C08091E8008E778093E8003F
+:10187000C114D10449F0F60180819181E80EF91E6E
+:10188000F182E08285E00FC00E94740D882321F36D
+:101890000AC089918093F10001501109FFEFEF1AFE
+:1018A000FF0ADACF80E0DF91CF911F910F91FF9077
+:1018B000EF90DF90CF9008952091EE013091EF01ED
+:1018C0002617370748F06115710539F42091E800B3
+:1018D0002E772093E80001C0B90140E06115710541
+:1018E000A9F12091E701222309F443C0253009F42E
+:1018F00042C02091E80023FD40C02091E80022FD75
+:1019000032C02091E80020FFE9CF4091F300209100
+:10191000F20030E0342BFC01CF016115710559F064
+:101920002830310540F481918093F10061507109B4
+:101930002F5F3F4FF1CF41E02830310509F040E003
+:101940002091E8002E772093E800C8CF4111C9CF3D
+:101950000AC08091E701882361F0853061F08091B1
+:10196000E80083FD0AC08091E80082FFF2CF80E0AA
+:10197000089582E0089583E0089581E0089520911C
+:10198000EE013091EF012617370748F06115710518
+:1019900039F42091E8002E772093E80001C0B901C6
+:1019A000FC0120E06115710591F18091E701882328
+:1019B00009F440C0853009F43FC08091E80083FD00
+:1019C0003DC08091E80082FD2FC08091E80080FF3B
+:1019D000E9CF2091F3008091F20090E0922B611505
+:1019E000710559F08830910540F424912093F1005D
+:1019F0003196615071090196F2CF21E0089709F004
+:101A000020E08091E8008E778093E800CBCF211111
+:101A1000CCCF0AC08091E701882361F0853061F066
+:101A20008091E80083FD0AC08091E80082FFF2CF38
+:101A300080E0089582E0089583E0089581E00895AC
+:101A4000982F973058F59093E900981739F07091D6
+:101A5000EC002091ED005091F00003C0242F762F70
+:101A600050E021FF19C03091EB003E7F3093EB0036
+:101A70003091ED003D7F3093ED003091EB0031600F
+:101A80003093EB007093EC002093ED005093F00046
+:101A90002091EE0027FF07C09F5FD3CF8F70809308
+:101AA000E90081E0089580E008958091E80187FFD2
+:101AB00011C08091E80082FD05C08091E70181118D
+:101AC000F8CF11C08091E8008B770BC08091E701BF
+:101AD000882349F08091E80080FFF8CF8091E800EA
+:101AE0008E778093E80008952091E4003091E5001E
+:101AF00095E64091EC00842F817040FF22C08091D8
+:101B0000E80080FD1CC08091E701882391F08530BA
+:101B100091F08091EB0085FD10C04091E400509160
+:101B2000E5004217530729F39A01915011F784E019
+:101B3000089582E0089583E0089581E0089580E0AB
+:101B400008954091E80042FFDECF08950E94140EF0
+:101B50000E941C0EE0EEF0E0808181608083E8ED61
+:101B6000F0E080818F77808319BCA7EDB0E08C9185
+:101B70008E7F8C9380818F7E80831092E601089502
+:101B80000F931F93CF93DF930E94140E0E941C0E9D
+:101B9000C8EDD0E088818F778883888180688883CA
+:101BA00088818F7D888319BC1092E7011092E30130
+:101BB0001092E5011092E40100EE10E0F80180813E
+:101BC0008B7F808388818160888342E060E080E051
+:101BD0000E94200DE1EEF0E080818E7F8083E2EEB6
+:101BE000F0E0808181608083808188608083F8015B
+:101BF00080818E7F8083888180618883DF91CF910F
+:101C00001F910F910895E8EDF0E080818F7E808331
+:101C1000E7EDF0E080818160808384E082BF81E035
+:101C20008093E6010C94C00DE8EDF0E080818E7F9A
+:101C300080831092E20008951092DA001092E10081
+:101C400008951F920F920FB60F9211242F933F9376
+:101C50004F935F936F937F938F939F93AF93BF93B4
+:101C6000EF93FF938091E10082FF0BC08091E2002F
+:101C700082FF07C08091E1008B7F8093E1000E948A
+:101C800088108091DA0080FF1FC08091D80080FF0B
+:101C90001BC08091DA008E7F8093DA008091D9009A
+:101CA00080FF0DC080E189BD82E189BD09B400FEDD
+:101CB000FDCF81E08093E7010E94830A05C019BC33
+:101CC0001092E7010E94910A8091E10080FF19C003
+:101CD0008091E20080FF15C08091E2008E7F8093AA
+:101CE000E2008091E20080618093E2008091D80060
+:101CF00080628093D80019BC85E08093E7010E9440
+:101D0000950A8091E10084FF30C08091E20084FF59
+:101D10002CC080E189BD82E189BD09B400FEFDCF00
+:101D20008091D8008F7D8093D8008091E1008F7ED4
+:101D30008093E1008091E2008F7E8093E2008091A9
+:101D4000E20081608093E2008091E301882311F03A
+:101D500084E007C08091E30087FD02C081E001C0FC
+:101D600083E08093E7010E94970A8091E10083FF5E
+:101D700029C08091E20083FF25C08091E100877F28
+:101D80008093E10082E08093E7011092E30180916B
+:101D9000E1008E7F8093E1008091E2008E7F80934E
+:101DA000E2008091E20080618093E20042E060E026
+:101DB00080E00E94200D8091F00088608093F00008
+:101DC0000E94940AFF91EF91BF91AF919F918F91E3
+:101DD0007F916F915F914F913F912F910F900FBE27
+:101DE0000F901F9018951F920F920FB60F9211240B
+:101DF0002F933F934F935F936F937F938F939F9313
+:101E0000AF93BF93CF93DF93EF93FF93C091E9001C
+:101E1000CF708091EC00D82FD17080FDD0E8109267
+:101E2000E9008091F000877F8093F00078940E9411
+:101E3000370F1092E9008091F00088608093F000E5
+:101E4000CD2BCF70C093E900FF91EF91DF91CF913F
+:101E5000BF91AF919F918F917F916F915F914F91C2
+:101E60003F912F910F900FBE0F901F9018951F93C9
+:101E7000CF93DF93CDB7DEB7AA970FB6F894DEBF46
+:101E80000FBECDBFE8EEF1E088E08E0F9091F1003B
+:101E900091938E13FBCF0E94B30A8091E80083FFD9
+:101EA0001FC18091E8019091E901492F50E04A302B
+:101EB000510508F015C1FA01EB59FF4F0C94ED24C0
+:101EC000803881F0823809F00BC18091EC018F706D
+:101ED0008093E9008091EB0085FB882780F91092C0
+:101EE000E90006C08091E4019091E50191118260C2
+:101EF0009091E800977F9093E8008093F100109212
+:101F0000F100C8C0282F2D7F09F0EAC0882319F0FE
+:101F1000823061F0E5C08091EA01813009F0E0C0D3
+:101F2000933009F080E08093E5012BC08091EA01B5
+:101F3000811127C08091EC018F7009F4D1C080938A
+:101F4000E9002091EB0020FF1CC0933021F4809128
+:101F5000EB00806214C09091EB0090619093EB00D5
+:101F600021E030E0A90102C0440F551F8A95E2F735
+:101F70004093EA001092EA008091EB008860809321
+:101F8000EB001092E9008091E800877F86C0811104
+:101F9000A7C01091EA011F778091E3008078812B20
+:101FA0008093E3008091E800877F8093E8000E949F
+:101FB000550D8091E80080FFFCCF8091E3008068A0
+:101FC0008093E300111102C082E001C083E080939E
+:101FD000E70186C08058823008F082C08091EA0113
+:101FE0009091EB018C3D53E0950779F583E08A836E
+:101FF0008AE289834FB7F894DE01139620E03EE031
+:1020000051E2E32FF0E050935700E49120FF03C02A
+:10201000E295EF703F5FEF708E2F90E0EA3010F0A6
+:10202000C79601C0C0968D939D932F5F243149F7C9
+:102030004FBF8091E800877F8093E8006AE270E0FC
+:10204000CE0101960E945C0C14C0AE014F5F5F4F41
+:102050006091EC010E94A30BBC01892B09F440C0E4
+:102060009091E800977F9093E80089819A810E947F
+:10207000BF0C8091E8008B778093E80031C08038F6
+:1020800079F58091E800877F8093E8008091E301F3
+:102090008093F1008091E8008E778093E8000E94A1
+:1020A000550D1EC081111CC09091EA019230C0F400
+:1020B0008091E800877F8093E8009093E3010E947D
+:1020C000550D8091E301811106C08091E30087FDE9
+:1020D00002C081E001C084E08093E7010E949F0A72
+:1020E0008091E80083FF0AC08091E800877F809399
+:1020F000E8008091EB0080628093EB00AA960FB617
+:10210000F894DEBF0FBECDBFDF91CF911F91089530
+:102110000895CF938091E7018823A1F0C091E90051
+:10212000CF709091EC00892F817090FD80E8C82BD2
+:102130001092E9008091E80083FD0E94370FCF7074
+:10214000C093E900CF91089590936B0180936A0149
+:102150000895E0916A01F0916B01309721F00190B0
+:10216000F081E02D099480E00895E0916A01F091FA
+:102170006B01309721F00280F381E02D09940895DE
+:10218000E0916A01F0916B01309721F00480F581B4
+:10219000E02D09940895209168013091690182171A
+:1021A000930771F09093690180936801E0916A014F
+:1021B000F0916B01309721F00680F781E02D0994B2
+:1021C000089520916601309167018217930771F09D
+:1021D0009093670180936601E0916A01F0916B0131
+:1021E000309721F00084F185E02D09940895089539
+:1021F0000C94F7100E94CA1C0E947F060C94901D3C
+:10220000CF92DF92EF92FF920F931F93CF93DF93C2
+:10221000CDB7DEB72B970FB6F894DEBF0FBECDBF9C
+:102220000E9497068DE6C82E81E0D82E00E010E0CF
+:10223000E02E802F0E948507F60141916F01F42E58
+:10224000F826B1F40F5F1F4F0E30110589F78FEF9D
+:1022500089838A831B820E94D31C8160782F9D838F
+:102260008C8349815A816B818D810E94A31140C06A
+:102270009091CE0191FF04C08B870E948B078B85C4
+:1022800020E030E04F2D50E0922FBA01022E02C024
+:10229000759567950A94E2F760FF24C02E83EF825C
+:1022A00021E030E0690102C0CC0CDD1C9A95E2F718
+:1022B00090E08C219D21892B09F420E028870E9441
+:1022C000D31C8160782F9A8789874E815F816885CA
+:1022D0008A850E94A311F801E359FE4F8081C82628
+:1022E000C08206C02F5F3F4F2630310569F6AACF66
+:1022F0000E94772010916C010E94A9101817A1F07C
+:102300000E94A91080936C012B960FB6F894DEBF43
+:102310000FBECDBFDF91CF911F910F91FF90EF9036
+:10232000DF90CF900C94A2092B960FB6F894DEBFE5
+:102330000FBECDBFDF91CF911F910F91FF90EF9016
+:10234000DF90CF900895CF93DF93CDB7DEB72B9773
+:102350000FB6F894DEBF0FBECDBF4F835887698795
+:102360007A878B87DE01119686E0FD0111928A95AE
+:10237000E9F785E0FE01379601900D928A95E1F725
+:1023800049815A816B817C818D819E810E94B9181F
+:102390002B960FB6F894DEBF0FBECDBFDF91CF9165
+:1023A0000895CF93882309F4C2C0C82F823859F406
+:1023B0000E94A91081FDBBC089E30E94551B0E94A9
+:1023C000121C89E30CC0833879F40E94A91080FDA7
+:1023D000AEC083E50E94551B0E94121C83E50E943B
+:1023E000971BCF910C94121C843859F40E94A910A9
+:1023F00082FD9DC087E40E94551B0E94121C87E449
+:10240000EECF8CEF8C0F813A48F48C2F0E94B822CB
+:1024100081118DC08C2F0E94551BE3CF80E28C0F61
+:10242000883048F4C77081E001C0880FCA95EAF788
+:102430000E94DB1BD6CF8BE58C0F833078F4C53A36
+:1024400029F0C63A31F083E890E005C081E890E0D9
+:1024500002C082E890E0CF910C94CB1088E58C0FFD
+:10246000833108F064C0C83A39F1C93A41F1CA3A37
+:1024700049F1CB3A51F1CC3A59F1CD3A61F1C03B37
+:1024800069F1CE3A71F1CF3A79F1C13B81F1C23BAA
+:1024900089F1C33B91F1C43B99F1C53BA1F1C63B26
+:1024A000A9F1C73BB1F1C83BB9F1C93BC1F1CA3B86
+:1024B000C9F180E090E038C082EE90E035C089EE4E
+:1024C00090E032C08AEE90E02FC085EB90E02CC007
+:1024D00086EB90E029C087EB90E026C08CEC90E082
+:1024E00023C08DEC90E020C083E891E01DC08AE815
+:1024F00091E01AC082E991E017C084E991E014C02C
+:1025000081E292E011C083E292E00EC084E292E0A8
+:102510000BC085E292E008C086E292E005C087E247
+:1025200092E002C08AE292E0CF910C94E110CF9148
+:102530000895882309F44BC0823859F40E94A910E9
+:1025400081FF45C089E30E94551B0E94121C89E34C
+:102550000CC0833871F40E94A91080FF38C083E555
+:102560000E94551B0E94121C83E50E94971B0C942D
+:10257000121C843859F40E94A91082FF28C087E4F5
+:102580000E94551B0E94121C87E4EFCF9CEF980F0E
+:10259000913A58F390E2980F983050F4877091E098
+:1025A00001C0990F8A95EAF7892F0E94E11BDFCFBE
+:1025B0009BE5980F933020F480E090E00C94CB10D2
+:1025C000885A833120F480E090E00C94E110089563
+:1025D000882321F00E94DB1B0C94121C0895882391
+:1025E00021F00E94E11B0C94121C0895BF92CF921F
+:1025F000DF92EF92FF920F931F93CF93DF9300D060
+:1026000000D000D0CDB7DEB725E0FC01DE01119689
+:1026100001900D922A95E1F7FC0140813181028100
+:10262000258122952F7063817481672B09F4E5C29F
+:102630003F3F19F44F3F09F4E0C27C0149833A83DC
+:1026400089819A812E830E94141B182FB92E0E9413
+:10265000131B0E94DA19EB2DE295EF70F0E0E159BF
+:10266000FF4F2E810C94ED248B2D807F9B2D9F702E
+:10267000F92E882319F0F29480EFF822002349F014
+:10268000FF2009F467C28F2D0E94EB1B0E94121CD1
+:1026900061C2812F0E949912FF2009F4AEC28F2DD2
+:1026A0000E94F11B26960FB6F894DEBF0FBECDBF79
+:1026B000DF91CF911F910F91FF90EF90DF90CF901E
+:1026C000BF900C94121C3B2D307F8B2D8F703032BD
+:1026D00011F08295807F112319F0113021F12CC067
+:1026E0000023B9F0222309F4A0C1213009F09DC1D3
+:1026F00026960FB6F894DEBF0FBECDBFDF91CF9107
+:102700001F910F91FF90EF90DF90CF90BF900C94AE
+:10271000FB1B222319F0213009F46FC28E830E9423
+:10272000FE1B8E8196C1002321F0223008F065C285
+:102730007CC1211162C28DC1002321F0222309F442
+:1027400074C108C2222309F484C119C22B2D269515
+:102750002695237030E02115310521F02130310517
+:10276000D1F04BC2002321F0812F9B2D937002C02A
+:1027700080E090E026960FB6F894DEBF0FBECDBF86
+:10278000DF91CF911F910F91FF90EF90DF90CF904D
+:10279000BF900C94CB10002321F0812F9B2D9370C0
+:1027A00002C080E090E026960FB6F894DEBF0FBE20
+:1027B000CDBFDF91CF911F910F91FF90EF90DF90F0
+:1027C000CF90BF900C94E110812F002319F00E944C
+:1027D0007F1F02C00E94E71F26960FB6F894DEBF47
+:1027E0000FBECDBFDF91CF911F910F91FF90EF9062
+:1027F000DF90CF90BF900C946C208B2D837009F0EC
+:102800007BC00111FAC1812F829586958770880F50
+:10281000880F912F9F70C92ED12CE12CF12C082EFE
+:1028200004C0CC0CDD1CEE1CFF1C0A94D2F714FF74
+:1028300012C04FE050E060E070E004C0440F551F4C
+:10284000661F771F8A95D2F7CB01BA016095709504
+:102850008095909503C060E070E0CB012B2D26950C
+:1028600026952370422F50E042305105D9F0433075
+:10287000510569F16C297D298E299F294130510527
+:1028800051F126960FB6F894DEBF0FBECDBFDF9193
+:10289000CF911F910F91FF90EF90DF90CF90BF905D
+:1028A0000C94011A6C297D298E299F2926960FB632
+:1028B000F894DEBF0FBECDBFDF91CF911F910F9176
+:1028C000FF90EF90DF90CF90BF900C941D1A0E9464
+:1028D000011AC701B60126960FB6F894DEBF0FBEE7
+:1028E000CDBFDF91CF911F910F91FF90EF90DF90BF
+:1028F000CF90BF900C94E519002319F08B2D8170B7
+:1029000001C08695882309F478C1812F8295869528
+:102910008770880F880F912F9F70C92ED12CE12CC2
+:10292000F12C082E04C0CC0CDD1CEE1CFF1C0A94FC
+:10293000D2F714FF12C04FE050E060E070E004C036
+:10294000440F551F661F771F8A95D2F7CB01BA0136
+:10295000609570958095909503C060E070E0CB0124
+:102960002B2D269526952370422F50E0423051059D
+:10297000D9F04330510569F16C297D298E299F29B1
+:102980004130510551F126960FB6F894DEBF0FBEC7
+:10299000CDBFDF91CF911F910F91FF90EF90DF900E
+:1029A000CF90BF900C94DB1A6C297D298E299F292A
+:1029B00026960FB6F894DEBF0FBECDBFDF91CF9144
+:1029C0001F910F91FF90EF90DF90CF90BF900C94EC
+:1029D000F71A0E94DB1AC701B60126960FB6F894C3
+:1029E000DEBF0FBECDBFDF91CF911F910F91FF9042
+:1029F000EF90DF90CF90BF900C94BF1A103FD1F1B1
+:102A000018F4103E50F4A1C0123F09F463C008F45A
+:102A10004CC0133F09F473C098C01F708B2D8F7189
+:102A20000023A1F00E94581A812F26960FB6F89421
+:102A3000DEBF0FBECDBFDF91CF911F910F91FF90F1
+:102A4000EF90DF90CF90BF900C94E8120E94791A1B
+:102A5000812F26960FB6F894DEBF0FBECDBFDF9153
+:102A6000CF911F910F91FF90EF90DF90CF90BF908B
+:102A70000C94EF120023A9F02111BFC08B2D8F7190
+:102A800026960FB6F894DEBF0FBECDBFDF91CF9173
+:102A90001F910F91FF90EF90DF90CF90BF900C941B
+:102AA0009E1A223008F0A9C0E9CF0023A9F08B2D8F
+:102AB0008F7126960FB6F894DEBF0FBECDBFDF91A3
+:102AC000CF911F910F91FF90EF90DF90CF90BF902B
+:102AD0000C94581A002359F38B2D8F7126960FB63C
+:102AE000F894DEBF0FBECDBFDF91CF911F910F9144
+:102AF000FF90EF90DF90CF90BF900C94791A002355
+:102B000099F08B2D8F7126960FB6F894DEBF0FBE0D
+:102B1000CDBFDF91CF911F910F91FF90EF90DF908C
+:102B2000CF90BF900C94431A26960FB6F894DEBF50
+:102B30000FBECDBFDF91CF911F910F91FF90EF900E
+:102B4000DF90CF90BF900C94391A0023A9F0222374
+:102B500009F4ADCF812F26960FB6F894DEBF0FBED5
+:102B6000CDBFDF91CF911F910F91FF90EF90DF903C
+:102B7000CF90BF900C94D111222309F4ADCF812FB7
+:102B800026960FB6F894DEBF0FBECDBFDF91CF9172
+:102B90001F910F91FF90EF90DF90CF90BF900C941A
+:102BA00099124B2D4F70612FC7010E943604269653
+:102BB0000FB6F894DEBF0FBECDBFDF91CF911F914E
+:102BC0000F91FF90EF90DF90CF90BF900C945D1924
+:102BD0004B2D4F70612FC70126960FB6F894DEBFBC
+:102BE0000FBECDBFDF91CF911F910F91FF90EF905E
+:102BF000DF90CF90BF900C944B0826960FB6F894B8
+:102C0000DEBF0FBECDBFDF91CF911F910F91FF901F
+:102C1000EF90DF90CF90BF9008950E94F81B0E9424
+:102C2000CD1B0E94121C0E941D210E946C2080E07E
+:102C300090E00E94CB1080E090E00C94E1100E94A4
+:102C4000E81B0C940D160E94141B292F22952F703F
+:102C500030E02C3031054CF42A3031056CF4225030
+:102C600031092230310588F407C02C30310549F094
+:102C70002F30310531F009C0803E48F0803F29F403
+:102C800006C093FB882780F9089580E0089581E0CD
+:102C90000895CF93DF9300D000D01F92CDB7DEB759
+:102CA0000F900F900F900F900F90DF91CF9108959C
+:102CB000CF93DF9300D000D000D0CDB7DEB72696FB
+:102CC0000FB6F894DEBF0FBECDBFDF91CF91089550
+:102CD0001F93CF93DF93C0917B0116E080917C011D
+:102CE000C81799F0D0E01C9FF0011D9FF00D112432
+:102CF000E358FE4F408151816281738184819581C7
+:102D00000E9458162196C770E9CFDF91CF911F918D
+:102D100008954091AD015091AE016091AF01709165
+:102D2000B0018091B1019091B2010C94581680913C
+:102D3000B20182958F7009F054C08091AF01882351
+:102D400009F44FC080917B01A0917C016091AD019D
+:102D50007091AE014091B0015091B101B6E08A1777
+:102D600009F43FC090E041155105C1F17F3F11F4D6
+:102D70006F3FA1F1B89FF001B99FF00D1124E35806
+:102D8000FE4F218172132AC02081621327C0228145
+:102D9000211124C0238134812417350710F42150D8
+:102DA0003109241B350B283C3105C0F42091B201B8
+:102DB0002F7020612093B20126E0289FF001299F07
+:102DC000F00D1124EE57FE4F80818F70806180835B
+:102DD0008DEA91E00E94F6120C94681601968770B5
+:102DE000BECF0895CF92DF92EF92FF920F931F9381
+:102DF000CF93DF93CDB7DEB762970FB6F894DEBFFF
+:102E00000FBECDBF8C0185E0F801DE011D9601905B
+:102E10000D928A95E1F7D8014C9111965C9111972A
+:102E200012966C9112971396CD90DC901497309176
+:102E3000AD017091AE018091B0019091B101009708
+:102E400009F46BC17F3F19F43F3F09F466C1E0907C
+:102E5000AF01EE2009F4C0C02091B201C816D90616
+:102E600028F0F601E81BF90BCF0104C0809590957E
+:102E70008C0D9D1DFF24F394883C910578F0F12C76
+:102E8000207F09F0C6C07C2DD98AC88A89890E9412
+:102E900049168DEA91E00E94F612B1C0822F807F20
+:102EA00009F046C0751314C0341312C0611110C06C
+:102EB0002F7020612093B2010E9489168DEA91E063
+:102EC0000E94F6128091B201D80115968C932EC003
+:102ED000CD2819F15F3F11F44F3FF9F0F62E611143
+:102EE0001CC080917B0120917C0136E0821709F49F
+:102EF0005AC090E0389FF001399FF00D1124E3583B
+:102F0000FE4F7181571306C07081471303C0728151
+:102F1000711103C001968770E9CFF62E662309F47C
+:102F200018C18091B20181608093B201F12C11C16E
+:102F3000751308C0341306C0611104C08091B2013A
+:102F4000D801C3C04D875E878D859E856A8B0E94A0
+:102F500023166A898823E1F16623D1F12091B20119
+:102F6000822F82958F7090E0029774F08091AD016E
+:102F70009091AE0198878F831986DB86CA862C874D
+:102F8000CE0107960E94F61286E0F801ADEAB1E0A4
+:102F900001900D928A95E1F70E9497160E9489167A
+:102FA000FF24F394D6C04D875E878D859E850E9451
+:102FB000141B292F22952F7030E0223031050CF0A0
+:102FC000BCC09F7009F0B6C0805E883008F4C1C0F4
+:102FD000C8010E94F612E4CFC816D90608F453C0FF
+:102FE000F601E81BF90BCF01883C910508F450C0AD
+:102FF000F12C7C2DD98AC88A89890E944916EDEA6C
+:10300000F1E086E0DF011D928A95E9F70E948916BA
+:10301000A0C0751314C0341312C0611110C0809188
+:10302000B201F8018583C8010E94F61286E0EDEA3C
+:10303000F1E0DF011D928A95E9F7FE2C8AC04D87E9
+:103040005E878D859E856A8B0E9423166A898823F8
+:1030500009F4BECF662309F4BBCF2091B201822FC1
+:1030600082958F7090E002970CF48ECF8091AD0125
+:103070009091AE019A8389831B82DD82CC822E835C
+:10308000CE0101967FCF809590958C0D9D1DACCF84
+:10309000F62E662309F49CCF75132EC034132CC072
+:1030A0002091B20120FD1FC0822F82958F70D9F030
+:1030B000D80115962C9315978F3049F08F5F982F74
+:1030C0009295907F822F8F70892B15968C93C801D3
+:1030D0000E94F61286E0F801ADEAB1E001900D928F
+:1030E0008A95E1F793CF86E0F801ADEAB1E001906F
+:1030F0000D928A95E1F72DC04D875E878D859E855F
+:103100000E942316811140CF8091B201816080938B
+:10311000B201C8010E94F6121CC0662309F458CF00
+:103120004D875E878D859E850E942316882309F42E
+:103130004FCF2ACF811148CF0CC0243031050CF07D
+:1031400047CF9F7009F440CFF8019581907F09F037
+:103150003BCF8F2D62960FB6F894DEBF0FBECDBF6A
+:10316000DF91CF911F910F91FF90EF90DF90CF9063
+:1031700008951F93CF93DF93CDB7DEB72C970FB68B
+:10318000F894DEBF0FBECDBF4F83588769877A871B
+:103190008B879C87CE0107960E94F216882369F0E0
+:1031A0008F8198852A853B85232BF1F19F3F09F07C
+:1031B00063C08F3F09F060C037C086E0FE013796DC
+:1031C000DE01119601900D928A95E1F76F81788565
+:1031D000EA85FB85309741F17F3F11F46F3F21F184
+:1031E00020917C0130E0C9010196877099274091B8
+:1031F0007B0150E08417950709F447C069837A83FF
+:10320000FD83EC8396E0929FD001939FB00D112433
+:10321000A358BE4FFE01319601900D929A95E1F7A9
+:1032200080937C010E94681616E080917B0190914A
+:103230007C018917C1F1189FC001112483589E4F4A
+:103240000E94F216882379F1E0917B011E9FF00124
+:103250001124E358FE4F4081518162817381848142
+:1032600095810E94581680917B0190E001968770AD
+:10327000992780937B01D9CF4F81588569857A85BD
+:103280008B859C850E945816CFCF0E941F161092E6
+:103290007C0110927B01EDEAF1E086E0DF011D92F6
+:1032A0008A95E9F7C1CF2C960FB6F894DEBF0FBE12
+:1032B000CDBFDF91CF911F910895EF92FF920F93B1
+:1032C0001F93CF93DF938C01892B09F46CC0F12CF1
+:1032D000EE24E394E8012196F8018491843740F4C8
+:1032E000843008F051C0813081F0823019F15BC028
+:1032F000853709F444C0A8F19CE7980F903708F08F
+:1033000052C08F770E94991241C00E5F1F4FFE017D
+:10331000C49180E28C0F883048F4C7708E2D01C0B4
+:10332000880FCA95EAF70E94EB1B14C08C2F0E94ED
+:10333000D1112DC00E5F1F4FFE01C49180E28C0F92
+:10334000883058F4C7708E2D01C0880FCA95EAF7EF
+:103350000E94F11B0E94121C1AC08C2F0E9499120D
+:1033600016C00E5F1F4FFE01C491CC2381F08FE980
+:103370009FE00197F1F700C00000C150F6CF0E5F4B
+:103380001F4FFE01F49003C00E94D1118E018F2DBA
+:10339000882309F49FCFEFE9FFE03197F1F700C0F0
+:1033A00000008150F5CFDF91CF911F910F91FF90D9
+:1033B000EF90089508956093B7017093B8018093DA
+:1033C000B9019093BA010C940D160F931F930091BD
+:1033D000B7011091B8012091B9013091BA01DC0117
+:1033E000CB01802B912BA22BB32B8093B701909311
+:1033F000B801A093B901B093BA011F910F910C9439
+:103400000D160F931F930091B7011091B8012091F1
+:10341000B9013091BA01DC01CB0180239123A223B1
+:10342000B3238093B7019093B801A093B901B093EF
+:10343000BA011F910F910C940D160F931F930091D9
+:10344000B7011091B8012091B9013091BA01DC01A6
+:10345000CB0180279127A227B3278093B7019093B0
+:10346000B801A093B901B093BA011F910F910C94C8
+:103470000D161092B3011092B4011092B501109282
+:10348000B6010C940D1641E050E060E070E004C01D
+:10349000440F551F661F771F8A95D2F74093B301DB
+:1034A0005093B4016093B5017093B6010C940D165E
+:1034B00041E050E060E070E004C0440F551F661F1B
+:1034C000771F8A95D2F78091B3019091B401A091B2
+:1034D000B501B091B601482B592B6A2B7B2B409339
+:1034E000B3015093B4016093B5017093B6010C948D
+:1034F0000D1641E050E060E070E004C0440F551F3D
+:10350000661F771F8A95D2F7409550956095709504
+:103510008091B3019091B401A091B501B091B60131
+:10352000482359236A237B234093B3015093B4016A
+:103530006093B5017093B6010C940D1641E050E014
+:1035400060E070E004C0440F551F661F771F8A9526
+:10355000D2F78091B3019091B401A091B501B091DF
+:10356000B601482759276A277B274093B301509318
+:10357000B4016093B5017093B6010C940D160F93CE
+:103580001F930091B3011091B4012091B5013091C6
+:10359000B601DC01CB01802B912BA22BB32B8093A6
+:1035A000B3019093B401A093B501B093B6011F91FC
+:1035B0000F910C940D160F931F930091B30110916E
+:1035C000B4012091B5013091B601DC01CB0180231B
+:1035D0009123A223B3238093B3019093B401A093CA
+:1035E000B501B093B6011F910F910C940D160F9376
+:1035F0001F930091B3011091B4012091B501309156
+:10360000B601DC01CB0180279127A227B327809345
+:10361000B3019093B401A093B501B093B6011F918B
+:103620000F910C940D160895CF92DF92EF92FF92B6
+:103630000F931F93CF93DF938C01C090B701D0906D
+:10364000B801E090B901F090BA014091B3015091F6
+:10365000B4016091B5017091B601C42AD52AE62A59
+:10366000F72ACFE1D0E0D701C6010C2E04C0B695F1
+:10367000A795979587950A94D2F780FF07C0B80160
+:103680008C2F0E946E088130910531F4219758F7F4
+:10369000B80180E00E946E08DF91CF911F910F91D9
+:1036A000FF90EF90DF90CF90089590910C019923B7
+:1036B00021F090910D01911109C020910E013091DE
+:1036C0000F01F90132969FEF40E01FC0982F9695A9
+:1036D000969596959F3050F5E0910E01F0910F016F
+:1036E000E90FF11D877021E030E0A90102C0440F0D
+:1036F000551F8A95E2F7CA019181892B818308952C
+:103700009F3F39F04F5F4E3041F051915813F8CF41
+:103710000DC05111F7CF942FF5CF9F3F39F0F9012C
+:10372000E90FF11D97FDFA95828308950895909110
+:103730000C01992321F090910D01911109C0209164
+:103740000E0130910F01F9013296205F3F4F1FC0EB
+:10375000982F9695969596959F30F0F4E0910E01EE
+:10376000F0910F01E90FF11D877021E030E0A90110
+:1037700002C0440F551F8A95E2F7CA0180959181D6
+:103780008923818308953196E217F30729F0908108
+:103790009813F9CF1082F7CF089581E090E0E0917F
+:1037A0000E01F0910F01E80FF91F10820196803190
+:1037B0009105A9F708959091CD01892B8093CD01B2
+:1037C000089580959091CD0189238093CD0108952E
+:1037D0001092CD0108959091CC01892B8093CC015A
+:1037E000089580959091CC0189238093CC01089510
+:1037F0001092CC0108958093BB0108951092BB01F3
+:10380000089580910E0190910F01FC0131969C0169
+:10381000205F3F4F80E0919191118F5FE217F30796
+:10382000D1F70895E0910E01F0910F018091CD0143
+:103830008083E0910E01F0910F0190818091CC0185
+:10384000892B80838091BB01882361F0E0910E0178
+:10385000F0910F019081892B80830E94011C8111BE
+:103860001092BB0180910E0190910F010C94B51044
+:10387000CF92DF92EF92FF926C01EE24FF24C114ED
+:10388000D104E104F10421F0C701B60120E101C037
+:1038900020E0C72ED82EE92EFF24C114D104E10464
+:1038A000F10419F0285FC701B6016B017C0154E0F7
+:1038B000F694E794D794C7945A95D1F7C114D104DC
+:1038C000E104F10419F02C5FC701B6016B017C0122
+:1038D00042E0F694E794D794C7944A95D1F7C1147F
+:1038E000D104E104F10419F02E5FC701B601DC0137
+:1038F000CB01B695A79597958795892B8A2B8B2B0E
+:1039000009F02F5F822FFF90EF90DF90CF90089506
+:103910008091E701843009F11092CF0120E488E121
+:1039200090E00FB6F894A895809360000FBE2093A6
+:10393000600083B7817F846083BF83B7816083BF6A
+:103940007894889583B78E7F83BF88E10FB6F8940B
+:1039500080936000109260000FBE0895089508954E
+:10396000CF930E94AE1C0E9497060E94AF1CC0E03D
+:103970008C2F0E948507811104C0CF5FCE30C1F724
+:1039800001C081E0CF9108950E941F160E94A910E6
+:103990000C94A20982E084BD93E095BD9AEF97BD97
+:1039A00080936E0008952FB7F8948091D001909184
+:1039B000D101A091D201B091D3012FBF0895CF9230
+:1039C000DF92EF92FF920F931F932FB7F8944091DD
+:1039D000D0015091D1016091D2017091D3012FBFDC
+:1039E0006A017B01EE24FF248C0120E030E0C01648
+:1039F000D106E206F30610F4415051099A01281B42
+:103A0000390BC9011F910F91FF90EF90DF90CF907C
+:103A100008951F920F920FB60F9211248F939F93C8
+:103A2000AF93BF938091D0019091D101A091D20129
+:103A3000B091D3010196A11DB11D8093D001909347
+:103A4000D101A093D201B093D301BF91AF919F91C7
+:103A50008F910F900FBE0F901F9018950E94A60D8A
+:103A6000F8942FEF87EA91E6215080409040E1F7EB
+:103A700000C0000087E090EBDC018093F0019093A0
+:103A8000F101A093F201B093F3019CE088E10FB63D
+:103A9000F894A895809360000FBE90936000FFCFCC
+:103AA000EF92FF920F931F93CF93DF93D82FC0E035
+:103AB0008C2F0E94850700E010E0E82EF12CC70152
+:103AC000002E02C0959587950A94E2F780FD06C006
+:103AD0000F5F1F4F0630110591F709C0602F7C2F33
+:103AE00080E00E944C08D813F3CF81E004C0CF5F80
+:103AF000CE30F1F680E0DF91CF911F910F91FF90D2
+:103B0000EF900895CF93C82F8CE20E94501D882318
+:103B100021F08C2FCF910C94501D80E0CF9108950F
+:103B2000CF930E94D71E811102C00E94BD1EC5E620
+:103B3000C15049F00E9497068FE39CE90197F1F785
+:103B400000C00000F5CF89E20E94821D811113C1DF
+:103B50008AE20E94821D81110E94BD1E85E00E94A2
+:103B6000821D81110E942E1D0E94E21E8093CE01B3
+:103B700087E00E94821D8823A9F18BE10E94821DAB
+:103B8000882351F08091CE0181FB222720F991E01A
+:103B9000922790FB81F90EC08EE00E94821D88233F
+:103BA00061F08091CE0182FB222720F991E09227DB
+:103BB00090FB82F98093CE0115C080E10E94821DA6
+:103BC0009091CE01882341F093FB222720F981E0D8
+:103BD000822780FB93F904C0892F809580FB90F9A0
+:103BE0009093CE018091CE010E94E61E0E94F41EA9
+:103BF0008093E10180EE0E94821D882341F0809134
+:103C0000E101982F909590FB80F98093E10189E381
+:103C10000E94821D882359F08091E10181FB2227B7
+:103C200020F991E0922790FB81F98093E10182EEE7
+:103C30000E94821D882359F08091E10182FB222796
+:103C400020F991E0922790FB82F98093E10186EEC2
+:103C50000E94821D882359F08091E10183FB222775
+:103C600020F991E0922790FB83F98093E10183EEA4
+:103C70000E94821D882359F08091E10184FB222754
+:103C800020F991E0922790FB84F98093E10185E38C
+:103C90000E94821D882359F08091E10185FB222733
+:103CA00020F991E0922790FB85F98093E10181E36F
+:103CB0000E94821D882359F08091E10186FB222712
+:103CC00020F991E0922790FB86F98093E10181E150
+:103CD0000E94821D882359F08091E10187FB2227F1
+:103CE00020F991E0922790FB87F98093E101809180
+:103CF000E1010E94F81E8091E10187FB882780F98D
+:103D000080930D0187E20E94821DC82F8EE10E94E0
+:103D1000821D8111C2608FE10E94821D8111C460E9
+:103D200080E20E94821D8111C86081E20E94821D92
+:103D30008111C06182E20E94821D8111C06283E212
+:103D40000E94821D8111C06484E20E94821D88232A
+:103D500011F0C06802C0CC2329F08C2F0E94EF1E06
+:103D60006C2F03C00E94EB1E682F70E080E090E093
+:103D7000CF910C94DB19CF9108956DEE7EEF80E02A
+:103D800090E00E94232560E082E090E00E941525EB
+:103D900060E083E090E00E94152560E084E090E020
+:103DA0000E94152560E085E090E00C94152580E0E8
+:103DB00090E00E940F2521E08D3E9E4F09F020E00B
+:103DC000822F089582E090E00C940725682F82E00E
+:103DD00090E00C94152583E090E00C940725682F63
+:103DE00083E090E00C94152584E090E00C94072586
+:103DF000682F84E090E00C9415258091D60180FF17
+:103E00000BC06091130185E0689FB0011124759586
+:103E10006795759567952BC081FF09C06091130167
+:103E200085E0689FB00111247595679520C082FFD9
+:103E300007C06091130185E0689FB001112417C08D
+:103E40009091D7019923D1F060911201961788F7CC
+:103E50002091130185E0289F90011124929FA001D9
+:103E6000939F500D112470E0CA010E94D92460383C
+:103E7000710540F46115710539F002C065E070E02C
+:103E8000862F08958FE7089581E008958091D601E7
+:103E900080FF08C06091110170E075956795759578
+:103EA000679521C081FF06C06091110170E0759592
+:103EB000679519C082FF04C06091110170E010C0C5
+:103EC0009091D7019923C1F0609110019617A0F746
+:103ED00080911101899FC001112470E00E94D924B2
+:103EE0006038710528F46115710521F0862F089559
+:103EF0008FE7089581E0089561E070E0F4CF803F9E
+:103F000021F40E94FD1E819504C0813F29F40E9486
+:103F1000FD1E8093DA010895823F21F40E94FD1E68
+:103F2000819504C0833F29F40E94FD1E8093D9012E
+:103F30000895893F19F40E94461F05C08A3F31F455
+:103F40000E94461F81958093DB0108958B3F21F4E9
+:103F50000E94461F819504C08C3F29F40E94461F91
+:103F60008093DC010895843F21F48091D801816021
+:103F700017C0853F21F48091D801826011C0863F2F
+:103F800021F48091D80184600BC0873F21F4809197
+:103F9000D801886005C0883F31F48091D8018061E4
+:103FA0008093D80108958D3F21F48091D6018160DE
+:103FB0000BC08E3F21F48091D601826005C08F3FF7
+:103FC00029F48091D60184608093D6010895803FC2
+:103FD00039F48091DA0187FF6CC01092DA0169C070
+:103FE000813F29F48091DA011816BCF362C09091E8
+:103FF000D901823F29F497FF5CC01092D90159C0C2
+:10400000833F19F41916CCF354C0893F41F48091D1
+:10401000DB0118160CF04DC01092DB014AC08A3F3C
+:1040200029F48091DB0187FF44C0F6CF8B3F39F440
+:104030008091DC0187FF3DC01092DC013AC08C3FCB
+:1040400029F48091DC011816BCF333C0843F21F4BD
+:104050008091D8018E7F17C0853F21F48091D801CF
+:104060008D7F11C0863F21F48091D8018B7F0BC0DA
+:10407000873F21F48091D801877F05C0883F31F4C4
+:104080008091D8018F7E8093D80113C08D3F21F499
+:104090008091D6018E7F0BC08E3F21F48091D60196
+:1040A0008D7F05C08F3F29F48091D6018B7F80934F
+:1040B000D6018091D90181110EC08091DA01811160
+:1040C0000AC08091DB01811106C08091DC01811161
+:1040D00002C01092D701089588ED91E00E94C010AF
+:1040E0000E94D31C9093D5018093D40108951F930F
+:1040F000CF93DF938091D4019091D5010E94DF1C72
+:10410000AC019091D701992321F02091140130E066
+:1041100006C0209115018AE0289F900111244217C2
+:10412000530708F486C08091D901C091DA01D0917B
+:10413000DB011091DC01811107C0C11176C0D111E2
+:1041400074C0111172C075C09F3F19F09F5F9093AA
+:10415000D701181624F40E94FD1E8093D901809186
+:10416000D90187FF05C00E94FD1E81958093D9016A
+:104170001C1624F40E94FD1E8093DA018091DA015E
+:1041800087FF05C00E94FD1E81958093DA01609132
+:10419000D901662339F1C091DA01CC2319F17727CF
+:1041A00067FD7095872F972F0E94EA2323E333E35F
+:1041B00043E35FE30E944E240E94B7236093D9013A
+:1041C0006C2F772767FD7095872F972F0E94EA2322
+:1041D00023E333E343E35FE30E944E240E94B723CB
+:1041E0006093DA011D1624F40E94461F8093DB01C0
+:1041F0008091DB0187FF05C00E94461F8195809357
+:10420000DB01111624F40E94461F8093DC0180918B
+:10421000DC0187FF05C00E94461F81958093DC0169
+:10422000DF91CF911F910C946C209F3F09F08ECFAE
+:1042300096CFDF91CF911F910895E8EDF1E085E0F1
+:10424000DF011D928A95E9F71092D7011092D601ED
+:104250000895833081F128F4813059F08230D1F013
+:104260000895853009F449C0B8F1863009F456C084
+:10427000089580911501262F30E0280F311D2F3F22
+:10428000310524F4680F6093150108958FEF809332
+:104290001501089580911401262F30E0280F311D5B
+:1042A0002F3F310524F4680F6093140108958FEFB8
+:1042B00080931401089580911301262F30E0280F78
+:1042C000311D2F3F310524F4680F609313010895C9
+:1042D0008FEF80931301089580911201262F30E013
+:1042E000280F311D2F3F310524F4680F6093120110
+:1042F00008958FEF80931201089580911101262F68
+:1043000030E0280F311D2F3F310524F4680F6093F2
+:10431000110108958FEF809311010895809110018C
+:10432000262F30E0280F311D2F3F310524F4680F70
+:104330006093100108958FEF8093100108958330EA
+:1043400011F128F4813049F0823091F008958530E0
+:1043500081F120F18630C1F108958091150168172F
+:1043600020F4861B8093150108951092150108957D
+:1043700080911401681720F4861B8093140108951E
+:1043800010921401089580911301681720F4861B80
+:1043900080931301089510921301089580911201E2
+:1043A000681720F4861B8093120108951092120161
+:1043B000089580911101681720F4861B80931101E4
+:1043C000089510921101089580911001681720F44A
+:1043D000861B8093100108951092100108950F9389
+:1043E0001F938D3109F46BC008F03FC08E3009F483
+:1043F0007DC0C0F4873009F46EC068F4863009F0DF
+:10440000AFC08091CE01817F8E7F8093CE0181E00D
+:104410008093DE01A6C0883009F458C08B3009F4BF
+:104420009BC09EC0863109F497C078F4803109F4AE
+:1044300070C0813109F094C00E941F1690910D0147
+:1044400081E0892780930D0187C0893109F484C0F8
+:104450008B3109F085C08091CE0181FB222720F9A4
+:1044600091E0922790FB81F94AC0853309F45BC043
+:1044700048F4873209F457C008F45AC0893209F465
+:1044800052C06EC0833438F48A3308F067C0883372
+:1044900009F462C065C0833409F445C0883409F06A
+:1044A0005FC00E941F160FEF13ED20E30150104074
+:1044B0002040E1F700C000000E942E1D4DC00E9468
+:1044C00071230E94A9100E94A20946C00E94E21E08
+:1044D0000E94F41E41C09091CE01892F817090FFFF
+:1044E00012C0917F9E7F9093CE013BC08091CE0100
+:1044F00082FB222720F991E0922790FB82F980939A
+:10450000CE01992349F18091CE0181608093CE0143
+:1045100023C08091CE0183FB222720F991E09227CE
+:1045200090FB83F9ECCF61E070E080E090E010C098
+:104530008D5141E050E060E070E08A019B0104C0D1
+:10454000000F111F221F331F8A95D2F7C901B8012E
+:104550000E94DB190E941F1681E003C08953E9CF36
+:1045600080E01F910F91089580E0089580E0089504
+:10457000CF93C82F8091DE01813079F018F082301E
+:10458000E9F187C0E0910E01F0910F018081813146
+:1045900069F0823209F07FC009C0E0910E01F0910C
+:1045A0000F018081813111F0823261F48C2F0E94E1
+:1045B000B422811104C08C2F0E94EF211DC081E024
+:1045C00090E01AC08C2F0E94B622811114C0C43111
+:1045D00079F048F4CB3079F0C03109F060C082E066
+:1045E0008093DE0108C0C93219F0C83321F057C0EA
+:1045F0001092DE0154C081E0817053C0C93289F14C
+:1046000018F5C43171F1A8F4C73009F046C08AE04A
+:104610008093150194E19093140193E0909313011A
+:104620008093120188E08093110188E28093100149
+:1046300034C0CE51C63088F5EC2FF0E0E65DFE4F79
+:1046400080818093DD0129C0CE34E9F020F4CB34A1
+:1046500021F56AE013C0C13579F0C235F1F461E0AB
+:104660000DC08091DD01882319F01092DD0115C085
+:1046700081E08093DE0115C061E006C08091DD011C
+:104680000E9429210AC06AE08091DD010E949F21D9
+:1046900004C01092DE0180E004C081E002C080E02E
+:1046A000ABCFCF910895E1E8F0E08081886080830E
+:1046B0008081816080838FB7F89493E09093890024
+:1046C00090ED909388008FBF0895EFE6F0E0808131
+:1046D000826080830895EFE6F0E080818D7F8083A3
+:1046E0000895EFE6F0E0908182E0892780830895C5
+:1046F0001F920F920FB60F9211242F933F934F9357
+:104700005F936F937F938F939F93AF93BF93EF9339
+:10471000FF938091DF019091E00101969093E00179
+:104720008093DF01811103C082E00E94A209E09121
+:10473000E001E695E695F0E0E156F84FE4918091CE
+:10474000DF018E1303C080E00E94A209FF91EF9168
+:10475000BF91AF919F918F917F916F915F914F9199
+:104760003F912F910F900FBE0F901F90189504D07E
+:104770006894B1118DC0089570D088F09F5790F063
+:10478000B92F9927B751A0F0D1F0660F771F881F76
+:10479000991F1AF0BA95C9F712C0B13081F077D0DD
+:1047A000B1E0089574C0672F782F8827B85F39F07B
+:1047B000B93FCCF3869577956795B395D9F73EF4D5
+:1047C00090958095709561957F4F8F4F9F4F08957D
+:1047D000E89409C097FB3EF490958095709561959B
+:1047E0007F4F8F4F9F4F9923A9F0F92F96E9BB2751
+:1047F0009395F695879577956795B795F111F8CFCD
+:10480000FAF4BB0F11F460FF1BC06F5F7F4F8F4F37
+:104810009F4F16C0882311F096E911C0772321F02D
+:104820009EE8872F762F05C0662371F096E8862FC5
+:1048300070E060E02AF09A95660F771F881FDAF71C
+:10484000880F9695879597F9089557FD9058440FCE
+:10485000551F59F05F3F71F04795880F97FB991FDF
+:1048600061F09F3F79F0879508951216130614069C
+:10487000551FF2CF4695F1DF08C016161706180629
+:10488000991FF1CF86957105610508940895E89404
+:10489000BB2766277727CB0197F908950BD078C0FF
+:1048A00069D028F06ED018F0952309F05AC05FC087
+:1048B0001124EECFCADFA0F3959FD1F3950F50E0FE
+:1048C000551F629FF001729FBB27F00DB11D639FC2
+:1048D000AA27F00DB11DAA1F649F6627B00DA11D68
+:1048E000661F829F2227B00DA11D621F739FB00D0E
+:1048F000A11D621F839FA00D611D221F749F33277E
+:10490000A00D611D231F849F600D211D822F762F16
+:104910006A2F11249F5750408AF0E1F088234AF013
+:10492000EE0FFF1FBB1F661F771F881F915050405F
+:10493000A9F79E3F510570F014C0AACF5F3FECF37A
+:10494000983EDCF3869577956795B795F795E7954B
+:104950009F5FC1F7FE2B880F911D9695879597F95C
+:10496000089597F99F6780E870E060E008959FEFF1
+:1049700080EC089500240A941616170618060906F6
+:10498000089500240A9412161306140605060895C5
+:10499000092E0394000C11F4882352F0BB0F40F44D
+:1049A000BF2B11F460FF04C06F5F7F4F8F4F9F4F8D
+:1049B000089597FB072E16F4009407D077FD09D0D1
+:1049C0000E94F32407FC05D03EF4909581959F4FFB
+:1049D0000895709561957F4F0895EE0FFF1F059024
+:1049E000F491E02D0994AA1BBB1B51E107C0AA1F3B
+:1049F000BB1FA617B70710F0A61BB70B881F991F80
+:104A00005A95A9F780959095BC01CD010895F99923
+:104A1000FECF92BD81BDF89A992780B50895A8E18F
+:104A2000B0E042E050E00C942A25262FF999FECF01
+:104A30001FBA92BD81BD20BD0FB6F894FA9AF99ABB
+:104A40000FBE019608950E941525272F0C94162558
+:104A5000DC01CB01FC01F999FECF06C0F2BDE1BD3E
+:104A6000F89A319600B40D9241505040B8F708952D
+:044A7000F894FFCFE8
+:104A74002002A409320A0F0ADB09A7090101BC01BB
+:104A840028080A03140A3F4D363960071307DD0668
+:104A9400A4063706500669068206010203040506C9
+:044AA40007080900F6
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png b/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png
index 1d5226974..8e709ee26 100644
--- a/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png
+++ b/keyboard/ergodox_ez/keymaps/osx_de/osx_de_highres.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/keymap.c
new file mode 100644
index 000000000..7c9f67381
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/keymap.c
@@ -0,0 +1,134 @@
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+
+#define BASE 0
+#define SYMB 1
+#define PLVR 2
+#define ARRW 3
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = KEYMAP(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F14,
+ KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, TG(PLVR),
+ CTL_T(KC_ESC), KC_A, KC_S, KC_E, KC_T, KC_G,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC,
+ KC_F1, KC_F2, KC_F3, KC_LALT, KC_LGUI,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_FN1,
+ //
+ /*-*/ KC_F15, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
+ /*-*/ KC_BSLS, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS,
+ /*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT,
+ /*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ /*-*/ /*-*/ /*-*/ KC_RGUI, KC_RALT, KC_F4, KC_F5, KC_F6,
+ KC_MPLY, KC_MNXT,
+ KC_MPRV,
+ KC_FN3, KC_QUOT, KC_SPC
+ ),
+ [SYMB] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
+ KC_TRNS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ //
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
+ /*-*/ /*-*/ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS,
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [PLVR] = KEYMAP(
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
+ KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T,
+ KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_C, KC_V, KC_NO,
+ //
+ /*-*/ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ /*-*/ KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,
+ /*-*/ /*-*/ KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
+ /*-*/ KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ /*-*/ /*-*/ /*-*/ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_NO, KC_N, KC_M
+ ),
+ [ARRW] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ //
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS,
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [SYMB] = ACTION_LAYER_TAP_TOGGLE(SYMB), // FN1 - Momentary Symbols Layer
+ [PLVR] = ACTION_LAYER_TAP_TOGGLE(PLVR), // FN2 - Momentary Plover Layer
+ [ARRW] = ACTION_LAYER_TAP_TOGGLE(ARRW), // FN3 - Momentary Arrows Layer
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case SYMB:
+ ergodox_right_led_1_on();
+ break;
+ case PLVR:
+ ergodox_right_led_2_on();
+ break;
+ case ARRW:
+ ergodox_right_led_3_on();
+ break;
+ default:
+ break;
+ }
+};
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/readme.md
new file mode 100644
index 000000000..4188d2b50
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/readme.md
@@ -0,0 +1,50 @@
+# Roman's Layout
+
+There are four layers:
+
+- **BASE** is [Norman layout](https://normanlayout.info/).
+- **SYMB** for numbers and symbols.
+- **PLVR** is optimized for [Plover](http://www.openstenoproject.org).
+- **ARRW** for navigation (same fingers for arrows as HJKL on QWERTY).
+
+Looking for IJKL arrows? [Here we
+go](../romanzolotarev-norman-plover-osx/).
+
+[![keyboard-layout](romanzolotarev-norman-plover-osx-hjkl.png)](rttp://www.keyboard-layout-editor.com/#/gists/56ffedceb0668dda47c993e7271563e0)
+
+## Switching
+
+- Tap `SYMB` to toggle **SYMB**.
+- Tap `ARRW` to toggle **ARRW**.
+- Hold `SYMB` (or `ARRW`) to activate **SYMB** (or **ARRW**) while holding.
+- Tap `PLVR` to toggle **PLVR**.
+
+## LEDs
+
+- Red: SYMB is on.
+- Green: PLVR is on.
+- Blue: ARRW is on.
+
+## Functional Keys
+
+- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/).
+- Tap `F2` to copy screenshot to the clipboard.
+- Hold `SHIFT` and tap `F2` to save screenshot as a file.
+- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/).
+- Tap `F14`, `F15` to adjust display brightness.
+
+**IMPORTANT**: If you have another keyboard connected via Bluetooth, then
+`F14` and `F15` will not work. Turn off that Bluetooth keyboard. Re-plug
+you ErgoDox. Enjoy!
+
+## CTRL/ESC
+
+Both of those keys are frequently used in Vim.
+
+- Tap `CTRL/ESC` to send `ESC`.
+- Hold `CTRL/ESC` to use as `CTRL`.
+
+## Activate N-rollover
+
+- While in **BASE** hold left `SHIFT` and right `SHIRT` and then tap `N`.
+- Then you can activate **PLVR** and use ErgoDox EZ for steno.
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.hex
new file mode 100644
index 000000000..c341ba2b2
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.hex
@@ -0,0 +1,1139 @@
+:100000000C94BB020C94FF020C94FF020C94FF02B0
+:100010000C94FF020C94FF020C94FF020C94FF025C
+:100020000C94FF020C94FF020C94090C0C94DB0C52
+:100030000C94FF020C94FF020C94FF020C94FF023C
+:100040000C94FF020C94A9210C94FF020C94FF0263
+:100050000C94FF020C94341B0C94FF020C94FF02CE
+:100060000C94FF020C94FF020C94FF020C94FF020C
+:100070000C94FF020C94FF020C94FF020C94FF02FC
+:100080000C94FF020C94FF020C94FF020C94FF02EC
+:100090000C94FF020C94FF020C94FF020C94FF02DC
+:1000A0000C94FF020C94FF020C94FF02480D6A0DA1
+:1000B000580E6A0D580EAF0DD20D580E270E3A0E7F
+:1000C0002611261163116311A611E411FD13FD130E
+:1000D000FD11FD13FE12FE12D113FD13FD13E813E3
+:1000E0000000F0A1F0A2F0A335002B002971E1007F
+:1000F0003A0000001E00140004001D003B00C10077
+:100100001F001A0016001B003C0029712000070088
+:1001100008000600E2002A0021000900170019006B
+:10012000E300A90022000E000A0005000000AA005A
+:100130006900025400002F000000A8006A0031008E
+:10014000000030000000AE0023000D001C00130072
+:100150000000AB002400180011001000E700AC0004
+:10016000250015000C003600E6002C0026000F00CC
+:10017000120037003D003400270033000B00380028
+:100180003E00C3002E002D002800E5003F000000C7
+:1001900001000100010001000100000001001E003B
+:1001A0001E0201000100010001001F001F020100EA
+:1001B00001000100010020002002010001000100F7
+:1001C00001002100210201000100010001002200C4
+:1001D00022020100000001000100010000000100F6
+:1001E000000001000100010000000100000001000A
+:1001F000010023002302010000000100010024008F
+:100200002402010001000100010025002502010077
+:10021000010001000100260026020100010001008A
+:100220000100270027020100010001000100010078
+:1002300001000100010000000000000000000000BB
+:100240000100000000001E00140004000100000076
+:1002500000001F001A001600010019000000200015
+:10026000080007000000060000002100150009003A
+:10027000000001000000220017000A000000010039
+:10028000010001000000000000000100010000006A
+:100290000000000000000100000023001C000B0013
+:1002A000000001000000240018000D000000010003
+:1002B000000025000C000E000000100000002600C9
+:1002C00012000F000000110000002700130033008F
+:1002D00000000000000000002F00340000000000BB
+:1002E0000100010001000100010000000100010007
+:1002F000010001000100010001000100F200010005
+:100300000100010001000100F000010001000100F6
+:1003100001000100F100F4000100010001000100F2
+:10032000F300F500000001000100010000000100E1
+:1003300000000100010001000000010000000100B8
+:100340000100010050000100000001000100010057
+:1003500051000100010001000100010052000100F4
+:1003600001000100010001004F0001000100010037
+:100370000100010001000100010001000100010075
+:100380000100010001000000160345007200670033
+:100390006F0044006F007800200045005A00000004
+:1003A00016034500720067006F0044006F0078007C
+:1003B000200045005A0000000403090409026D00F2
+:1003C000040100A0FA090400000103010100092151
+:1003D00011010001223F000705810308000A0904FA
+:1003E00001000103010200092111010001224D0059
+:1003F0000705820308000A09040200010300000047
+:100400000921110100012236000705830308000AB3
+:100410000904030001030000000921110100012269
+:1004200039000705840310000112011001000000CB
+:1004300008EDFE071301000102000105010906A1F4
+:1004400001050719E029E7150025019508750181C7
+:100450000205081901290595057501910295017597
+:100460000391010507190029771500250195787575
+:10047000018102C005010980A10185021601002643
+:10048000B7001A01002AB700751095018100C00558
+:100490000C0901A1018503160100269C021A010026
+:1004A0002A9C02751095018100C005010902A10175
+:1004B0000901A10005091901290515002501950566
+:1004C000750181029501750381010501093009312A
+:1004D0001581257F95027508810609381581257FCC
+:1004E000950175088106050C0A38021581257F954E
+:1004F0000175088106C0C005010906A1010507199B
+:10050000E029E7150025019508750181029501751F
+:1005100008810105081901290595057501910295C4
+:1005200001750391010507190029FF150025FF95A5
+:100530000675088100C000000000000000000000F7
+:1005400000010204060A0F17202C3A4A5D71879DAC
+:10055000B3C7DAE9F5FCFFFCF5E9DAC7B39D8771AB
+:100560005D4A3A2C20170F0A060402010000000021
+:1005700000000000000011241FBECFEFDAE0DEBF54
+:10058000CDBF04B603FE24C08091EF019091F0012D
+:10059000A091F101B091F2018730904BA740B04B90
+:1005A000B9F41092EF011092F0011092F101109243
+:1005B000F20114BE84B7877F84BF88E10FB6F89438
+:1005C00080936000109260000FBEE0E0FFE30995A9
+:1005D00011E0A0E0B1E0E6EDF6E402C005900D9276
+:1005E000A433B107D9F711E0A4E3B1E001C01D9233
+:1005F000AF3EB107E1F70E944D090C9469230C94BA
+:10060000000061110BC0FC018281882321F085EE7E
+:100610000E94BA0F03C085EE0E94821080E090E035
+:10062000089508956091B1017091B2018091B30174
+:100630009091B4010E94601A56985E9825982D9862
+:1006400026982E9827982F98823039F0833041F0E1
+:10065000813041F4259A2D9A0895269A2E9A08956C
+:10066000279A2F9A08950C94120356985E9825980D
+:100670002D9826982E9827982F988FEF90E090939A
+:1006800089008093880090938B0080938A009093D8
+:100690008D0080938C00259A2D9A2FEF80E792E0B1
+:1006A000215080409040E1F700C00000269A2E9A29
+:1006B0002FEF80E792E0215080409040E1F700C0AA
+:1006C0000000279A2F9A2FEF80E792E02150804078
+:1006D0009040E1F700C0000025982D982FEF80E7AB
+:1006E00092E0215080409040E1F700C00000269841
+:1006F0002E982FEF80E792E0215080409040E1F764
+:1007000000C0000027982F9856985E9825982D983D
+:1007100026982E9827982F98089589EA809380002C
+:1007200089E08093810024982C983F988AB18F7437
+:100730008AB96E98479A8BB1806B8BB9769A0E9472
+:1007400035030C94110380E2809300018091340101
+:1007500081110EC00E94F20381E0809334012FEFDB
+:1007600083ED90E3215080409040E1F700C000000D
+:1007700080E40E94F8038093000181112EC00E9442
+:10078000220480930001811128C00E9422048093DA
+:100790000001811122C08FE30E9422048093000196
+:1007A00081111BC00E941A0480E40E94F803809308
+:1007B0000001811112C08CE00E942204809300018C
+:1007C00081110BC00E94220480930001811105C099
+:1007D0008FE30E942204809300010E941A048091FA
+:1007E000000108951092B9008AE08093B80008953E
+:1007F00094EA9093BC009091BC0097FFFCCF90913D
+:10080000B900987F983021F0903111F081E008957F
+:100810008093BB0084E88093BC008091BC0087FF7C
+:10082000FCCF8091B900887F883111F0803471F756
+:1008300080E0089584E98093BC008091BC0084FD31
+:10084000FCCF08958093BB0084E88093BC00809126
+:10085000BC0087FFFCCF9091B900987F81E098326F
+:1008600009F480E0089584E88093BC008091BC0086
+:1008700087FFFCCF8091BB0008958091000181111A
+:1008800015C080E40E94F8038093000181110CC020
+:1008900082E10E94220480930001811105C08FEF44
+:1008A0000E942204809300010E941A0484B1807F78
+:1008B00084B985B1807F85B98AB1837F8AB98BB1CC
+:1008C000837F8BB93E98469808950E94A303809336
+:1008D00000010E943D0480B38C7080BB81B3836FA4
+:1008E00081BBA6E3B1E0E4E4F1E08EE08E0F11926B
+:1008F0001D928E13FCCF0C948D03BF92CF92DF928A
+:10090000EF92FF920F931F93CF93DF93809100019B
+:10091000882379F0809135018F5F809335018111B3
+:1009200008C00E94A30380930001811102C00E94AD
+:10093000350306E311E0C0E0D0E0DD24D39482E08B
+:10094000C82EEE24E394F12CC730D10500F5809138
+:100950000001811164C080E40E94F80380930001CB
+:10096000811112C082E10E94220480930001811152
+:100970000BC0C7010C2E01C0880F0A94EAF78095BE
+:100980000E942204809300010E941A0448C0CA30C9
+:10099000A1F028F4C83059F0C93061F005C0CC305E
+:1009A00089F070F0CD3089F0209A289810C0219AF3
+:1009B00029980DC0229A2A980AC0239A2B9807C01A
+:1009C000529A01C0539A5B9802C03E9A469890EAA8
+:1009D0009A95F1F79FB1799902C082E001C080E059
+:1009E00091709D25982B7C9902C084E001C080E025
+:1009F000892B7D9902C038E001C030E0832B7E99BD
+:100A000002C020E101C020E0822B9FB19095991F88
+:100A10009927991F9295990F907E892B0FC08091ED
+:100A20000001811149C080E40E94F8038093000115
+:100A3000882379F1B12C0E941A048B2DF801908142
+:100A4000981719F08083C09201010E943D042196FD
+:100A50000F5F1F4FCE30D10509F076CF8091010195
+:100A6000882361F1815080930101882339F08FE957
+:100A70009FE00197F1F700C0000020C0A4E4B1E0BE
+:100A8000E6E3F1E0CF01825F91919D938E13FCCF5D
+:100A900015C083E10E942204809300018111CACF16
+:100AA00081E40E94F803809300018111C3CF0E946A
+:100AB0003304B82EB094BFCF80E0C0CF0E94330380
+:100AC00081E0DF91CF911F910F91FF90EF90DF9028
+:100AD000CF90BF900895E82FF0E0EC5BFE4F80814F
+:100AE000089508958B3B910578F4883A910540F577
+:100AF000853A9105D0F48430910508F0B1C0813079
+:100B0000910509F4ADC06BC0803E910508F467C043
+:100B1000883E910508F4A4C09C01205F3109203172
+:100B2000310508F05CC090650895853A910509F497
+:100B300059C0863A910509F058C082E890E40895BA
+:100B4000883A910509F454C0893A910509F453C0D3
+:100B50008A3A910509F452C08B3A910509F451C0C3
+:100B60008C3A910509F450C08D3A910509F44FC0B3
+:100B7000803B910509F44EC08E3A910509F44DC0B1
+:100B80008F3A910509F44CC0813B910509F44BC0A3
+:100B9000823B910509F44AC0833B910509F449C0A1
+:100BA000843B910509F448C0853B910509F447C091
+:100BB000863B910509F446C0873B910509F445C081
+:100BC000883B910509F444C0893B910509F443C071
+:100BD0008A3B910509F442C080E094E4089580E0E6
+:100BE00090E0089581E890E4089583E890E4089502
+:100BF00082EE94E4089589EE94E408958AEE94E4F4
+:100C0000089585EB94E4089586EB94E4089587EBCA
+:100C100094E408958CEC94E408958DEC94E40895A4
+:100C200083E895E408958AE895E4089582E995E4D7
+:100C3000089584E995E4089581E296E4089583E2B5
+:100C400096E4089584E296E4089585E296E4089592
+:100C500086E296E4089587E296E408958AE296E4AF
+:100C60000895089596E0799FF001112494E5899FF5
+:100C7000E00DF11D1124E60FF11DEE0FFF1FE851ED
+:100C8000FF4F859194910895880F991FFC01E05AB8
+:100C9000F040859194910895880F991FFC01E052CE
+:100CA000FF4F85919491089526E0729FF0011124E1
+:100CB00044E5849FE00DF11D1124E60FF11DEE0FB8
+:100CC000FF1FE851FF4F859194919C013A952115A2
+:100CD0004FE1340708F41CC13F512115304120F485
+:100CE0009F700E944C0608959C013053211530419D
+:100CF00018F49927906C0895811520E5920771F4F6
+:100D00000E9421144FEF84E39CE0415080409040CA
+:100D1000E1F700C000000E94591BFAC0813020E5B5
+:100D2000920731F48091CD0181608093CD01F0C0B4
+:100D30009C0130552115304108F051C0292F33272F
+:100D40002F70332721303105D9F4AC01437055277A
+:100D500002C0220F331F4A95E2F73C68AC0164E001
+:100D6000440F551F6A95E1F744275370242B352B08
+:100D700073E0880F991F7A95E1F7807699271DC057
+:100D80002230310529F4982F8827816F906A0895C1
+:100D900023303105A9F4AC014370552721E030E040
+:100DA00002C0220F331F4A95E2F73C6843E0880FE8
+:100DB000991F4A95E1F7807E9770822B932B0895B7
+:100DC00024303105E1F4AC014370552721E030E0D7
+:100DD00002C0220F331F4A95E2F73A68E7CF9C0121
+:100DE00030572115304118F49F70906208959C018E
+:100DF00030582115304118F49F70906A0895803E54
+:100E00009105E0F4803C910558F58133910509F492
+:100E10006FC048F48932910509F463C08A329105A4
+:100E200009F46DC072C089339105E9F082389105EB
+:100E3000D1F08533910509F44DC067C0833E91051B
+:100E400081F138F4803E9105B9F0823E9105D9F0E8
+:100E50005CC0863E910561F1873E9105A1F155C0C8
+:100E60000E94440608952091E00120FD02C021FF68
+:100E70004CC080EE90E049C08091E00180FFF9CF46
+:100E800089E390E042C08091E00182FF0EC0809132
+:100E9000E00184FF03C080E090E037C083EE90E083
+:100EA00034C08091E00182FFF2CF82EE90E02DC04D
+:100EB0008091E00183FF0BC08091E00184FDEBCFC6
+:100EC00087EE90E022C08091E00183FFF5CF86EEAF
+:100ED00090E01BC08091E00185FF07C089E290E0AF
+:100EE00014C08091E00185FFF9CF85E390E00DC04B
+:100EF0008091E00186FF07C08AE290E006C0809101
+:100F0000E00186FFF9CF81E390E00E947205089529
+:100F1000089508950C948907809162010895CF93F4
+:100F2000DF9300D01F92CDB7DEB79C018091E60120
+:100F3000843019F593E099833B832A839093E900E9
+:100F40008FEF9091E800815095FD06C095ED9A9540
+:100F5000F1F700008111F5CF8091E80085FF0DC009
+:100F600040E050E063E070E0CE0101960E94F90994
+:100F70008091E8008E778093E8000F900F900F909B
+:100F8000DF91CF910895CF93DF9300D01F92CDB71B
+:100F9000DEB72091E601243021F522E029839B83EE
+:100FA0008A8383E08093E9008FEF9091E80081507D
+:100FB00095FD06C095ED9A95F1F700008111F5CFEA
+:100FC0008091E80085FF0DC040E050E063E070E0F4
+:100FD000CE0101960E94F9098091E8008E778093F6
+:100FE000E8000F900F900F90DF91CF91089520911E
+:100FF000E6012430F1F422E02093E9002FEF309154
+:10100000E800215035FD06C035ED3A95F1F70000B6
+:101010002111F5CF2091E80025FF0BC040E050E002
+:1010200065E070E00E94F9098091E8008E77809376
+:10103000E8000895CF93DF93EC019091E60194309E
+:1010400009F046C080910C018823D9F080910D01F0
+:101050008823B9F09093E9008FEF9091E8008150D8
+:1010600095FD06C095E19A95F1F700008111F5CF45
+:101070008091E80085FF2CC040E050E060E170E026
+:1010800017C081E08093E9008FEF9091E8008150D4
+:1010900095FD06C095ED9A95F1F700008111F5CF09
+:1010A0008091E80085FF14C040E050E068E070E007
+:1010B000CE010E94F9098091E8008E778093E800C4
+:1010C00080E1FE01A2E5B1E001900D928A95E1F781
+:1010D000DF91CF9108958091E501811109C00E94AF
+:1010E0008E0B0E94EB0B8091E20084608093E20003
+:1010F00008951092E501089508950C9496210E9498
+:10110000EF1A0E949C210E94910E0C948A0742E0E3
+:1011100061EC81E00E94080B42E061EC82E00E94F9
+:10112000080B42E061EC83E00E94080B42E161ECB5
+:1011300084E00C94080B8091E801833009F455C0D9
+:1011400030F4813071F0823009F48EC008958A3015
+:1011500009F47AC08B3009F460C0893009F09CC072
+:1011600020C08091E701813A09F096C08091E800A3
+:10117000877F8093E8008091EB019091EC01892BAF
+:1011800021F460E182E591E003C060E080E090E05E
+:1011900070E00E94440A8091E8008B778093E80019
+:1011A00008958091E701813209F076C08091EB01CA
+:1011B0009091EC01009719F0039709F06DC08091B0
+:1011C000E800877F8093E8008091E80082FD05C0F9
+:1011D0008091E6018111F8CF5FC08091F10080938A
+:1011E00062018091E8008B7753C08091E701813ADA
+:1011F00009F052C08091EB019091EC01892B09F02C
+:101200004BC08091E800877F8093E8008091E800E0
+:1012100080FFFCCF80910C0136C08091E7018132C4
+:10122000D9F58091EB019091EC01892BA9F5809182
+:10123000E800877F8093E8000E943D0B8091E901E0
+:1012400080930C010C9421148091E701813221F5E7
+:101250008091E800877F8093E8000E943D0B809199
+:10126000EA018093630108958091E701813AA1F436
+:101270008091E800877F8093E8008091E80080FFFC
+:10128000FCCF809163018093F1008091E8008E771C
+:101290008093E8000C943D0B089584B7877F84BF4A
+:1012A00088E10FB6F89480936000109260000FBE42
+:1012B00090E080E80FB6F89480936100909361000D
+:1012C0000FBE0E94E00E0E948E0B0E94EB0B8091DD
+:1012D000E20084608093E20078940E94710E0E9484
+:1012E000E20E82E091E00E948C0E0E9484218091A7
+:1012F000E601853069F40E94B01A8091E4018823E8
+:10130000B1F30E94DB1A882391F30E94E309EFCF27
+:101310000E94E80EECCF292F332723303105C9F086
+:1013200064F42130310581F02230310509F043C0E9
+:101330008DE690E02CEB33E042C021323105F1F034
+:101340002232310541F137C082E190E029E234E0F8
+:1013500036C099278130910541F08230910541F0E6
+:10136000892B49F5E8EBF3E005C0E0EAF3E002C0C1
+:10137000E8E8F3E0849190E09F0121C06430D8F464
+:10138000E62FF0E0EE0FFF1FEE5DFE4F2081318172
+:1013900089E090E014C0643070F470E0FB01EE0F5F
+:1013A000FF1FE65EFE4F20813181FB01EA5EFE4FAA
+:1013B000808190E004C080E090E020E030E0FA011D
+:1013C00031832083089580E189BD82E189BD09B41C
+:1013D00000FEFDCF8091D8008F7D8093D800809152
+:1013E000E00082608093E0008091E00081FDFCCF0E
+:1013F0000895CF92DF92EF92FF920F931F93CF93B6
+:10140000DF93EC018B016A010E945C0B811133C0F8
+:10141000C114D10439F0F60180819181081B190BA8
+:10142000C80FD91FE12CF12C0115110519F180917C
+:10143000E80085FD16C08091E8008E778093E80073
+:10144000C114D10449F0F60180819181E80EF91EA2
+:10145000F182E08285E00FC00E945C0B882321F3BB
+:101460000AC089918093F10001501109FFEFEF1A32
+:10147000FF0ADACF80E0DF91CF911F910F91FF90AB
+:10148000EF90DF90CF9008952091ED013091EE0123
+:101490002617370748F06115710539F42091E800E7
+:1014A0002E772093E80001C0B90140E06115710575
+:1014B000A9F12091E601222309F443C0253009F463
+:1014C00042C02091E80023FD40C02091E80022FDA9
+:1014D00032C02091E80020FFE9CF4091F300209135
+:1014E000F20030E0342BFC01CF016115710559F099
+:1014F0002830310540F481918093F10061507109E9
+:101500002F5F3F4FF1CF41E02830310509F040E037
+:101510002091E8002E772093E800C8CF4111C9CF71
+:101520000AC08091E601882361F0853061F08091E6
+:10153000E80083FD0AC08091E80082FFF2CF80E0DE
+:10154000089582E0089583E0089581E00895209150
+:10155000ED013091EE012617370748F0611571054E
+:1015600039F42091E8002E772093E80001C0B901FA
+:10157000FC0120E06115710591F18091E60188235D
+:1015800009F440C0853009F43FC08091E80083FD34
+:101590003DC08091E80082FD2FC08091E80080FF6F
+:1015A000E9CF2091F3008091F20090E0922B611539
+:1015B000710559F08830910540F424912093F10091
+:1015C0003196615071090196F2CF21E0089709F038
+:1015D00020E08091E8008E778093E800CBCF211146
+:1015E000CCCF0AC08091E601882361F0853061F09C
+:1015F0008091E80083FD0AC08091E80082FFF2CF6D
+:1016000080E0089582E0089583E0089581E00895E0
+:10161000982F973058F59093E900981739F070910A
+:10162000EC002091ED005091F00003C0242F762FA4
+:1016300050E021FF19C03091EB003E7F3093EB006A
+:101640003091ED003D7F3093ED003091EB00316043
+:101650003093EB007093EC002093ED005093F0007A
+:101660002091EE0027FF07C09F5FD3CF8F7080933C
+:10167000E90081E0089580E008958091E70187FF07
+:1016800011C08091E80082FD05C08091E6018111C2
+:10169000F8CF11C08091E8008B770BC08091E601F4
+:1016A000882349F08091E80080FFF8CF8091E8001E
+:1016B0008E778093E80008952091E4003091E50052
+:1016C00095E64091EC00842F817040FF22C080910C
+:1016D000E80080FD1CC08091E601882391F08530F0
+:1016E00091F08091EB0085FD10C04091E400509195
+:1016F000E5004217530729F39A01915011F784E04E
+:10170000089582E0089583E0089581E0089580E0DF
+:1017100008954091E80042FFDECF08950E94FC0B3F
+:101720000E94040CE0EEF0E0808181608083E8EDAF
+:10173000F0E080818F77808319BCA7EDB0E08C91B9
+:101740008E7F8C9380818F7E80831092E501089537
+:101750000F931F93CF93DF930E94FC0B0E94040C06
+:10176000C8EDD0E088818F778883888180688883FE
+:1017700088818F7D888319BC1092E6011092E20166
+:101780001092E4011092E30100EE10E0F801808174
+:101790008B7F808388818160888342E060E080E085
+:1017A0000E94080BE1EEF0E080818E7F8083E2EE04
+:1017B000F0E0808181608083808188608083F8018F
+:1017C00080818E7F8083888180618883DF91CF9143
+:1017D0001F910F910895E8EDF0E080818F7E808366
+:1017E000E7EDF0E080818160808384E082BF81E06A
+:1017F0008093E5010C94A80BE8EDF0E080818E7FEA
+:1018000080831092E20008951092DA001092E100B5
+:1018100008951F920F920FB60F9211242F933F93AA
+:101820004F935F936F937F938F939F93AF93BF93E8
+:10183000EF93FF938091E10082FF0BC08091E20063
+:1018400082FF07C08091E1008B7F8093E1000E94BE
+:10185000700E8091DA0080FF1FC08091D80080FF59
+:101860001BC08091DA008E7F8093DA008091D900CE
+:1018700080FF0DC080E189BD82E189BD09B400FE11
+:10188000FDCF81E08093E6010E946B0805C019BC82
+:101890001092E6010E9479088091E10080FF19C052
+:1018A0008091E20080FF15C08091E2008E7F8093DE
+:1018B000E2008091E20080618093E2008091D80094
+:1018C00080628093D80019BC85E08093E6010E9475
+:1018D0007D088091E10084FF30C08091E20084FFA8
+:1018E0002CC080E189BD82E189BD09B400FEFDCF35
+:1018F0008091D8008F7D8093D8008091E1008F7E09
+:101900008093E1008091E2008F7E8093E2008091DD
+:10191000E20081608093E2008091E201882311F06F
+:1019200084E007C08091E30087FD02C081E001C030
+:1019300083E08093E6010E947F088091E10083FFAD
+:1019400029C08091E20083FF25C08091E100877F5C
+:101950008093E10082E08093E6011092E2018091A1
+:10196000E1008E7F8093E1008091E2008E7F809382
+:10197000E2008091E20080618093E20042E060E05A
+:1019800080E00E94080B8091F00088608093F00056
+:101990000E947C08FF91EF91BF91AF919F918F9131
+:1019A0007F916F915F914F913F912F910F900FBE5B
+:1019B0000F901F9018951F920F920FB60F9211243F
+:1019C0002F933F934F935F936F937F938F939F9347
+:1019D000AF93BF93CF93DF93EF93FF93C091E90051
+:1019E000CF708091EC00D82FD17080FDD0E810929C
+:1019F000E9008091F000877F8093F00078940E9446
+:101A00001F0D1092E9008091F00088608093F00033
+:101A1000CD2BCF70C093E900FF91EF91DF91CF9173
+:101A2000BF91AF919F918F917F916F915F914F91F6
+:101A30003F912F910F900FBE0F901F9018951F93FD
+:101A4000CF93DF93CDB7DEB7AA970FB6F894DEBF7A
+:101A50000FBECDBFE7EEF1E088E08E0F9091F10070
+:101A600091938E13FBCF0E949B088091E80083FF27
+:101A70001FC18091E7019091E801492F50E04A3061
+:101A8000510508F015C1FA01EA5AFF4F0C941E23C4
+:101A9000803881F0823809F00BC18091EB018F70A2
+:101AA0008093E9008091EB0085FB882780F91092F4
+:101AB000E90006C08091E3019091E40191118260F8
+:101AC0009091E800977F9093E8008093F100109246
+:101AD000F100C8C0282F2D7F09F0EAC0882319F033
+:101AE000823061F0E5C08091E901813009F0E0C009
+:101AF000933009F080E08093E4012BC08091E901EC
+:101B0000811127C08091EB018F7009F4D1C08093BF
+:101B1000E9002091EB0020FF1CC0933021F480915C
+:101B2000EB00806214C09091EB0090619093EB0009
+:101B300021E030E0A90102C0440F551F8A95E2F769
+:101B40004093EA001092EA008091EB008860809355
+:101B5000EB001092E9008091E800877F86C0811138
+:101B6000A7C01091E9011F778091E3008078812B55
+:101B70008093E3008091E800877F8093E8000E94D3
+:101B80003D0B8091E80080FFFCCF8091E3008068EE
+:101B90008093E300111102C082E001C083E08093D2
+:101BA000E60186C08058823008F082C08091E90149
+:101BB0009091EA018C3D53E0950779F583E08A83A3
+:101BC0008AE289834FB7F894DE01139620E03EE065
+:101BD00051E2E32FF0E050935700E49120FF03C05F
+:101BE000E295EF703F5FEF708E2F90E0EA3010F0DB
+:101BF000C79601C0C0968D939D932F5F243149F7FE
+:101C00004FBF8091E800877F8093E8006AE270E030
+:101C1000CE0101960E94440A14C0AE014F5F5F4F8F
+:101C20006091EB010E948B09BC01892B09F440C033
+:101C30009091E800977F9093E80089819A810E94B3
+:101C4000A70A8091E8008B778093E80031C0803844
+:101C500079F58091E800877F8093E8008091E20128
+:101C60008093F1008091E8008E778093E8000E94D5
+:101C70003D0B1EC081111CC09091E9019230C0F44F
+:101C80008091E800877F8093E8009093E2010E94B2
+:101C90003D0B8091E201811106C08091E30087FD38
+:101CA00002C081E001C084E08093E6010E948708C1
+:101CB0008091E80083FF0AC08091E800877F8093CD
+:101CC000E8008091EB0080628093EB00AA960FB64B
+:101CD000F894DEBF0FBECDBFDF91CF911F91089565
+:101CE0000895CF938091E6018823A1F0C091E90087
+:101CF000CF709091EC00892F817090FD80E8C82B07
+:101D00001092E9008091E80083FD0E941F0DCF70C2
+:101D1000C093E900CF910895909369018093680181
+:101D20000895E0916801F0916901309721F00190E8
+:101D3000F081E02D099480E00895E0916801F09130
+:101D40006901309721F00280F381E02D0994089514
+:101D5000E0916801F0916901309721F00480F581EC
+:101D6000E02D099408952091660130916701821752
+:101D7000930771F09093670180936601E091680189
+:101D8000F0916901309721F00680F781E02D0994E8
+:101D9000089520916401309165018217930771F0D5
+:101DA0009093650180936401E0916801F09169016D
+:101DB000309721F00084F185E02D0994089508956D
+:101DC0000C94DF0E0E94F51A0E9465040C94BB1B54
+:101DD000CF92DF92EF92FF920F931F93CF93DF93F7
+:101DE000CDB7DEB72B970FB6F894DEBF0FBECDBFD1
+:101DF0000E947D048BE6C82E81E0D82E00E010E022
+:101E0000E02E802F0E946B05F60141916F01F42EA8
+:101E1000F826B1F40F5F1F4F0E30110589F78FEFD1
+:101E200089838A831B820E94FE1A8160782F9D839A
+:101E30008C8349815A816B818D810E948B0F40C0B8
+:101E40009091CD0191FF04C08B870E9471058B8515
+:101E500020E030E04F2D50E0922FBA01022E02C058
+:101E6000759567950A94E2F760FF24C02E83EF8290
+:101E700021E030E0690102C0CC0CDD1C9A95E2F74C
+:101E800090E08C219D21892B09F420E028870E9475
+:101E9000FE1A8160782F9A8789874E815F816885D5
+:101EA0008A850E948B0FF801E559FE4F8081C82674
+:101EB000C08206C02F5F3F4F2630310569F6AACF9A
+:101EC0000E94A21E10916A010E94910E1817A1F0A3
+:101ED0000E94910E80936A012B960FB6F894DEBF94
+:101EE0000FBECDBFDF91CF911F910F91FF90EF906B
+:101EF000DF90CF900C948A072B960FB6F894DEBF34
+:101F00000FBECDBFDF91CF911F910F91FF90EF904A
+:101F1000DF90CF900895CF93DF93CDB7DEB72B97A7
+:101F20000FB6F894DEBF0FBECDBF4F8358876987C9
+:101F30007A878B87DE01119686E0FD0111928A95E2
+:101F4000E9F785E0FE01379601900D928A95E1F759
+:101F500049815A816B817C818D819E810E94BB1653
+:101F60002B960FB6F894DEBF0FBECDBFDF91CF9199
+:101F700008950895CF93882309F4C2C0C82F8238EA
+:101F800059F40E94910E81FDBBC089E30E9464193F
+:101F90000E94311A89E30CC0833879F40E94910EB3
+:101FA00080FDAEC083E50E9464190E94311A83E56A
+:101FB0000E94A619CF910C94311A843859F40E94CA
+:101FC000910E82FD9DC087E40E9464190E94311A1F
+:101FD00087E4EECF8CEF8C0F813A48F48C2F0E946F
+:101FE000E92081118DC08C2F0E946419E3CF80E21B
+:101FF0008C0F883048F4C77081E001C0880FCA9503
+:10200000EAF70E94EA19D6CF8BE58C0F833078F47B
+:10201000C53A29F0C63A31F083E890E005C081E87E
+:1020200090E002C082E890E0CF910C94B30E88E576
+:102030008C0F833108F064C0C83A39F1C93A41F1D4
+:10204000CA3A49F1CB3A51F1CC3A59F1CD3A61F162
+:10205000C03B69F1CE3A71F1CF3A79F1C13B81F1E0
+:10206000C23B89F1C33B91F1C43B99F1C53BA1F15E
+:10207000C63BA9F1C73BB1F1C83BB9F1C93BC1F1BE
+:10208000CA3BC9F180E090E038C082EE90E035C0F4
+:1020900089EE90E032C08AEE90E02FC085EB90E0B0
+:1020A0002CC086EB90E029C087EB90E026C08CEC3A
+:1020B00090E023C08DEC90E020C083E891E01DC04B
+:1020C0008AE891E01AC082E991E017C084E991E0C2
+:1020D00014C081E292E011C083E292E00EC084E27B
+:1020E00092E00BC085E292E008C086E292E005C073
+:1020F00087E292E002C08AE292E0CF910C94C90E8E
+:10210000CF910895882309F44BC0823859F40E9476
+:10211000910E81FF45C089E30E9464190E94311A23
+:1021200089E30CC0833871F40E94910E80FF38C09F
+:1021300083E50E9464190E94311A83E50E94A61962
+:102140000C94311A843859F40E94910E82FF28C0F1
+:1021500087E40E9464190E94311A87E4EFCF9CEF54
+:10216000980F913A58F390E2980F983050F4877096
+:1021700091E001C0990F8A95EAF7892F0E94F01922
+:10218000DFCF9BE5980F933020F480E090E00C9433
+:10219000B30E885A833120F480E090E00C94C90E8D
+:1021A0000895882321F00E94EA190C94311A0895A9
+:1021B000882321F00E94F0190C94311A0895BF92DF
+:1021C000CF92DF92EF92FF920F931F93CF93DF9303
+:1021D00000D000D000D0CDB7DEB725E0FC01DE0195
+:1021E000119601900D922A95E1F7FC01D0801181A2
+:1021F0000281258122952F7043815481452B09F45A
+:10220000FCC21F3F21F4FFEFDF1609F4F6C27C0188
+:102210002E830E94B90FD9821A8369817A81802F17
+:102220000E946019182FB92E0E9415190E94DC1700
+:102230002E81002319F00E94071A2E81EB2DE295C2
+:10224000EF70F0E0E05AFF4F0C941E238B2D807F3F
+:102250009B2D9F70F92E882319F0F29480EFF822BD
+:10226000002389F0FF2009F475C280E2810F8830D5
+:1022700020F48F2D0E94EA1903C08F2D0E94FA19B5
+:102280000E94311A67C2812F0E948210FF2009F438
+:10229000B4C2105E8F2D183018F40E94F01902C0DD
+:1022A0000E94001A26960FB6F894DEBF0FBECDBF6F
+:1022B000DF91CF911F910F91FF90EF90DF90CF9022
+:1022C000BF900C94311A3B2D307F8B2D8F703032A4
+:1022D00011F08295807F112319F0113021F12CC06B
+:1022E0000023B9F0222309F4A0C1213009F09DC1D7
+:1022F00026960FB6F894DEBF0FBECDBFDF91CF910B
+:102300001F910F91FF90EF90DF90CF90BF900C94B2
+:102310001A1A222319F0213009F46FC28E830E9409
+:102320001D1A8E8196C1002321F0223008F065C26B
+:102330007CC1211162C28DC1002321F0222309F446
+:1023400074C108C2222309F484C119C22B2D269519
+:102350002695237030E02115310521F0213031051B
+:10236000D1F04BC2002321F0812F9B2D937002C02E
+:1023700080E090E026960FB6F894DEBF0FBECDBF8A
+:10238000DF91CF911F910F91FF90EF90DF90CF9051
+:10239000BF900C94B30E002321F0812F9B2D9370DE
+:1023A00002C080E090E026960FB6F894DEBF0FBE24
+:1023B000CDBFDF91CF911F910F91FF90EF90DF90F4
+:1023C000CF90BF900C94C90E812F002319F00E946A
+:1023D000AA1D02C00E94121E26960FB6F894DEBFF8
+:1023E0000FBECDBFDF91CF911F910F91FF90EF9066
+:1023F000DF90CF90BF900C94971E8B2D837009F0C7
+:102400007BC00111FAC1812F829586958770880F54
+:10241000880F912F9F70C92ED12CE12CF12C082E02
+:1024200004C0CC0CDD1CEE1CFF1C0A94D2F714FF78
+:1024300012C04FE050E060E070E004C0440F551F50
+:10244000661F771F8A95D2F7CB01BA016095709508
+:102450008095909503C060E070E0CB012B2D269510
+:1024600026952370422F50E042305105D9F0433079
+:10247000510569F16C297D298E299F29413051052B
+:1024800051F126960FB6F894DEBF0FBECDBFDF9197
+:10249000CF911F910F91FF90EF90DF90CF90BF9061
+:1024A0000C9403186C297D298E299F2926960FB636
+:1024B000F894DEBF0FBECDBFDF91CF911F910F917A
+:1024C000FF90EF90DF90CF90BF900C941F180E9468
+:1024D0000318C701B60126960FB6F894DEBF0FBEEB
+:1024E000CDBFDF91CF911F910F91FF90EF90DF90C3
+:1024F000CF90BF900C94E717002319F08B2D8170BB
+:1025000001C08695882309F478C1812F829586952C
+:102510008770880F880F912F9F70C92ED12CE12CC6
+:10252000F12C082E04C0CC0CDD1CEE1CFF1C0A9400
+:10253000D2F714FF12C04FE050E060E070E004C03A
+:10254000440F551F661F771F8A95D2F7CB01BA013A
+:10255000609570958095909503C060E070E0CB0128
+:102560002B2D269526952370422F50E042305105A1
+:10257000D9F04330510569F16C297D298E299F29B5
+:102580004130510551F126960FB6F894DEBF0FBECB
+:10259000CDBFDF91CF911F910F91FF90EF90DF9012
+:1025A000CF90BF900C94DD186C297D298E299F292E
+:1025B00026960FB6F894DEBF0FBECDBFDF91CF9148
+:1025C0001F910F91FF90EF90DF90CF90BF900C94F0
+:1025D000F9180E94DD18C701B60126960FB6F894C7
+:1025E000DEBF0FBECDBFDF91CF911F910F91FF9046
+:1025F000EF90DF90CF90BF900C94C118103FD1F1B5
+:1026000018F4103E50F4A1C0123F09F463C008F45E
+:102610004CC0133F09F473C098C01F708B2D8F718D
+:102620000023A1F00E945A18812F26960FB6F89425
+:10263000DEBF0FBECDBFDF91CF911F910F91FF90F5
+:10264000EF90DF90CF90BF900C94D1100E947B1838
+:10265000812F26960FB6F894DEBF0FBECDBFDF9157
+:10266000CF911F910F91FF90EF90DF90CF90BF908F
+:102670000C94D8100023A9F02111BFC08B2D8F71AD
+:1026800026960FB6F894DEBF0FBECDBFDF91CF9177
+:102690001F910F91FF90EF90DF90CF90BF900C941F
+:1026A000A018223008F0A9C0E9CF0023A9F08B2D93
+:1026B0008F7126960FB6F894DEBF0FBECDBFDF91A7
+:1026C000CF911F910F91FF90EF90DF90CF90BF902F
+:1026D0000C945A18002359F38B2D8F7126960FB640
+:1026E000F894DEBF0FBECDBFDF91CF911F910F9148
+:1026F000FF90EF90DF90CF90BF900C947B18002359
+:1027000099F08B2D8F7126960FB6F894DEBF0FBE11
+:10271000CDBFDF91CF911F910F91FF90EF90DF9090
+:10272000CF90BF900C94451826960FB6F894DEBF54
+:102730000FBECDBFDF91CF911F910F91FF90EF9012
+:10274000DF90CF90BF900C943B180023A9F0222378
+:1027500009F4ADCF812F26960FB6F894DEBF0FBED9
+:10276000CDBFDF91CF911F910F91FF90EF90DF9040
+:10277000CF90BF900C94BA0F222309F4ADCF812FD4
+:1027800026960FB6F894DEBF0FBECDBFDF91CF9176
+:102790001F910F91FF90EF90DF90CF90BF900C941E
+:1027A00082104B2D4F70612FC7010E9401032696A6
+:1027B0000FB6F894DEBF0FBECDBFDF91CF911F9152
+:1027C0000F91FF90EF90DF90CF90BF900C945F1728
+:1027D0004B2D4F70612FC70126960FB6F894DEBFC0
+:1027E0000FBECDBFDF91CF911F910F91FF90EF9062
+:1027F000DF90CF90BF900C94310626960FB6F894D8
+:10280000DEBF0FBECDBFDF91CF911F910F91FF9023
+:10281000EF90DF90CF90BF9008950E94071A0E941A
+:10282000171A0E94DC190E94311A0E94481F0E9448
+:10283000971E80E090E00E94B30E80E090E00C9440
+:10284000C90E0E94F7190C940D140E945519292FD6
+:1028500022952F7030E02C3031054CF42A303105B0
+:102860006CF4225031092230310588F407C02C3035
+:10287000310549F02F30310531F009C0803E48F074
+:10288000803F29F406C093FB882780F9089580E0F3
+:10289000089581E00895CF93DF9300D000D01F9278
+:1028A000CDB7DEB70F900F900F900F900F90DF9184
+:1028B000CF910895CF93DF9300D000D000D0CDB753
+:1028C000DEB726960FB6F894DEBF0FBECDBFDF9100
+:1028D000CF9108951F93CF93DF93C091790116E0B4
+:1028E00080917A01C81799F0D0E01C9FF0011D9FDC
+:1028F000F00D1124E558FE4F4081518162817381B2
+:10290000848195810E945A142196C770E9CFDF9186
+:10291000CF911F9108954091AB015091AC0160910E
+:10292000AD017091AE018091AF019091B0010C9416
+:102930005A148091B00182958F7009F054C0809133
+:10294000AD01882309F44FC080917901A0917A01EB
+:102950006091AB017091AC014091AE015091AF011B
+:10296000B6E08A1709F43FC090E041155105C1F166
+:102970007F3F11F46F3FA1F1B89FF001B99FF00DB7
+:102980001124E558FE4F218172132AC02081621361
+:1029900027C02281211124C02381348124173507C7
+:1029A00010F421503109241B350B283C3105C0F4AB
+:1029B0002091B0012F7020612093B00126E0289F64
+:1029C000F001299FF00D1124E058FE4F80818F7097
+:1029D000806180838BEA91E00E94DF100C946A147E
+:1029E00001968770BECF0895CF92DF92EF92FF924B
+:1029F0000F931F93CF93DF93CDB7DEB762970FB6D8
+:102A0000F894DEBF0FBECDBF8C0185E0F801DE017A
+:102A10001D9601900D928A95E1F7D8014C9111967F
+:102A20005C91119712966C9112971396CD90DC9051
+:102A300014973091AB017091AC018091AE019091EF
+:102A4000AF01009709F46BC17F3F19F43F3F09F4D0
+:102A500066C1E090AD01EE2009F4C0C02091B00144
+:102A6000C816D90628F0F601E81BF90BCF0104C0FF
+:102A7000809590958C0D9D1DFF24F394883C9105C5
+:102A800078F0F12C207F09F0C6C07C2DD98AC88A45
+:102A900089890E944B148BEA91E00E94DF10B1C03B
+:102AA000822F807F09F046C0751314C0341312C002
+:102AB000611110C02F7020612093B0010E948B140F
+:102AC0008BEA91E00E94DF108091B001D801159649
+:102AD0008C932EC0CD2819F15F3F11F44F3FF9F0D0
+:102AE000F62E61111CC08091790120917A0136E0A7
+:102AF000821709F45AC090E0389FF001399FF00D19
+:102B00001124E558FE4F7181571306C07081471399
+:102B100003C07281711103C001968770E9CFF62E50
+:102B2000662309F418C18091B00181608093B001DF
+:102B3000F12C11C1751308C0341306C0611104C013
+:102B40008091B001D801C3C04D875E878D859E8579
+:102B50006A8B0E9425146A898823E1F16623D1F1EA
+:102B60002091B001822F82958F7090E0029774F0CF
+:102B70008091AB019091AC0198878F831986DB8699
+:102B8000CA862C87CE0107960E94DF1086E0F801E6
+:102B9000ABEAB1E001900D928A95E1F70E94991499
+:102BA0000E948B14FF24F394D6C04D875E878D85D9
+:102BB0009E850E945519292F22952F7030E02230D2
+:102BC00031050CF0BCC09F7009F0B6C0805E883043
+:102BD00008F4C1C0C8010E94DF10E4CFC816D906AE
+:102BE00008F453C0F601E81BF90BCF01883C9105AE
+:102BF00008F450C0F12C7C2DD98AC88A89890E949A
+:102C00004B14EBEAF1E086E0DF011D928A95E9F7CB
+:102C10000E948B14A0C0751314C0341312C061112C
+:102C200010C08091B001F8018583C8010E94DF10B7
+:102C300086E0EBEAF1E0DF011D928A95E9F7FE2CD0
+:102C40008AC04D875E878D859E856A8B0E9425147C
+:102C50006A89882309F4BECF662309F4BBCF20918B
+:102C6000B001822F82958F7090E002970CF48ECF86
+:102C70008091AB019091AC019A8389831B82DD82A4
+:102C8000CC822E83CE0101967FCF809590958C0DBE
+:102C90009D1DACCFF62E662309F49CCF75132EC074
+:102CA00034132CC02091B00120FD1FC0822F8295CB
+:102CB0008F70D9F0D80115962C9315978F3049F065
+:102CC0008F5F982F9295907F822F8F70892B15960A
+:102CD0008C93C8010E94DF1086E0F801ABEAB1E0F6
+:102CE00001900D928A95E1F793CF86E0F801ABEA67
+:102CF000B1E001900D928A95E1F72DC04D875E8776
+:102D00008D859E850E942514811140CF8091B00150
+:102D100081608093B001C8010E94DF101CC066234F
+:102D200009F458CF4D875E878D859E850E942514B6
+:102D3000882309F44FCF2ACF811148CF0CC024300B
+:102D400031050CF047CF9F7009F440CFF801958111
+:102D5000907F09F03BCF8F2D62960FB6F894DEBFBF
+:102D60000FBECDBFDF91CF911F910F91FF90EF90DC
+:102D7000DF90CF9008951F93CF93DF93CDB7DEB749
+:102D80002C970FB6F894DEBF0FBECDBF4F83588788
+:102D900069877A878B879C87CE0107960E94F414F7
+:102DA000882369F08F8198852A853B85232BF1F153
+:102DB0009F3F09F063C08F3F09F060C037C086E0D5
+:102DC000FE013796DE01119601900D928A95E1F78A
+:102DD0006F817885EA85FB85309741F17F3F11F45B
+:102DE0006F3F21F120917A0130E0C901019687708F
+:102DF00099274091790150E08417950709F447C05D
+:102E000069837A83FD83EC8396E0929FD001939F40
+:102E1000B00D1124A558BE4FFE01319601900D92C0
+:102E20009A95E1F780937A010E946A1416E08091E6
+:102E3000790190917A018917C1F1189FC00111247D
+:102E400085589E4F0E94F414882379F1E09179010E
+:102E50001E9FF0011124E558FE4F4081518162818F
+:102E60007381848195810E945A148091790190E048
+:102E700001968770992780937901D9CF4F81588522
+:102E800069857A858B859C850E945A14CFCF0E94D4
+:102E9000211410927A0110927901EBEAF1E086E0B8
+:102EA000DF011D928A95E9F7C1CF2C960FB6F894F1
+:102EB000DEBF0FBECDBFDF91CF911F910895EF927E
+:102EC000FF920F931F93CF93DF938C01892B09F40B
+:102ED0006CC0F12CEE24E394E8012196F801849172
+:102EE000843740F4843008F051C0813081F0823062
+:102EF00019F15BC0853709F444C0A8F19CE7980F2D
+:102F0000903708F052C08F770E94821041C00E5F48
+:102F10001F4FFE01C49180E28C0F883048F4C770C7
+:102F20008E2D01C0880FCA95EAF70E940A1A14C0B4
+:102F30008C2F0E94BA0F2DC00E5F1F4FFE01C4914F
+:102F400080E28C0F883058F4C7708E2D01C0880F36
+:102F5000CA95EAF70E94101A0E94311A1AC08C2FE3
+:102F60000E94821016C00E5F1F4FFE01C491CC2339
+:102F700081F08FE99FE00197F1F700C00000C15098
+:102F8000F6CF0E5F1F4FFE01F49003C00E94BA0FF0
+:102F90008E018F2D882309F49FCFEFE9FFE0319751
+:102FA000F1F700C000008150F5CFDF91CF911F9164
+:102FB0000F91FF90EF90089508956093B50170937D
+:102FC000B6018093B7019093B8010C940D140F9340
+:102FD0001F930091B5011091B6012091B701309176
+:102FE000B801DC01CB01802B912BA22BB32B80935A
+:102FF000B5019093B601A093B701B093B8011F91AA
+:103000000F910C940D140F931F930091B501109123
+:10301000B6012091B7013091B801DC01CB018023CA
+:103020009123A223B3238093B5019093B601A0937B
+:10303000B701B093B8011F910F910C940D140F9329
+:103040001F930091B5011091B6012091B701309105
+:10305000B801DC01CB0180279127A227B3278093F9
+:10306000B5019093B601A093B701B093B8011F9139
+:103070000F910C940D141092B1011092B2011092A4
+:10308000B3011092B4010C940D1441E050E060E0E3
+:1030900070E004C0440F551F661F771F8A95D2F752
+:1030A0004093B1015093B2016093B3017093B401A6
+:1030B0000C940D1441E050E060E070E004C0440F57
+:1030C000551F661F771F8A95D2F78091B1019091A5
+:1030D000B201A091B301B091B401482B592B6A2BD6
+:1030E0007B2B4093B1015093B2016093B301709375
+:1030F000B4010C940D1441E050E060E070E004C0B5
+:10310000440F551F661F771F8A95D2F7409550953B
+:10311000609570958091B1019091B201A091B30139
+:10312000B091B401482359236A237B234093B10112
+:103130005093B2016093B3017093B4010C940D14D9
+:1031400041E050E060E070E004C0440F551F661F8E
+:10315000771F8A95D2F78091B1019091B201A09129
+:10316000B301B091B401482759276A277B274093C0
+:10317000B1015093B2016093B3017093B4010C9408
+:103180000D140F931F930091B1011091B201209182
+:10319000B3013091B401DC01CB01802B912BA22B28
+:1031A000B32B8093B1019093B201A093B301B0937C
+:1031B000B4011F910F910C940D140F931F93009164
+:1031C000B1011091B2012091B3013091B401DC0141
+:1031D000CB0180239123A223B3238093B101909349
+:1031E000B201A093B301B093B4011F910F910C945D
+:1031F0000D140F931F930091B1011091B201209112
+:10320000B3013091B401DC01CB0180279127A227C3
+:10321000B3278093B1019093B201A093B301B0930F
+:10322000B4011F910F910C940D140895CF92DF9269
+:10323000EF92FF920F931F93CF93DF938C01C09077
+:10324000B501D090B601E090B701F090B80180913F
+:10325000B1019091B201A091B301B091B401C82A1B
+:10326000D92AEA2AFB2ACFE1D0E0D701C6010C2EE9
+:1032700004C0B695A795979587950A94D2F780FFD5
+:1032800006C0B8018C2F0E945406019721F42197A3
+:1032900060F780E001C08C2FDF91CF911F910F91DB
+:1032A000FF90EF90DF90CF900895CF93DF93EC01E4
+:1032B0000E941619BE010E945406DF91CF91089515
+:1032C000CB010E945519089590910C01992321F08A
+:1032D00090910D01911109C020910E0130910F01C3
+:1032E000F90132969FEF40E01FC0982F9695969572
+:1032F00096959F3050F5E0910E01F0910F01E90F86
+:10330000F11D877021E030E0A90102C0440F551F74
+:103310008A95E2F7CA019181892B818308959F3FA5
+:1033200039F04F5F4E3041F051915813F8CF0DC036
+:103330005111F7CF942FF5CF9F3F39F0F901E90FE5
+:10334000F11D97FDFA9582830895089590910C01DF
+:10335000992321F090910D01911109C020910E0146
+:1033600030910F01F9013296205F3F4F1FC0982F17
+:103370009695969596959F30F0F4E0910E01F09118
+:103380000F01E90FF11D877021E030E0A90102C0B3
+:10339000440F551F8A95E2F7CA01809591818923D0
+:1033A000818308953196E217F30729F090819813ED
+:1033B000F9CF1082F7CF089581E090E0E0910E01FF
+:1033C000F0910F01E80FF91F1082019680319105ED
+:1033D000A9F708959091CC01892B8093CC01089591
+:1033E00080959091CC0189238093CC01089510920F
+:1033F000CC0108959091CB01892B8093CB01089546
+:1034000080959091CB0189238093CB0108951092F0
+:10341000CB0108959091CA01892B8093CA01089528
+:1034200080959091CA0189238093CA0108951092D2
+:10343000CA0108958093B90108951092B9010895C1
+:1034400080910E0190910F01FC0131969C01205F4B
+:103450003F4F80E0919191118F5FE217F307D1F711
+:103460000895E0910E01F0910F018091CC018083CD
+:10347000E0910E01F0910F0190818091CB01892B99
+:103480008083E0910E01F0910F0190818091CA013B
+:10349000892B80838091B901882361F0E0910E012E
+:1034A000F0910F019081892B80830E94201A811155
+:1034B0001092B90180910E0190910F010C949D0E14
+:1034C000CF92DF92EF92FF926C01EE24FF24C114A1
+:1034D000D104E104F10421F0C701B60120E101C0EB
+:1034E00020E0C72ED82EE92EFF24C114D104E10418
+:1034F000F10419F0285FC701B6016B017C0154E0AB
+:10350000F694E794D794C7945A95D1F7C114D1048F
+:10351000E104F10419F02C5FC701B6016B017C01D5
+:1035200042E0F694E794D794C7944A95D1F7C11432
+:10353000D104E104F10419F02E5FC701B601DC01EA
+:10354000CB01B695A79597958795892B8A2B8B2BC1
+:1035500009F02F5F822FFF90EF90DF90CF900895BA
+:103560008091E601843021F11092CE0120E488E1BF
+:1035700090E00FB6F894A895809360000FBE20935A
+:10358000600080E00E948A0783B7817F846083BFE8
+:1035900083B7816083BF7894889583B78E7F83BF1C
+:1035A00088E10FB6F89480936000109260000FBE1F
+:1035B000089508950895CF930E94D91A0E947D041A
+:1035C0000E94DA1AC0E08C2F0E946B05811104C0A2
+:1035D000CF5FCE30C1F701C081E0CF9108950E9446
+:1035E00021140E94910E0C948A0782E084BD93E01E
+:1035F00095BD9AEF97BD80936E0008952FB7F8940C
+:103600008091CF019091D001A091D101B091D201D0
+:103610002FBF0895CF92DF92EF92FF920F931F93E7
+:103620002FB7F8944091CF015091D0016091D10112
+:103630007091D2012FBF6A017B01EE24FF248C011F
+:1036400020E030E0C016D106E206F30610F4415047
+:1036500051099A01281B390BC9011F910F91FF9045
+:10366000EF90DF90CF9008951F920F920FB60F92B8
+:1036700011248F939F93AF93BF938091CF0190912B
+:10368000D001A091D101B091D2010196A11DB11D2F
+:103690008093CF019093D001A093D101B093D20138
+:1036A000BF91AF919F918F910F900FBE0F901F9080
+:1036B00018950E948E0BF8942FEF87EA91E621501F
+:1036C00080409040E1F700C0000087E090EBDC0113
+:1036D0008093EF019093F001A093F101B093F20178
+:1036E0009CE088E10FB6F894A895809360000FBE27
+:1036F00090936000FFCFEF92FF920F931F93CF93B1
+:10370000DF93D82FC0E08C2F0E946B0500E010E003
+:10371000E82EF12CC701002E02C0959587950A94DA
+:10372000E2F780FD06C00F5F1F4F0630110591F7CD
+:1037300009C0602F7C2F80E00E943206D813F3CF9F
+:1037400081E004C0CF5FCE30F1F680E0DF91CF9111
+:103750001F910F91FF90EF900895CF93C82F8CE2A7
+:103760000E947B1B882321F08C2FCF910C947B1B14
+:1037700080E0CF910895CF930E94021D811102C075
+:103780000E94E81CC5E6C15049F00E947D048FE309
+:103790009CE90197F1F700C00000F5CF89E20E9493
+:1037A000AD1B811113C18AE20E94AD1B81110E94E1
+:1037B000E81C85E00E94AD1B81110E94591B0E94EC
+:1037C0000D1D8093CD0187E00E94AD1B8823A9F1D8
+:1037D0008BE10E94AD1B882351F08091CD0181FBCC
+:1037E000222720F991E0922790FB81F90EC08EE00C
+:1037F0000E94AD1B882361F08091CD0182FB2227BE
+:1038000020F991E0922790FB82F98093CD0115C0B9
+:1038100080E10E94AD1B9091CD01882341F093FB84
+:10382000222720F981E0822780FB93F904C0892FA9
+:10383000809580FB90F99093CD018091CD010E94FD
+:10384000111D0E941F1D8093E00180EE0E94AD1BA0
+:10385000882341F08091E001982F909590FB80F9AA
+:103860008093E00189E30E94AD1B882359F0809189
+:10387000E00181FB222720F991E0922790FB81F95A
+:103880008093E00182EE0E94AD1B882359F0809165
+:10389000E00182FB222720F991E0922790FB82F938
+:1038A0008093E00186EE0E94AD1B882359F0809141
+:1038B000E00183FB222720F991E0922790FB83F916
+:1038C0008093E00183EE0E94AD1B882359F0809124
+:1038D000E00184FB222720F991E0922790FB84F9F4
+:1038E0008093E00185E30E94AD1B882359F080910D
+:1038F000E00185FB222720F991E0922790FB85F9D2
+:103900008093E00181E30E94AD1B882359F08091F0
+:10391000E00186FB222720F991E0922790FB86F9AF
+:103920008093E00181E10E94AD1B882359F08091D2
+:10393000E00187FB222720F991E0922790FB87F98D
+:103940008093E0018091E0010E94231D8091E001BD
+:1039500087FB882780F980930D0187E20E94AD1BC9
+:10396000C82F8EE10E94AD1B8111C2608FE10E94C1
+:10397000AD1B8111C46080E20E94AD1B8111C86043
+:1039800081E20E94AD1B8111C06182E20E94AD1BE9
+:103990008111C06283E20E94AD1B8111C06484E288
+:1039A0000E94AD1B882311F0C06802C0CC2329F00F
+:1039B0008C2F0E941A1D6C2F03C00E94161D682FA9
+:1039C00070E080E090E0CF910C94DD17CF910895E6
+:1039D0006DEE7EEF80E090E00E94542360E082E094
+:1039E00090E00E94462360E083E090E00E9446233E
+:1039F00060E084E090E00E94462360E085E090E093
+:103A00000C94462380E090E00E94402321E08D3E0C
+:103A10009E4F09F020E0822F089582E090E00C9400
+:103A20003823682F82E090E00C94462383E090E0F6
+:103A30000C943823682F83E090E00C94462384E0B4
+:103A400090E00C943823682F84E090E00C94462397
+:103A50008091D50180FF0BC06091130185E0689FC4
+:103A6000B001112475956795759567952BC081FFF9
+:103A700009C06091130185E0689FB001112475951C
+:103A8000679520C082FF07C06091130185E0689FA1
+:103A9000B001112417C09091D6019923D1F0609103
+:103AA0001201961788F72091130185E0289F900155
+:103AB0001124929FA001939F500D112470E0CA0120
+:103AC0000E940A236038710540F46115710539F0D0
+:103AD00002C065E070E0862F08958FE7089581E0C9
+:103AE00008958091D50180FF08C06091110170E0B8
+:103AF000759567957595679521C081FF06C06091A2
+:103B0000110170E07595679519C082FF04C060913E
+:103B1000110170E010C09091D6019923C1F060911D
+:103B200010019617A0F780911101899FC0011124FF
+:103B300070E00E940A236038710528F46115710550
+:103B400021F0862F08958FE7089581E0089561E0C0
+:103B500070E0F4CF803F21F40E94281D819504C0BD
+:103B6000813F29F40E94281D8093D9010895823F46
+:103B700021F40E94281D819504C0833F29F40E94EE
+:103B8000281D8093D8010895893F19F40E94711D62
+:103B900005C08A3F31F40E94711D81958093DA013E
+:103BA00008958B3F21F40E94711D819504C08C3FC4
+:103BB00029F40E94711D8093DB010895843F21F454
+:103BC0008091D701816017C0853F21F48091D70192
+:103BD000826011C0863F21F48091D70184600BC0C0
+:103BE000873F21F48091D701886005C0883F31F478
+:103BF0008091D70180618093D70108958D3F21F492
+:103C00008091D50181600BC08E3F21F48091D50158
+:103C1000826005C08F3F29F48091D5018460809334
+:103C2000D5010895803F39F48091D90187FF6CC098
+:103C30001092D90169C0813F29F48091D9011816E9
+:103C4000BCF362C09091D801823F29F497FF5CC019
+:103C50001092D80159C0833F19F41916CCF354C0FF
+:103C6000893F41F48091DA0118160CF04DC0109292
+:103C7000DA014AC08A3F29F48091DA0187FF44C003
+:103C8000F6CF8B3F39F48091DB0187FF3DC0109266
+:103C9000DB013AC08C3F29F48091DB011816BCF39C
+:103CA00033C0843F21F48091D7018E7F17C0853FB8
+:103CB00021F48091D7018D7F11C0863F21F480913E
+:103CC000D7018B7F0BC0873F21F48091D701877F7D
+:103CD00005C0883F31F48091D7018F7E8093D70152
+:103CE00013C08D3F21F48091D5018E7F0BC08E3F94
+:103CF00021F48091D5018D7F05C08F3F29F48091FB
+:103D0000D5018B7F8093D5018091D80181110EC0A0
+:103D10008091D90181110AC08091DA01811106C018
+:103D20008091DB01811102C01092D601089587EDC8
+:103D300091E00E94A80E0E94FE1A9093D4018093F5
+:103D4000D30108951F93CF93DF938091D301909176
+:103D5000D4010E940A1BAC019091D601992321F055
+:103D60002091140130E006C0209115018AE0289FBF
+:103D7000900111244217530708F486C08091D8019E
+:103D8000C091D901D091DA011091DB01811107C0F6
+:103D9000C11176C0D11174C0111172C075C09F3F9E
+:103DA00019F09F5F9093D601181624F40E94281DE5
+:103DB0008093D8018091D80187FF05C00E94281DFB
+:103DC00081958093D8011C1624F40E94281D8093AD
+:103DD000D9018091D90187FF05C00E94281D8195D6
+:103DE0008093D9016091D801662339F1C091D9013E
+:103DF000CC2319F1772767FD7095872F972F0E94A5
+:103E00001B2223E333E343E35FE30E947F220E940C
+:103E1000E8216093D8016C2F772767FD7095872F75
+:103E2000972F0E941B2223E333E343E35FE30E94C7
+:103E30007F220E94E8216093D9011D1624F40E947C
+:103E4000711D8093DA018091DA0187FF05C00E941D
+:103E5000711D81958093DA01111624F40E94711D61
+:103E60008093DB018091DB0187FF05C00E94711DFB
+:103E700081958093DB01DF91CF911F910C94971E68
+:103E80009F3F09F08ECF96CFDF91CF911F9108957C
+:103E9000E7EDF1E085E0DF011D928A95E9F71092E8
+:103EA000D6011092D5010895833081F128F4813034
+:103EB00059F08230D1F00895853009F449C0B8F145
+:103EC000863009F456C0089580911501262F30E000
+:103ED000280F311D2F3F310524F4680F6093150121
+:103EE00008958FEF80931501089580911401262F76
+:103EF00030E0280F311D2F3F310524F4680F609307
+:103F0000140108958FEF8093140108958091130197
+:103F1000262F30E0280F311D2F3F310524F4680F84
+:103F20006093130108958FEF80931301089580919A
+:103F30001201262F30E0280F311D2F3F310524F4C8
+:103F4000680F6093120108958FEF80931201089516
+:103F500080911101262F30E0280F311D2F3F3105B0
+:103F600024F4680F6093110108958FEF809311017D
+:103F7000089580911001262F30E0280F311D2F3F2A
+:103F8000310524F4680F6093100108958FEF80933A
+:103F900010010895833011F128F4813049F0823006
+:103FA00091F00895853081F120F18630C1F10895B6
+:103FB00080911501681720F4861B809315010895E0
+:103FC00010921501089580911401681720F4861B42
+:103FD00080931401089510921401089580911301A3
+:103FE000681720F4861B8093130108951092130123
+:103FF000089580911201681720F4861B80931201A6
+:10400000089510921201089580911101681720F40B
+:10401000861B8093110108951092110108958091DB
+:104020001001681720F4861B8093100108951092E8
+:10403000100108950F931F938D3109F46AC008F0A1
+:104040003FC08E3009F484C0C0F4873009F46DC0DD
+:1040500068F4863009F0B5C08091CD01817F8E7FF4
+:104060008093CD0181E08093DD01ACC0883009F4FC
+:1040700057C08B3009F46AC0A4C0863109F466C009
+:1040800078F4803109F477C0813109F09AC00E9438
+:10409000211490910D0181E0892780930D0156C074
+:1040A000893109F453C08B3109F08BC08091CD0167
+:1040B00081FB222720F991E0922790FB81F951C0E2
+:1040C000853309F475C048F4873209F471C008F4E7
+:1040D0005EC0893209F46CC074C0833430F48A3312
+:1040E00008F053C0883391F16CC0833409F460C088
+:1040F000883409F066C00E9421140FEF13ED20E30D
+:10410000015010402040E1F700C000000E94591B00
+:104110001DC00E94A2210E94910E0E948A0716C013
+:104120000E940D1D0E941F1D11C09091CD01892F6D
+:104130008095817080FB90F929F09660986090934B
+:10414000CD0140C0997F977F9093CD0181E03AC027
+:104150008091CD0182FB222720F991E0922790FBEC
+:1041600082F98093CD01992389F38091CD018160FB
+:104170008093CD01EBCF8091CD0183FB222720F9E5
+:1041800091E0922790FB83F9ECCF895301C08D51C8
+:1041900041E050E060E070E08A019B0104C0000F44
+:1041A000111F221F331F8A95D2F7C901B80104C01D
+:1041B00061E070E080E090E00E94DD170E94211431
+:1041C000C5CF80E01F910F91089580E0089580E0B1
+:1041D0000895CF93C82F8091DD01813079F018F0D8
+:1041E0008230E9F187C0E0910E01F0910F018081EA
+:1041F000813169F0823209F07FC009C0E0910E017F
+:10420000F0910F018081813111F0823261F48C2FA5
+:104210000E94E520811104C08C2F0E941A201DC02D
+:1042200081E090E01AC08C2F0E94E720811114C019
+:10423000C43179F048F4CB3079F0C03109F060C076
+:1042400082E08093DD0108C0C93219F0C83321F043
+:1042500057C01092DD0154C081E0817053C0C93253
+:1042600089F118F5C43171F1A8F4C73009F046C0DE
+:104270008AE08093150194E19093140193E0909368
+:1042800013018093120188E08093110188E28093EA
+:10429000100134C0CE51C63088F5EC2FF0E0E65D59
+:1042A000FE4F80818093DC0129C0CE34E9F020F4F8
+:1042B000CB3421F56AE013C0C13579F0C235F1F491
+:1042C00061E00DC08091DC01882319F01092DC01BF
+:1042D00015C081E08093DD0115C061E006C08091CA
+:1042E000DC010E94541F0AC06AE08091DC010E9438
+:1042F000CA1F04C01092DD0180E004C081E002C04A
+:1043000080E0ABCFCF910895E1E8F0E08081886054
+:1043100080838081816080838FB7F89493E090934D
+:10432000890090ED909388008FBF0895EFE6F0E04C
+:104330008081826080830895EFE6F0E080818D7F48
+:1043400080830895EFE6F0E0908182E08927808302
+:1043500008951F920F920FB60F9211242F933F933F
+:104360004F935F936F937F938F939F93AF93BF937D
+:10437000EF93FF938091DE019091DF01019690937E
+:10438000DF018093DE01811103C082E00E948A0771
+:10439000E091DF01E695E695F0E0EA5CFA4FE49102
+:1043A0008091DE018E1303C080E00E948A07FF9196
+:1043B000EF91BF91AF919F918F917F916F915F919D
+:1043C0004F913F912F910F900FBE0F901F90189516
+:1043D00004D06894B1118DC0089570D088F09F57B3
+:1043E00090F0B92F9927B751A0F0D1F0660F771F41
+:1043F000881F991F1AF0BA95C9F712C0B13081F021
+:1044000077D0B1E0089574C0672F782F8827B85F00
+:1044100039F0B93FCCF3869577956795B395D9F781
+:104420003EF490958095709561957F4F8F4F9F4F8B
+:104430000895E89409C097FB3EF490958095709597
+:1044400061957F4F8F4F9F4F9923A9F0F92F96E9E0
+:10445000BB279395F695879577956795B795F11155
+:10446000F8CFFAF4BB0F11F460FF1BC06F5F7F4FF2
+:104470008F4F9F4F16C0882311F096E911C0772304
+:1044800021F09EE8872F762F05C0662371F096E80D
+:10449000862F70E060E02AF09A95660F771F881FDC
+:1044A000DAF7880F9695879597F9089557FD9058F4
+:1044B000440F551F59F05F3F71F04795880F97FBE8
+:1044C000991F61F09F3F79F08795089512161306A2
+:1044D0001406551FF2CF4695F1DF08C016161706D1
+:1044E0001806991FF1CF8695710561050894089506
+:1044F000E894BB2766277727CB0197F908950BD05F
+:1045000078C069D028F06ED018F0952309F05AC011
+:104510005FC01124EECFCADFA0F3959FD1F3950FB2
+:1045200050E0551F629FF001729FBB27F00DB11D37
+:10453000639FAA27F00DB11DAA1F649F6627B00DC7
+:10454000A11D661F829F2227B00DA11D621F739FB0
+:10455000B00DA11D621F839FA00D611D221F749FBE
+:104560003327A00D611D231F849F600D211D822F05
+:10457000762F6A2F11249F5750408AF0E1F088234C
+:104580004AF0EE0FFF1FBB1F661F771F881F915059
+:104590005040A9F79E3F510570F014C0AACF5F3F6D
+:1045A000ECF3983EDCF3869577956795B795F7958C
+:1045B000E7959F5FC1F7FE2B880F911D9695879514
+:1045C00097F9089597F99F6780E870E060E0089593
+:1045D0009FEF80EC089500240A941616170618061B
+:1045E0000906089500240A941216130614060506F7
+:1045F0000895092E0394000C11F4882352F0BB0F88
+:1046000040F4BF2B11F460FF04C06F5F7F4F8F4FEA
+:104610009F4F089597FB072E16F4009407D077FD5F
+:1046200009D00E94242307FC05D03EF49095819583
+:104630009F4F0895709561957F4F0895EE0FFF1F6E
+:104640000590F491E02D0994AA1BBB1B51E107C012
+:10465000AA1FBB1FA617B70710F0A61BB70B881F12
+:10466000991F5A95A9F780959095BC01CD010895A1
+:10467000F999FECF92BD81BDF89A992780B508952A
+:10468000A8E1B0E042E050E00C945B23262FF999BA
+:10469000FECF1FBA92BD81BD20BD0FB6F894FA9A25
+:1046A000F99A0FBE019608950E944623272F0C9475
+:1046B0004723DC01CB01FC01F999FECF06C0F2BD16
+:1046C000E1BDF89A319600B40D9241505040B8F7D0
+:0646D0000895F894FFCFED
+:1046D60020028C071A08F707C3078F070101BA01E2
+:1046E60028080A03140A3F4D3639F704AA0474044D
+:1046F6003B04CE03E7030004190401020304050684
+:044706000708090097
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.png b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.png
new file mode 100644
index 000000000..cdc535f79
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx-hjkl/romanzolotarev-norman-plover-osx-hjkl.png
Binary files differ
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx/readme.md
index 9eb4c24db..804c52a76 100644
--- a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx/readme.md
+++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-plover-osx/readme.md
@@ -5,7 +5,10 @@ There are four layers:
- **BASE** is [Norman layout](https://normanlayout.info/).
- **SYMB** for numbers and symbols.
- **PLVR** is optimized for [Plover](http://www.openstenoproject.org).
-- **ARRW** for navigation.
+- **ARRW** for navigation (same fingers for arrows as IJKL on QWERTY).
+
+Looking for HJKL arrows? [Here we
+go](../romanzolotarev-norman-plover-osx-hjkl/).
[![keyboard-layout](romanzolotarev-norman-plover-osx.png)](http://www.keyboard-layout-editor.com/#/gists/8ebcb701ecb763944417)
@@ -28,11 +31,11 @@ There are four layers:
- Tap `F2` to copy screenshot to the clipboard.
- Hold `SHIFT` and tap `F2` to save screenshot as a file.
- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/).
-- Tap `F14`, `F15` to adjust display brightness.
-
-**IMPORTANT**: If you have another keyboard connected via Bluetooth, then `F14` and `F15` will not work.
-Turn off that Bluetooth keyboard. Re-plug you ErgoDox. Enjoy!
+- Tap `F14`, `F15` to adjust display brightness.
+**IMPORTANT**: If you have another keyboard connected via Bluetooth, then
+`F14` and `F15` will not work. Turn off that Bluetooth keyboard. Re-plug
+you ErgoDox. Enjoy!
## CTRL/ESC
diff --git a/keyboard/ergodox_ez/readme.md b/keyboard/ergodox_ez/readme.md
index c1d0bd5dc..4afb42c8f 100644
--- a/keyboard/ergodox_ez/readme.md
+++ b/keyboard/ergodox_ez/readme.md
@@ -15,7 +15,7 @@ This requires a little bit of familiarity with coding.
1. Go to https://github.com/jackhumbert/qmk_firmware and read the Readme at the base of this repository, top to bottom. Then come back here :)
2. Clone the repository (download it)
-3. Set up a build environment as per [pjrc.com/teensy/gcc.html](https://www.pjrc.com/teensy/gcc.html)
+3. Set up a build environment as per [the build guide](/BUILD_GUIDE.md)
- Using a Mac and have homebrew? just run `brew tap osx-cross/avr && brew install avr-libc`
4. Copy `keymaps/default/keymap.c` into `keymaps/your_name/keymap.c` (for example, `keymaps/german/keymap.c`)
5. Edit this file, changing keycodes to your liking (see "Finding the keycodes you need" below). Try to edit the comments as well, so the "text graphics" represent your layout correctly. See below for more tips on sharing your work.
diff --git a/keyboard/gh60/Makefile b/keyboard/gh60/Makefile
index daba0f644..4c8f9dc8a 100644
--- a/keyboard/gh60/Makefile
+++ b/keyboard/gh60/Makefile
@@ -53,9 +53,9 @@ SRC = keymap_common.c \
led.c
ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
- SRC := keymap_poker.c $(SRC)
+ SRC := keymaps/poker.c $(SRC)
endif
CONFIG_H = config.h
diff --git a/keyboard/gh60/Makefile.pjrc b/keyboard/gh60/Makefile.pjrc
index 11bd3b784..8ed73a248 100644
--- a/keyboard/gh60/Makefile.pjrc
+++ b/keyboard/gh60/Makefile.pjrc
@@ -53,9 +53,9 @@ SRC = keymap_common.c \
led.c
ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
- SRC := keymap_poker.c $(SRC)
+ SRC := keymaps/poker.c $(SRC)
endif
CONFIG_H = config.h
diff --git a/keyboard/gh60/README.md b/keyboard/gh60/README.md
index 510cb5c8b..41a757ea3 100644
--- a/keyboard/gh60/README.md
+++ b/keyboard/gh60/README.md
@@ -21,7 +21,7 @@ Use `make -f Makefile.pjrc` if you want to use PJRC stack but I find no reason t
## Keymap
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document(you can find in top README.md) and existent keymap files.
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document(you can find in top README.md) and existent keymap files.
To build firmware binary hex file with a certain keymap just do `make` with `KEYMAP` option like:
@@ -29,8 +29,8 @@ To build firmware binary hex file with a certain keymap just do `make` with `KEY
### 1 Poker
-[keymap_poker.c](keymap_poker.c) emulates original Poker layers
-while both [keymap_poker_bit.c](keymap_poker_bit.c) and [keymap_poker_set.c](keymap_poker_set.c) implements same layout in different way and they fix a minor issue of original Poker and enhance arrow keys.
+[poker.c](keymaps/poker.c) emulates original Poker layers
+while both [poker_bit.c](keymaps/poker_bit.c) and [poker_set.c](keymaps/poker_set.c) implement the same layout in different ways and they fix a minor issue of original Poker and enhance arrow keys.
Fn + Esc = `
Fn + {left, down, up, right} = {home, pgdown, pgup, end}
@@ -63,7 +63,7 @@ while both [keymap_poker_bit.c](keymap_poker_bit.c) and [keymap_poker_set.c](key
### 2. Plain
Without any Fn layer this will be useful if you want to use key remapping tool like AHK on host.
-See [keymap_plain.c](keymap_plain.c) for detail.
+See [plain.c](keymaps/plain.c) for detail.
#### 1.0 Plain Default layer
,-----------------------------------------------------------.
@@ -80,11 +80,11 @@ See [keymap_plain.c](keymap_plain.c) for detail.
### 3. Hasu
-This is my favorite keymap with HHKB Fn, Vi cursor and Mousekey layer. See [keymap_hasu.c](keymap_hasu.c) for detail.
+This is my favorite keymap with HHKB Fn, Vi cursor and Mousekey layer. See [hasu.c](keymaps/hasu.c) for detail.
### 4. SpaceFN
-This layout proposed by spiceBar uses space bar to change layer with using Dual role key technique. See [keymap_spacefn.c](keymap_spacefn.c) and [SpaceFN discussion](http://geekhack.org/index.php?topic=51069.0).
+This layout proposed by spiceBar uses space bar to change layer with using Dual role key technique. See [spacefn.c](keymaps/spacefn.c) and [SpaceFN discussion](http://geekhack.org/index.php?topic=51069.0).
#### 4.0 Default layer
,-----------------------------------------------------------.
@@ -113,7 +113,7 @@ This layout proposed by spiceBar uses space bar to change layer with using Dual
### 5. HHKB
-[keymap_hhkb.c](keymap_hhkb.c) emulates original HHKB layers.
+[hhkb.c](keymaps/hhkb.c) emulates original HHKB layers.
#### 5.0: Default layer
,-----------------------------------------------------------.
|Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `|
diff --git a/keyboard/gh60/keymap_hasu.c b/keyboard/gh60/keymaps/hasu.c
index e6af28585..e6af28585 100644
--- a/keyboard/gh60/keymap_hasu.c
+++ b/keyboard/gh60/keymaps/hasu.c
diff --git a/keyboard/gh60/keymap_hhkb.c b/keyboard/gh60/keymaps/hhkb.c
index ce1b816ec..ce1b816ec 100644
--- a/keyboard/gh60/keymap_hhkb.c
+++ b/keyboard/gh60/keymaps/hhkb.c
diff --git a/keyboard/gh60/keymap_plain.c b/keyboard/gh60/keymaps/plain.c
index 3138c1807..3138c1807 100644
--- a/keyboard/gh60/keymap_plain.c
+++ b/keyboard/gh60/keymaps/plain.c
diff --git a/keyboard/gh60/keymap_poker.c b/keyboard/gh60/keymaps/poker.c
index 7a612ee44..7a612ee44 100644
--- a/keyboard/gh60/keymap_poker.c
+++ b/keyboard/gh60/keymaps/poker.c
diff --git a/keyboard/gh60/keymap_poker_bit.c b/keyboard/gh60/keymaps/poker_bit.c
index b8870fdd8..b8870fdd8 100644
--- a/keyboard/gh60/keymap_poker_bit.c
+++ b/keyboard/gh60/keymaps/poker_bit.c
diff --git a/keyboard/gh60/keymap_poker_set.c b/keyboard/gh60/keymaps/poker_set.c
index aaa31fc57..aaa31fc57 100644
--- a/keyboard/gh60/keymap_poker_set.c
+++ b/keyboard/gh60/keymaps/poker_set.c
diff --git a/keyboard/gh60/keymap_spacefn.c b/keyboard/gh60/keymaps/spacefn.c
index 8077dcee7..8077dcee7 100644
--- a/keyboard/gh60/keymap_spacefn.c
+++ b/keyboard/gh60/keymaps/spacefn.c
diff --git a/keyboard/hhkb/Makefile b/keyboard/hhkb/Makefile
index 5a179bd24..d434246ce 100644
--- a/keyboard/hhkb/Makefile
+++ b/keyboard/hhkb/Makefile
@@ -129,17 +129,17 @@ NKRO_ENABLE = yes # USB Nkey Rollover
# Keymap file
#
ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
ifdef HHKB_JP
- SRC := keymap_jp.c $(SRC)
+ SRC := keymaps/jp.c $(SRC)
else
- SRC := keymap_hhkb.c $(SRC)
+ SRC := keymaps/hhkb.c $(SRC)
endif
endif
-ifneq (, $(or $(findstring keymap_jp.c, $(SRC)), $(findstring yes, $(HHKB_JP))))
+ifneq (, $(or $(findstring jp.c, $(SRC)), $(findstring yes, $(HHKB_JP))))
OPT_DEFS += -DHHKB_JP
endif
diff --git a/keyboard/hhkb/Makefile.pjrc b/keyboard/hhkb/Makefile.pjrc
index 7d0f8c3a9..403a8ec60 100644
--- a/keyboard/hhkb/Makefile.pjrc
+++ b/keyboard/hhkb/Makefile.pjrc
@@ -18,9 +18,9 @@ SRC = keymap_common.c \
led.c
ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
- SRC := keymap_hasu.c $(SRC)
+ SRC := keymaps/hasu.c $(SRC)
endif
CONFIG_H = config.h
diff --git a/keyboard/hhkb/Makefile.rn42 b/keyboard/hhkb/Makefile.rn42
index cbb2b744c..a730442af 100644
--- a/keyboard/hhkb/Makefile.rn42
+++ b/keyboard/hhkb/Makefile.rn42
@@ -122,17 +122,17 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
# Keymap file
#
ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/$(KEYMAP).c $(SRC)
else
ifdef HHKB_JP
- SRC := keymap_jp.c $(SRC)
+ SRC := keymaps/jp.c $(SRC)
else
- SRC := keymap_hhkb.c $(SRC)
+ SRC := keymaps/hhkb.c $(SRC)
endif
endif
-ifneq (, $(or $(findstring keymap_jp.c, $(SRC)), $(findstring yes, $(HHKB_JP))))
+ifneq (, $(or $(findstring jp.c, $(SRC)), $(findstring yes, $(HHKB_JP))))
OPT_DEFS += -DHHKB_JP
endif
diff --git a/keyboard/hhkb/README.md b/keyboard/hhkb/README.md
index fcd72e194..e20c23d82 100644
--- a/keyboard/hhkb/README.md
+++ b/keyboard/hhkb/README.md
@@ -76,7 +76,7 @@ Use [Teensy Loader] if your controller is Teensy/Teensy++.
##Keymap
-To define your own keymap create file named `keymap_<name>.c` and see [keymap document](../../doc/keymap.md) and existent keymap files.
+To define your own keymap create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
##Hardware
diff --git a/keyboard/hhkb/keymap_hasu.c b/keyboard/hhkb/keymaps/hasu.c
index a5602ded3..a5602ded3 100644
--- a/keyboard/hhkb/keymap_hasu.c
+++ b/keyboard/hhkb/keymaps/hasu.c
diff --git a/keyboard/hhkb/keymap_hhkb.c b/keyboard/hhkb/keymaps/hhkb.c
index 86ad0f5ee..86ad0f5ee 100644
--- a/keyboard/hhkb/keymap_hhkb.c
+++ b/keyboard/hhkb/keymaps/hhkb.c
diff --git a/keyboard/hhkb/keymap_jp.c b/keyboard/hhkb/keymaps/jp.c
index 48d0ee70b..48d0ee70b 100644
--- a/keyboard/hhkb/keymap_jp.c
+++ b/keyboard/hhkb/keymaps/jp.c
diff --git a/keyboard/hhkb/keymap_spacefn.c b/keyboard/hhkb/keymaps/spacefn.c
index deff920ae..deff920ae 100644
--- a/keyboard/hhkb/keymap_spacefn.c
+++ b/keyboard/hhkb/keymaps/spacefn.c
diff --git a/keyboard/hhkb_qmk/Makefile b/keyboard/hhkb_qmk/Makefile
index 8bd44100b..21ba261a2 100644
--- a/keyboard/hhkb_qmk/Makefile
+++ b/keyboard/hhkb_qmk/Makefile
@@ -54,9 +54,9 @@ SRC = hhkb_qmk.c \
matrix.c
ifdef KEYMAP
- SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/keymaps/$(KEYMAP).c $(SRC)
else
- SRC := keymaps/keymap_default.c $(SRC)
+ SRC := keymaps/keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
diff --git a/keyboard/hhkb_qmk/README.md b/keyboard/hhkb_qmk/README.md
index 606025c41..389407b3a 100644
--- a/keyboard/hhkb_qmk/README.md
+++ b/keyboard/hhkb_qmk/README.md
@@ -171,10 +171,10 @@ Depending on which keymap you would like to use, you will have to compile slight
To build with the default keymap, simply run `make`.
### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
-Keymaps follow the format **__keymap\_\<name\>.c__** and are stored in the `keymaps` folder.
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboard/hhkb_qmk/keymaps/keymap_default.c b/keyboard/hhkb_qmk/keymaps/default.c
index bcd8ead37..bcd8ead37 100644
--- a/keyboard/hhkb_qmk/keymaps/keymap_default.c
+++ b/keyboard/hhkb_qmk/keymaps/default.c
diff --git a/keyboard/hhkb_qmk/keymaps/keymap_lxol.c b/keyboard/hhkb_qmk/keymaps/lxol.c
index 3256fda51..3256fda51 100644
--- a/keyboard/hhkb_qmk/keymaps/keymap_lxol.c
+++ b/keyboard/hhkb_qmk/keymaps/lxol.c
diff --git a/keyboard/jd45/Makefile b/keyboard/jd45/Makefile
index 076dced82..f6a8d10c5 100644
--- a/keyboard/jd45/Makefile
+++ b/keyboard/jd45/Makefile
@@ -54,9 +54,9 @@ SRC = jd45.c \
backlight.c
ifdef KEYMAP
- SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
+ SRC := keymaps/keymaps/(KEYMAP).c $(SRC)
else
- SRC := keymaps/keymap_default.c $(SRC)
+ SRC := keymaps/keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
diff --git a/keyboard/jd45/keymaps/keymap_default.c b/keyboard/jd45/keymaps/default.c
index 05dd46e79..05dd46e79 100644
--- a/keyboard/jd45/keymaps/keymap_default.c
+++ b/keyboard/jd45/keymaps/default.c
diff --git a/keyboard/jd45/keymaps/keymap_justin.c b/keyboard/jd45/keymaps/justin.c
index f261b5463..f261b5463 100644
--- a/keyboard/jd45/keymaps/keymap_justin.c
+++ b/keyboard/jd45/keymaps/justin.c
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile
index 307b0c7f4..01d9e3ce9 100644
--- a/keyboard/planck/Makefile
+++ b/keyboard/planck/Makefile
@@ -41,7 +41,6 @@
# Target file name (without extension).
TARGET = planck
-
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
@@ -62,17 +61,28 @@ ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
else
ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+ include keymaps/$(KEYMAP)/makefile.mk
+endif
else
$(error Keymap file does not exist)
+endif
endif
-endif
+
else
+
ifneq ("$(wildcard keymaps/default.c)","")
KEYMAP_FILE = keymaps/default.c
else
KEYMAP_FILE = keymaps/default/keymap.c
endif
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+ include keymaps/default/makefile.mk
+endif
+
endif
+
SRC := $(KEYMAP_FILE) $(SRC)
CONFIG_H = config.h
@@ -94,7 +104,6 @@ MCU = atmega32u4
# software delays.
F_CPU = 16000000
-
#
# LUFA specific
#
@@ -126,29 +135,45 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# 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
+# change to "no" to disable the options, or define them in the makefile.mk in
+# the appropriate keymap folder that will get included automatically
+#
+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 = no # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
+
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES # MIDI controls
-# AUDIO_ENABLE = YES # Audio output on port C6
-# UNICODE_ENABLE = YES # Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
-# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time.
-
-ifdef BACKLIGHT_ENABLE
- SRC += backlight.c
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+ifdef KEYMAP
+
+ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+ include keymaps/$(KEYMAP)/makefile.mk
+endif
endif
+else
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+ include keymaps/default/makefile.mk
+endif
+
+endif
+
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
+ SRC := backlight.c $(SRC)
+endif
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
@@ -158,4 +183,4 @@ VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
-include $(TOP_DIR)/quantum/quantum.mk
+include $(TOP_DIR)/quantum/quantum.mk \ No newline at end of file
diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md
index 3ba0cc152..d9a1e3bee 100644
--- a/keyboard/planck/README.md
+++ b/keyboard/planck/README.md
@@ -16,13 +16,13 @@ Depending on which keymap you would like to use, you will have to compile slight
To build with the default keymap, simply run `make`.
### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
-Keymaps follow the format **__<name\>.c__** and are stored in the `keymaps` folder.
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
### Notable forks (which some of the keymap files are from)
- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck)
diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h
index d3719e0cb..7d64f0977 100644
--- a/keyboard/planck/config.h
+++ b/keyboard/planck/config.h
@@ -73,10 +73,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* disable debug print */
-#define NO_DEBUG
+//#define NO_DEBUG
/* disable print */
-#define NO_PRINT
+//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
diff --git a/keyboard/planck/keymaps/bone2planck.c b/keyboard/planck/keymaps/bone2planck.c
new file mode 100644
index 000000000..a99e7719f
--- /dev/null
+++ b/keyboard/planck/keymaps/bone2planck.c
@@ -0,0 +1,112 @@
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+#include "backlight.h"
+#endif
+#include "..\..\quantum\keymap_extras\keymap_german.h"
+
+/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
+ It has Umlauts and "ß" as it is optimized for a mix of German & English.
+ My favourite features are the placement of the special characters often used for programming right on the home row
+ and the number & navigation block combo, so you never have to move your hands from their home position.
+
+ Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
+*/
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Bone2
+ * ,-----------------------------------------------------------------------------------.
+ * | Q | J | D | U | A | X | P | H | L | M | W | ẞ |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | M1 | C | T | I | E | O | B | N | R | S | G | M1 |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| F | V | Ü | Ä | Ö | Y | Z | , | . | K |Shift |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [0] = {
+ { DE_Q, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_SS },
+ { MO(1), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, MO(1) },
+ { DE_S, DE_F, DE_V, DE_UE, DE_AE, DE_OE, DE_Y, DE_Z, DE_COMM, DE_DOT, DE_K, DE_S },
+ { KC_LCTL, KC_LGUI, KC_LALT, MO(3), MO(2), KC_SPC, KC_SPC, MO(2), MO(3), KC_ESC, KC_TAB, KC_ENT }
+ },
+
+ /* M1 Special Characters
+ * ,-----------------------------------------------------------------------------------.
+ * | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | M1 | \ | / | { | } | * | ? | ( | ) | - | : | M1 |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | # | $ | | | ~ | € | + | % | " | ' | ; | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [1] = {
+ { DE_RING, DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, KC_NO },
+ { KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, KC_TRNS },
+ { KC_NO , DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, KC_NO },
+ { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+ },
+
+ /* Navigation & Number Blocks
+ * ,-----------------------------------------------------------------------------------.
+ * | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | Home | Lft | Down | Right| End | . | 4 | 5 | 6 | , | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| | Tab | Ins | Enter| | 0 | 1 | 2 | 3 | ; |Shift |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [2] = {
+ { KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_NO },
+ { KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_NO },
+ { DE_S, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, KC_0, DE_1, DE_2, DE_3, DE_SCLN, DE_S },
+ { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+ },
+
+ /* Function & Media Keys
+ * ,-----------------------------------------------------------------------------------.
+ * | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Alt | M3 | | Space | | M3 | Esc | Tab |Enter |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [3] = {
+ { KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO },
+ { KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO },
+ { KC_TRNS, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, KC_TRNS},
+ { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+ }
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch (id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+#ifdef BACKLIGHT_ENABLE
+ backlight_step();
+#endif
+ }
+ else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/default/README.md b/keyboard/planck/keymaps/default/README.md
index d2f43bbdb..de9680b49 100644
--- a/keyboard/planck/keymaps/default/README.md
+++ b/keyboard/planck/keymaps/default/README.md
@@ -1,34 +1,2 @@
# The Default Planck Layout
- const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_QW] = { /* Qwerty */
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
- },
- [_CM] = { /* Colemak */
- {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
- {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
- },
- [_DV] = { /* Dvorak */
- {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
- {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
- {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
- },
- [_RS] = { /* RAISE */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
- {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
- },
- [_LW] = { /* LOWER */
- {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
- {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
- }
- }; \ No newline at end of file
diff --git a/keyboard/planck/keymaps/default/keymap.c b/keyboard/planck/keymaps/default/keymap.c
index d995eb9e5..ccf9c7ade 100644
--- a/keyboard/planck/keymaps/default/keymap.c
+++ b/keyboard/planck/keymaps/default/keymap.c
@@ -2,19 +2,46 @@
// this is the style you want to emulate.
#include "planck.h"
-#ifdef BACKLIGHT_ENABLE
- #include "backlight.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+ #include "audio.h"
#endif
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
-#define _QW 0
-#define _CM 1
-#define _DV 2
-#define _LW 3
-#define _RS 4
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _MUSIC 5
+#define _PLOVER 6
+#define _ADJUST 16
+
+// Macro name shortcuts
+#define QWERTY M(_QWERTY)
+#define COLEMAK M(_COLEMAK)
+#define DVORAK M(_DVORAK)
+#define LOWER M(_LOWER)
+#define RAISE M(_RAISE)
+#define M_BL 5
+#ifdef AUDIO_ENABLE
+ #define AUD_OFF M(6)
+ #define AUD_ON M(7)
+#endif
+#define MUS_OFF M(8)
+#define MUS_ON M(9)
+#define PLOVER M(10)
+#define EXT_PLV M(11)
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -26,14 +53,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
-[_QW] = {
+[_QWERTY] = {
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
/* Colemak
@@ -44,14 +71,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
-[_CM] = {
+[_COLEMAK] = {
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
/* Dvorak
@@ -62,14 +89,32 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
-[_DV] = {
+[_DVORAK] = {
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = {
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
/* Raise
@@ -78,46 +123,166 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
-[_RS] = {
+[_RAISE] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
- {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
},
-/* Lower
+/* Music (reserved for process_action_user)
+ *
+ */
+[_MUSIC] = {
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Plover layer (http://opensteno.org)
* ,-----------------------------------------------------------------------------------.
- * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * | # | # | # | # | # | # | # | # | # | # | # | # |
* |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * | | S | T | P | H | * | * | F | P | L | T | D |
* |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * | | S | K | W | R | * | * | R | B | G | S | Z |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
+ * | Exit | | | C | V | | N | M | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_LW] = {
- {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
- {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+
+[_PLOVER] = {
+ {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 },
+ {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC},
+ {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | |Mus on|Musoff| | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+ {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+ {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
+ {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
}
+
+
};
const uint16_t PROGMEM fn_actions[] = {
};
+#ifdef AUDIO_ENABLE
+float tone_startup[][2] = {
+ {440.0*pow(2.0,(31)/12.0), 12},
+ {440.0*pow(2.0,(28)/12.0), 8},
+ {440.0*pow(2.0,(19)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {440.0*pow(2.0,(28)/12.0), 20}
+};
+
+float tone_qwerty[][2] = {
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 16}
+};
+
+float tone_colemak[][2] = {
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 12},
+ {0, 4},
+ {440.0*pow(2.0,(35)/12.0), 12}
+};
+
+float tone_dvorak[][2] = {
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(33)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 8}
+};
+
+
+float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
+float goodbye[][2] = SONG(GOODBYE_SOUND);
+
+#endif
+
+
+void persistant_default_layer_set(uint16_t default_layer) {
+ eeconfig_write_default_layer(default_layer);
+ default_layer_set(default_layer);
+}
+
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
- // MACRODOWN only works in this function
switch(id) {
- case 0:
+ case _QWERTY:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ #endif
+ persistant_default_layer_set(1UL<<_QWERTY);
+ }
+ break;
+ case _COLEMAK:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ #endif
+ persistant_default_layer_set(1UL<<_COLEMAK);
+ }
+ break;
+ case _DVORAK:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ #endif
+ persistant_default_layer_set(1UL<<_DVORAK);
+ }
+ break;
+ case _LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ break;
+ case _RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ break;
+ case M_BL:
if (record->event.pressed) {
register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
@@ -127,6 +292,85 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
unregister_code(KC_RSFT);
}
break;
+ case 6:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ audio_off();
+ #endif
+ }
+ break;
+ case 7:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ audio_on();
+ PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ #endif
+ }
+ break;
+ case 8:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ layer_off(_MUSIC);
+ stop_all_notes();
+ #endif
+ }
+ break;
+ case 9:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(music_scale, false, 0);
+ layer_on(_MUSIC);
+ #endif
+ }
+ break;
+ case 10:
+ if (record->event.pressed) {
+ layer_off(_RAISE);
+ layer_off(_LOWER);
+ layer_off(_ADJUST);
+ layer_on(_PLOVER);
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+ keymap_config.raw = eeconfig_read_keymap();
+ keymap_config.nkro = 1;
+ eeconfig_write_keymap(keymap_config.raw);
+ }
+ break;
+ case 11:
+ if (record->event.pressed) {
+ layer_off(_PLOVER);
+ }
+ break;
+
}
return MACRO_NONE;
};
+
+uint8_t starting_note = 0x0C;
+int offset = 7;
+
+void process_action_user(keyrecord_t *record) {
+
+ if (IS_LAYER_ON(_MUSIC)) {
+ if (record->event.pressed) {
+ play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
+ } else {
+ stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
+ }
+ }
+
+}
+
+void matrix_init_user(void) {
+ #ifdef AUDIO_ENABLE
+ init_notes();
+ PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ #endif
+}
+
+void play_goodbye_tone()
+{
+ PLAY_NOTE_ARRAY(goodbye, false, 0);
+ _delay_ms(150);
+}
diff --git a/keyboard/planck/keymaps/default/makefile.mk b/keyboard/planck/keymaps/default/makefile.mk
new file mode 100644
index 000000000..99fbfbd0b
--- /dev/null
+++ b/keyboard/planck/keymaps/default/makefile.mk
@@ -0,0 +1,2 @@
+AUDIO_ENABLE = yes
+NKRO_ENABLE = yes \ No newline at end of file
diff --git a/keyboard/planck/keymaps/nico.c b/keyboard/planck/keymaps/nico.c
new file mode 100644
index 000000000..e81fd80a4
--- /dev/null
+++ b/keyboard/planck/keymaps/nico.c
@@ -0,0 +1,69 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "backlight.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_CM] = { /* Colemak */
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_DV] = { /* Dvorak */
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_ESC, KC_LALT, KC_LGUI, F(1), KC_SPC, KC_SPC, F(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14, KC_F15, KC_TRNS, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_LW] = { /* LOWER */
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F14, KC_F15, KC_TRNS, KC_MFFD, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_LAYER_TAP_KEY(MO(_LW), KC_BSPC), // Tap for backspace, hold for LOWER
+ [2] = ACTION_LAYER_TAP_KEY(MO(_RS), KC_ENT), // Tap for enter, hold for RAISE
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ backlight_step();
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/pvc_planck.c b/keyboard/planck/keymaps/pvc_planck.c
new file mode 100644
index 000000000..1de8acb1e
--- /dev/null
+++ b/keyboard/planck/keymaps/pvc_planck.c
@@ -0,0 +1,179 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "planck.h"
+#include "print.h"
+#include "action_layer.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+#define _FN 5
+
+#define XXXXXXX KC_NO
+#define _______ KC_TRNS
+
+#define ASFT(kc) LSFT(RSFT(kc))
+#define MG_B ASFT(KC_B)
+#define MG_H ASFT(KC_H)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | Up |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Alt | Del |Raise | Space |Lower | / | Left | Down |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QW] = {
+ {RESET, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT },
+ {KC_LCTL, KC_LGUI, KC_LALT, KC_DEL, M(_LW), KC_SPC, KC_SPC, M(_RS), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT}
+},
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_CM] = {
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DV] = {
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RS] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, RESET, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LW] = {
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, MG_B, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Function
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_FN] = {
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id)
+ {
+ case _RS:
+ if (record->event.pressed) {
+ print("RS_DN");
+ layer_on(_RS);
+ update_tri_layer(_RS, _LW, _FN);
+ } else {
+ print("RS_UP");
+ layer_off(_RS);
+ update_tri_layer(_RS, _LW, _FN);
+ phex(layer_state);
+ }
+ break;
+
+ case _LW:
+ if (record->event.pressed) {
+ print("LW_DN");
+ layer_on(_LW);
+ update_tri_layer(_RS, _LW, _FN);
+ } else {
+ print("LW_UP");
+ layer_off(_LW);
+ update_tri_layer(_RS, _LW, _FN);
+ }
+ break;
+
+ default:
+ break;
+ }
+ return MACRO_NONE;
+};
diff --git a/keyboard/planck/keymaps/tak3over.c b/keyboard/planck/keymaps/tak3over.c
new file mode 100644
index 000000000..7d8243dfa
--- /dev/null
+++ b/keyboard/planck/keymaps/tak3over.c
@@ -0,0 +1,130 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+//
+//Dropped the Dvorak layer and added two my layer buttons. Both Raise and lower can be accessed from either side now.
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _LW 2
+#define _RS 3
+#define _FN 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Func |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QW] = {
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {KC_LCTL, KC_LALT, KC_LGUI, MO(_FN), MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Func |Lower | Space |Raise | Left | Down | Up |Right
+ * `-----------------------------------------------------------------------------------'
+ */
+[_CM] = {
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {KC_LCTL, KC_LALT, KC_LGUI, MO(_FN), MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| F7 | F8 | F9 | F10 | F11 | F12 | _ | + | { | } |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Func |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RS] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+},
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | Reset| Ins | Home | PGUP |Colemk| Left | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Brite| Del | End | PGDN |Qwerty| Del | _ | + | { | } |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Func |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LW] = {
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, RESET, KC_INS, KC_HOME, KC_PGUP, DF(_CM), KC_LEFT, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, M(0), KC_DEL, KC_END, KC_PGDN, DF(_QW), KC_DEL, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+},
+/* Function
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | GUI | X | C | V | Z | Left | Down | Up |Right | Del | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |Shift | Ctrl | X | C | V | Z | Next | Mute | Vol- | Vol+ | Play |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Func |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_FN] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_RGUI, KC_X, KC_C, KC_V, KC_Z, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_DEL, KC_BSLS},
+ {KC_TRNS, KC_RCTL, KC_X, KC_C, KC_V, KC_Z, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
diff --git a/keyboard/planck/common_keymaps/keymap_mitch.c b/keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c
index f7df7bbba..f7df7bbba 100644
--- a/keyboard/planck/common_keymaps/keymap_mitch.c
+++ b/keyboard/planck/old_keymap_files/common_keymaps/keymap_mitch.c
diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c
index fe8731ec7..4b39cf1e8 100644
--- a/keyboard/planck/planck.c
+++ b/keyboard/planck/planck.c
@@ -1,28 +1,26 @@
#include "planck.h"
__attribute__ ((weak))
-void matrix_init_user(void) {
-
-}
+void matrix_init_user(void) {}
__attribute__ ((weak))
-void matrix_scan_user(void) {
+void matrix_scan_user(void) {}
-}
+__attribute__ ((weak))
+void process_action_user(keyrecord_t *record) {}
void matrix_init_kb(void) {
- #ifdef BACKLIGHT_ENABLE
- backlight_init_ports();
- #endif
+#ifdef BACKLIGHT_ENABLE
+ backlight_init_ports();
+#endif
- #ifdef RGBLIGHT_ENABLE
- rgblight_init();
- #endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_init();
+#endif
-
- // Turn status LED on
- DDRE |= (1<<6);
- PORTE |= (1<<6);
+ // Turn status LED on
+ DDRE |= (1<<6);
+ PORTE |= (1<<6);
matrix_init_user();
}
@@ -30,3 +28,7 @@ void matrix_init_kb(void) {
void matrix_scan_kb(void) {
matrix_scan_user();
}
+
+void process_action_kb(keyrecord_t *record) {
+ process_action_user(record);
+}
diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h
index e9566b922..edcb5fbff 100644
--- a/keyboard/planck/planck.h
+++ b/keyboard/planck/planck.h
@@ -42,5 +42,6 @@
void matrix_init_user(void);
void matrix_scan_user(void);
+void process_action_user(keyrecord_t *record);
#endif
diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile
index 0145e44bc..3504e2720 100644
--- a/keyboard/preonic/Makefile
+++ b/keyboard/preonic/Makefile
@@ -27,7 +27,7 @@
# 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,
+# 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.
@@ -39,25 +39,41 @@
#----------------------------------------------------------------------------
# Target file name (without extension).
-TARGET = preonic_lufa
+TARGET = preonic
+
# Directory common source filess exist
TOP_DIR = ../..
+TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
-SRC = extended_keymap_common.c \
- matrix.c \
- led.c \
- backlight.c
+SRC = preonic.c
+
+ifdef keymap
+ KEYMAP = $(keymap)
+endif
ifdef KEYMAP
- SRC := extended_keymaps/extended_keymap_$(KEYMAP).c $(SRC)
+ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ KEYMAP_FILE = keymaps/$(KEYMAP).c
+else
+ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
+ KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
+else
+$(error Keymap file does not exist)
+endif
+endif
+else
+ifneq ("$(wildcard keymaps/default.c)","")
+ KEYMAP_FILE = keymaps/default.c
else
- SRC := extended_keymaps/extended_keymap_default.c $(SRC)
+ KEYMAP_FILE = keymaps/default/keymap.c
+endif
endif
+SRC := $(KEYMAP_FILE) $(SRC)
CONFIG_H = config.h
@@ -110,34 +126,53 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# 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
+# change to "no" to disable the options, or define them in the makefile.mk in
+# the appropriate keymap folder that will get included automatically
+#
+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 = no # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
+
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
-BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-MIDI_ENABLE = yes # MIDI controls
-BACKLIGHT_ENABLE = yes
-
-ifdef MIDI_ENABLE
- SRC += keymap_midi.c \
- beeps.c
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+ifdef KEYMAP
+
+ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+ include keymaps/$(KEYMAP)/makefile.mk
+endif
+endif
+
+else
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+ include keymaps/default/makefile.mk
+endif
+
endif
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
+ SRC := backlight.c $(SRC)
+endif
+
+
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
+VPATH += $(TMK_DIR)
-include $(TOP_DIR)/protocol/lufa.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
+include $(TOP_DIR)/quantum/quantum.mk
diff --git a/keyboard/preonic/Makefile.pjrc b/keyboard/preonic/Makefile.pjrc
deleted file mode 100644
index be83ba18b..000000000
--- a/keyboard/preonic/Makefile.pjrc
+++ /dev/null
@@ -1,116 +0,0 @@
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF.
-#
-# make extcoff = Convert ELF to AVR Extended COFF.
-#
-# make program = Download the hex file to the device.
-# Please customize your programmer settings(PROGRAM_CMD)
-#
-# make teensy = Download the hex file to the device, using teensy_loader_cli.
-# (must have teensy_loader_cli installed).
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-# have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-# have Atmel FLIP installed).
-#
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
-# (must have dfu-programmer installed).
-#
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
-# (must have Atmel FLIP installed).
-#
-# make debug = Start either simulavr or avarice as specified for debugging,
-# with avr-gdb or avr-insight as the front end for debugging.
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-# bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
-# Target file name (without extension).
-TARGET = gh60_pjrc
-
-# Directory common source filess exist
-TOP_DIR = ../..
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# project specific files
-SRC = keymap_common.c \
- matrix.c \
- led.c
-
-ifdef KEYMAP
- SRC := keymap_$(KEYMAP).c $(SRC)
-else
- SRC := keymap_jack.c $(SRC)
-endif
-
-CONFIG_H = config.h
-
-
-# MCU name, you MUST set this to match the board you are using
-# type "make clean" after changing this, so all files will be rebuilt
-MCU = atmega32u4
-#MCU = at90usb1286
-
-
-# Processor frequency.
-# Normally the first thing your program should do is set the clock prescaler,
-# so your program will run at the correct speed. You should also set this
-# variable to same clock speed. The _delay_ms() macro uses this, and many
-# examples use this variable to calculate timings. Do not add a "UL" here.
-F_CPU = 16000000
-
-
-# Boot Section Size in *bytes*
-# Teensy halfKay 512
-# Atmel DFU loader 4096
-# LUFA bootloader 4096
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-# comment out to disable the options.
-#
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
-EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover(+500)
-#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
-
-
-# Search Path
-VPATH += $(TARGET_DIR)
-VPATH += $(TOP_DIR)
-
-include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
-
-plain: OPT_DEFS += -DKEYMAP_PLAIN
-plain: all
-
-poker: OPT_DEFS += -DKEYMAP_POKER
-poker: all
-
-poker_set: OPT_DEFS += -DKEYMAP_POKER_SET
-poker_set: all
-
-poker_bit: OPT_DEFS += -DKEYMAP_POKER_BIT
-poker_bit: all
diff --git a/keyboard/preonic/PCB_GUIDE.md b/keyboard/preonic/PCB_GUIDE.md
deleted file mode 100644
index c3004c75a..000000000
--- a/keyboard/preonic/PCB_GUIDE.md
+++ /dev/null
@@ -1,116 +0,0 @@
-# Planck Firmware Guide
-
-## Setting up the environment
-
-### Windows
-1. Install [WinAVR Tools](http://sourceforge.net/projects/winavr/) for AVR GCC compiler.
-2. Install [DFU-Programmer][dfu-prog] (the -win one).
-3. Start DFU bootloader on the chip first time you will see 'Found New Hardware Wizard' to install driver. If you install device driver properly you can find chip name like 'ATmega32U4' under 'LibUSB-Win32 Devices' tree on 'Device Manager'. If not you will need to update its driver on 'Device Manager' to the `dfu-programmer` driver.
-
-### Mac
-1. Install [CrossPack](http://www.obdev.at/products/crosspack/index.html) or install Xcode from the App Store and install the Command Line Tools from `Xcode->Preferences->Downloads`.
-2. Install [DFU-Programmer][dfu-prog].
-
-### Linux
-1. Install AVR GCC with your favorite package manager.
-2. Install [DFU-Programmer][dfu-prog].
-
-##Verify Your Installation
-1. Clone the following repository: https://github.com/jackhumbert/tmk_keyboard
-2. Open a Terminal and `cd` into `tmk_keyboard/keyboard/planck`
-3. Run `make`. This should output a lot of information about the build process.
-
-## Using the built-in functions
-
-Here is a list of some of the functions available from the command line:
-
-* `make clean`: clean the environment - may be required in-between builds
-* `make`: compile the code
-* `make COMMON=true`: compile with the common (non-extended) keymap
-* `make MATRIX=<matrix_file>`: compile with the referenced matrix file. Default if unspecified is `matrix_pcb.c`. For handwired boards, use `matrix_handwired.c`.
-* `make KEYMAP=<keymap>`: compile with the extended keymap file `extended_keymaps/extended_keymap_<keymap>.c`
-* `make COMMON=true KEYMAP=<keymap>`: compile with the common keymap file `common_keymaps/keymap_<keymap>.c`
-* `make dfu`: build and flash the layout to the PCB
-* `make dfu-force`: build and force-flash the layout to the PCB (may be require for first flash)
-
-Generally, the instructions to flash the PCB are as follows:
-
-1. Make changes to the appropriate keymap file
-2. Save the file
-3. `make clean`
-4. Press the reset button on the PCB/press the key with the `RESET` keycode
-5. `make <arguments> dfu` - use the necessary `KEYMAP=<keymap>` and/or `COMMON=true` arguments here.
-
-## Extended keymap
-
-### Keymap
-
-Unlike the common keymap, prefixing the keycodes with `KC_` is required. A full list of the keycodes is available [here](https://github.com/jackhumbert/tmk_keyboard/blob/master/doc/keycode.txt). For the keycodes available only in the extended keymap, see this [header file](https://github.com/jackhumbert/tmk_keyboard/blob/master/keyboard/planck/extended_keymap_common.h).
-
-You can use modifiers with keycodes like this:
-
- LCTL(KC_C)
-
-Which will generate Ctrl+c. These are daisy-chainable, meaning you can do things like:
-
- LCTL(LALT(KC_C))
-
-That will generate Ctrl+Alt+c. The entire list of these functions is here:
-
-* `LCTL()`: Left control
-* `LSFT()` / `S()`: Left shift
-* `LALT()`: Left alt/opt
-* `LGUI()`: Left win/cmd
-* `RCTL()`: Right control
-* `RSFT()`: Right shift
-* `RALT()`: Right alt/opt
-* `RGUI()`: Right win/cmd
-
-`S(KC_1)`-like entries are useful in writing keymaps for the Planck.
-
-### Other keycodes
-
-A number of other keycodes have been added that you may find useful:
-
-* `CM_<key>`: the Colemak equivalent of a key (in place of `KC_<key>`), when using Colemak in software (`CM_O` generates `KC_SCLN`)
-* `RESET`: jump to bootloader for flashing (same as press the reset button)
-* `BL_STEP`: step through the backlight brightnesses
-* `BL_<0-15>`: set backlight brightness to 0-15
-* `BL_DEC`: lower the backlight brightness
-* `BL_INC`: raise the backlight brightness
-* `BL_TOGG`: toggle the backlight on/off
-
-### Function layers
-
-The extended keymap extends the number of function layers from 32 to the near-infinite value of 256. Rather than using `FN<num>` notation (still available, but limited to `FN0`-`FN31`), you can use the `FUNC(<num>)` notation. `F(<num>)` is a shortcut for this.
-
-The function actions are unchanged, and you can see the full list of them [here](https://github.com/jackhumbert/tmk_keyboard/blob/master/common/action_code.h). They are explained in detail [here](https://github.com/jackhumbert/tmk_keyboard/blob/master/doc/keymap.md#2-action).
-
-### Macros
-
-Macros have been setup in the `extended_keymaps/extended_keymaps_default.c` file so that you can use `M(<num>)` to access a macro in the `action_get_macro` section on your keymap. The switch/case structure you see here is required, and is setup for `M(0)` - you'll need to copy and paste the code to look like this (e.g. to support `M(3)`):
-
- switch(id) {
- case 0:
- return MACRODOWN(TYPE(KC_A), END);
- break;
- case 1:
- return MACRODOWN(TYPE(KC_B), END);
- break;
- case 2:
- return MACRODOWN(TYPE(KC_C), END);
- break;
- case 3:
- return MACRODOWN(TYPE(KC_D), END);
- break;
- }
- return MACRO_NONE;
-
-`MACRODOWN()` is a shortcut for `(record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)` which tells the macro to execute when the key is pressed. Without this, the macro will be executed on both the down and up stroke.
-
-[cygwin]: https://www.cygwin.com/
-[mingw]: http://www.mingw.org/
-[mhv]: https://infernoembedded.com/products/avr-tools
-[winavr]: http://winavr.sourceforge.net/
-[crosspack]: http://www.obdev.at/products/crosspack/index.html
-[dfu-prog]: http://dfu-programmer.sourceforge.net/
diff --git a/keyboard/preonic/README.md b/keyboard/preonic/README.md
index ee824d26e..4a33a3e4e 100644
--- a/keyboard/preonic/README.md
+++ b/keyboard/preonic/README.md
@@ -1,56 +1,25 @@
-Planck keyboard firmware
+Preonic keyboard firmware
======================
-DIY/Assembled compact ortholinear 40% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com).
+DIY/Assembled compact ortholinear 50% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com).
-## Extended Keymap
-If you include extended_keymap_common.h instead of keymap_common.h at the top of your file, you'll have access to a bunch of goodies:
+## Quantum MK Firmware
-- Use `LSFT()`, `LCTL()`, et. al. (listed in extended_keymap_common.h) as modifiers for keys (daisy-chain-able)
-- Use `FUNC(1)` instead of `FN1` (etc.) to access the function layers beyond the 32 function layer limit
-- Use `CM_F` instead of `KC_F` to get the ColeMak equivilent for shortcuts (maps backwards)
-- Use `MACRODOWN()` instead of `MACRO()` to easily make a keydown macro (`CM_*` works here too)
+For the full Quantum feature list, see [the parent README.md](/README.md).
-### Some notes on usage:
+## Building
-- The `KEYMAP()` macro is unable to be used due to the bitwise modifications that take place - refer to extended_keymap_jack.c to see how to set things up with the `KC_` prefix
-- Keep an eye on the Makefile - this needs to include the correct files to work
-- Don't forget to use `const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {` instead of the 8bit equivilent
-
-## Build
-
-Follow [this guide](http://deskthority.net/workshop-f7/how-to-build-your-very-own-keyboard-firmware-t7177.html) to setup your development environment before anything else. Abbreviated instructions are provide at the [bottom of this document](https://github.com/rswiernik/tmk_keyboard/tree/rswiernik_dev/keyboard/planck#environment-setup)
-
-Download the whole firmware [here](https://github.com/jackhumbert/tmk_keyboard/archive/master.zip) and navigate to the keyboard/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex that you can load with the Teensy app onto your Planck (once you've hit reset/shorted GND & RST).
+Download or clone the whole firmware and navigate to the keyboard/preonic folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button.
Depending on which keymap you would like to use, you will have to compile slightly differently.
-####Default
-To build with the default keymap, simply move to the tmk\_keyboard/keyboard/planck/ and run `make` as follows:
-```
-$ make
-```
-
-## Keymap
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
-
-####**Extended Keymaps**
+### Default
+To build with the default keymap, simply run `make`.
-To build the firmware binary hex file with an extended keymap just do `make` with `KEYMAP` option like:
-```
-$ make KEYMAP=[common|jack|<name>]
-```
-_The only applicable keymaps will work with this option._ Extended keymaps follow the format **__extended\_keymap\_\<name\>.c__**
+### Other Keymaps
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap, create a file in the keymaps folder named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
-####**Common Keymaps**
-
-Building with a common keymap is as simple as adding the COMMON option. Note that only
+To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
-$ make KEYMAP=[common|jack|<name>] COMMON=true
+$ make KEYMAP=[default|jack|<name>]
```
-_The only applicable keymaps will work with this option._ Common keymaps follow the format **__keymap\_\<name\>.c__**
-
-## Notable TMK forks (which some of the keymap files are from)
-- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck)
-- [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c)
-- [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck)
-- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck_grid)
+Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboard/preonic/__avr_gdbinit b/keyboard/preonic/__avr_gdbinit
deleted file mode 100644
index afc51e6d1..000000000
--- a/keyboard/preonic/__avr_gdbinit
+++ /dev/null
@@ -1,6 +0,0 @@
-define reset
-SIGNAL SIGHUP
-end
-file planck_lufa.elf
-target remote localhost:4242
-break main
diff --git a/keyboard/preonic/analog.c b/keyboard/preonic/analog.c
deleted file mode 100644
index 49b84ee0e..000000000
--- a/keyboard/preonic/analog.c
+++ /dev/null
@@ -1,53 +0,0 @@
-// Simple analog to digitial conversion
-
-#include <avr/io.h>
-#include <avr/pgmspace.h>
-#include <stdint.h>
-#include "analog.h"
-
-
-static uint8_t aref = (1<<REFS0); // default to AREF = Vcc
-
-
-void analogReference(uint8_t mode)
-{
- aref = mode & 0xC0;
-}
-
-
-// Arduino compatible pin input
-int16_t analogRead(uint8_t pin)
-{
-#if defined(__AVR_ATmega32U4__)
- static const uint8_t PROGMEM pin_to_mux[] = {
- 0x00, 0x01, 0x04, 0x05, 0x06, 0x07,
- 0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
- if (pin >= 12) return 0;
- return adc_read(pgm_read_byte(pin_to_mux + pin));
-#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
- if (pin >= 8) return 0;
- return adc_read(pin);
-#else
- return 0;
-#endif
-}
-
-// Mux input
-int16_t adc_read(uint8_t mux)
-{
-#if defined(__AVR_AT90USB162__)
- return 0;
-#else
- uint8_t low;
-
- ADCSRA = (1<<ADEN) | ADC_PRESCALER; // enable ADC
- ADCSRB = (1<<ADHSM) | (mux & 0x20); // high speed mode
- ADMUX = aref | (mux & 0x1F); // configure mux input
- ADCSRA = (1<<ADEN) | ADC_PRESCALER | (1<<ADSC); // start the conversion
- while (ADCSRA & (1<<ADSC)) ; // wait for result
- low = ADCL; // must read LSB first
- return (ADCH << 8) | low; // must read MSB only once!
-#endif
-}
-
-
diff --git a/keyboard/preonic/analog.h b/keyboard/preonic/analog.h
deleted file mode 100644
index 9b95a93be..000000000
--- a/keyboard/preonic/analog.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _analog_h_included__
-#define _analog_h_included__
-
-#include <stdint.h>
-
-void analogReference(uint8_t mode);
-int16_t analogRead(uint8_t pin);
-int16_t adc_read(uint8_t mux);
-
-#define ADC_REF_POWER (1<<REFS0)
-#define ADC_REF_INTERNAL ((1<<REFS1) | (1<<REFS0))
-#define ADC_REF_EXTERNAL (0)
-
-// These prescaler values are for high speed mode, ADHSM = 1
-#if F_CPU == 16000000L
-#define ADC_PRESCALER ((1<<ADPS2) | (1<<ADPS1))
-#elif F_CPU == 8000000L
-#define ADC_PRESCALER ((1<<ADPS2) | (1<<ADPS0))
-#elif F_CPU == 4000000L
-#define ADC_PRESCALER ((1<<ADPS2))
-#elif F_CPU == 2000000L
-#define ADC_PRESCALER ((1<<ADPS1) | (1<<ADPS0))
-#elif F_CPU == 1000000L
-#define ADC_PRESCALER ((1<<ADPS1))
-#else
-#define ADC_PRESCALER ((1<<ADPS0))
-#endif
-
-// some avr-libc versions do not properly define ADHSM
-#if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
-#if !defined(ADHSM)
-#define ADHSM (7)
-#endif
-#endif
-
-#endif
diff --git a/keyboard/preonic/beeps.c b/keyboard/preonic/beeps.c
deleted file mode 100644
index 8ffd70f41..000000000
--- a/keyboard/preonic/beeps.c
+++ /dev/null
@@ -1,246 +0,0 @@
-#include "beeps.h"
-#include <math.h>
-#include <avr/pgmspace.h>
-#include <avr/interrupt.h>
-#include <avr/io.h>
-
-#define PI 3.14159265
-
-void delay_us(int count) {
- while(count--) {
- _delay_us(1);
- }
-}
-
-int voices = 0;
-double frequency = 0;
-int volume = 0;
-int position = 0;
-
-double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
-bool sliding = false;
-#define RANGE 1000
-volatile int i=0; //elements of the wave
-
-
-void beeps() {
- play_notes();
-}
-
-void send_freq(double freq, int vol) {
- int duty = (((double)F_CPU) / freq);
- ICR3 = duty; // Set max to the period
- OCR3A = duty >> (0x10 - vol); // Set compare to half the period
-}
-
-void stop_all_notes() {
- voices = 0;
- TCCR3A = 0;
- TCCR3B = 0;
- frequency = 0;
- volume = 0;
-
- for (int i = 0; i < 8; i++) {
- frequencies[i] = 0;
- volumes[i] = 0;
- }
-}
-
-void stop_note(double freq) {
- for (int i = 7; i >= 0; i--) {
- if (frequencies[i] == freq) {
- frequencies[i] = 0;
- volumes[i] = 0;
- for (int j = i; (j < 7); j++) {
- frequencies[j] = frequencies[j+1];
- frequencies[j+1] = 0;
- volumes[j] = volumes[j+1];
- volumes[j+1] = 0;
- }
- }
- }
- voices--;
- if (voices < 0)
- voices = 0;
- if (voices == 0) {
- TCCR3A = 0;
- TCCR3B = 0;
- frequency = 0;
- volume = 0;
- } else {
- double freq = frequencies[voices - 1];
- int vol = volumes[voices - 1];
- if (frequency < freq) {
- sliding = true;
- for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
- send_freq(f, vol);
- }
- sliding = false;
- } else if (frequency > freq) {
- sliding = true;
- for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
- send_freq(f, vol);
- }
- sliding = false;
- }
- send_freq(freq, vol);
- frequency = freq;
- volume = vol;
- }
-}
-
-void init_notes() {
- // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10);
- // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
-
- // DDRC |= (1<<6);
-
- // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
- // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
-
- // ICR3 = 0xFFFF;
- // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
-
-
- // cli();
-
- // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
- // this gives a timer interrupt at 15625Hz. */
- // TIMSK3 = (1 << OCIE3A);
-
- // /* clear/reset timer on match */
- // // TCCR3A = 1<<WGM31 | 0<<WGM30; CTC mode, reset on match
- // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */
-
- // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
- // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
-
-
- // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
- // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
- // // SPCR = 0x50;
- // // SPSR = 0x01;
- // DDRC |= (1<<6);
- // // ICR3 = 0xFFFF;
- // // OCR3A=80;
- // PORTC |= (1<<6);
-
- // sei();
-}
-
-// #define highByte(c) ((c >> 8) & 0x00FF)
-// #define lowByte(c) (c & 0x00FF)
-
-ISR(TIMER3_COMPA_vect) {
-
- if (ICR3 > 0 && !sliding) {
- switch (position) {
- case 0: {
- int duty = (((double)F_CPU) / (frequency));
- ICR3 = duty; // Set max to the period
- OCR3A = duty >> 1; // Set compare to half the period
- break;
- }
- case 1: {
- int duty = (((double)F_CPU) / (frequency*2));
- ICR3 = duty; // Set max to the period
- OCR3A = duty >> 1; // Set compare to half the period
- break;
- }
- case 2: {
- int duty = (((double)F_CPU) / (frequency*3));
- ICR3 = duty; // Set max to the period
- OCR3A = duty >> 1; // Set compare to half the period
- break;
- }
- }
- position = (position + 1) % 3;
- }
-// /* OCR2A has been cleared, per TCCR2A above */
-// // OCR3A = 127;
-
-// // pos1 += incr1;
-// // pos2 += incr2;
-// // pos3 += incr3;
-
-// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)];
-
-// // OCR3A = sample;
-
-
-// OCR3A=pgm_read_byte(&sinewave[pos1]);
-// pos1++;
-// // PORTC &= ~(1<<6);
-
-// /* buffered, 1x gain, active mode */
-// // SPDR = highByte(sample) | 0x70;
-// // while (!(SPSR & (1<<SPIF)));
-
-// // SPDR = lowByte(sample);
-// // while (!(SPSR & (1<<SPIF)));
-
-// // PORTC |= (1<<6);
-}
-
-void play_note(double freq, int vol) {
-
- if (freq > 0) {
- DDRC |= (1<<6);
-
- TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
- TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
-
- if (frequency != 0) {
- if (frequency < freq) {
- for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
- send_freq(f, vol);
- }
- } else if (frequency > freq) {
- for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
- send_freq(f, vol);
- }
- }
- }
- send_freq(freq, vol);
- frequency = freq;
- volume = vol;
-
- frequencies[voices] = frequency;
- volumes[voices] = volume;
- voices++;
- }
- // ICR3 = 0xFFFF;
- // for (int i = 0; i < 10000; i++) {
- // OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
- // // _delay_us(50);
- // }
-
- // TCCR3A = 0;
- // TCCR3B = 0;
-}
-
-// void note(int x, float length) {
-// DDRC |= (1<<6);
-// int t = (int)(440*pow(2,-x/12.0)); // starting note
-// for (int y = 0; y < length*1000/t; y++) { // note length
-// PORTC |= (1<<6);
-// delay_us(t);
-// PORTC &= ~(1<<6);
-// delay_us(t);
-// }
-// PORTC &= ~(1<<6);
-// }
-
-// void true_note(float x, float y, float length) {
-// for (uint32_t i = 0; i < length * 50; i++) {
-// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
-// for (int u = 0; u < 8; u++) {
-// if (v & (1 << u) && !(PORTC&(1<<6)))
-// PORTC |= (1<<6);
-// else if (PORTC&(1<<6))
-// PORTC &= ~(1<<6);
-// }
-// }
-// PORTC &= ~(1<<6);
-// } \ No newline at end of file
diff --git a/keyboard/preonic/beeps.h b/keyboard/preonic/beeps.h
deleted file mode 100644
index 378983c60..000000000
--- a/keyboard/preonic/beeps.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
-
-void note(int x, float length);
-void beeps();
-void true_note(float x, float y, float length);
-void play_note(double freq, int vol);
-void stop_note(double freq);
-void stop_all_notes();
-void init_notes(); \ No newline at end of file
diff --git a/keyboard/preonic/config.h b/keyboard/preonic/config.h
index cad269c9d..bb9d29dab 100644
--- a/keyboard/preonic/config.h
+++ b/keyboard/preonic/config.h
@@ -18,11 +18,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_H
#define CONFIG_H
-#include "config_definitions.h"
+#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6062
+#define PRODUCT_ID 0x6061
#define DEVICE_VER 0x0001
#define MANUFACTURER Ortholinear Keyboards
#define PRODUCT The Preonic Keyboard
@@ -34,7 +34,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Planck PCB default pin-out */
#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }
-#define ROWS (int []){ D1, D0, D5, B5, B6 }
+#define ROWS (int []){ D2, D5, B5, B6, D3 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
@@ -55,16 +58,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
+/* ws2812 RGB LED */
+#define ws2812_PORTREG PORTD
+#define ws2812_DDRREG DDRD
+#define ws2812_pin PD1
+#define RGBLED_NUM 28 // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
-#define NO_DEBUG
+// #define NO_DEBUG
/* disable print */
-#define NO_PRINT
+// #define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
diff --git a/keyboard/preonic/config_definitions.h b/keyboard/preonic/config_definitions.h
deleted file mode 100644
index fd138b884..000000000
--- a/keyboard/preonic/config_definitions.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef CONFIG_DEFINITIONS_H
-#define CONFIG_DEFINITIONS_H
-
-#define B0 0x20
-#define B1 0x21
-#define B2 0x22
-#define B3 0x23
-#define B4 0x24
-#define B5 0x25
-#define B6 0x26
-#define B7 0x27
-#define C0 0x30
-#define C1 0x31
-#define C2 0x32
-#define C3 0x33
-#define C4 0x34
-#define C5 0x35
-#define C6 0x36
-#define C7 0x37
-#define D0 0x40
-#define D1 0x41
-#define D2 0x42
-#define D3 0x43
-#define D4 0x44
-#define D5 0x45
-#define D6 0x46
-#define D7 0x47
-#define E0 0x50
-#define E1 0x51
-#define E2 0x52
-#define E3 0x53
-#define E4 0x54
-#define E5 0x55
-#define E6 0x56
-#define E7 0x57
-#define F0 0x60
-#define F1 0x61
-#define F2 0x62
-#define F3 0x63
-#define F4 0x64
-#define F5 0x65
-#define F6 0x66
-#define F7 0x67
-
-
-
-
-
-#endif
-
diff --git a/keyboard/preonic/extended_keymap_common.c b/keyboard/preonic/extended_keymap_common.c
deleted file mode 100644
index 4fa80de7c..000000000
--- a/keyboard/preonic/extended_keymap_common.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "extended_keymap_common.h"
-#include "report.h"
-#include "keycode.h"
-#include "action_layer.h"
-#include "action.h"
-#include "action_macro.h"
-#include "debug.h"
-#include "backlight.h"
-#include "keymap_midi.h"
-#include <lufa.h>
-
-static action_t keycode_to_action(uint16_t keycode);
-
-/* converts key to action */
-action_t action_for_key(uint8_t layer, keypos_t key)
-{
- // 16bit keycodes - important
- uint16_t keycode = keymap_key_to_keycode(layer, key);
-
- if (keycode >= 0x0100 && keycode < 0x2000) {
- // Has a modifier
- action_t action;
- // Split it up
- action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF);
- return action;
- } else if (keycode >= 0x2000 && keycode < 0x3000) {
- // Is a shortcut for function layer, pull last 12bits
- return keymap_func_to_action(keycode & 0xFFF);
- } else if (keycode >= 0x3000 && keycode < 0x4000) {
- action_t action;
- action.code = ACTION_MACRO(keycode & 0xFF);
- return action;
- } else if (keycode >= BL_0 & keycode <= BL_15) {
- action_t action;
- action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
- return action;
- } else if (keycode == BL_DEC) {
- action_t action;
- action.code = ACTION_BACKLIGHT_DECREASE();
- return action;
- } else if (keycode == BL_INC) {
- action_t action;
- action.code = ACTION_BACKLIGHT_INCREASE();
- return action;
- } else if (keycode == BL_TOGG) {
- action_t action;
- action.code = ACTION_BACKLIGHT_TOGGLE();
- return action;
- } else if (keycode == BL_STEP) {
- action_t action;
- action.code = ACTION_BACKLIGHT_STEP();
- return action;
- } else if (keycode == RESET) {
- bootloader_jump();
- return;
- } else if (keycode == DEBUG) {
- print("\nDEBUG: enabled.\n");
- debug_enable = true;
- return;
- } else if (keycode >= 0x6000 && keycode < 0x7000) {
- action_t action;
- action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
- return action;
- }
-
- switch (keycode) {
- case KC_FN0 ... KC_FN31:
- return keymap_fn_to_action(keycode);
-#ifdef BOOTMAGIC_ENABLE
- case KC_CAPSLOCK:
- case KC_LOCKING_CAPS:
- if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
- return keycode_to_action(KC_LCTL);
- }
- return keycode_to_action(keycode);
- case KC_LCTL:
- if (keymap_config.swap_control_capslock) {
- return keycode_to_action(KC_CAPSLOCK);
- }
- return keycode_to_action(KC_LCTL);
- 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_LGUI);
- }
- return keycode_to_action(KC_LALT);
- case KC_LGUI:
- if (keymap_config.swap_lalt_lgui) {
- return keycode_to_action(KC_LALT);
- }
- if (keymap_config.no_gui) {
- return keycode_to_action(ACTION_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_RGUI);
- }
- return keycode_to_action(KC_RALT);
- case KC_RGUI:
- if (keymap_config.swap_ralt_rgui) {
- return keycode_to_action(KC_RALT);
- }
- if (keymap_config.no_gui) {
- return keycode_to_action(ACTION_NO);
- }
- return keycode_to_action(KC_RGUI);
- case KC_GRAVE:
- if (keymap_config.swap_grave_esc) {
- return keycode_to_action(KC_ESC);
- }
- return keycode_to_action(KC_GRAVE);
- case KC_ESC:
- if (keymap_config.swap_grave_esc) {
- return keycode_to_action(KC_GRAVE);
- }
- return keycode_to_action(KC_ESC);
- case KC_BSLASH:
- if (keymap_config.swap_backslash_backspace) {
- return keycode_to_action(KC_BSPACE);
- }
- return keycode_to_action(KC_BSLASH);
- case KC_BSPACE:
- if (keymap_config.swap_backslash_backspace) {
- return keycode_to_action(KC_BSLASH);
- }
- return keycode_to_action(KC_BSPACE);
-#endif
- default:
- return keycode_to_action(keycode);
- }
-}
-
-
-/* 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)
-{
-}
-
-/* translates keycode to action */
-static action_t keycode_to_action(uint16_t keycode)
-{
- action_t action;
- switch (keycode) {
- case KC_A ... KC_EXSEL:
- case KC_LCTRL ... KC_RGUI:
- action.code = ACTION_KEY(keycode);
- break;
- case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
- action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode));
- break;
- case KC_AUDIO_MUTE ... KC_WWW_FAVORITES:
- action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode));
- break;
- case KC_MS_UP ... KC_MS_ACCEL2:
- action.code = ACTION_MOUSEKEY(keycode);
- break;
- case KC_TRNS:
- action.code = ACTION_TRANSPARENT;
- break;
- default:
- action.code = ACTION_NO;
- break;
- }
- return action;
-}
-
-
-/* translates key to keycode */
-uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
-{
- // Read entire word (16bits)
- return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
-}
-
-/* translates Fn keycode to action */
-action_t keymap_fn_to_action(uint16_t keycode)
-{
- return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
-}
-
-action_t keymap_func_to_action(uint16_t keycode)
-{
- // For FUNC without 8bit limit
- return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
-}
diff --git a/keyboard/preonic/extended_keymap_common.h b/keyboard/preonic/extended_keymap_common.h
deleted file mode 100644
index 7ccfa1b03..000000000
--- a/keyboard/preonic/extended_keymap_common.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef KEYMAP_H
-#define KEYMAP_H
-
-#include <stdint.h>
-#include <stdbool.h>
-#include "action.h"
-#include <avr/pgmspace.h>
-#include "keycode.h"
-#include "keymap.h"
-#include "action_macro.h"
-#include "report.h"
-#include "host.h"
-// #include "print.h"
-#include "debug.h"
-
-#ifdef BOOTMAGIC_ENABLE
-/* NOTE: Not portable. Bit field order depends on implementation */
-typedef union {
- uint16_t raw;
- struct {
- bool swap_control_capslock:1;
- bool capslock_to_control:1;
- bool swap_lalt_lgui:1;
- bool swap_ralt_rgui:1;
- bool no_gui:1;
- bool swap_grave_esc:1;
- bool swap_backslash_backspace:1;
- bool nkro:1;
- };
-} keymap_config_t;
-keymap_config_t keymap_config;
-#endif
-
-
-/* translates key to keycode */
-uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
-
-/* translates Fn keycode to action */
-action_t keymap_fn_to_action(uint16_t keycode);
-
-/* translates Fn keycode to action */
-action_t keymap_func_to_action(uint16_t keycode);
-
-extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
-extern const uint16_t fn_actions[];
-
-// Ability to use mods in layouts
-#define LCTL(kc) kc | 0x0100
-#define LSFT(kc) kc | 0x0200
-#define LALT(kc) kc | 0x0400
-#define LGUI(kc) kc | 0x0800
-#define RCTL(kc) kc | 0x1100
-#define RSFT(kc) kc | 0x1200
-#define RALT(kc) kc | 0x1400
-#define RGUI(kc) kc | 0x1800
-
-// Alias for function layers than expand past FN31
-#define FUNC(kc) kc | 0x2000
-
-// Aliases
-#define S(kc) LSFT(kc)
-#define F(kc) FUNC(kc)
-
-// For software implementation of colemak
-#define CM_Q KC_Q
-#define CM_W KC_W
-#define CM_F KC_E
-#define CM_P KC_R
-#define CM_G KC_T
-#define CM_J KC_Y
-#define CM_L KC_U
-#define CM_U KC_I
-#define CM_Y KC_O
-#define CM_SCLN KC_P
-
-#define CM_A KC_A
-#define CM_R KC_S
-#define CM_S KC_D
-#define CM_T KC_F
-#define CM_D KC_G
-#define CM_H KC_H
-#define CM_N KC_J
-#define CM_E KC_K
-#define CM_I KC_L
-#define CM_O KC_SCLN
-
-#define CM_Z KC_Z
-#define CM_X KC_X
-#define CM_C KC_C
-#define CM_V KC_V
-#define CM_B KC_B
-#define CM_K KC_N
-#define CM_M KC_M
-#define CM_COMM KC_COMM
-#define CM_DOT KC_DOT
-#define CM_SLSH KC_SLSH
-
-// Make it easy to support these in macros
-#define KC_CM_Q CM_Q
-#define KC_CM_W CM_W
-#define KC_CM_F CM_F
-#define KC_CM_P CM_P
-#define KC_CM_G CM_G
-#define KC_CM_J CM_J
-#define KC_CM_L CM_L
-#define KC_CM_U CM_U
-#define KC_CM_Y CM_Y
-#define KC_CM_SCLN CM_SCLN
-
-#define KC_CM_A CM_A
-#define KC_CM_R CM_R
-#define KC_CM_S CM_S
-#define KC_CM_T CM_T
-#define KC_CM_D CM_D
-#define KC_CM_H CM_H
-#define KC_CM_N CM_N
-#define KC_CM_E CM_E
-#define KC_CM_I CM_I
-#define KC_CM_O CM_O
-
-#define KC_CM_Z CM_Z
-#define KC_CM_X CM_X
-#define KC_CM_C CM_C
-#define KC_CM_V CM_V
-#define KC_CM_B CM_B
-#define KC_CM_K CM_K
-#define KC_CM_M CM_M
-#define KC_CM_COMM CM_COMM
-#define KC_CM_DOT CM_DOT
-#define KC_CM_SLSH CM_SLSH
-
-#define M(kc) kc | 0x3000
-
-#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)
-
-#define BL_ON 0x4009
-#define BL_OFF 0x4000
-#define BL_0 0x4000
-#define BL_1 0x4001
-#define BL_2 0x4002
-#define BL_3 0x4003
-#define BL_4 0x4004
-#define BL_5 0x4005
-#define BL_6 0x4006
-#define BL_7 0x4007
-#define BL_8 0x4008
-#define BL_9 0x4009
-#define BL_10 0x400A
-#define BL_11 0x400B
-#define BL_12 0x400C
-#define BL_13 0x400D
-#define BL_14 0x400E
-#define BL_15 0x400F
-#define BL_DEC 0x4010
-#define BL_INC 0x4011
-#define BL_TOGG 0x4012
-#define BL_STEP 0x4013
-
-#define RESET 0x5000
-#define DEBUG 0x5001
-
-#define MIDI(n) n | 0x6000
-
-#endif
diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_default.c b/keyboard/preonic/extended_keymaps/extended_keymap_default.c
deleted file mode 100644
index b52f60fd0..000000000
--- a/keyboard/preonic/extended_keymaps/extended_keymap_default.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include "extended_keymap_common.h"
-#include "backlight.h"
-#include "lufa.h"
-#include "debug.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
- // Space is repeated to accommadate for both spacebar wiring positions
-},
-[1] = { /* Colemak */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
- {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
- {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
- {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-},
-[2] = { /* RAISE */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
- {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[3] = { /* LOWER */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
- {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC},
- {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[4] = { /* TENKEY */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT},
- {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-}
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE
- [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER
-
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch(id) {
- case 0:
- if (record->event.pressed) {
- register_code(KC_RSFT);
- midi_send_noteon(&midi_device, 1, 64, 127);
- backlight_step();
- } else {
- unregister_code(KC_RSFT);
- midi_send_noteoff(&midi_device, 1, 64, 127);
- }
- break;
- }
- return MACRO_NONE;
-};
diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
deleted file mode 100644
index ec7bc776a..000000000
--- a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "extended_keymap_common.h"
-#include "backlight.h"
-#include "action_layer.h"
-#include "keymap_midi.h"
-#include "beeps.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = { /* Qwerty */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
- // Space is repeated to accommadate for both spacebar wiring positions
-},
-[1] = { /* Colemak */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
- {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT},
- {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-},
-[2] = { /* RAISE */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
- {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[3] = { /* LOWER */
- {KC_GRV, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC},
- {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC},
- {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)},
- {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
-[4] = { /* TENKEY */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC},
- {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT},
- {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT},
- {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-},
-[5] = {
- { MIDI12 },
- { MIDI12 },
- { MIDI12 },
- { MIDI12 },
- {M(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), MIDI, MIDI, MIDI, MIDI}
-}
-
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE
- [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER
-
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- switch(id) {
- case 0:
- if (record->event.pressed) {
- // register_code(KC_RSFT);
- backlight_set(BACKLIGHT_LEVELS);
- default_layer_and(0);
- default_layer_or((1<<5));
- } else {
- // unregister_code(KC_RSFT);
- backlight_set(0);
- default_layer_and(0);
- default_layer_or(0);
- }
- break;
- }
- return MACRO_NONE;
-};
diff --git a/keyboard/preonic/flash-pcb.sh b/keyboard/preonic/flash-pcb.sh
new file mode 100755
index 000000000..8b59b83f5
--- /dev/null
+++ b/keyboard/preonic/flash-pcb.sh
@@ -0,0 +1,3 @@
+dfu-programmer atmega32u4 erase --force
+dfu-programmer atmega32u4 flash preonic_pcb.hex
+dfu-programmer atmega32u4 reset \ No newline at end of file
diff --git a/keyboard/preonic/keymap_midi.c b/keyboard/preonic/keymap_midi.c
deleted file mode 100644
index a0fa59990..000000000
--- a/keyboard/preonic/keymap_midi.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-Copyright 2015 Jack Humbert <jack.humb@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "extended_keymap_common.h"
-#include "keymap_midi.h"
-#include <lufa.h>
-
-uint8_t starting_note = 0x0C;
-int offset = 7;
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- if (id != 0) {
- if (record->event.pressed) {
- midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
- } else {
- midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
- }
- }
-
- if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
- if (record->event.pressed) {
- starting_note++;
- play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
- midi_send_cc(&midi_device, 0, 0x7B, 0);
- midi_send_cc(&midi_device, 1, 0x7B, 0);
- midi_send_cc(&midi_device, 2, 0x7B, 0);
- midi_send_cc(&midi_device, 3, 0x7B, 0);
- midi_send_cc(&midi_device, 4, 0x7B, 0);
- return;
- } else {
- stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
- stop_all_notes();
- return;
- }
- }
- if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
- if (record->event.pressed) {
- starting_note--;
- play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
- midi_send_cc(&midi_device, 0, 0x7B, 0);
- midi_send_cc(&midi_device, 1, 0x7B, 0);
- midi_send_cc(&midi_device, 2, 0x7B, 0);
- midi_send_cc(&midi_device, 3, 0x7B, 0);
- midi_send_cc(&midi_device, 4, 0x7B, 0);
- return;
- } else {
- stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
- stop_all_notes();
- return;
- }
- }
-
- if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
- offset++;
- midi_send_cc(&midi_device, 0, 0x7B, 0);
- midi_send_cc(&midi_device, 1, 0x7B, 0);
- midi_send_cc(&midi_device, 2, 0x7B, 0);
- midi_send_cc(&midi_device, 3, 0x7B, 0);
- midi_send_cc(&midi_device, 4, 0x7B, 0);
- stop_all_notes();
- for (int i = 0; i <= 7; i++) {
- play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
- _delay_us(80000);
- stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
- _delay_us(8000);
- }
- return;
- }
- if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
- offset--;
- midi_send_cc(&midi_device, 0, 0x7B, 0);
- midi_send_cc(&midi_device, 1, 0x7B, 0);
- midi_send_cc(&midi_device, 2, 0x7B, 0);
- midi_send_cc(&midi_device, 3, 0x7B, 0);
- midi_send_cc(&midi_device, 4, 0x7B, 0);
- stop_all_notes();
- for (int i = 0; i <= 7; i++) {
- play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
- _delay_us(80000);
- stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
- _delay_us(8000);
- }
- return;
- }
-
- if (record->event.pressed) {
- // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
- midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
- play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
- } else {
- // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
- midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
- stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
- }
-} \ No newline at end of file
diff --git a/keyboard/preonic/keymap_midi.h b/keyboard/preonic/keymap_midi.h
deleted file mode 100644
index c5917f884..000000000
--- a/keyboard/preonic/keymap_midi.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
-Copyright 2015 Jack Humbert <jack.humb@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef KEYMAP_MIDI_H
-#define KEYMAP_MIDI_H
-
-#define MIDI 0x6000
-#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000
-
-#define CHNL(note, channel) (note + (channel << 8))
-
-#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
- 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
- 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
- 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
- 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
-
-#define N_CN1 (0x600C + (12 * -1) + 0 )
-#define N_CN1S (0x600C + (12 * -1) + 1 )
-#define N_DN1F (0x600C + (12 * -1) + 1 )
-#define N_DN1 (0x600C + (12 * -1) + 2 )
-#define N_DN1S (0x600C + (12 * -1) + 3 )
-#define N_EN1F (0x600C + (12 * -1) + 3 )
-#define N_EN1 (0x600C + (12 * -1) + 4 )
-#define N_FN1 (0x600C + (12 * -1) + 5 )
-#define N_FN1S (0x600C + (12 * -1) + 6 )
-#define N_GN1F (0x600C + (12 * -1) + 6 )
-#define N_GN1 (0x600C + (12 * -1) + 7 )
-#define N_GN1S (0x600C + (12 * -1) + 8 )
-#define N_AN1F (0x600C + (12 * -1) + 8 )
-#define N_AN1 (0x600C + (12 * -1) + 9 )
-#define N_AN1S (0x600C + (12 * -1) + 10)
-#define N_BN1F (0x600C + (12 * -1) + 10)
-#define N_BN1 (0x600C + (12 * -1) + 11)
-#define N_C0 (0x600C + (12 * 0) + 0 )
-#define N_C0S (0x600C + (12 * 0) + 1 )
-#define N_D0F (0x600C + (12 * 0) + 1 )
-#define N_D0 (0x600C + (12 * 0) + 2 )
-#define N_D0S (0x600C + (12 * 0) + 3 )
-#define N_E0F (0x600C + (12 * 0) + 3 )
-#define N_E0 (0x600C + (12 * 0) + 4 )
-#define N_F0 (0x600C + (12 * 0) + 5 )
-#define N_F0S (0x600C + (12 * 0) + 6 )
-#define N_G0F (0x600C + (12 * 0) + 6 )
-#define N_G0 (0x600C + (12 * 0) + 7 )
-#define N_G0S (0x600C + (12 * 0) + 8 )
-#define N_A0F (0x600C + (12 * 0) + 8 )
-#define N_A0 (0x600C + (12 * 0) + 9 )
-#define N_A0S (0x600C + (12 * 0) + 10)
-#define N_B0F (0x600C + (12 * 0) + 10)
-#define N_B0 (0x600C + (12 * 0) + 11)
-#define N_C1 (0x600C + (12 * 1) + 0 )
-#define N_C1S (0x600C + (12 * 1) + 1 )
-#define N_D1F (0x600C + (12 * 1) + 1 )
-#define N_D1 (0x600C + (12 * 1) + 2 )
-#define N_D1S (0x600C + (12 * 1) + 3 )
-#define N_E1F (0x600C + (12 * 1) + 3 )
-#define N_E1 (0x600C + (12 * 1) + 4 )
-#define N_F1 (0x600C + (12 * 1) + 5 )
-#define N_F1S (0x600C + (12 * 1) + 6 )
-#define N_G1F (0x600C + (12 * 1) + 6 )
-#define N_G1 (0x600C + (12 * 1) + 7 )
-#define N_G1S (0x600C + (12 * 1) + 8 )
-#define N_A1F (0x600C + (12 * 1) + 8 )
-#define N_A1 (0x600C + (12 * 1) + 9 )
-#define N_A1S (0x600C + (12 * 1) + 10)
-#define N_B1F (0x600C + (12 * 1) + 10)
-#define N_B1 (0x600C + (12 * 1) + 11)
-#define N_C2 (0x600C + (12 * 2) + 0 )
-#define N_C2S (0x600C + (12 * 2) + 1 )
-#define N_D2F (0x600C + (12 * 2) + 1 )
-#define N_D2 (0x600C + (12 * 2) + 2 )
-#define N_D2S (0x600C + (12 * 2) + 3 )
-#define N_E2F (0x600C + (12 * 2) + 3 )
-#define N_E2 (0x600C + (12 * 2) + 4 )
-#define N_F2 (0x600C + (12 * 2) + 5 )
-#define N_F2S (0x600C + (12 * 2) + 6 )
-#define N_G2F (0x600C + (12 * 2) + 6 )
-#define N_G2 (0x600C + (12 * 2) + 7 )
-#define N_G2S (0x600C + (12 * 2) + 8 )
-#define N_A2F (0x600C + (12 * 2) + 8 )
-#define N_A2 (0x600C + (12 * 2) + 9 )
-#define N_A2S (0x600C + (12 * 2) + 10)
-#define N_B2F (0x600C + (12 * 2) + 10)
-#define N_B2 (0x600C + (12 * 2) + 11)
-#define N_C3 (0x600C + (12 * 3) + 0 )
-#define N_C3S (0x600C + (12 * 3) + 1 )
-#define N_D3F (0x600C + (12 * 3) + 1 )
-#define N_D3 (0x600C + (12 * 3) + 2 )
-#define N_D3S (0x600C + (12 * 3) + 3 )
-#define N_E3F (0x600C + (12 * 3) + 3 )
-#define N_E3 (0x600C + (12 * 3) + 4 )
-#define N_F3 (0x600C + (12 * 3) + 5 )
-#define N_F3S (0x600C + (12 * 3) + 6 )
-#define N_G3F (0x600C + (12 * 3) + 6 )
-#define N_G3 (0x600C + (12 * 3) + 7 )
-#define N_G3S (0x600C + (12 * 3) + 8 )
-#define N_A3F (0x600C + (12 * 3) + 8 )
-#define N_A3 (0x600C + (12 * 3) + 9 )
-#define N_A3S (0x600C + (12 * 3) + 10)
-#define N_B3F (0x600C + (12 * 3) + 10)
-#define N_B3 (0x600C + (12 * 3) + 11)
-#define N_C4 (0x600C + (12 * 4) + 0 )
-#define N_C4S (0x600C + (12 * 4) + 1 )
-#define N_D4F (0x600C + (12 * 4) + 1 )
-#define N_D4 (0x600C + (12 * 4) + 2 )
-#define N_D4S (0x600C + (12 * 4) + 3 )
-#define N_E4F (0x600C + (12 * 4) + 3 )
-#define N_E4 (0x600C + (12 * 4) + 4 )
-#define N_F4 (0x600C + (12 * 4) + 5 )
-#define N_F4S (0x600C + (12 * 4) + 6 )
-#define N_G4F (0x600C + (12 * 4) + 6 )
-#define N_G4 (0x600C + (12 * 4) + 7 )
-#define N_G4S (0x600C + (12 * 4) + 8 )
-#define N_A4F (0x600C + (12 * 4) + 8 )
-#define N_A4 (0x600C + (12 * 4) + 9 )
-#define N_A4S (0x600C + (12 * 4) + 10)
-#define N_B4F (0x600C + (12 * 4) + 10)
-#define N_B4 (0x600C + (12 * 4) + 11)
-#define N_C5 (0x600C + (12 * 5) + 0 )
-#define N_C5S (0x600C + (12 * 5) + 1 )
-#define N_D5F (0x600C + (12 * 5) + 1 )
-#define N_D5 (0x600C + (12 * 5) + 2 )
-#define N_D5S (0x600C + (12 * 5) + 3 )
-#define N_E5F (0x600C + (12 * 5) + 3 )
-#define N_E5 (0x600C + (12 * 5) + 4 )
-#define N_F5 (0x600C + (12 * 5) + 5 )
-#define N_F5S (0x600C + (12 * 5) + 6 )
-#define N_G5F (0x600C + (12 * 5) + 6 )
-#define N_G5 (0x600C + (12 * 5) + 7 )
-#define N_G5S (0x600C + (12 * 5) + 8 )
-#define N_A5F (0x600C + (12 * 5) + 8 )
-#define N_A5 (0x600C + (12 * 5) + 9 )
-#define N_A5S (0x600C + (12 * 5) + 10)
-#define N_B5F (0x600C + (12 * 5) + 10)
-#define N_B5 (0x600C + (12 * 5) + 11)
-#define N_C6 (0x600C + (12 * 6) + 0 )
-#define N_C6S (0x600C + (12 * 6) + 1 )
-#define N_D6F (0x600C + (12 * 6) + 1 )
-#define N_D6 (0x600C + (12 * 6) + 2 )
-#define N_D6S (0x600C + (12 * 6) + 3 )
-#define N_E6F (0x600C + (12 * 6) + 3 )
-#define N_E6 (0x600C + (12 * 6) + 4 )
-#define N_F6 (0x600C + (12 * 6) + 5 )
-#define N_F6S (0x600C + (12 * 6) + 6 )
-#define N_G6F (0x600C + (12 * 6) + 6 )
-#define N_G6 (0x600C + (12 * 6) + 7 )
-#define N_G6S (0x600C + (12 * 6) + 8 )
-#define N_A6F (0x600C + (12 * 6) + 8 )
-#define N_A6 (0x600C + (12 * 6) + 9 )
-#define N_A6S (0x600C + (12 * 6) + 10)
-#define N_B6F (0x600C + (12 * 6) + 10)
-#define N_B6 (0x600C + (12 * 6) + 11)
-#define N_C7 (0x600C + (12 * 7) + 0 )
-#define N_C7S (0x600C + (12 * 7) + 1 )
-#define N_D7F (0x600C + (12 * 7) + 1 )
-#define N_D7 (0x600C + (12 * 7) + 2 )
-#define N_D7S (0x600C + (12 * 7) + 3 )
-#define N_E7F (0x600C + (12 * 7) + 3 )
-#define N_E7 (0x600C + (12 * 7) + 4 )
-#define N_F7 (0x600C + (12 * 7) + 5 )
-#define N_F7S (0x600C + (12 * 7) + 6 )
-#define N_G7F (0x600C + (12 * 7) + 6 )
-#define N_G7 (0x600C + (12 * 7) + 7 )
-#define N_G7S (0x600C + (12 * 7) + 8 )
-#define N_A7F (0x600C + (12 * 7) + 8 )
-#define N_A7 (0x600C + (12 * 7) + 9 )
-#define N_A7S (0x600C + (12 * 7) + 10)
-#define N_B7F (0x600C + (12 * 7) + 10)
-#define N_B7 (0x600C + (12 * 7) + 11)
-#define N_C8 (0x600C + (12 * 8) + 0 )
-#define N_C8S (0x600C + (12 * 8) + 1 )
-#define N_D8F (0x600C + (12 * 8) + 1 )
-#define N_D8 (0x600C + (12 * 8) + 2 )
-#define N_D8S (0x600C + (12 * 8) + 3 )
-#define N_E8F (0x600C + (12 * 8) + 3 )
-#define N_E8 (0x600C + (12 * 8) + 4 )
-#define N_F8 (0x600C + (12 * 8) + 5 )
-#define N_F8S (0x600C + (12 * 8) + 6 )
-#define N_G8F (0x600C + (12 * 8) + 6 )
-#define N_G8 (0x600C + (12 * 8) + 7 )
-#define N_G8S (0x600C + (12 * 8) + 8 )
-#define N_A8F (0x600C + (12 * 8) + 8 )
-#define N_A8 (0x600C + (12 * 8) + 9 )
-#define N_A8S (0x600C + (12 * 8) + 10)
-#define N_B8F (0x600C + (12 * 8) + 10)
-#define N_B8 (0x600C + (12 * 8) + 11)
-#define N_C8 (0x600C + (12 * 8) + 0 )
-#define N_C8S (0x600C + (12 * 8) + 1 )
-#define N_D8F (0x600C + (12 * 8) + 1 )
-#define N_D8 (0x600C + (12 * 8) + 2 )
-#define N_D8S (0x600C + (12 * 8) + 3 )
-#define N_E8F (0x600C + (12 * 8) + 3 )
-#define N_E8 (0x600C + (12 * 8) + 4 )
-#define N_F8 (0x600C + (12 * 8) + 5 )
-#define N_F8S (0x600C + (12 * 8) + 6 )
-#define N_G8F (0x600C + (12 * 8) + 6 )
-#define N_G8 (0x600C + (12 * 8) + 7 )
-#define N_G8S (0x600C + (12 * 8) + 8 )
-#define N_A8F (0x600C + (12 * 8) + 8 )
-#define N_A8 (0x600C + (12 * 8) + 9 )
-#define N_A8S (0x600C + (12 * 8) + 10)
-#define N_B8F (0x600C + (12 * 8) + 10)
-#define N_B8 (0x600C + (12 * 8) + 11)
-
-#endif \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/default/README.md b/keyboard/preonic/keymaps/default/README.md
new file mode 100644
index 000000000..e911968dd
--- /dev/null
+++ b/keyboard/preonic/keymaps/default/README.md
@@ -0,0 +1 @@
+# The default Preonic layout - largely based on the Planck's \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c
new file mode 100644
index 000000000..ecf3400f8
--- /dev/null
+++ b/keyboard/preonic/keymaps/default/keymap.c
@@ -0,0 +1,356 @@
+#include "preonic.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+#ifdef AUDIO_ENABLE
+ #include "audio.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _MUSIC 5
+#define _ADJUST 16
+
+// Macro name shortcuts
+#define QWERTY M(_QWERTY)
+#define COLEMAK M(_COLEMAK)
+#define DVORAK M(_DVORAK)
+#define LOWER M(_LOWER)
+#define RAISE M(_RAISE)
+#define M_BL 5
+#ifdef AUDIO_ENABLE
+ #define AUD_OFF M(6)
+ #define AUD_ON M(7)
+#endif
+#define MUS_OFF M(8)
+#define MUS_ON M(9)
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = {
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
+ {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = {
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL},
+ {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Music (reserved for process_action_user)
+ *
+ */
+[_MUSIC] = {
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX},
+ {XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | |Musoff|Mus on| | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+ {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12},
+ {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+ {_______, _______, _______, AUD_ON, AUD_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______},
+ {_______, _______, _______, MUS_ON, MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
+ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+}
+
+
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+#ifdef AUDIO_ENABLE
+float start_up[][2] = {
+ {440.0*pow(2.0,(14)/12.0), 20},
+ {440.0*pow(2.0,(26)/12.0), 8},
+ {440.0*pow(2.0,(18)/12.0), 20},
+ {440.0*pow(2.0,(26)/12.0), 8}
+};
+
+float tone_qwerty[][2] = {
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 16}
+};
+
+float tone_colemak[][2] = {
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 12},
+ {0, 4},
+ {440.0*pow(2.0,(35)/12.0), 12}
+};
+
+float tone_dvorak[][2] = {
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(33)/12.0), 8},
+ {0, 4},
+ {440.0*pow(2.0,(31)/12.0), 8}
+};
+
+float tone_music[][2] = {
+ {440.0*pow(2.0,(12)/12.0), 8},
+ {440.0*pow(2.0,(14)/12.0), 8},
+ {440.0*pow(2.0,(16)/12.0), 8},
+ {440.0*pow(2.0,(17)/12.0), 8},
+ {440.0*pow(2.0,(19)/12.0), 8},
+ {440.0*pow(2.0,(21)/12.0), 8},
+ {440.0*pow(2.0,(23)/12.0), 8},
+ {440.0*pow(2.0,(24)/12.0), 8}
+};
+float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
+float goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+void persistant_default_layer_set(uint16_t default_layer) {
+ eeconfig_write_default_layer(default_layer);
+ default_layer_set(default_layer);
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ switch(id) {
+ case _QWERTY:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ #endif
+ persistant_default_layer_set(1UL<<_QWERTY);
+ }
+ break;
+ case _COLEMAK:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ #endif
+ persistant_default_layer_set(1UL<<_COLEMAK);
+ }
+ break;
+ case _DVORAK:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ #endif
+ persistant_default_layer_set(1UL<<_DVORAK);
+ }
+ break;
+ case _LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ break;
+ case _RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ break;
+ case M_BL:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ case 6:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ audio_off();
+ #endif
+ }
+ break;
+ case 7:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ audio_on();
+ PLAY_NOTE_ARRAY(start_up, false, 0);
+ #endif
+ }
+ break;
+ case 8:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ layer_off(_MUSIC);
+ stop_all_notes();
+ #endif
+ }
+ break;
+ case 9:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(music_scale, false, 0);
+ layer_on(_MUSIC);
+ #endif
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+uint8_t starting_note = 0x0C;
+int offset = 7;
+
+void process_action_user(keyrecord_t *record) {
+
+ if (IS_LAYER_ON(_MUSIC)) {
+ if (record->event.pressed) {
+ play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
+ } else {
+ stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
+ }
+ }
+
+}
+
+void matrix_init_user(void) {
+ play_startup_tone();
+}
+
+void play_startup_tone()
+{
+ PLAY_NOTE_ARRAY(start_up, false, 0);
+}
+
+void play_goodbye_tone()
+{
+ PLAY_NOTE_ARRAY(goodbye, false, 0);
+ _delay_ms(150);
+} \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/default/makefile.mk b/keyboard/preonic/keymaps/default/makefile.mk
new file mode 100644
index 000000000..628167ff6
--- /dev/null
+++ b/keyboard/preonic/keymaps/default/makefile.mk
@@ -0,0 +1 @@
+AUDIO_ENABLE = yes \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/lock/README.md b/keyboard/preonic/keymaps/lock/README.md
new file mode 100644
index 000000000..d21cb990b
--- /dev/null
+++ b/keyboard/preonic/keymaps/lock/README.md
@@ -0,0 +1,3 @@
+# Lock layout
+
+This layout is designed for having a lock switch in the lower-left-hand corner, and for experimenting with MIDI/audio features. It's constantly in development, so don't expect anything to work/be documented correctly! \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/lock/keymap.c b/keyboard/preonic/keymaps/lock/keymap.c
new file mode 100644
index 000000000..cfb7f0803
--- /dev/null
+++ b/keyboard/preonic/keymaps/lock/keymap.c
@@ -0,0 +1,105 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "preonic.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+#include "action_layer.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+#define _MI 5
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_CM] = { /* Colemak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_DV] = { /* Dvorak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_LW] = { /* LOWER */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_MI] = { /* MIDI */
+ {MIDI12},
+ {MIDI12},
+ {MIDI12},
+ {MIDI12},
+ {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MIDI, MIDI, MIDI, MIDI}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+float start_up[][2] = {
+ {440.0*pow(2.0,(67)/12.0), 600},
+ {0, 50},
+ {440.0*pow(2.0,(64)/12.0), 400},
+ {0, 50},
+ {440.0*pow(2.0,(55)/12.0), 400},
+ {0, 50},
+ {440.0*pow(2.0,(60)/12.0), 400},
+ {0, 50},
+ {440.0*pow(2.0,(64)/12.0), 1000},
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ default_layer_state = 1<<5;
+ } else {
+ unregister_code(KC_RSFT);
+ default_layer_state = 1<<0;
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+ init_notes();
+ play_notes(&start_up, 9, false);
+}
diff --git a/keyboard/preonic/keymaps/nerdgasm/README.md b/keyboard/preonic/keymaps/nerdgasm/README.md
new file mode 100644
index 000000000..d2f43bbdb
--- /dev/null
+++ b/keyboard/preonic/keymaps/nerdgasm/README.md
@@ -0,0 +1,34 @@
+# The Default Planck Layout
+
+ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QW] = { /* Qwerty */
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_CM] = { /* Colemak */
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_DV] = { /* Dvorak */
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ },
+ [_LW] = { /* LOWER */
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ }
+ }; \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/nerdgasm/keymap.c b/keyboard/preonic/keymaps/nerdgasm/keymap.c
new file mode 100644
index 000000000..818102fbd
--- /dev/null
+++ b/keyboard/preonic/keymaps/nerdgasm/keymap.c
@@ -0,0 +1,117 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "preonic.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_CM] = { /* Colemak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_DV] = { /* Dvorak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_LW] = { /* LOWER */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+// Guitar Notes
+#define N_E 13180.5
+#define N_B 9870.8
+#define N_G 15680.0
+#define N_D 11740.7
+#define N_E 13180.5
+
+float start_up[][2] = {
+ { N_E, 500 },
+ { 0, 50 },
+ { N_E, 500 },
+ { 0, 50 },
+ { N_E, 500 },
+ { 0, 50 },
+ { N_B, 500 },
+ { 0, 50 },
+ { N_E, 1000 },
+ { 0, 50 },
+ { N_G, 1500 },
+ { 0, 50 },
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+#ifdef AUDIO_ENABLE
+ init_notes();
+ play_notes(&start_up, 12, false);
+#endif
+}
+
+void process_action_user(keyrecord_t *record) {
+#ifdef AUDIO_ENABLE
+ if (record->event.pressed) {
+ float keypress[][2] = {
+ {440.0*pow(2.0,(record->event.key.col*7)/12.0), 600}
+ };
+ play_notes(&keypress, 1, false);
+ }
+#endif
+}
diff --git a/keyboard/preonic/led.c b/keyboard/preonic/led.c
deleted file mode 100644
index 2c0574660..000000000
--- a/keyboard/preonic/led.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <avr/io.h>
-#include "stdint.h"
-#include "led.h"
-
-
-void led_set(uint8_t usb_led)
-{
- // // Using PE6 Caps Lock LED
- // if (usb_led & (1<<USB_LED_CAPS_LOCK))
- // {
- // // Output high.
- // DDRE |= (1<<6);
- // PORTE |= (1<<6);
- // }
- // else
- // {
- // // Output low.
- // DDRE &= ~(1<<6);
- // PORTE &= ~(1<<6);
- // }
-}
diff --git a/keyboard/preonic/matrix.c b/keyboard/preonic/matrix.c
deleted file mode 100644
index 98ef55ed6..000000000
--- a/keyboard/preonic/matrix.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
-Copyright 2012 Jun Wako
-Generated by planckkeyboard.com (2014 Jack Humbert)
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 10
-#endif
-static uint8_t debouncing = DEBOUNCE;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-
-static matrix_row_t read_cols(void);
-static void init_cols(void);
-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)
-{
- // To use PORTF disable JTAG with writing JTD bit twice within four cycles.
- MCUCR |= (1<<JTD);
- MCUCR |= (1<<JTD);
-
- backlight_init_ports();
-
- // Turn status LED on
- DDRE |= (1<<6);
- PORTE |= (1<<6);
-
- // initialize row and col
- unselect_rows();
- init_cols();
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- matrix[i] = 0;
- matrix_debouncing[i] = 0;
- }
-}
-
-
-uint8_t matrix_scan(void)
-{
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t cols = read_cols();
- if (matrix_debouncing[i] != cols) {
- matrix_debouncing[i] = cols;
- if (debouncing) {
- debug("bounce!: "); debug_hex(debouncing); debug("\n");
- }
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = matrix_debouncing[i];
- }
- }
- }
-
- return 1;
-}
-
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 0123456789ABCDEF\n");
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- phex(row); print(": ");
- pbin_reverse16(matrix_get_row(row));
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += bitpop16(matrix[i]);
- }
- return count;
-}
-
-static void init_cols(void)
-{
- int B = 0, C = 0, D = 0, E = 0, F = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
- int col = COLS[x];
- if ((col & 0xF0) == 0x20) {
- B |= (1<<(col & 0x0F));
- } else if ((col & 0xF0) == 0x30) {
- C |= (1<<(col & 0x0F));
- } else if ((col & 0xF0) == 0x40) {
- D |= (1<<(col & 0x0F));
- } else if ((col & 0xF0) == 0x50) {
- E |= (1<<(col & 0x0F));
- } else if ((col & 0xF0) == 0x60) {
- F |= (1<<(col & 0x0F));
- }
- }
- DDRB &= ~(B); PORTB |= (B);
- DDRC &= ~(C); PORTC |= (C);
- DDRD &= ~(D); PORTD |= (D);
- DDRE &= ~(E); PORTE |= (E);
- DDRF &= ~(F); PORTF |= (F);
-}
-
-static matrix_row_t read_cols(void)
-{
- matrix_row_t result = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
- int col = COLS[x];
- if ((col & 0xF0) == 0x20) {
- result |= (PINB&(1<<(col & 0x0F)) ? 0 : (1<<x));
- } else if ((col & 0xF0) == 0x30) {
- result |= (PINC&(1<<(col & 0x0F)) ? 0 : (1<<x));
- } else if ((col & 0xF0) == 0x40) {
- result |= (PIND&(1<<(col & 0x0F)) ? 0 : (1<<x));
- } else if ((col & 0xF0) == 0x50) {
- result |= (PINE&(1<<(col & 0x0F)) ? 0 : (1<<x));
- } else if ((col & 0xF0) == 0x60) {
- result |= (PINF&(1<<(col & 0x0F)) ? 0 : (1<<x));
- }
- }
- return result;
-}
-
-static void unselect_rows(void)
-{
- int B = 0, C = 0, D = 0, E = 0, F = 0;
- for(int x = 0; x < MATRIX_ROWS; x++) {
- int row = ROWS[x];
- if ((row & 0xF0) == 0x20) {
- B |= (1<<(row & 0x0F));
- } else if ((row & 0xF0) == 0x30) {
- C |= (1<<(row & 0x0F));
- } else if ((row & 0xF0) == 0x40) {
- D |= (1<<(row & 0x0F));
- } else if ((row & 0xF0) == 0x50) {
- E |= (1<<(row & 0x0F));
- } else if ((row & 0xF0) == 0x60) {
- F |= (1<<(row & 0x0F));
- }
- }
- DDRB &= ~(B); PORTB |= (B);
- DDRC &= ~(C); PORTC |= (C);
- DDRD &= ~(D); PORTD |= (D);
- DDRE &= ~(E); PORTE |= (E);
- DDRF &= ~(F); PORTF |= (F);
-}
-
-static void select_row(uint8_t row)
-{
- int row_pin = ROWS[row];
- if ((row_pin & 0xF0) == 0x20) {
- DDRB |= (1<<(row_pin & 0x0F));
- PORTB &= ~(1<<(row_pin & 0x0F));
- } else if ((row_pin & 0xF0) == 0x30) {
- DDRC |= (1<<(row_pin & 0x0F));
- PORTC &= ~(1<<(row_pin & 0x0F));
- } else if ((row_pin & 0xF0) == 0x40) {
- DDRD |= (1<<(row_pin & 0x0F));
- PORTD &= ~(1<<(row_pin & 0x0F));
- } else if ((row_pin & 0xF0) == 0x50) {
- DDRE |= (1<<(row_pin & 0x0F));
- PORTE &= ~(1<<(row_pin & 0x0F));
- } else if ((row_pin & 0xF0) == 0x60) {
- DDRF |= (1<<(row_pin & 0x0F));
- PORTF &= ~(1<<(row_pin & 0x0F));
- }
-} \ No newline at end of file
diff --git a/keyboard/preonic/preonic.c b/keyboard/preonic/preonic.c
new file mode 100644
index 000000000..f639f247a
--- /dev/null
+++ b/keyboard/preonic/preonic.c
@@ -0,0 +1,41 @@
+#include "preonic.h"
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+
+};
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+
+};
+
+__attribute__ ((weak))
+void process_action_user(keyrecord_t *record) {
+
+};
+
+void matrix_init_kb(void) {
+ #ifdef BACKLIGHT_ENABLE
+ backlight_init_ports();
+ #endif
+
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_init();
+ #endif
+
+
+ // Turn status LED on
+ DDRE |= (1<<6);
+ PORTE |= (1<<6);
+
+ matrix_init_user();
+};
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+};
+
+void process_action_kb(keyrecord_t *record) {
+ process_action_user(record);
+} \ No newline at end of file
diff --git a/keyboard/preonic/preonic.h b/keyboard/preonic/preonic.h
new file mode 100644
index 000000000..51ed9ba39
--- /dev/null
+++ b/keyboard/preonic/preonic.h
@@ -0,0 +1,51 @@
+#ifndef PREONIC_H
+#define PREONIC_H
+
+#include "matrix.h"
+#include "keymap_common.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+#ifdef RGBLIGHT_ENABLE
+ #include "rgblight.h"
+#endif
+#include <stddef.h>
+#ifdef MIDI_ENABLE
+ #include <keymap_midi.h>
+#endif
+
+#define PREONIC_MIT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k45, k47, k48, k49, k4a, k4b } \
+}
+
+#define PREONIC_GRID( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \
+}
+
+void matrix_init_user(void);
+void matrix_scan_user(void);
+void process_action_kb(keyrecord_t *record);
+
+#endif
diff --git a/keyboard/preonic/preonic_music.hex b/keyboard/preonic/preonic_music.hex
new file mode 100644
index 000000000..603693bff
--- /dev/null
+++ b/keyboard/preonic/preonic_music.hex
@@ -0,0 +1,1713 @@
+:100000000C9410030C9454030C9454030C94540358
+:100010000C9454030C9454030C9454030C94540304
+:100020000C9454030C9454030C9410170C94E21782
+:100030000C94BD290C9454030C9454030C94540355
+:100040000C9454030C9454030C9454030C945403D4
+:100050000C9454030C942A2A0C9454030C945403C7
+:100060000C9454030C9454030C9454030C945403B4
+:100070000C9454030C9454030C9454030C945403A4
+:100080000C94440E0C9454030C9454030C94540399
+:100090000C9454030C9454030C9454030C94540384
+:1000A0000C9454030C9454030C9454030763423689
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
+:1000D0000000803F08000000BE922449123EABAAF7
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
+:1000F000AA3E00000000BF000000803F000000009A
+:1001000000084178D3BB4387D1133D190E3CC3BDD2
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
+:1001200080EFFFBE01C4FF7F3F00000000003500EC
+:100130001E001F00200021002200230024002500B3
+:10014000260027002A002B0014001A0008001500C2
+:1001500017001C0018000C00120013002A002900D0
+:1001600004001600070009000A000B000D000E0035
+:100170000F0033003400E1001D001B0006001900D1
+:10018000050011001000360037003800280000304C
+:10019000E000E200E30003522C002C000452500067
+:1001A000510052004F0035001E001F0020002100AA
+:1001B0002200230024002500260027002A002B000F
+:1001C00014001A00090013000A000D000F001800A7
+:1001D0001C0033002A002900040015001600170037
+:1001E00007000B00110008000C0012003400E100B1
+:1001F0001D001B000600190005000E00100036004F
+:100200003700380028000030E000E200E30003522D
+:100210002C002C0004525000510052004F003500B9
+:100220001E001F00200021002200230024002500C2
+:10023000260027002A002B00340036003700130068
+:100240001C0009000A00060015000F002A00290002
+:1002500004001200080018000C0007000B00170033
+:10026000110016003800E100330014000D000E00EC
+:100270001B00050010001A0019001D0028000030A6
+:10028000E000E200E30003522C002C000452500076
+:10029000510052004F0035001E001F0020002100B9
+:1002A0002200230024002500260027002A00350212
+:1002B0001E021F0220022102220223022402250222
+:1002C000260227022A0001003A003B003C003D00C4
+:1002D0003E003F002D022E022F02300231020100AB
+:1002E00040004100420043004400450000530153D8
+:1002F0000253005001000100010001000100010053
+:10030000010001000100AB00AA00A900AE00350009
+:100310001E001F00200021002200230024002500D1
+:10032000260027002A0035001E001F0020002100A3
+:100330002200230024002500260027002A000100B7
+:100340003A003B003C003D003E003F002D002E00E7
+:100350002F00300031000100400041004200430006
+:1003600044004500005301530253005001000100B6
+:100370000100010001000100010001000100AB00CB
+:10038000AA00A900AE00006000600060006000608C
+:10039000006000600060006000600060006000605D
+:1003A000006000600060006000600060006000604D
+:1003B000006000600060006000600060006000603D
+:1003C000006000600060006000600060006000602D
+:1003D000006000600060006000600060006000601D
+:1003E00000600060006000300100010001000100B9
+:1003F00001000100010000600060006000602A034D
+:1004000054006800650020005000720065006F0015
+:100410006E006900630020004B00650079006200F7
+:100420006F0061007200640000002C034F00720036
+:10043000740068006F006C0069006E006500610068
+:10044000720020004B006500790062006F006100BF
+:100450007200640073000000040309040902D00064
+:10046000060100A0FA0904000001030101000921AE
+:1004700011010001223F000705810308000A090459
+:1004800001000103010200092111010001224D00B8
+:100490000705820308000A090402000103000000A6
+:1004A0000921110100012236000705830308000A13
+:1004B00009040300020300000009211101000122C8
+:1004C0002000070584032000010705040320000124
+:1004D00009040400000101000009240100010900D1
+:1004E00001050904050002010300000724010001C1
+:1004F0004100062402010100062402020200092430
+:1005000003010301020100092403020401010100A7
+:100510000905060240000500000525010101090545
+:1005200085024000050000052501010312011001AC
+:1005300000000008EDFE61600100010200010631CB
+:10054000FF0974A1010975150025FF952075088123
+:10055000020976150025FF952075089102C0050156
+:100560000980A101850216010026B7001A01002AA0
+:10057000B700751095018100C0050C0901A1018526
+:1005800003160100269C021A01002A9C0275109590
+:10059000018100C005010902A1010901A1000509AD
+:1005A000190129051500250195057501810295019F
+:1005B000750381010501093009311581257F9502F7
+:1005C0007508810609381581257F95017508810612
+:1005D000050C0A38021581257F950175088106C032
+:1005E000C005010906A101050719E029E715002545
+:1005F00001950875018102950175088101050819A9
+:100600000129059505750191029501750391010573
+:1006100007190029FF150025FF950675088100C000
+:1006200011241FBECFEFDAE0DEBFCDBF04B603FE5C
+:1006300024C08091050490910604A0910704B09114
+:1006400008048730904BA740B04BB9F410920504D2
+:1006500010920604109207041092080414BE84B786
+:10066000877F84BF88E10FB6F89480936000109272
+:1006700060000FBEE0E0F8E3099512E0A0E0B1E011
+:10068000E6ECF9E602C005900D92A832B107D9F761
+:1006900014E0A8E2B2E001C01D92A530B107E1F775
+:1006A0000E94C8130C94E1340C94000061111DC029
+:1006B000FC018281882351F085EE0E94901E0E94E9
+:1006C000BC3080E290E0A0E0B0E007C085EE0E9480
+:1006D000581F81E090E0A0E0B0E08093E1029093A9
+:1006E000E202A093E302B093E40280E090E0089578
+:1006F0000E94370E40E050E069E070E080E091E059
+:100700000C94880F08950E948B036E9A769A0C942D
+:1007100078030C948203279A2F988FEF9FEF909382
+:100720008700809386008AE08093800089E180932F
+:1007300081000C94653081110BC080918000877F0F
+:100740008093800010928D0010928C002F98089555
+:100750002F98833041F480918000886080938000DE
+:100760008FEF9FEF12C0909180009860909380006F
+:1007700023E030E0281B3109220F331F8FEF9FEF5A
+:1007800002C0969587952A95E2F790938D00809305
+:100790008C0008958B3B910568F4883A910530F5FB
+:1007A000853A9105C0F48430910598F4019709F0D9
+:1007B0006FC071C0803E910508F46AC0883E910503
+:1007C00040F09C01205F31092031310508F060C004
+:1007D0005CC09C01A1C0853A910509F45FC0863ACE
+:1007E000910509F45EC023E830E496C0883A91058B
+:1007F00009F45AC0893A910509F459C08A3A910519
+:1008000009F458C08B3A910509F457C08C3A910508
+:1008100009F456C08D3A910509F455C0803B910505
+:1008200009F454C08E3A910509F453C08F3A9105EA
+:1008300009F452C0813B910509F451C0823B9105F6
+:1008400009F450C0833B910509F44FC0843B9105E6
+:1008500009F44EC0853B910509F44DC0863B9105D6
+:1008600009F44CC0873B910509F44BC0883B9105C6
+:1008700009F44AC0893B910509F449C08A3B9105B6
+:1008800009F048C02AE236E447C09C01306544C004
+:1008900020E030E041C021E030E03EC021E830E41B
+:1008A0003BC022E830E438C022EE34E435C029EE03
+:1008B00034E432C02AEE34E42FC025EB34E42CC0FB
+:1008C00026EB34E429C027EB34E426C02CEC34E4D6
+:1008D00023C02DEC34E420C023E835E41DC02AE811
+:1008E00035E41AC022E935E417C024E935E414C020
+:1008F00021E236E411C023E236E40EC024E236E4FD
+:100900000BC025E236E408C026E236E405C027E243
+:1009100036E402C020E034E4C90108959CE0799FE8
+:10092000F00111249CE3899FE00DF11D1124E60FD5
+:10093000F11DEE0FFF1FE25DFE4F25913491C901BD
+:100940000895880F991F82559040FC01259134919C
+:10095000C9010895880F991F825D9E4FFC01259162
+:100960003491C90108950E948E049C019A958115C5
+:100970009F4110F4C9010895C90190528115904119
+:1009800028F4C9019F700E94AA040895C9019053D8
+:100990008115904120F4C9019927906C0895C901EF
+:1009A0009054409728F4C9018F709927946D089549
+:1009B000203180E4380719F480E091ED0895213169
+:1009C00090E4390719F480E090ED0895223140E475
+:1009D000340719F480E092ED0895233180E438075C
+:1009E00019F480E093ED0895211590E53907A1F4FD
+:1009F0000E948B2340E065E088E491E00E94880F2C
+:100A00002FEF44E38CE0215040408040E1F700C0EC
+:100A100000000E944F2A1EC1213090E5390731F4B1
+:100A20008091F10281608093F10214C1C901905557
+:100A30008115904108F062C0432F55274F7055270C
+:100A400041305105F9F4C90174E0880F991F7A9576
+:100A5000E1F788279370B901E3E0660F771FEA9505
+:100A6000E1F760767727862B972B9C6823703327D6
+:100A700002C0440F551F2A95E2F74F715527842B6A
+:100A8000952B08954230510529F4922F8827816FC4
+:100A9000906A089543305105B9F4C90153E0880FB5
+:100AA000991F5A95E1F7807E97702370332741E0B4
+:100AB00050E002C0440F551F2A95E2F74F715527A9
+:100AC000842B952B9C6808954430510589F5C90104
+:100AD00043E0880F991F4A95E1F7807E9770237055
+:100AE000332741E050E002C0440F551F2A95E2F73A
+:100AF0004F715527842B952B9A680895C9019056FC
+:100B00008115904118F4C901906F0895C90190575B
+:100B10008115904120F4C9019F7090620895C90128
+:100B200090588115904120F4C9019F70906A0895F2
+:100B3000203E3105E0F4203C310568F521333105D4
+:100B400009F475C048F42932310509F46BC02A3222
+:100B5000310509F07BC075C02933310501F1223818
+:100B60003105E9F02533310509F070C051C0233E4D
+:100B70003105B1F140F4203E3105D1F0223E31057E
+:100B800009F064C01CC0263E310579F1273E3105CD
+:100B900009F05CC038C0C9010E94A1040895809189
+:100BA000020380FD02C081FF51C080EE90E04FC083
+:100BB0008091020380FFF9CF89E390E048C08091E3
+:100BC000020382FF0AC08091020384FF03C080E019
+:100BD00090E03DC083EE90E03AC082EE90E037C0F6
+:100BE0008091020382FFEFCFF8CF8091020383FF51
+:100BF00007C08091020384FDEACF87EE90E027C012
+:100C000086EE90E024C08091020383FFF2CFF8CFFC
+:100C10008091020385FF03C089E290E018C085E35C
+:100C200090E015C08091020385FDF9CFF5CF80914A
+:100C3000020386FF03C08AE290E009C081E390E0EE
+:100C400006C08091020386FDF9CFF5CFC9010E944D
+:100C5000CA030895089508950C942B065F926F922D
+:100C60007F928F929F92AF92BF92CF92DF92EF923C
+:100C7000FF920F931F93CF93DF93CDB7DEB72A97E1
+:100C80000FB6F894DEBF0FBECDBF9E012F5F3F4F62
+:100C90004E018BE0880E911C60E070E000E010E0F7
+:100CA000E12CF12CC12CD12CA12CB12C8AE0782E76
+:100CB000622E532E41E050E0E3E9F1E0A62DB52D80
+:100CC000872D01900D928A95E1F7F901819191911B
+:100CD0009F01FC01E07FFF27E032F10559F48F709E
+:100CE0009927FA0102C0EE0FFF1F8A95E2F7AE2A9C
+:100CF000BF2A37C0E033F10559F48F709927FA0104
+:100D000002C0EE0FFF1F8A95E2F7CE2ADF2A29C024
+:100D1000E034F10559F48F709927FA0102C0EE0F03
+:100D2000FF1F8A95E2F7EE2AFF2A1BC0E035F10586
+:100D300059F48F709927FA0102C0EE0FFF1F8A95B0
+:100D4000E2F70E2B1F2B0DC0E036F10551F48F702A
+:100D50009927FA0102C0EE0FFF1F8A95E2F76E2B6A
+:100D60007F2B2815390509F0A7CF94B18A2D8095DE
+:100D7000892384B985B18A2985B997B18C2D80954D
+:100D8000892387B988B18C2988B99AB18E2D80952D
+:100D900089238AB98BB18E298BB99DB1802F80951B
+:100DA00089238DB98EB1802B8EB990B3862F809513
+:100DB000892380BB81B3862B81BB2A960FB6F8941A
+:100DC000DEBF0FBECDBFDF91CF911F910F91FF907E
+:100DD000EF90DF90CF90BF90AF909F908F907F90DB
+:100DE0006F905F9008955F926F927F928F929F9223
+:100DF000AF92BF92CF92DF92EF92FF920F931F9329
+:100E0000CF93DF93CDB7DEB768970FB6F894DEBF08
+:100E10000FBECDBF85B7806885BF85B7806885BFA9
+:100E20000E942E069E012F5F3F4F4E0189E1880EE2
+:100E3000911C60E070E000E010E0E12CF12CC12C8E
+:100E4000D12CA12CB12C98E1792E622E532E41E0A9
+:100E500050E0EDE9F1E0A62DB52D872D01900D9222
+:100E60008A95E1F7F901819191919F01FC01E07F61
+:100E7000FF27E032F10559F48F709927FA0102C07B
+:100E8000EE0FFF1F8A95E2F7AE2ABF2A37C0E03384
+:100E9000F10559F48F709927FA0102C0EE0FFF1F78
+:100EA0008A95E2F7CE2ADF2A29C0E034F10559F409
+:100EB0008F709927FA0102C0EE0FFF1F8A95E2F7A3
+:100EC000EE2AFF2A1BC0E035F10559F48F709927EF
+:100ED000FA0102C0EE0FFF1F8A95E2F70E2B1F2BBF
+:100EE0000DC0E036F10551F48F709927FA0102C068
+:100EF000EE0FFF1F8A95E2F76E2B7F2B2815390521
+:100F000009F0A7CF94B18A2D8095892384B985B142
+:100F10008A2985B997B18C2D8095892387B988B1A5
+:100F20008C2988B99AB18E2D809589238AB98BB185
+:100F30008E298BB99DB1802F809589238DB98EB173
+:100F4000802B8EB990B3862F8095892380BB81B387
+:100F5000862B81BB10922902109228021092330234
+:100F60001092320210922B0210922A021092350235
+:100F70001092340210922D0210922C02109237021D
+:100F80001092360210922F0210922E021092390205
+:100F900010923802109231021092300210923B02ED
+:100FA00010923A0268960FB6F894DEBF0FBECDBF1E
+:100FB000DF91CF911F910F91FF90EF90DF90CF9035
+:100FC000BF90AF909F908F907F906F905F900C94A8
+:100FD00083035F926F927F928F929F92AF92BF92A4
+:100FE000CF92DF92EF92FF920F931F93CF93DF93F5
+:100FF000CDB7DEB7A2970FB6F894DEBF0FBECDBF58
+:101000007E0149E1E40EF11C22E3C22E22E0D22E41
+:101010005E0153E2A50EB11C3AE0532E470101E0F8
+:1010200010E048E1642E55E0752EE3E9F1E0D401CB
+:10103000852D01900D928A95E1F7F70181919191AB
+:101040007F019C01207F33272032310589F424B1B0
+:101050008F709927A80102C0440F551F8A95E2F7A7
+:10106000CA01242B24B995B18095892385B94FC035
+:101070002033310589F427B18F709927F80102C018
+:10108000EE0FFF1F8A95E2F7CF012E2B27B998B1FB
+:101090008095892388B93BC02034310589F42AB171
+:1010A0008F709927A80102C0440F551F8A95E2F757
+:1010B000CA01242B2AB99BB1809589238BB927C0FB
+:1010C0002035310589F42DB18F709927F80102C0C0
+:1010D000EE0FFF1F8A95E2F7CF012E2B2DB99EB19F
+:1010E000809589238EB913C02036310581F420B351
+:1010F0008F709927A80102C0440F551F8A95E2F707
+:10110000CA01242B20BB91B38095892381BB50EA6F
+:101110005A95F1F7BE016F5F7F4F80E090E020E0CD
+:1011200030E0EDE9F1E0DE011196462D01900D92DF
+:101130004A95E1F7FB0141915191BF01FA01E07F2E
+:10114000FF27E032F10511F4E3B113C0E033F105FC
+:1011500011F4E6B10EC0E034F10511F4E9B109C0B3
+:10116000E035F10511F4ECB104C0E036F105B9F455
+:10117000EFB1F0E04F70552702C0F595E7954A951D
+:10118000E2F7E0FD08C0A801022E02C0440F551F7F
+:101190000A94E2F702C040E050E0842B952B2F5FC9
+:1011A0003F4F2C30310509F0BCCFF6012081318151
+:1011B0002817390721F091838083709270010E9473
+:1011C0002E06F2E0CF0ED11CEA14FB0409F02DCF5D
+:1011D000809170018823A1F1815080937001882350
+:1011E00039F08FE99FE00197F1F700C0000028C0B7
+:1011F00080913202909133029093290280932802C9
+:10120000809134029091350290932B0280932A02B0
+:10121000809136029091370290932D0280932C0298
+:10122000809138029091390290932F0280932E0280
+:1012300080913A0290913B02909331028093300268
+:101240000E94890381E0A2960FB6F894DEBF0FBE1C
+:10125000CDBFDF91CF911F910F91FF90EF90DF9065
+:10126000CF90BF90AF909F908F907F906F905F9046
+:101270000895E82FF0E0EE0FFF1FE85DFD4F80813D
+:10128000918108950895CF92DF92EF92FF920F938C
+:101290001F93CF93DF93CDB7DEB7CC5BD2400FB6B1
+:1012A000F894DEBF0FBECDBF8C01862F642F88233C
+:1012B00079F0F80192812FE7482F992329F084E0F3
+:1012C00093E00E94EC1904C084E093E00E94FC19B2
+:1012D000F80180818B3091F59181943009F0A8C29A
+:1012E0009281809173019923B1F08F5F8093730194
+:1012F00096E4E5EBF1E0DE01A958BD4F01900D92B7
+:101300009A95E1F7E0917101F0917201EE0FFF1FE4
+:1013100027E732E036C096E4E5EBF1E0DE01AF5CB2
+:10132000BD4F01900D929A95E1F7E0917101F09116
+:101330007201EE0FFF1F21E332E093C08A3009F003
+:10134000CBC0F8019181943009F072C292818091F2
+:101350007301992309F473C081508093730196E45B
+:10136000E5EBF1E0DE01A551BE4F01900D929A959B
+:10137000E1F7E0917101F0917201EE0FFF1F2BEE8A
+:1013800031E02C0F3D1FE20FF31F60817181680F68
+:10139000711D882777FD8095982F0E94003220E0EC
+:1013A00030E040E451E40E94653120E030E040E864
+:1013B00050E40E94FD309B01AC0160E070E080E0F1
+:1013C00090E40E94173321E230ED42E053E40E94A2
+:1013D000B4324CE050E00E94E30F20E04BE760E0C5
+:1013E00084E093E00E94DC1920E04BE761E084E0B8
+:1013F00093E00E94DC1920E04BE762E084E093E098
+:101400000E94DC1920E04BE763E084E093E00E9457
+:10141000DC1920E04BE764E084E093E0C454DD4F46
+:101420000FB6F894DEBF0FBECDBFDF91CF911F91F5
+:101430000F91FF90EF90DF90CF900C94DC1996E421
+:10144000E5EBF1E0DE01AB55BE4F01900D929A95B0
+:10145000E1F7E0917101F0917201EE0FFF1F25EAB3
+:1014600031E02C0F3D1FE20FF31F60817181680F87
+:10147000711D882777FD8095982F0E94003220E00B
+:1014800030E040E451E40E94653120E030E040E883
+:1014900050E40E94FD309B01AC0160E070E080E010
+:1014A00090E40E94173321E230ED42E053E40E94C1
+:1014B000B4320E94130DC454DD4F0FB6F894DEBF52
+:1014C0000FBECDBFDF91CF911F910F91FF90EF9095
+:1014D000DF90CF900C94E60C893009F0D3C0F8016E
+:1014E0009181943009F0A4C19281992309F4A0C19B
+:1014F0008091710190917201019690937201809395
+:10150000710120E04BE760E084E093E00E94DC1989
+:1015100020E04BE761E084E093E00E94DC1920E0EA
+:101520004BE762E084E093E00E94DC1920E04BE7A7
+:1015300063E084E093E00E94DC1920E04BE764E084
+:1015400084E093E00E94DC190E94E60C00E010E0C9
+:10155000E6E4FE2E80917301E5EBF1E0DE01A15A95
+:10156000BE4F9F2D01900D929A95E1F7E091710188
+:10157000F0917201E00FF11FEE0FFF1F2FE531E038
+:101580002C0F3D1FE20FF31F60817181680F711DE9
+:10159000882777FD8095982F0E94003220E030E068
+:1015A00040E451E40E94653120E030E040E850E43E
+:1015B0000E94FD309B01AC0160E070E080E090E4AF
+:1015C0000E94173321E230ED42E053E40E94B4322E
+:1015D0004CE050E00E94E30F3FEF87EE93E0315084
+:1015E00080409040E1F700C0000080917301E5EB7E
+:1015F000F1E0DE01A75EBE4F9F2D01900D929A95FE
+:10160000E1F7E0917101F0917201E00FF11FEE0F2F
+:10161000FF1F29E131E02C0F3D1FE20FF31F608116
+:101620007181680F711D882777FD8095982F0E9422
+:10163000003220E030E040E451E40E94653120E0D7
+:1016400030E040E850E40E94FD309B01AC0160E0D6
+:1016500070E080E090E40E94173321E230ED42E038
+:1016600053E40E94B4320E94130D8FEF9CE7019760
+:10167000F1F700C000000F5F1F4F0830110509F09F
+:1016800069CF94C1883009F0D3C0F80191819430BA
+:1016900009F0CEC09281992309F4CAC080917101EA
+:1016A000909172010197909372018093710120E0F3
+:1016B0004BE760E084E093E00E94DC1920E04BE718
+:1016C00061E084E093E00E94DC1920E04BE762E0F7
+:1016D00084E093E00E94DC1920E04BE763E084E0C3
+:1016E00093E00E94DC1920E04BE764E084E093E0A3
+:1016F0000E94DC190E94E60C00E010E056E4F52E92
+:1017000080917301E5EBF1E0DE01AD52BF4F9F2DFB
+:1017100001900D929A95E1F7E0917101F0917201BB
+:10172000E00FF11FEE0FFF1F23ED30E02C0F3D1FE8
+:10173000E20FF31F60817181680F711D882777FDAB
+:101740008095982F0E94003220E030E040E451E480
+:101750000E94653120E030E040E850E40E94FD3016
+:101760009B01AC0160E070E080E090E40E941733E0
+:1017700021E230ED42E053E40E94B4324CE050E00C
+:101780000E94E30F3FEF87EE93E03150804090409E
+:10179000E1F700C0000080917301E5EBF1E0DE01AC
+:1017A000A357BF4F9F2D01900D929A95E1F7E091BD
+:1017B0007101F0917201E00FF11FEE0FFF1F2DE894
+:1017C00030E02C0F3D1FE20FF31F60817181680F25
+:1017D000711D882777FD8095982F0E94003220E0A8
+:1017E00030E040E451E40E94653120E030E040E820
+:1017F00050E40E94FD309B01AC0160E070E080E0AD
+:1018000090E40E94173321E230ED42E053E40E945D
+:10181000B4320E94130D8FEF9CE70197F1F700C0DF
+:1018200000000F5F1F4F0830110509F069CFBEC0DF
+:10183000F801228190917301222309F45DC026E40E
+:10184000E5EBF1E0DE01A95BBF4F01900D922A9517
+:10185000E1F7E0917101F0917201E80FF11DEE0FD7
+:10186000FF1F27E430E02C0F3D1FE20FF31F6081C4
+:101870007181690F711D882777FD8095982F0E94CF
+:10188000003220E030E040E451E40E9465316B0119
+:101890007C01F801818165E070E0681B710988278F
+:1018A00077FD8095982F0E9400329B01AC01C70103
+:1018B000B6010E94FD309B01AC0160E070E080E069
+:1018C00090E40E94173321E230ED42E053E40E949D
+:1018D000B4324FE050E0C454DD4F0FB6F894DEBF91
+:1018E0000FBECDBFDF91CF911F910F91FF90EF9071
+:1018F000DF90CF900C94E30F26E4E5EBF1E0DE01FE
+:10190000119601900D922A95E1F7E0917101F09105
+:101910007201E80FF11DEE0FFF1F21E030E02C0FE8
+:101920003D1FE20FF31F60817181690F711D8827D0
+:1019300077FD8095982F0E94003220E030E040E44F
+:1019400051E40E9465316B017C01F801818165E001
+:1019500070E0681B7109882777FD8095982F0E9499
+:1019600000329B01AC01C701B6010E94FD309B0112
+:10197000AC0160E070E080E090E40E94173321E267
+:1019800030ED42E053E40E94B432C454DD4F0FB650
+:10199000F894DEBF0FBECDBFDF91CF911F910F91A5
+:1019A000FF90EF90DF90CF900C94130DC454DD4F57
+:1019B0000FB6F894DEBF0FBECDBFDF91CF911F9160
+:1019C0000F91FF90EF90DF90CF90089510928702D3
+:1019D00010928602809171008D7F809371008091BA
+:1019E00090008F77809390001092480210924702E7
+:1019F0001092800210928102109282021092830251
+:101A000010927F0210927E02EEE5F2E0AEE4B2E0C8
+:101A100011921192119211921D921D9282E0EE3755
+:101A2000F807B1F708956F927F928F929F92AF92CD
+:101A3000BF92CF92DF92EF92FF920F931F93CF93BB
+:101A4000DF936B017C010EE712E04CE5A42E42E02F
+:101A5000B42EC7E0D0E0A7019601F80192918291DF
+:101A6000729162918F010E946131882349F0219720
+:101A7000F2E0AF1AB108CF3F8FEFD80761F734C05B
+:101A8000F8011082118212821382F50111821082F4
+:101A9000FE01EE0FFF1FEE0FFF1FE25AFD4FDE01AA
+:101AA000AA0FBB1FA25BBD4FCE011AC00196448195
+:101AB0005581668177814083518362837383148269
+:101AC00015821682178212962D913C9113971196CA
+:101AD0003C932E9313961C921E9212973496129654
+:101AE0008730910519F7C3CF8091860290918702C4
+:101AF000019797FD05C0909387028093860204C0EA
+:101B00001092870210928602E0918602F09187027D
+:101B10003097C9F4809171008D7F8093710080911E
+:101B200090008F7780939000109280021092810233
+:101B3000109282021092830210927F0210927E0213
+:101B40001092470285C03197DF01AA0FBB1FAA0F71
+:101B5000BB1FA25ABD4FCD90DD90ED90FC90EE0FD3
+:101B6000FF1FE25BFD4FC081D181609080027090C9
+:101B700081028090820290908302A7019601662DD7
+:101B8000772D882D992D0E94613187FF25C0262D44
+:101B9000372D482D592DC701B6010E94FC3020E099
+:101BA00030E04AEF54E40E9465315B018C012A2D3C
+:101BB0003B2D402F512F662D772D882D992D0E947A
+:101BC000FD303B014C01A7019601772D992D0E9414
+:101BD0006131181664F72EC0A7019601662D772D86
+:101BE000882D992D0E94B032181634F5A701960160
+:101BF000662D772D882D992D0E94FC3020E030E055
+:101C00004AEF54E40E9465315B018C012A2D3B2D83
+:101C1000402F512F662D772D882D992D0E94FC3055
+:101C20003B014C01A7019601772D992D0E94B032FE
+:101C300087FFECCF10924D02C0928002D0928102B9
+:101C4000E0928202F0928302D0937F02C0937E02E0
+:101C5000DF91CF911F910F91FF90EF90DF90CF9088
+:101C6000BF90AF909F908F907F906F9008953E9A15
+:101C7000E1E7F0E080818D7F808382E080939000B7
+:101C80008AE18093910008951F920F920FB60F92F0
+:101C90001124CF92DF92EF92FF922F933F934F93B5
+:101CA0005F936F937F938F939F93AF93BF93CF93E4
+:101CB000DF93EF93FF9380914702882309F479C063
+:101CC00020E030E0A9016091800270918102809152
+:101CD0008202909183020E94B03218160CF069C003
+:101CE00020E030E040E251E46091490270914A0204
+:101CF00080914B0290914C020E94B0321816BCF4B5
+:101D00008091840290918502019660918602709183
+:101D100087020E949C3490938502809384021092E3
+:101D2000490210924A0210924B0210924C02C0914A
+:101D30008402D0918502CC0FDD1FCC0FDD1FC25A6B
+:101D4000DD4F288139814A815B8160E074E284E75C
+:101D50009BE40E9465310E94CD317093970060939F
+:101D60009600288139814A815B8160E074E284E7D2
+:101D70009BE40E9465310E94CD3175956795709303
+:101D800099006093980020E030E040E85FE36091C4
+:101D9000490270914A0280914B0290914C020E943C
+:101DA000FD306093490270934A0280934B029093F6
+:101DB0004C0280914802882309F493C0C0904302EA
+:101DC000D0904402E0904502F090460220E030E0DE
+:101DD000A901C701B6010E94B0321816F4F4A70198
+:101DE000960160E074E284E79BE40E9465310E9402
+:101DF000CD317093970060939600A701960160E043
+:101E000074E284E79BE40E9465310E94CD317595B0
+:101E10006795709399006093980060913D0270916E
+:101E20003E026F5F7F4F70933E0260933D0280E001
+:101E300090E00E94FE3120913F023091400240919B
+:101E40004102509142020E94B03287FD4AC0809107
+:101E50003C028F5F80933C029091F1038917A0F0C0
+:101E60008091F603882319F010923C020DC08091F6
+:101E700071008D7F80937100809190008F778093A7
+:101E80009000109248022DC0E091F203F091F3030C
+:101E900080913C0298E0899FE00DF11D1124808122
+:101EA0009181A281B3818093430290934402A093D5
+:101EB0004502B093460220E030E040E85EE36481F2
+:101EC0007581868197810E94B43260933F0270933E
+:101ED0004002809341029093420210923E0210927F
+:101EE0003D02FF91EF91DF91CF91BF91AF919F9113
+:101EF0008F917F916F915F914F913F912F91FF90C3
+:101F0000EF90DF90CF900F900FBE0F901F9018951D
+:101F10000F931F93CF93DF9300D0CDB7DEB78C0123
+:101F200080914702882331F04A8369830E94E60C3E
+:101F300069814A8181E0809348021093F303009302
+:101F4000F2036093F1034093F6031092490210925A
+:101F50004A0210924B0210924C0210923C02F8017D
+:101F600040815181628173814093430250934402C6
+:101F7000609345027093460220E030E040E85EE363
+:101F800064817581868197810E94B43260933F029B
+:101F900070934002809341029093420210923E025D
+:101FA00010923D0280917100826080937100809157
+:101FB00090008068809390000F900F90DF91CF91F8
+:101FC0001F910F9108956F927F928F929F92AF927F
+:101FD000BF92CF92DF92EF92FF920F931F93CF9316
+:101FE000DF936B017C01EA018091480281110E941C
+:101FF000E60C81E08093470220E030E0A901C701B0
+:10200000B6010E94B03218160CF09AC0609080029F
+:1020100070908102809082029090830220E030E0F4
+:10202000A901662D772D882D992D0E94613181118E
+:1020300028C0C0928002D0928102E0928202F09287
+:102040008302D0937F02C0937E028091860290919A
+:102050008702FC01EE0FFF1FEE0FFF1FE25AFD4F3C
+:10206000C082D182E282F382FC01EE0FFF1FE25BAD
+:10207000FD4FD183C083019690938702809386029F
+:102080005FC0A7019601662D772D882D992D0E949E
+:10209000613187FF25C0262D372D482D592DC701C9
+:1020A000B6010E94FC3020E030E04AEF54E40E9488
+:1020B00065315B018C012A2D3B2D402F512F662D60
+:1020C000772D882D992D0E94FD303B014C01A701F1
+:1020D0009601772D992D0E946131181664F7A9CFCA
+:1020E000A7019601662D772D882D992D0E94B0327B
+:1020F00018160CF09ECFA7019601662D772D882D1E
+:10210000992D0E94FC3020E030E04AEF54E40E9418
+:1021100065315B018C012A2D3B2D402F512F662DFF
+:10212000772D882D992D0E94FC303B014C01A70191
+:102130009601772D992D0E94B03287FFECCF79CF91
+:10214000809171008260809371008091900080681E
+:1021500080939000DF91CF911F910F91FF90EF90AE
+:10216000DF90CF90BF90AF909F908F907F906F90B7
+:102170000895809191020895CF93DF9300D01F922C
+:10218000CDB7DEB72091FB03243021F523E029836E
+:102190009B838A832093E9008FEF06C095ED9A9583
+:1021A000F1F70000882329F09091E800815095FF15
+:1021B000F5CF8091E80085FF0DC040E050E063E07E
+:1021C00070E0CE0101960E94A6148091E8008E77FF
+:1021D0008093E8000F900F900F90DF91CF910895BA
+:1021E000CF93DF9300D01F92CDB7DEB72091FB03D2
+:1021F000243029F522E029839B838A8383E080931E
+:10220000E9008FEF06C095ED9A95F1F7000088235D
+:1022100029F09091E800815095FFF5CF8091E8007A
+:1022200085FF0DC040E050E063E070E0CE01019614
+:102230000E94A6148091E8008E778093E8000F90AA
+:102240000F900F90DF91CF9108952091FB032430E0
+:10225000F9F422E02093E9002FEF06C035ED3A951E
+:10226000F1F70000222329F03091E800215035FFDA
+:10227000F5CF2091E80025FF0BC040E050E065E07D
+:1022800070E00E94A6148091E8008E778093E800A9
+:102290000895CF93DF93EC018091FB03843041F5E7
+:1022A00081E08093E9008FEF06C095ED9A95F1F7F4
+:1022B0000000882329F09091E800815095FFF5CF28
+:1022C0008091E80085FF14C040E050E068E070E0D5
+:1022D000CE010E94A6148091E8008E778093E800DA
+:1022E00088E0FE01A9E8B2E001900D928A95E1F73D
+:1022F000DF91CF910895BF92CF92DF92EF92FF923C
+:102300000F931F93CF93DF937C01B62EE90100E07A
+:1023100010E0C42ED12C0BC04991202F2B0D2F770C
+:102320004F776FE0C7010E94DC190F5F1F4F0C153C
+:102330001D0594F3DF91CF911F910F91FF90EF90C6
+:10234000DF90CF90BF90089570E06F5F7F4F6F7008
+:1023500077270C94DC190F931F93CF93C42F63300E
+:10236000710509F04AC0842F807F803849F1803997
+:1023700009F043C0622F6F7770E080E090E00E9428
+:10238000003220E030E040E451E40E9465319B01DE
+:10239000AC0160E070E080E090E40E9417330F77BA
+:1023A00010E023E0159507952A95E1F72DEC3CEC1C
+:1023B00042E053E40E94B432A8010E94E30F1DC022
+:1023C000622F6F7770E080E090E00E94003220E0A2
+:1023D00030E040E451E40E9465319B01AC0160E0D3
+:1023E00070E080E090E40E9417332DEC3CEC42E07A
+:1023F00053E40E94B4320E94130DCC3F29F4CF91D4
+:102400001F910F910C94E60CCF911F910F9108959D
+:102410000F931F93CF93DF93CDB7DEB727970FB6F8
+:10242000F894DEBF0FBECDBF8C0114C08A810E941C
+:10243000B6199A819D839B819E839C819F83811184
+:102440001EC089818430B1F08730A1F08630A1F0C0
+:102450008530A1F0BE016F5F7F4F84E791E00E945D
+:10246000231D8111E3CF84E791E00E94141D0E9497
+:102470008F190DC083E003C082E001C081E0AE018E
+:102480004B5F5F4F682FC8010E94491AE3CF279620
+:102490000FB6F894DEBF0FBECDBFDF91CF911F9175
+:1024A0000F910895EF92FF920F93CF93DF9300D097
+:1024B00000D000D0CDB7DEB77B014A832B830C83DD
+:1024C000842F2E834D830E94B6192E814D81811158
+:1024D0001BC082E0E816F10479F083E0E816F1040D
+:1024E00021F0EA94EF2821F50BC0073F11F487E0B3
+:1024F00001C084E089830BC0273FD9F786E0FACF7B
+:10250000473FB9F785E0F6CF42954F704983BE014A
+:102510006F5F7F4F84E791E00E94D91C84E791E0D0
+:102520000E94F71C84E791E00E94141D0E948F19FD
+:1025300026960FB6F894DEBF0FBECDBFDF91CF91C8
+:102540000F91FF90EF9008958091FA03811109C0D7
+:102550000E9495160E94F2168091E200846080939A
+:10256000E20008951092FA030895089508950C94D6
+:10257000B229809192028F5F8093920262E30E945F
+:102580007C34911135C0109292028091930288237D
+:1025900079F18091FB03843049F58091E9008F70D7
+:1025A0009091EC0090FF02C090E801C090E0982B61
+:1025B00084E08093E9008091EB0080FF14C080915B
+:1025C000EE0087FD03C00FC01092F1008091E8007B
+:1025D00085FDFACF8091E80080FF05C08091E8007A
+:1025E0008E778093E8009F709093E9001092930299
+:1025F000089542E061EC81E00E940B1642E061EC3C
+:1026000082E00E940B1642E061EC83E00E940B1610
+:1026100042E261EC84E00E940B1642E361E885E04F
+:102620000E940B1642E360E886E00C940B16809142
+:10263000FD03833009F454C030F4813071F08230EE
+:1026400009F0A5C08CC08A3009F479C08B3009F438
+:102650005FC0893009F09BC020C08091FC03813AA3
+:1026600009F095C08091E800877F8093E800809111
+:10267000000490910104892B21F060E080E090E05B
+:1026800003C068E089E892E070E00E944415809100
+:10269000E8008B778093E80008958091FC038132F5
+:1026A00009F075C08091000490910104892B09F014
+:1026B0006EC08091E800877F8093E80005C080911C
+:1026C000FB03882309F463C08091E80082FFF7CF01
+:1026D0008091F100809391028091E8008B7753C044
+:1026E0008091FC03813A09F052C0809100049091DE
+:1026F0000104892B09F04BC08091E800877F80930B
+:10270000E8008091E80080FFFCCF80918A0136C00C
+:102710008091FC038132D9F58091000490910104ED
+:10272000892BA9F58091E800877F8093E8000E94BB
+:1027300042168091FE0380938A010C948B23809132
+:10274000FC03813221F58091E800877F8093E800C7
+:102750000E9442168091FF03809388020895809121
+:10276000FC03813AA1F48091E800877F8093E80020
+:102770008091E80080FFFCCF809188028093F10077
+:102780008091E8008E778093E8000C9442160895BB
+:1027900084E093E00E94181A62E572E184E093E01D
+:1027A0000E946E1A68E072E184E093E00E94721A5F
+:1027B00084B7877F84BF88E10FB6F8948093600068
+:1027C000109260000FBE90E080E80FB6F8948093FE
+:1027D0006100909361000FBE0E949C1D0E9495169F
+:1027E0000E94F2168091E20084608093E200789467
+:1027F0006BEA71E184E093E00E94141A64EA71E1EB
+:1028000084E093E00E940C1A6BE771E184E093E0AE
+:102810000E94101A0E94370E0E948F190E949E1D5E
+:1028200080E891E00E94481D0BC00E946C298091B5
+:10283000F903882329F00E949A2981110E9490149B
+:102840008091FB03853089F384E093E00E94211C92
+:102850000E94A81DF5CF292F332723303105B1F071
+:102860004CF42130310509F44DC02230310509F016
+:102870004EC007C02132310541F12232310591F1BC
+:1028800046C0E0EDF0E08CE594E045C0992781304A
+:10289000910569F08230910589F0892B09F037C0E4
+:1028A000E8E5F4E0E491F0E088E594E034C0EAE2A1
+:1028B000F4E0E491F0E08AE294E02DC0EEEFF3E082
+:1028C000E491F0E08EEF93E026C0643000F5E62F4F
+:1028D000F0E0EE0FFF1FE550FE4F80819181E9E0AF
+:1028E000F0E019C0643098F4E62FF0E0DF01AA0FA1
+:1028F000BB1FAD5FBD4F8D919C91E55FFD4FE081AA
+:10290000F0E009C0E2E1F0E08CE295E004C0E0E034
+:10291000F0E080E090E0DA018D939C93CF01089580
+:1029200080E189BD82E189BD09B400FEFDCF8091BF
+:10293000D8008F7D8093D8008091E00082608093E2
+:10294000E0008091E00081FDFCCF0895BF92CF921E
+:10295000DF92EF92FF920F931F93CF93DF937C014F
+:102960008B01EA010E946316B82E811133C02097B3
+:1029700031F028813981021B130BE20EF31EC12CAA
+:10298000D12C23C08091E80085FD15C08091E8001E
+:102990008E778093E800209749F0888199818C0D8B
+:1029A0009D1D9983888325E0B22E14C00E94631672
+:1029B000882359F00EC0F70181917F018093F100C7
+:1029C00001501109FFEFCF1ADF0A01151105D1F6E9
+:1029D00001C0B82E8B2DDF91CF911F910F91FF90E9
+:1029E000EF90DF90CF90BF900895BF92CF92DF928B
+:1029F000EF92FF920F931F93CF93DF937C018B0194
+:102A0000EA010E946316B82E811133C0209731F07D
+:102A100028813981021B130BE20EF31EC12CD12C2D
+:102A200023C08091E80085FD15C08091E8008B7778
+:102A30008093E800209749F0888199818C0D9D1D35
+:102A40009983888345E0B42E14C00E9463168823BE
+:102A500059F00EC08091F100F70181937F01015080
+:102A60001109FFEFCF1ADF0A01151105D1F601C0D8
+:102A7000B82E8B2DDF91CF911F910F91FF90EF908A
+:102A8000DF90CF90BF9008954091020450910304CD
+:102A90004617570748F06115710539F44091E80071
+:102AA0004E774093E80001C0BA01FC0140E033C01A
+:102AB0008091FB03882309F444C0853009F443C0A6
+:102AC0008091E80083FD41C08091E80082FD33C021
+:102AD0008091E80080FF1FC09091F3008091F20088
+:102AE000392F20E0A901482BCA0106C0419140932B
+:102AF000F1006150710901966115710519F0883076
+:102B00009105A0F341E0089709F040E08091E800CA
+:102B10008E778093E8006115710551F64111C8CF99
+:102B20000AC08091FB03882361F0853061F08091B9
+:102B3000E80083FD0AC08091E80082FFF2CF80E0C8
+:102B4000089582E0089583E0089581E0089540911A
+:102B50000204509103044617570748F061157105A8
+:102B600039F44091E8004E774093E80001C0BA0183
+:102B7000FC0140E034C08091FB03882309F445C088
+:102B8000853009F444C08091E80083FD42C0809103
+:102B9000E80082FD34C08091E80080FF20C0909161
+:102BA000F3008091F200392F20E0A901482BCA01DF
+:102BB00007C044914093F10031966150710901962C
+:102BC0006115710519F08830910598F341E0089777
+:102BD00009F040E08091E8008E778093E80061156D
+:102BE000710549F64111C7CF0AC08091FB038823C4
+:102BF00061F0853061F08091E80083FD0AC080912A
+:102C0000E80082FFF2CF80E0089582E0089583E03B
+:102C1000089581E00895982F2CC09093E9009817AB
+:102C200039F07091EC002091ED005091F00003C05C
+:102C3000242F762F50E021FD02C09F5F1AC03091F3
+:102C4000EB003E7F3093EB003091ED003D7F309301
+:102C5000ED003091EB0031603093EB007093EC00AD
+:102C60002093ED005093F0002091EE0027FDE5CF7A
+:102C700007C0973090F28F708093E90081E008954B
+:102C800080E008958091FC0387FD05C08091E800F5
+:102C900080FF0EC012C08091E80082FD05C08091C7
+:102CA000FB038111F8CF08958091E8008B7708C06D
+:102CB0008091FB038111EACF08958091E8008E771F
+:102CC0008093E80008958091E4009091E50045E646
+:102CD0002091EC0020FD1FC023C02091FB03222384
+:102CE00091F0253091F02091EB0025FD10C020914E
+:102CF000E4003091E5002817390751F34150C9012C
+:102D000039F784E0089582E0089583E0089581E032
+:102D1000089580E008952091E80020FFDECFF9CFEC
+:102D20002091E80022FFD9CFF4CF0E9403170E9420
+:102D30000B17E0EEF0E0808181608083E8EDF0E049
+:102D400080818F77808319BCA7EDB0E08C918E7F56
+:102D50008C9380818F7E80831092FA0308950F9365
+:102D60001F93CF93DF930E9403170E940B17C8EDA8
+:102D7000D0E088818F778883888180688883888184
+:102D80008F7D888319BC1092FB031092F703109279
+:102D9000F9031092F80300EE10E0F80180818B7FB8
+:102DA000808388818160888342E060E080E00E94C7
+:102DB0000B16E1EEF0E080818E7F8083E2EEF0E0A2
+:102DC000808181608083808188608083F801808138
+:102DD0008E7F8083888180618883DF91CF911F916E
+:102DE0000F910895E8EDF0E080818F7E8083E7ED1C
+:102DF000F0E080818160808384E082BF81E0809305
+:102E0000FA030C94AF16E8EDF0E080818E7F8083AA
+:102E10001092E20008951092DA001092E1000895F5
+:102E20001F920F920FB60F9211242F933F934F933F
+:102E30005F936F937F938F939F93AF93BF93EF9322
+:102E4000FF938091E10082FF0BC08091E20082FF3E
+:102E500007C08091E1008B7F8093E1000E94B9124E
+:102E60008091DA0080FF1FC08091D80080FF1BC0D6
+:102E70008091DA008E7F8093DA008091D90080FF04
+:102E80000DC080E189BD82E189BD09B400FEFDCF9E
+:102E900081E08093FB030E94A41205C019BC10922C
+:102EA000FB030E94B2128091E10080FF19C0809163
+:102EB000E20080FF15C08091E2008E7F8093E200E7
+:102EC0008091E20080618093E2008091D80080626E
+:102ED0008093D80019BC85E08093FB030E94B61252
+:102EE0008091E10084FF30C08091E20084FF2CC01B
+:102EF00080E189BD82E189BD09B400FEFDCF8091EA
+:102F0000D8008F7D8093D8008091E1008F7E8093E0
+:102F1000E1008091E2008F7E8093E2008091E200E8
+:102F200081608093E2008091F703882311F084E0B0
+:102F300007C08091E30087FF02C083E001C081E009
+:102F40008093FB030E94B7128091E10083FF29C0A8
+:102F50008091E20083FF25C08091E100877F80930C
+:102F6000E10082E08093FB031092F7038091E1007F
+:102F70008E7F8093E1008091E2008E7F8093E2005B
+:102F80008091E20080618093E20042E060E080E0B6
+:102F90000E940B168091F00088608093F0000E94E0
+:102FA000B512FF91EF91BF91AF919F918F917F915A
+:102FB0006F915F914F913F912F910F900FBE0F90A6
+:102FC0001F9018951F920F920FB60F9211242F93F6
+:102FD0003F934F935F936F937F938F939F93AF93A1
+:102FE000BF93CF93EF93FF938091E9008F709091FF
+:102FF000EC0090FF02C090E801C090E0C92FC82B00
+:103000001092E9008091F000877F8093F00078941F
+:103010000E9426181092E9008091F0008860809349
+:10302000F000CF70C093E900FF91EF91CF91BF9175
+:10303000AF919F918F917F916F915F914F913F9150
+:103040002F910F900FBE0F901F9018951F93CF9345
+:10305000DF93CDB7DEB7AC970FB6F894DEBF0FBEE7
+:10306000CDBFECEFF3E08091F100819324E0E430F8
+:10307000F207C9F70E9417138091E80083FF37C158
+:103080008091FC039091FD03953009F488C038F4D9
+:103090009130B1F170F0933009F029C131C098300E
+:1030A00009F4F8C0993009F404C1963009F01FC141
+:1030B0009DC0803821F0823809F019C108C0809184
+:1030C000F8039091F903992389F082600FC08091F1
+:1030D0000004909101048F7099278093E9008091FA
+:1030E000EB0085FB882780F91092E9009091E800B9
+:1030F000977F9093E8008093F1001092F100D5C083
+:10310000882319F0823009F0F2C08F7121F08230EB
+:1031100009F0EDC00BC08091FE03813009F0E7C0DB
+:10312000933009F080E08093F9032FC08091FE0373
+:1031300081112BC080910004909101048F70992718
+:10314000009709F4D4C08093E9002091EB0020FFA0
+:103150001CC02091FD03233021F48091EB0080629C
+:1031600012C09091EB0090619093EB0021E030E071
+:1031700001C0220F8A95EAF72093EA001092EA0034
+:103180008091EB0088608093EB001092E9008091C1
+:10319000E800877F8093E8000E944216A8C0811152
+:1031A000A6C08091FE039091FF038F779927182F77
+:1031B0009091E3009078982B9093E3008091E80041
+:1031C000877F8093E8000E9442168091E80080FF8C
+:1031D000FCCF8091E30080688093E300112311F01D
+:1031E00083E001C082E08093FB0381C0805882307D
+:1031F00008F07DC08091FE039091FF038C3D23E099
+:10320000920779F583E08A838AE289834FB7F8943D
+:10321000DE01139620E03EE051E2E32FF0E0509310
+:103220005700E49120FF03C0E295EF703F5FEF701D
+:103230008E2F90E0EA3010F0C79601C0C0968D93B3
+:103240009D932F5F243149F74FBF8091E800877F1E
+:103250008093E8006AE270E0CE0101960E94441576
+:1032600013C0AE01455D5F4F609100040E942B14B6
+:103270000097E9F12091E800277F2093E800BC0146
+:103280008BA59CA50E94A7158091E8008B77809361
+:10329000E8002DC0803859F58091E800877F809341
+:1032A000E8008091F7038093F1008091E8008E7729
+:1032B00071CF81111CC09091FE039230C0F48091B7
+:1032C000E800877F8093E8009093F7030E944216FE
+:1032D0008091F703811104C08091E30087FF02C051
+:1032E00084E001C081E08093FB030E94F912809189
+:1032F000E80083FF0AC08091E800877F8093E800A0
+:103300008091EB0080628093EB00AC960FB6F8944E
+:10331000DEBF0FBECDBFDF91CF911F910895CF9338
+:103320008091FB038823B1F08091E9008F70909128
+:10333000EC0090FF02C090E801C090E0C92FC82BBC
+:103340001092E9008091E80083FD0E942618CF705A
+:10335000C093E900CF910895881F8827881F08959A
+:1033600091E0883F08F490E0892F0895982F907F8E
+:10337000903B99F038F4903981F0903A71F09038A0
+:10338000C9F40BC0903DA1F018F4903C99F410C022
+:10339000903E19F0903F71F402C083E00895E82F49
+:1033A000E15FEF3038F4F0E0E15FFD4F8081089598
+:1033B00082E0089580E008950F932F774F776F7024
+:1033C000606BDC01ED91FC91022F242F462F63E00E
+:1033D00070E009950F9108950F932F774F776F70D5
+:1033E0006069DC01ED91FC91022F242F462F63E0F0
+:1033F00070E009950F9108950F932F774F776F70B5
+:103400006068DC01ED91FC91022F242F462F63E0D0
+:1034100070E009950F910895FC017383628308950C
+:10342000FC01738F628F0895FC01758F648F08957E
+:10343000CF93DF93EC011DA21FA21EA2BC01685D09
+:103440007F4F40EC88519F4F0E94551C1B821A826F
+:103450001D821C821F821E82198618861B861A8670
+:103460001D861C861F861E86198A188A1B8A1A8A40
+:103470001D8A1C8A1F8A1E8A198E188E1B8E1A8E10
+:103480001D8E1C8E1F8E1E8E19A218A2DF91CF9149
+:103490000895CF92DF92FF920F931F93CF93DF9304
+:1034A0001F92CDB7DEB7F62E6A018C0108511F4F6F
+:1034B00008C0F60161916F01C80149830E945C1C3C
+:1034C00049818C2D841B8F15A0F30F90DF91CF9134
+:1034D0001F910F91FF90DF90CF900895FC017183B1
+:1034E00060830895FC0171A360A30895AF92BF9219
+:1034F000CF92DF92EF92FF920F931F93CF93DF93C0
+:1035000000D01F92CDB7DEB77C016B01142FB22E15
+:10351000A02EDC0195968C9195978430F1F45A9603
+:10352000ED91FC915B97309709F4D8C0CB010197DE
+:1035300063E070E00E948834DB01AA0FBB1FA60F76
+:10354000B71F49832A830B834C2D4A1B9E012F5F93
+:103550003F4FBD01C7010995B1C06230710509F443
+:1035600053C06330710529F06130710509F09CC0CA
+:1035700083C0842F807F803A01F130F48038B9F025
+:10358000803909F0ABC00DC0803EE9F0803F09F101
+:10359000803B09F0A3C0D7011296ED91FC911397DF
+:1035A00023C0D7011496ED91FC9115971DC0D7014A
+:1035B0001696ED91FC91179717C0D7011896ED91CB
+:1035C000FC91199711C0D7011A96ED91FC911B97A8
+:1035D0000BC0423F09F082C0D7011C96ED91FC91CF
+:1035E0001D97309731F47AC0309709F477C0123FB5
+:1035F00021F42A2D4B2D62EF04C0612F6F702A2D0C
+:103600004B2DC70109955AC0842F807F803D59F00A
+:10361000803F79F0803C09F061C0D7011E96ED91A2
+:10362000FC911F9719C0D7015096ED91FC915197CD
+:1036300013C0433F31F4D7015296ED91FC9153975B
+:1036400008C0413F09F04AC0D7015496ED91FC9162
+:103650005597309741F442C0309709F43FC0133F6B
+:1036600011F0113F19F44B2D612F03C0612F6F70C2
+:103670004B2DC701099522C0842F0E94B0198823C1
+:1036800031F0D7015696ED91FC91579707C0163F40
+:1036900029F5D7015896ED91FC9159973097F1F0A3
+:1036A000612FC70109950AC064307105A8F416C0DE
+:1036B0000A2D2B2D412FB601C7010995D7015E9622
+:1036C000ED91FC915F97309789F00A2D2B2D412FBA
+:1036D000B601C70109950AC0C12CD12CD7015C964F
+:1036E000ED91FC915D97309719F7E8CF0F900F900F
+:1036F0000F90DF91CF911F910F91FF90EF90DF908E
+:10370000CF90BF90AF900895EF92FF920F931F93C9
+:10371000CF93DF93EC01162F862F0E94B0198823D8
+:1037200069F0FDA081E08DA300E020E0412F61E081
+:1037300070E0CE010E94761AFDA27CC0812F0E940B
+:10374000AC194DA1882309F440C0443029F01AA3D4
+:1037500021E030E03FA32EA3812F0E94B6198130D3
+:1037600031F070F0823051F0833059F507C08DA3ED
+:1037700000E020E0412F61E070E01EC08DA35AC040
+:10378000103F19F0173FE9F404C084E08DA31AA399
+:103790003FC02EA13FA1C90163E070E00E948834C0
+:1037A0008C0F9D1FFC0112A3B9016F5F7F4F7FA398
+:1037B0006EA30CA12BA14AA1CE010E94761A1DA2D4
+:1037C00039C01DA21FA21EA235C0442399F12EA10B
+:1037D0003FA1C90163E070E00E9488347C01FE01D2
+:1037E000E80FF91F12A3B9016F5F7F4F7FA36EA38C
+:1037F0008130910591F082E0E816F104D9F40CA132
+:103800002BA14AA1CE010E94761A8DA1843091F09D
+:1038100081E090E09FA38EA30DC0423059F400E0F8
+:103820002BA14AA1CE010E94761A8DA1843011F0FD
+:10383000FFA2EEA2DF91CF911F910F91FF90EF9029
+:103840000895CF92DF92EF92FF920F931F93CF9341
+:10385000DF93EC01E8A1F9A1309709F009958E01F9
+:1038600008511F4FC8010E948E1CE12CF12CC82E5C
+:10387000D12C0FC060E0C8010E94A21C682FCE01AD
+:103880000E94841B61E0C8010E94B31C8FEFE81AFC
+:10389000F80AEC14FD0470F3DF91CF911F910F91A2
+:1038A000FF90EF90DF90CF900895FC0142837483E6
+:1038B00063831182108208950F931F93CF93DF9338
+:1038C000EC01062F0E94D41C182F298130E0C90179
+:1038D00001966A8170E00E949C34488150E0841710
+:1038E000950729F4812F0E94D71C80E012C0EB813C
+:1038F000FC81E20FF31F00832981822F90E0019663
+:103900006A8170E00E949C348983812F0E94D71CB9
+:1039100081E0DF91CF911F910F910895CF93DF93B5
+:10392000EC010E94D41C29819881291710F0C22F24
+:1039300002C0CA81C20FC91B0E94D71C8C2FDF9105
+:10394000CF910895FC012081862F90E0820F911D78
+:10395000628170E00E949C340380F481E02DE80FC6
+:10396000F91F808108950F931F93CF93DF931F92C8
+:10397000CDB7DEB78C0169830E94D41C482FF801B3
+:1039800080816981262F30E0280F311D6281C901B5
+:1039900070E00E949C348083842F0F90DF91CF9140
+:1039A0001F910F910C94D71C8FB7F89408958FBF77
+:1039B0000895FC01CB012091FB032430B1F4218157
+:1039C0002F702093E90040E050E064E070E00E9436
+:1039D000A61481110BC09091E80095FD07C090914D
+:1039E000E8009E779093E800089582E00895209182
+:1039F000FB032430A9F4FC0181818F708093E900DE
+:103A00003091F3002091F200932F80E0822B892BDC
+:103A100049F08091E8008E778093E8000C9463165B
+:103A200082E0089580E008952091FB03243051F452
+:103A3000FC0121812F702093E9002091E80020FDF6
+:103A40000C94F71C0895FC01CB012091FB0324305A
+:103A500011F080E0089526812F702093E9002091D5
+:103A6000E80022FFF6CF2091E80025FFF2CF40E0EA
+:103A700050E064E070E00E94F5148091E80085FD5C
+:103A800005C08091E8008B778093E80081E008957D
+:103A900090939502809394020895E0919402F0919E
+:103AA0009502309721F00190F081E02D099480E09B
+:103AB0000895E0919402F0919502309721F00280F0
+:103AC000F381E02D09940895E0919402F09195021C
+:103AD000309721F00480F581E02D0994089520911C
+:103AE0009602309197028217930771F09093970294
+:103AF00080939602E0919402F0919502309721F024
+:103B00000680F781E02D0994089520919802309164
+:103B100099028217930771F090939902809398020B
+:103B2000E0919402F0919502309721F00084F185A4
+:103B3000E02D0994089508950C949B1D0E94E62998
+:103B40000E94F3060E94BA2A0C9465300C942C064D
+:103B50005F926F927F928F929F92AF92BF92CF921D
+:103B6000DF92EF92FF920F931F93CF93DF93CDB726
+:103B7000DEB72A970FB6F894DEBF0FBECDBF0E9406
+:103B8000E9079AE9C92E92E0D92E00E010E0AA24B4
+:103B9000A394B12C502E802F0E9439093C01F601CC
+:103BA000E190F1906F01E826F926E114F10431F477
+:103BB0000F5F1F4F0530110569F73AC08091F10280
+:103BC00081FD0E94420920E030E04501022E02C042
+:103BD000880C991C0A94E2F7C4018E219F21892B3D
+:103BE00009F12E835F826820792081E0672809F43B
+:103BF00080E088870E94EF298160782F9A878987E3
+:103C00004E815F8168858A850E94611EF801EE0FF2
+:103C1000FF1FE656FD4F808191818825992591836C
+:103C2000808316C02F5F3F4F2C30310571F6C0CF17
+:103C30008FEF89838A831B820E94EF298160782F0E
+:103C40009D838C8349815A816B818D810E94611E85
+:103C50000E94A72D1091A4020E944D1D1817D9F0A3
+:103C60000E944D1D8093A4022A960FB6F894DEBFE1
+:103C70000FBECDBFDF91CF911F910F91FF90EF90BD
+:103C8000DF90CF90BF90AF909F908F907F906F907C
+:103C90005F900C94A61D2A960FB6F894DEBF0FBE57
+:103CA000CDBFDF91CF911F910F91FF90EF90DF90EB
+:103CB000CF90BF90AF909F908F907F906F905F90CC
+:103CC0000895CF93DF93CDB7DEB72B970FB6F89457
+:103CD000DEBF0FBECDBF4F83588769877A878B873A
+:103CE000DE01119686E0FD0111928A95E9F785E0E3
+:103CF000FE01379601900D928A95E1F749815A812C
+:103D00006B817C818D819E810E944A262B960FB605
+:103D1000F894DEBF0FBECDBFDF91CF910895089517
+:103D2000CF93C82F882309F4C1C0823859F40E9468
+:103D30004D1D81FDBBC089E30E94B1280E943D2931
+:103D400089E30CC0833879F40E944D1D80FDAEC01C
+:103D500083E50E94B1280E943D2983E50E94D32873
+:103D6000CF910C943D29843859F40E944D1D82FD59
+:103D70009DC087E40E94B1280E943D2987E4EECFD0
+:103D80008450813A48F48C2F0E94C72F81118EC035
+:103D90008C2F0E94B128E4CF8C2F805E883050F4A5
+:103DA000C77081E090E001C0880FCA95EAF70E94D1
+:103DB000F428D6CF8C2F855A833078F4C53A29F071
+:103DC000C63A31F482E890E005C081E890E002C094
+:103DD00083E890E0CF910C946F1D8C2F885A83312B
+:103DE00008F064C0C83A39F1C93A41F1CA3A49F118
+:103DF000CB3A51F1CC3A59F1CD3A61F1C03B69F17E
+:103E0000CE3A71F1CF3A79F1C13B81F1C23B89F1F0
+:103E1000C33B91F1C43B99F1C53BA1F1C63BA9F16C
+:103E2000C73BB1F1C83BB9F1C93BC1F1CA3BC9F5C8
+:103E30008AE292E038C082EE90E035C089EE90E0F0
+:103E400032C08AEE90E02FC085EB90E02CC086EB6C
+:103E500090E029C087EB90E026C08CEC90E023C076
+:103E60008DEC90E020C083E891E01DC08AE891E0ED
+:103E70001AC082E991E017C084E991E014C081E2A0
+:103E800092E011C083E292E00EC084E292E00BC0A7
+:103E900085E292E008C086E292E005C087E292E007
+:103EA00002C080E090E0CF910C94851DCF910895E1
+:103EB000882309F44DC0823859F40E944D1D81FFBA
+:103EC00047C089E30E94B1280E943D2989E30CC0C4
+:103ED000833871F40E944D1D80FF3AC083E50E9433
+:103EE000B1280E943D2983E50E94D3280C943D29E6
+:103EF000843859F40E944D1D82FF2AC087E40E9435
+:103F0000B1280E943D2987E4EFCF982F9450913A31
+:103F100008F4EACF982F905E983058F4282F277035
+:103F200081E090E001C0880F2A95EAF70E94FA2804
+:103F3000DDCF982F955A933020F480E090E00C94D8
+:103F40006F1D885A833120F480E090E00C94851D29
+:103F50000895882321F00E94F4280C943D290895A7
+:103F6000882321F00E94FA280C943D290895BF92DD
+:103F7000CF92DF92EF92FF920F931F93CF93DF9335
+:103F8000CDB7DEB727970FB6F894DEBF0FBECDBF13
+:103F90008C0185E0F801DE01119601900D928A9561
+:103FA000E1F7F801D080E180F280558152955F7091
+:103FB00083819481892B41F0FFEFEF1208C081E0EB
+:103FC00090E0DF1631F003C081E090E002C080E0B5
+:103FD00090E080FD7CC3C8015E830E948F1ED98261
+:103FE000EA8289819A810E946E28B92E8F830E946D
+:103FF0006D280E9495275E816F81FF2021F00E942D
+:1040000011296F815E812B2D22952F7030E0253094
+:10401000310509F4E6C06CF4243031050CF0A2C07F
+:104020004B2D407F8B2D8F70223031050CF045C019
+:1040300017C02C3031054CF42A3031050CF0E7C1A3
+:104040002830310509F043C3E5C02D30310509F4AE
+:10405000BAC20CF4A2C22F30310509F038C323C311
+:10406000182F411101C002C01295107FFF2059F096
+:10407000112309F46BC2812F6F830E9404290E94CF
+:104080003D296F8163C2862F0E94581F112309F4B6
+:104090001EC3812F0E940A2927960FB6F894DEBF0F
+:1040A0000FBECDBFDF91CF911F910F91FF90EF9089
+:1040B000DF90CF90BF900C943D29403211F0829553
+:1040C000807F662319F0613071F523C0FF20B1F0C5
+:1040D000511101C032C0513081F527960FB6F894C6
+:1040E000DEBF0FBECDBFDF91CF911F910F91FF902B
+:1040F000EF90DF90CF90BF900C942429511101C014
+:1041000003C0513009F4E3C28E830E9427298E81B7
+:104110009AC1FF2021F0563008F0D9C20EC05530A8
+:1041200008F0D5C290C1FF20C9F0552331F0F80145
+:10413000958190FF0BC29F70958327960FB6F894D8
+:10414000DEBF0FBECDBFDF91CF911F910F91FF90CA
+:10415000EF90DF90CF90BF900C94A91F552309F4E6
+:1041600072C109C22B2D26952695237030E02115AA
+:10417000310529F02130310509F0A9C219C0FF200D
+:1041800021F0862F9B2D937002C080E090E027964F
+:104190000FB6F894DEBF0FBECDBFDF91CF911F9158
+:1041A0000F91FF90EF90DF90CF90BF900C946F1D18
+:1041B000FF2021F0862F9B2D937002C080E090E0BD
+:1041C00027960FB6F894DEBF0FBECDBFDF91CF911B
+:1041D0001F910F91FF90EF90DF90CF90BF900C94C4
+:1041E000851D862FFF2019F00E94AD2C02C00E9471
+:1041F000152D27960FB6F894DEBF0FBECDBFDF9109
+:10420000CF911F910F91FF90EF90DF90CF90BF90D3
+:104210000C949C2D8B2D837009F079C0F11057C23E
+:10422000262F229526952770220F220F862F8F701A
+:10423000C82ED12CE12CF12C022E04C0CC0CDD1C9C
+:10424000EE1CFF1C0A94D2F764FF10C06FE070E010
+:1042500080E090E004C0660F771F881F991F2A95A1
+:10426000D2F7609570958095909503C060E070E0FE
+:10427000CB012B2D269526952370422F50E04230FE
+:104280005105D9F04330510569F16C297D298E29FA
+:104290009F294130510551F127960FB6F894DEBFA2
+:1042A0000FBECDBFDF91CF911F910F91FF90EF9087
+:1042B000DF90CF90BF900C94AA276C297D298E297E
+:1042C0009F2927960FB6F894DEBF0FBECDBFDF91B2
+:1042D000CF911F910F91FF90EF90DF90CF90BF9003
+:1042E0000C94BC270E94AA27C701B60127960FB6D7
+:1042F000F894DEBF0FBECDBFDF91CF911F910F911C
+:10430000FF90EF90DF90CF90BF900C949827FF2004
+:1043100019F08B2D817001C08695882309F4D7C1CF
+:10432000262F229526952770220F220F862F8F7019
+:10433000C82ED12CE12CF12C022E04C0CC0CDD1C9B
+:10434000EE1CFF1C0A94D2F764FF10C06FE070E00F
+:1043500080E090E004C0660F771F881F991F2A95A0
+:10436000D2F7609570958095909503C060E070E0FD
+:10437000CB012B2D269526952370422F50E04230FD
+:104380005105D9F04330510569F16C297D298E29F9
+:104390009F294130510551F127960FB6F894DEBFA1
+:1043A0000FBECDBFDF91CF911F910F91FF90EF9086
+:1043B000DF90CF90BF900C9449286C297D298E29DD
+:1043C0009F2927960FB6F894DEBF0FBECDBFDF91B1
+:1043D000CF911F910F91FF90EF90DF90CF90BF9002
+:1043E0000C945B280E944928C701B60127960FB696
+:1043F000F894DEBF0FBECDBFDF91CF911F910F911B
+:10440000FF90EF90DF90CF90BF900C943728603FE3
+:1044100059F120F4603E08F494C008C0623F09F4EA
+:1044200067C0F0F1633F09F08CC065C0162F1F70A4
+:104430008B2D8F71FF2021F00E94E227812F7DCEEE
+:104440000E94FD27812F27960FB6F894DEBF0FBE7E
+:10445000CDBFDF91CF911F910F91FF90EF90DF9033
+:10446000CF90BF900C94B01FFF20B1F0553008F0F2
+:104470002EC18B2D8F7127960FB6F894DEBF0FBE1D
+:10448000CDBFDF91CF911F910F91FF90EF90DF9003
+:10449000CF90BF900C941C28563008F018C1E9CF7B
+:1044A000FF2099F08B2D8F7127960FB6F894DEBF01
+:1044B0000FBECDBFDF91CF911F910F91FF90EF9075
+:1044C000DF90CF90BF900C94E2278B2D8F712796B1
+:1044D0000FB6F894DEBF0FBECDBFDF91CF911F9115
+:1044E0000F91FF90EF90DF90CF90BF900C94FD273D
+:1044F000F110EBCFD7CFFF2099F08B2D8F7127963E
+:104500000FB6F894DEBF0FBECDBFDF91CF911F91E4
+:104510000F91FF90EF90DF90CF90BF900C94D32736
+:1045200027960FB6F894DEBF0FBECDBFDF91CF91B7
+:104530001F910F91FF90EF90DF90CF90BF900C9460
+:10454000CE27FF20A9F0552309F4ACCF862F27965C
+:104550000FB6F894DEBF0FBECDBFDF91CF911F9194
+:104560000F91FF90EF90DF90CF90BF900C94901E32
+:10457000552309F4AACF862F27960FB6F894DEBFED
+:104580000FBECDBFDF91CF911F910F91FF90EF90A4
+:10459000DF90CF90BF900C94581F4B2D4F70C801E7
+:1045A0000E94560327960FB6F894DEBF0FBECDBF0C
+:1045B000DF91CF911F910F91FF90EF90DF90CF90FF
+:1045C000BF900C940027F11082C09B2D9F70492F43
+:1045D00050E04230510599F144F44115510569F01C
+:1045E0004130510509F073C019C043305105C1F184
+:1045F0004430510509F06BC044C027960FB6F894BB
+:10460000DEBF0FBECDBFDF91CF911F910F91FF9005
+:10461000EF90DF90CF90BF900C94763027960FB636
+:10462000F894DEBF0FBECDBFDF91CF911F910F91E8
+:10463000FF90EF90DF90CF90BF900C948D30279635
+:104640000FB6F894DEBF0FBECDBFDF91CF911F91A3
+:104650000F91FF90EF90DF90CF90BF900C94A93016
+:1046600027960FB6F894DEBF0FBECDBFDF91CF9176
+:104670001F910F91FF90EF90DF90CF90BF900C941F
+:10468000BC30862F27960FB6F894DEBF0FBECDBF85
+:10469000DF91CF911F910F91FF90EF90DF90CF901E
+:1046A000BF900C94E0304B2D4F70C80127960FB689
+:1046B000F894DEBF0FBECDBFDF91CF911F910F9158
+:1046C000FF90EF90DF90CF90BF900C944309279616
+:1046D0000FB6F894DEBF0FBECDBFDF91CF911F9113
+:1046E0000F91FF90EF90DF90CF90BF9008950E94C0
+:1046F00011290E9421290E94E6280E943D290E943A
+:10470000482E0E949C2D80E090E00E946F1D80E06A
+:1047100090E00C94851D0E9401290C9477230E943F
+:104720006E28292F22952F7030E02C3031054CF463
+:104730002A3031056CF4225031092230310590F4D1
+:1047400007C02C30310551F02F30310559F406C027
+:10475000803E10F0803F31F481E0089593FB88277C
+:1047600080F9089580E00895CF93DF9300D000D0C2
+:104770001F92CDB7DEB70F900F900F900F900F9054
+:10478000DF91CF910895CF93DF9300D000D000D078
+:10479000CDB7DEB726960FB6F894DEBF0FBECDBFFD
+:1047A000DF91CF9108951F93CF93DF93C091DB02E8
+:1047B00016E012C0D0E01C9FF0011D9FF00D1124E7
+:1047C000E555FD4F408151816281738184819581DE
+:1047D0000E94C3232196C7708091DC02C813EACFE0
+:1047E000DF91CF911F9108954091A5025091A602AB
+:1047F0006091A7027091A8028091A9029091AA02EB
+:104800000C94C3230F931F93CF93DF938091AA023D
+:1048100082958F7009F069C08091A702882309F4FE
+:1048200064C0A091DB02D091DC02B091A502C091DE
+:10483000A6028091A8029091A90221E030E0BF3F3A
+:1048400011F020E030E0122FBC016095709506E079
+:104850004AC0009721F0CF3F29F4212F05C021E065
+:1048600030E002C020E030E020FD3BC04A2F50E0A5
+:10487000049FF001059FF00D1124E555FD4F2181A6
+:10488000C2132FC02081B2132CC02281211129C054
+:10489000238134812817390718F0281B390B02C0EF
+:1048A000260F371F283C3105E0F48091AA028F7053
+:1048B00080618093AA0286E0849FF001859FF00DBD
+:1048C0001124E055FD4F80818F708061808385EADF
+:1048D00092E00E94B71FDF91CF911F910F910C942E
+:1048E000D323AF5FA770AD13B4CFDF91CF911F91EA
+:1048F0000F910895EF92FF920F931F93CF93DF9341
+:10490000CDB7DEB762970FB6F894DEBF0FBECDBF4E
+:104910008C0185E0F801DE011D9601900D928A95CB
+:10492000E1F7D8014C9111965C91119712966C9118
+:1049300012971396ED90FC9014977091A502E09158
+:10494000A6028091A8029091A902009739F0EF3F4A
+:1049500041F421E030E07F3F31F003C021E030E05E
+:1049600002C020E030E020FD5CC12091A70222239C
+:1049700009F4F1C0E816F90628F09701281B390B55
+:10498000C90104C0809590958E0D9F1D883C9105AE
+:1049900008F098C08091AA02982F907F09F064C017
+:1049A000E51314C0741312C0611110C08F708061C0
+:1049B0008093AA020E94F42385EA92E00E94B71F26
+:1049C0008091AA02D80115968C9343C1EF2839F043
+:1049D0005F3F41F481E090E04F3F31F003C081E060
+:1049E00090E002C080E090E080FD03C081E0862777
+:1049F00002C080E090E080FF2EC08091DB02209119
+:104A0000DC0236E013C090E0389FF001399FF00DD2
+:104A10001124E555FD4F7181571306C0708147136E
+:104A200003C07281671317C0019687708213EBCFA2
+:104A300012C19F7059F0882309F40BC107C09F7001
+:104A400029F0F8019581907F09F403C1805E8830D8
+:104A500008F4FFC0D2C0662309F4FBC08091AA020B
+:104A600081608093AA02F5C0E51308C0741306C0E4
+:104A7000611104C0D80115968C939DC04D875E8747
+:104A80008D859E856A8B0E948F236A89882309F40D
+:104A9000B4C0662309F4B1C02091AA02822F829586
+:104AA0008F7090E002970CF4C6C08091A50290919F
+:104AB000A60298878F831986FB86EA862C87CE010B
+:104AC000079646C08091AA02982F907F59F47E2DB8
+:104AD000F98AE88A89890E94B42385EA92E00E94D3
+:104AE000B71F95C0E51311C074130FC061110DC03D
+:104AF000F8018583C8010E94B71FE5EAF2E086E06D
+:104B0000DF011D928A95E9F7A2C04D875E878D85EA
+:104B10009E856A8B0E948F236A89882309F46DC061
+:104B2000662309F46AC02091AA02822F82958F70B1
+:104B300090E002970CF47FC08091A5029091A602AC
+:104B40009A8389831B82FD82EC822E83CE0101969B
+:104B50000E94B71F70C0E816F90628F09701281BBD
+:104B6000390BC90104C0809590958E0D9F1D883C1E
+:104B7000910508F046C0662309F43FC0E51330C034
+:104B800074132EC02091AA0220FD21C0322F32952D
+:104B90003F70832F90E00097D1F0D80115962C93A9
+:104BA00015970F9741F0832F8F5F8295807F2F702D
+:104BB000282B15962C93C8010E94B71F86E0F80198
+:104BC000A5EAB2E001900D928A95E1F73EC086E039
+:104BD000F801A5EAB2E001900D928A95E1F737C09D
+:104BE0004D875E878D859E850E948F23811123C00E
+:104BF0008091AA0281608093AA02C8010E94B71F17
+:104C000026C07E2DF98AE88A89890E94B423E5EAC4
+:104C1000F2E086E0DF011D928A95E9F70E94F42315
+:104C200018C0662351F34D875E878D859E850E944F
+:104C30008F23882311F386E0F801A5EAB2E0019002
+:104C40000D928A95E1F70E9402240E94F42381E0EC
+:104C500014C080E012C04D875E878D859E850E94BE
+:104C60006E28292F22952F7030E0223031050CF468
+:104C7000E0CE243031050CF6E2CE62960FB6F89401
+:104C8000DEBF0FBECDBFDF91CF911F910F91FF907F
+:104C9000EF9008951F93CF93DF93CDB7DEB72C9796
+:104CA0000FB6F894DEBF0FBECDBF4F83588769871C
+:104CB0007A878B879C87CE0107960E947A24882367
+:104CC000D9F02F8138858A859B85892B39F03F3F24
+:104CD00019F080E090E004C02F3FD9F781E090E028
+:104CE000892B09F06DC04F81588569857A858B8540
+:104CF0009C850E94C32364C086E0FE013796DE01D6
+:104D0000119601900D928A95E1F7FF81E8854A8519
+:104D10005B854115510539F0EF3F41F481E090E0AA
+:104D2000FF3F31F003C081E090E002C080E090E0FE
+:104D300080FD46C02091DC0230E0C90101968770F9
+:104D400099276091DB0270E08617970709F440C04D
+:104D5000F983EA835D834C8396E0929FD001939F11
+:104D6000B00D1124A555BD4FFE01319601900D9255
+:104D70009A95E1F78093DC020E94D32321C0189F0B
+:104D8000C001112485559D4F0E947A24882371F11A
+:104D9000E091DB021E9FF0011124E555FD4F40819B
+:104DA000518162817381848195810E94C3238091A6
+:104DB000DB0290E00196877099278093DB0201C0A7
+:104DC00016E08091DB029091DC028913D8CF0EC0EF
+:104DD0000E948B231092DC021092DB02E5EAF2E0E3
+:104DE00086E0DF011D928A95E9F7EACF2C960FB68F
+:104DF000F894DEBF0FBECDBFDF91CF911F91089514
+:104E0000DF92EF92FF920F931F93CF93DF93EC010A
+:104E1000009709F46EC0D12CEE24E394F12C8E019E
+:104E20000F5F1F4FFE018491843748F4843008F0EF
+:104E30004CC0813071F0823009F05BC01EC08537F4
+:104E400009F43FC080F1982F9458903708F051C072
+:104E50003FC02296F8018491982F905E983050F4CC
+:104E60008770FE2D01C0FF0F8A95EAF78F2F0E94F1
+:104E7000142913C00E94901E2FC02296F80184911D
+:104E8000982F905E983060F48770FE2D01C0FF0F60
+:104E90008A95EAF78F2F0E941A290E943D291CC08B
+:104EA0000E94581F19C02296F801049107C08FE98B
+:104EB0009FE00197F1F700C0000001500111F7CF0A
+:104EC0000BC02296F801D49007C00E94901E03C028
+:104ED0008F770E94581FE8018D2D07C08150EFE9A0
+:104EE000FFE03197F1F700C00000882309F497CF65
+:104EF000F5CFDF91CF911F910F91FF90EF90DF9051
+:104F000008956093E1027093E2028093E30290932C
+:104F1000E4020C9477236093DD027093DE028093A9
+:104F2000DF029093E0020C94772308950C9481277C
+:104F30000F931F930091E1021091E2022091E3028E
+:104F40003091E402602B712B822B932B1F910F91D8
+:104F50000C9481270F931F930091E1021091E202BC
+:104F60002091E3023091E402602371238223932392
+:104F70001F910F910C9481270F931F930091E102D1
+:104F80001091E2022091E3023091E4026027712740
+:104F9000822793271F910F910C94812760E070E086
+:104FA000CB010C948B2741E050E060E070E004C03E
+:104FB000440F551F661F771F8A95D2F7CB01BA01A0
+:104FC0000C948B2741E050E060E070E004C0440F97
+:104FD000551F661F771F8A95D2F78091DD02909149
+:104FE000DE02A091DF02B091E002482B592B6A2B20
+:104FF0007B2BCB01BA010C948B2741E050E060E0A1
+:1050000070E004C0440F551F661F771F8A95D2F7C2
+:1050100040955095609570958091DD029091DE02EB
+:10502000A091DF02B091E002482359236A237B2339
+:10503000CB01BA010C948B2741E050E060E070E0B6
+:1050400004C0440F551F661F771F8A95D2F78091C1
+:10505000DD029091DE02A091DF02B091E0024827CC
+:1050600059276A277B27CB01BA010C948B270F9312
+:105070001F930091DD021091DE022091DF0230913A
+:10508000E002602B712B822B932B1F910F910C94BC
+:105090008B270F931F930091DD021091DE02209168
+:1050A000DF023091E00260237123822393231F915A
+:1050B0000F910C948B270F931F930091DD02109199
+:1050C000DE022091DF023091E00260277127822703
+:1050D00093271F910F910C948B270895CF92DF9205
+:1050E000EF92FF920F931F93CF93DF93EC01C09049
+:1050F000E102D090E202E090E302F090E4028091BD
+:10510000DD029091DE02A091DF02B091E002C82A98
+:10511000D92AEA2AFB2A0FE110E0B701A601002EE6
+:1051200004C076956795579547950A94D2F740FF46
+:1051300008C0BE01802F0E94B3048130910509F0A0
+:1051400007C00150110948F7BE0180E00E94B30476
+:10515000DF91CF911F910F91FF90EF90DF90CF9053
+:10516000089540918B0150918C0120E030E09FEF39
+:10517000FA01E20FF31F62816817A1F09F3F19F453
+:10518000611101C0922F2F5F3F4F2630310581F70B
+:1051900007C0FA01E90FF11D97FDFA958283089582
+:1051A0009F3FB9F7089540918B0150918C0120E009
+:1051B00030E0FA01E20FF31F9281981301C01282CE
+:1051C0002F5F3F4F26303105A1F7089581E090E031
+:1051D000E0918B01F0918C01E80FF91F108201968C
+:1051E00088309105A9F708959091E502982B909346
+:1051F000E502089580959091E50298239093E50249
+:1052000008951092E50208959091E602982B9093EC
+:10521000E602089580959091E60298239093E60225
+:1052200008951092E60208959091E702982B9093CA
+:10523000E702089580959091E70298239093E70202
+:1052400008951092E70208958093E802089510925D
+:10525000E802089540918B0150918C0120E030E0EC
+:1052600080E0FA01E20FF31F918191118F5F2F5FB0
+:105270003F4F27303105A9F70895E0918B01F09158
+:105280008C018091E5028083E0918B01F0918C018B
+:1052900080819091E602892B8083E0918B01F091CF
+:1052A0008C0180819091E702892B80839091E802A4
+:1052B000992361F0E0918B01F0918C018081892B21
+:1052C00080830E942A2981110E94272980918B01C5
+:1052D00090918C010C94591D8091FB03843039F11D
+:1052E0001092F20220E488E190E00FB6F894A895BD
+:1052F000809360000FBE2093600080E00E949B03BB
+:1053000080E00E942C0683B7817F846083BF83B7CF
+:10531000816083BF7894889583B78E7F83BF88E14F
+:105320000FB6F89480936000109260000FBE08954D
+:1053300008950895CF9380E00E949B030E949829CE
+:105340000E94E9070E949929C0E08C2F0E94390928
+:10535000892B29F4CF5FC530C1F780E001C081E01F
+:10536000CF9108950E948B2380E00E949B030E94AE
+:1053700065300E944D1D0C942C061F920F920FB6A3
+:105380000F9211248F939F93AF93BF938091F2025A
+:10539000811113C08091F3029091F402A091F50263
+:1053A000B091F6024196A11DB11D8093F302909336
+:1053B000F402A093F502B093F602BF91AF919F91D2
+:1053C0008F910F900FBE0F901F90189582E084BDB3
+:1053D00093E095BD9AEF97BD80936E0008958FB7C7
+:1053E000F8944091F3025091F4026091F5027091AB
+:1053F000F6028FBFCA010895CF92DF92EF92FF921B
+:105400000F931F932FB7F8944091F3025091F40239
+:105410006091F5027091F6022FBF6A017B01EE24C4
+:10542000FF248C0120E030E0C016D106E206F3062E
+:1054300020F09A01281B390B05C09C01209530955E
+:10544000240F351FC9011F910F91FF90EF90DF903E
+:10545000CF9008951F920F920FB60F9211248F9341
+:105460009F93AF93BF938091F3029091F402A09128
+:10547000F502B091F6020196A11DB11D8093F302D1
+:105480009093F402A093F502B093F602BF91AF910E
+:105490009F918F910F900FBE0F901F9018950E94B3
+:1054A0009516F8942FEF87EA91E6215080409040BE
+:1054B000E1F700C0000087E090EBDC018093050479
+:1054C00090930604A0930704B09308042CE088E1AD
+:1054D00090E00FB6F894A895809360000FBE2093DB
+:1054E0006000FFCFCF92DF92EF92FF920F931F9356
+:1054F000CF93DF93C82ED12C01E010E08D2D0E94B8
+:1055000039097C01C0E0D0E098010C2E02C0220FC6
+:10551000331F0A94E2F72E213F21232B29F42196F1
+:10552000CC30D10589F708C06C2F7D2D80E00E941A
+:105530008E04C812F4CF06C0D39485E0D812DECF13
+:1055400080E001C081E0DF91CF911F910F91FF902A
+:10555000EF90DF90CF900895CF93C82F8CE20E94F8
+:10556000722A882321F08C2FCF910C94722A80E02C
+:10557000CF910895CF930E94FD2B811102C00E940C
+:10558000DE2BC5E608C00E94E9078FE39CE901977E
+:10559000F1F700C00000C150B1F789E20E94AC2AC7
+:1055A00081110AC18AE20E94AC2A81110E94DE2B7D
+:1055B00085E00E94AC2A81110E944F2A0E94082C8B
+:1055C0008093F10287E00E94AC2A882399F18BE155
+:1055D0000E94AC2A882351F09091F10291FB882718
+:1055E00080F921E0822780FB91F922C08EE00E94A1
+:1055F000AC2A882351F09091F10292FB882780F920
+:1056000021E0822780FB92F913C080E10E94AC2A3E
+:105610009091F102882341F093FB882780F921E0E3
+:10562000822780FB93F904C0892F809580FB90F935
+:105630009093F1028091F1020E940C2C0E941A2C8E
+:105640008093020380EE0E94AC2A882341F080916F
+:105650000203982F909590FB80F98093020389E3D1
+:105660000E94AC2A882359F09091020391FB88276D
+:1056700080F921E0822780FB91F99093020382EE6A
+:105680000E94AC2A882359F09091020392FB88274C
+:1056900080F921E0822780FB92F99093020386EE45
+:1056A0000E94AC2A882359F09091020393FB88272B
+:1056B00080F921E0822780FB93F99093020383EE27
+:1056C0000E94AC2A882359F09091020394FB88270A
+:1056D00080F921E0822780FB94F99093020385E30F
+:1056E0000E94AC2A882359F09091020395FB8827E9
+:1056F00080F921E0822780FB95F99093020381E3F2
+:105700000E94AC2A882359F09091020396FB8827C7
+:1057100080F921E0822780FB96F99093020381E1D2
+:105720000E94AC2A882359F09091020397FB8827A6
+:1057300080F921E0822780FB97F990930203809102
+:1057400002030E941E2C87E20E94AC2AC82F8EE121
+:105750000E94AC2A8111C2608FE10E94AC2A8111A3
+:10576000C46080E20E94AC2A8111C86081E20E947C
+:10577000AC2A8111C06182E20E94AC2A8111C06210
+:1057800083E20E94AC2A8111C06484E20E94AC2AA8
+:10579000882311F0C06802C0CC2329F08C2F0E940E
+:1057A000152C6C2F03C00E94112C682F70E080E034
+:1057B00090E0CF910C949627CF9108956DEE7EEFF7
+:1057C00080E090E00E94CC3460E082E090E00E94B3
+:1057D000BE3460E083E090E00E94BE3460E084E08C
+:1057E00090E00E94BE3460E085E090E00E94BE340C
+:1057F00060E086E090E00C94BE3480E090E00E948F
+:10580000B83421E08D3E9E4F09F020E0822F0895AC
+:1058100082E090E00C94B034682F82E090E00C9429
+:10582000BE3483E090E00C94B034682F83E090E0C5
+:105830000C94BE3484E090E00C94B034682F84E083
+:1058400090E00C94BE3486E090E00C94B034682F65
+:1058500086E090E00C94BE348091FF0280FF0BC084
+:105860006091900185E0689FB0011124759567955E
+:10587000759567952AC081FF09C06091900185E008
+:10588000689FB0011124759567951FC082FF07C0FE
+:105890006091900185E0689FB001112416C040918D
+:1058A000F9024423C9F060918F01461788F72091CF
+:1058B000900185E0289F90011124429FC001439FE1
+:1058C000900D112470E00E949C346038710540F402
+:1058D0006115710539F002C065E070E0862F08950A
+:1058E0008FE7089581E008958091FF0280FF08C04E
+:1058F00060918E0170E0759567957595679521C0EB
+:1059000081FF06C060918E0170E07595679519C0A2
+:1059100082FF04C060918E0170E010C08091F90296
+:105920008823C1F060918D018617A0F790918E01B8
+:10593000989FC001112470E00E949C34603871056A
+:1059400028F46115710521F0862F08958FE70895D9
+:1059500081E0089561E070E0F4CF803F21F40E947F
+:105960002C2C819504C0813F29F40E942C2C80931B
+:10597000FC020895823F21F40E942C2C819504C0E2
+:10598000833F29F40E942C2C8093FB020895893FC9
+:1059900019F40E94742C05C08A3F31F40E94742CC3
+:1059A00081958093FD0208958B3F21F40E94742C11
+:1059B000819504C08C3F29F40E94742C8093FE02D0
+:1059C0000895843F21F48091FA02816017C0853FD9
+:1059D00021F48091FA02826011C0863F21F4809107
+:1059E000FA0284600BC0873F21F48091FA0288603C
+:1059F00005C0883F31F48091FA0280618093FA02F9
+:105A000008958D3F21F48091FF0281600BC08E3F8D
+:105A100021F48091FF02826005C08F3F29F48091BC
+:105A2000FF0284608093FF020895803F29F48091F3
+:105A3000FC0287FF6EC007C0813F41F48091FC02E9
+:105A400018160CF066C01092FC0263C09091FB0225
+:105A5000823F19F497FF5DC005C0833F31F41916EA
+:105A60000CF057C01092FB0254C0893F31F4809172
+:105A7000FD0218160CF04DC006C08A3F39F4809123
+:105A8000FD0287FF46C01092FD0243C08B3F29F400
+:105A90008091FE0287FF3DC006C08C3F39F48091A3
+:105AA000FE021816B4F51092FE0233C0843F21F4B2
+:105AB0008091FA028E7F05C0853F31F48091FA0211
+:105AC0008D7F8093FA0225C0863F21F48091FA02EF
+:105AD0008B7FF7CF873F21F48091FA02877FF1CF48
+:105AE000883F21F48091FA028F7EEBCF8D3F21F425
+:105AF0008091FF028E7F0BC08E3F21F48091FF02C8
+:105B00008D7F05C08F3F29F48091FF028B7F8093AA
+:105B1000FF028091FB0281110EC08091FC02811175
+:105B20000AC08091FD02811106C08091FE028111A0
+:105B300002C01092F90208958AEF92E00E94641D5B
+:105B40000E94EF299093F8028093F7020895CF9373
+:105B50008091F7029091F8020E94FC294091F9028D
+:105B6000442321F02091910130E006C02091920160
+:105B70005AE0259F900111248217930708F486C0EC
+:105B80008091FB0281110DC09091FC02911109C01E
+:105B90009091FD02911105C09091FE02992309F4A4
+:105BA00075C04F3F19F04F5F4093F902181624F467
+:105BB0000E942C2C8093FB028091FB0287FF05C082
+:105BC0000E942C2C81958093FB028091FC02181678
+:105BD00024F40E942C2C8093FC028091FC0287FF0D
+:105BE00005C00E942C2C81958093FC026091FB02E1
+:105BF000662339F1C091FC02CC2319F1772767FDA8
+:105C00007095872F972F0E94003223E333E343E3FD
+:105C10005FE30E94B4320E94CD316093FB026C2F8F
+:105C2000772767FD7095872F972F0E94003223E317
+:105C300033E343E35FE30E94B4320E94CD316093CB
+:105C4000FC028091FD02181624F40E94742C8093AB
+:105C5000FD028091FD0287FF05C00E94742C819592
+:105C60008093FD028091FE02181624F40E94742C89
+:105C70008093FE028091FE0287FF05C00E94742C73
+:105C800081958093FE02CF910C949C2DCF91089525
+:105C9000EAEFF2E085E0DF011D928A95E9F71092C4
+:105CA000F9021092FF020895833089F130F48130B7
+:105CB00061F0823009F06EC019C0853009F449C026
+:105CC000B8F1863009F066C055C020919201862F48
+:105CD00090E0820F911D8F3F910520F4620F609339
+:105CE000920108958FEF8093920108952091910180
+:105CF000862F90E0820F911D8F3F910520F4620F57
+:105D00006093910108958FEF809391010895209100
+:105D10009001862F90E0820F911D8F3F910520F416
+:105D2000620F6093900108958FEF80939001089522
+:105D300020918F01862F90E0820F911D8F3F91055A
+:105D400020F4620F60938F0108958FEF80938F018D
+:105D5000089520918E01862F90E0820F911D8F3F34
+:105D6000910520F4620F60938E0108958FEF809368
+:105D70008E01089520918D01862F90E0820F911D54
+:105D80008F3F910520F4620F60938D0108958FEF8E
+:105D900080938D010895833021F130F4813059F0E2
+:105DA000823009F049C012C0853089F128F186306F
+:105DB00009F042C037C080919201681720F4861B19
+:105DC000809392010895109292010895809191011B
+:105DD000681720F4861B8093910108951092910119
+:105DE000089580919001681720F4861B809390019C
+:105DF000089510929001089580918F01681720F402
+:105E0000861B80938F01089510928F0108958091D1
+:105E10008E01681720F4861B80938E0108951092DE
+:105E20008E01089580918D01681720F4861B809360
+:105E30008D01089510928D01089541E050E060E0D9
+:105E400070E004C0440F551F661F771F8A95D2F774
+:105E5000CB01BA010E9496270C948B23873200F560
+:105E60008E3108F089C08E3009F469C060F4873043
+:105E700009F44DC018F4863049F531C0883041F13D
+:105E80008B3021F57EC0863109F47BC018F4803157
+:105E9000E9F45FC0893109F474C08B31B9F445C0AD
+:105EA000883309F46EC048F4893209F467C0853339
+:105EB00009F464C0873251F461C0833409F45EC0D0
+:105EC00018F48A3318F056C0883499F080E00895A9
+:105ED0000E94082C0E941A2C0E94232C52C08091F0
+:105EE000F102817F8E7F8093F10281E08093000335
+:105EF00008950E948B232FEF83ED90E32150804083
+:105F00009040E1F700C000000E944F2A3AC09091F3
+:105F1000F102892F8095817080FB90F919F09660CD
+:105F2000986025C0997F977F22C09091F10291FBE4
+:105F3000882780F921E0822780FB91F913C0909196
+:105F4000F10292FB882780F921E0822780FB92F9F9
+:105F500009C09091F10293FB882780F921E0822704
+:105F600080FB93F99093F102882359F0916090930C
+:105F7000F10207C0895303C08D5101C080E00E9427
+:105F80001D2F81E0089580E0089580E00895CF936B
+:105F9000C82F80910003813071F020F0823009F029
+:105FA00089C037C0A0918B01B0918C018C91823255
+:105FB00009F082C007C0A0918B01B0918C018C9137
+:105FC000823249F48C2F0E94C32F81111EC08C2F66
+:105FD0000E942E2F1CC08C2F0E94C52F811115C02E
+:105FE000C43169F030F4CB3081F0C03109F068C0C1
+:105FF00009C0C93221F0C83309F062C006C010924E
+:1060000000035EC082E08093000381E090E0817035
+:106010005AC0C932C9F060F4C431B1F020F4C730BD
+:1060200009F04CC034C0CE51C63008F047C017C08C
+:10603000CE3439F120F4CB3409F040C01CC0C13556
+:10604000C1F0C235D9F513C080910103882319F03E
+:106050001092010333C081E08093000334C0EC2F21
+:10606000F0E0E25EFD4F80818093010327C061E094
+:1060700003C061E007C06AE0809101030E94542ED2
+:106080001DC06AE0809101030E94CB2E17C08EE1F3
+:106090008093920182E3809391018AE08093900142
+:1060A00084E180938F0188E080938E0188E2809361
+:1060B0008D0104C01092000380E005C081E003C0A0
+:1060C00080E090E0A4CFCF9108950E94FD2B811134
+:1060D00002C00E94DE2B0E94232C8093040480FFC8
+:1060E00002C0869501C080E00C949B03809104045B
+:1060F000982F9695292F30E0233031054CF49F5F7F
+:10610000990F8170892B8160809304040E94272C51
+:106110008091040486950C949B0380910404982F2D
+:10612000969591F09158990F8170892B8093040472
+:106130008E7F91E009F490E08091040490FB80F957
+:10614000809304040E94272C8091040486950C946B
+:106150009B0380910404982F909590FB80F9809385
+:1061600004040E94272C8091040480FF02C08695BD
+:1061700001C080E00C949B0330910404232F2695EA
+:106180002F5F2F77822F90E0317004972CF4220F2D
+:10619000232B2093040402C0309304048091040450
+:1061A000282F2E7F91E009F490E090FB80F98093F6
+:1061B00004040E94272C8091040486950C949B0370
+:1061C00020910404922F96959827990F822F817021
+:1061D000892B809304048E7F91E009F490E08091F4
+:1061E000040490FB80F9809304040E94272C809182
+:1061F000040486950C949B035058BB27AA270ED005
+:1062000075C166D130F06BD120F031F49F3F11F4AD
+:106210001EF45BC10EF4E095E7FB51C1E92F77D185
+:1062200080F3BA17620773078407950718F071F4B3
+:106230009EF58FC10EF4E0950B2EBA2FA02D0B0109
+:10624000B90190010C01CA01A0011124FF27591BBB
+:1062500099F0593F50F4503E68F11A16F040A22FC1
+:10626000232F342F4427585FF3CF46953795279532
+:10627000A795F0405395C9F77EF41F16BA0B620B31
+:10628000730B840BBAF09150A1F0FF0FBB1F661F78
+:10629000771F881FC2F70EC0BA0F621F731F841FBB
+:1062A00048F4879577956795B795F7959E3F08F0E1
+:1062B000B3CF9395880F08F09927EE0F97958795A0
+:1062C0000895D9D008F481E008950CD00FC107D10A
+:1062D00040F0FED030F021F45F3F19F0F0C05111D2
+:1062E00039C1F3C014D198F39923C9F35523B1F3FD
+:1062F000951B550BBB27AA2762177307840738F035
+:106300009F5F5F4F220F331F441FAA1FA9F333D093
+:106310000E2E3AF0E0E830D091505040E695001C47
+:10632000CAF729D0FE2F27D0660F771F881FBB1F03
+:10633000261737074807AB07B0E809F0BB0B802DDD
+:10634000BF01FF2793585F4F2AF09E3F510568F029
+:10635000B6C000C15F3FECF3983EDCF386957795BD
+:106360006795B795F7959F5FC9F7880F911D96952B
+:10637000879597F90895E1E0660F771F881FBB1F87
+:10638000621773078407BA0720F0621B730B840B34
+:10639000BA0BEE1F88F7E095089504D06894B11108
+:1063A000D9C00895BCD088F09F5790F0B92F992795
+:1063B000B751A0F0D1F0660F771F881F991F1AF010
+:1063C000BA95C9F712C0B13081F0C3D0B1E00895D9
+:1063D000C0C0672F782F8827B85F39F0B93FCCF35A
+:1063E000869577956795B395D9F73EF49095809506
+:1063F000709561957F4F8F4F9F4F0895E89409C026
+:1064000097FB3EF490958095709561957F4F8F4FE7
+:106410009F4F9923A9F0F92F96E9BB279395F695FD
+:10642000879577956795B795F111F8CFFAF4BB0F7B
+:1064300011F460FF1BC06F5F7F4F8F4F9F4F16C0DF
+:10644000882311F096E911C0772321F09EE8872F69
+:10645000762F05C0662371F096E8862F70E060E025
+:106460002AF09A95660F771F881FDAF7880F96959E
+:10647000879597F90895990F0008550FAA0BE0E842
+:10648000FEEF16161706E807F907C0F012161306F6
+:10649000E407F50798F0621B730B840B950B39F436
+:1064A0000A2661F0232B242B252B21F408950A269C
+:1064B00009F4A140A6958FEF811D811D089597F9DC
+:1064C0009F6780E870E060E008959FEF80EC08959A
+:1064D00000240A94161617061806090608950024C3
+:1064E0000A9412161306140605060895092E03943D
+:1064F000000C11F4882352F0BB0F40F4BF2B11F4B1
+:1065000060FF04C06F5F7F4F8F4F9F4F089557FD0F
+:106510009058440F551F59F05F3F71F04795880F11
+:1065200097FB991F61F09F3F79F0879508951216A8
+:1065300013061406551FF2CF4695F1DF08C0161654
+:1065400017061806991FF1CF869571056105089405
+:106550000895E894BB2766277727CB0197F908951C
+:106560008ADF08F48FEF08950BD0C0CFB1DF28F099
+:10657000B6DF18F0952309F0A2CFA7CF1124EACFF8
+:10658000C6DFA0F3959FD1F3950F50E0551F629F92
+:10659000F001729FBB27F00DB11D639FAA27F00D7C
+:1065A000B11DAA1F649F6627B00DA11D661F829FA3
+:1065B0002227B00DA11D621F739FB00DA11D621F88
+:1065C000839FA00D611D221F749F3327A00D611DA5
+:1065D000231F849F600D211D822F762F6A2F112487
+:1065E0009F5750408AF0E1F088234AF0EE0FFF1FDA
+:1065F000BB1F661F771F881F91505040A9F79E3F11
+:10660000510570F05CCFA6CF5F3FECF3983EDCF312
+:10661000869577956795B795F795E7959F5FC1F74D
+:10662000FE2B880F911D9695879597F90895FA018D
+:10663000EE0FFF1F30962105310599F161157105A7
+:1066400061F48038BFE39B0749F168949038810575
+:1066500061F08038BFEF9B0741F0992342F5FF3F7F
+:10666000E1053105210511F1E8940894E795D90178
+:10667000AA2329F4AB2FBE2FF85FD0F310C0FF5F21
+:1066800070F4A695E0F7F73950F019F0FF3A38F4B6
+:106690009F779F930CD00F9007FC905808953EF081
+:1066A00014CF60E070E080E89FE308954FE79F77A4
+:1066B0005F934F933F932F939ED02F913F914F9194
+:1066C0005F9152DF05C019F40EF0F9CE42CFFDCE36
+:1066D00026DFC8F39638C0F707F80F92E8942BE34B
+:1066E0003AEA48EB5FE74EDF0F920F920F924DB7F9
+:1066F0005EB70F92C0D0ECEAF0E016D04F915F91F8
+:10670000EF91FF91E595EE1FFF1F49F0FE57E068FE
+:106710004427EE0F441FFA95E1F74195550B32D00F
+:106720000F9007FE26C00895DF93CF931F930F931A
+:10673000FF92EF92DF927B018C01689405C0DA2E04
+:10674000EF011EDFFE01E894A59125913591459159
+:106750005591AEF3EF0162DDFE019701A801DA94D5
+:1067600079F7DF90EF90FF900F911F91CF91DF911C
+:1067700008959B01AC0160E070E080E89FE3A5CD47
+:106780009ECEACC0CCDEE8F39923D9F3940F511D13
+:10679000BBF39150504094F059F0882332F0660FCB
+:1067A000771F881F91505040C1F79E3F510544F715
+:1067B000880F911D9695879597F908955F3FACF0E6
+:1067C000983E9CF0BB27869577956795B79508F41A
+:1067D000B1609395C1F7BB0F58F711F460FFE8CF94
+:1067E0006F5F7F4F8F4F9F4FE3CFB4CE0EF076C0D9
+:1067F0006CCE689464CE93DEC8F39923D1F3C6F3CC
+:10680000DF93CF931F930F93FF92C92FDD27882328
+:106810002AF02197660F771F881FDAF720E030E013
+:1068200040E85FEB9FE3883920F0803E30F021960E
+:106830008F77E3DCE4EDF0E003C0DFDCE1E0F1E0E2
+:1068400073DF8B01BE01EC01FB2E6F57710975954B
+:10685000771F880B990BD4DD28E132E741E35FE332
+:106860008FDEAF2D9801AE01FF900F911F91CF9158
+:10687000DF91D4DC3BCEFA01DC01AA0FBB1F9B01E8
+:10688000AC01BF5728F422273327442750781FC074
+:10689000B75188F4AB2F0024469537952795011CF6
+:1068A000A395D2F3002069F0220F331F441FB39544
+:1068B000DAF30DD0A1CC61307105A0E88A07B946A2
+:1068C00030F49B01AC0166277727882790783096B3
+:1068D00021F0208331834283538308959F3F31F019
+:1068E000915020F4879577956795B795880F911DFE
+:1068F0009695879597F90895991B79E004C0991F9B
+:10690000961708F0961B881F7A95C9F78095089509
+:10691000AA1BBB1B51E107C0AA1FBB1FA617B707C5
+:1069200010F0A61BB70B881F991F5A95A9F78095E1
+:106930009095BC01CD01089597FB072E16F40094A5
+:1069400007D077FD09D00E94883407FC05D03EF4BB
+:10695000909581959F4F0895709561957F4F08950B
+:10696000F999FECF92BD81BDF89A992780B5089517
+:10697000A8E1B0E042E050E00C94D334262FF9991E
+:10698000FECF1FBA92BD81BD20BD0FB6F894FA9A12
+:10699000F99A0FBE019608950E94BE34272F0C94D9
+:1069A000BF34DC01CB01FC01F999FECF06C0F2BD7A
+:1069B000E1BDF89A319600B40D9241505040B8F7BD
+:0669C0000895F894FFCFDA
+:1069C60055D0A446000016440000000000004842CE
+:1069D60061978A460000C843000000000000484254
+:1069E60055D024460000C84300000000000048427D
+:1069F60000005C460000C84300000000000048425A
+:106A060061978A4600007A4455D0A4460000C843E0
+:106A1600000000000000484200005C460000C84339
+:106A2600000000000000484255D0244600001644ED
+:106A36000507000C05854000000106400000010026
+:106A4600B91049112511F010BC1001E902280814EB
+:106A56000A321E4200450025002600430061006000
+:106A660000200037006400650066006700440046A9
+:106A7600002400470000000200040005000700098A
+:106A8600000B000C000E001000110013001500177B
+:106A96000018001A001C001D001F002100230024FE
+:106AA600002600280029002B002D002F0030003280
+:106AB6000034003500370039003B006E048704A01F
+:106AC60004B904E10594055E053E053F4D362002F6
+:106AD60003020000010001010101010001010102A0
+:086AE60003040506070809007E
+:00000001FF
diff --git a/keyboard/preonic/preonic_pcb.hex b/keyboard/preonic/preonic_pcb.hex
new file mode 100644
index 000000000..5bdc190e1
--- /dev/null
+++ b/keyboard/preonic/preonic_pcb.hex
@@ -0,0 +1,1702 @@
+:100000000C94D4020C9418030C9418030C94180349
+:100010000C9418030C9418030C9418030C941803F4
+:100020000C9418030C9418030C94E8160C94BA174B
+:100030000C946C290C9418030C9418030C9418035A
+:100040000C9418030C9418030C9418030C941803C4
+:100050000C9418030C94D9290C9418030C941803CD
+:100060000C9418030C9418030C9418030C941803A4
+:100070000C9418030C9418030C9418030C94180394
+:100080000C941C0E0C9418030C9418030C94180375
+:100090000C9418030C9418030C9418030C94180374
+:1000A0000C9418030C9418030C941803076342363D
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
+:1000D0000000803F08000000BE922449123EABAAF7
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
+:1000F000AA3E00000000BF000000803F000000009A
+:1001000000084178D3BB4387D1133D190E3CC3BDD2
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
+:1001200080EFFFBE01C4FF7F3F00000000003500EC
+:100130001E001F00200021002200230024002500B3
+:10014000260027002A002B0014001A0008001500C2
+:1001500017001C0018000C00120013002A002900D0
+:1001600004001600070009000A000B000D000E0035
+:100170000F0033003400E1001D001B0006001900D1
+:10018000050011001000360037003800280000304C
+:10019000E000E200E30003522C002C000452500067
+:1001A000510052004F0035001E001F0020002100AA
+:1001B0002200230024002500260027002A002B000F
+:1001C00014001A00090013000A000D000F001800A7
+:1001D0001C0033002A002900040015001600170037
+:1001E00007000B00110008000C0012003400E100B1
+:1001F0001D001B000600190005000E00100036004F
+:100200003700380028000030E000E200E30003522D
+:100210002C002C0004525000510052004F003500B9
+:100220001E001F00200021002200230024002500C2
+:10023000260027002A002B00340036003700130068
+:100240001C0009000A00060015000F002A00290002
+:1002500004001200080018000C0007000B00170033
+:10026000110016003800E100330014000D000E00EC
+:100270001B00050010001A0019001D0028000030A6
+:10028000E000E200E30003522C002C000452500076
+:10029000510052004F0035001E001F0020002100B9
+:1002A0002200230024002500260027002A00350212
+:1002B0001E021F0220022102220223022402250222
+:1002C000260227022A0001003A003B003C003D00C4
+:1002D0003E003F002D022E022F02300231020100AB
+:1002E00040004100420043004400450000530153D8
+:1002F0000253005001000100010001000100010053
+:10030000010001000100AB00AA00A900AE00350009
+:100310001E001F00200021002200230024002500D1
+:10032000260027002A0035001E001F0020002100A3
+:100330002200230024002500260027002A000100B7
+:100340003A003B003C003D003E003F002D002E00E7
+:100350002F00300031000100400041004200430006
+:1003600044004500005301530253005001000100B6
+:100370000100010001000100010001000100AB00CB
+:10038000AA00A900AE002A035400680065002000FE
+:100390005000720065006F006E006900630020006D
+:1003A0004B006500790062006F006100720064001C
+:1003B00000002C034F007200740068006F006C0096
+:1003C00069006E0065006100720020004B0065004E
+:1003D000790062006F006100720064007300000029
+:1003E000040309040902D000060100A0FA09040070
+:1003F000000103010100092111010001223F000752
+:1004000005810308000A0904010001030102000933
+:100410002111010001224D000705820308000A098D
+:10042000040200010300000009211101000122362D
+:10043000000705830308000A090403000203000003
+:10044000000921110100012220000705840320007A
+:100450000107050403200001090404000001010054
+:100460000009240100010900010509040500020139
+:1004700003000007240100014100062402010100DD
+:1004800006240202020009240301030102010009FB
+:1004900024030204010101000905060240000500D1
+:1004A0000005250101010905850240000500000540
+:1004B000250101031201100100000008EDFE61603A
+:1004C0000100010200010631FF0974A1010975153F
+:1004D0000025FF9520750881020976150025FF95F6
+:1004E0002075089102C005010980A101850216014D
+:1004F0000026B7001A01002AB70075109501810087
+:10050000C0050C0901A1018503160100269C021AF1
+:1005100001002A9C02751095018100C005010902A5
+:10052000A1010901A10005091901290515002501ED
+:100530009505750181029501750381010501093059
+:1005400009311581257F95027508810609381581C5
+:10055000257F950175088106050C0A38021581254D
+:100560007F950175088106C0C005010906A1010536
+:100570000719E029E7150025019508750181029505
+:100580000175088101050819012905950575019175
+:10059000029501750391010507190029FF15002532
+:1005A000FF950675088100C011241FBECFEFDAE069
+:1005B000DEBFCDBF04B603FE24C080910404909139
+:1005C0000504A0910604B09107048730904BA74022
+:1005D000B04BB9F410920404109205041092060472
+:1005E0001092070414BE84B7877F84BF88E10FB6DA
+:1005F000F89480936000109260000FBEE0E0F8E392
+:10060000099512E0A0E0B1E0EEE1F9E602C0059044
+:100610000D92A832B107D9F714E0A8E2B2E001C008
+:100620001D92A430B107E1F70E94A0130C948D3401
+:100630000C94000061110DC0FC018281882331F00F
+:1006400085EE0E94671E0E94683003C085EE0E94FE
+:100650002F1F80E090E008950E940F0E40E050E0D0
+:1006600069E070E080E091E00C94600F08950E94D2
+:1006700049036E9A769A8CE293E0892B11F00C94E0
+:100680002C03089586E393E0892B11F00C94360334
+:100690000895279A2F988FEF9FEF9093870080936C
+:1006A00086008AE08093800089E1809381000C9429
+:1006B000113081110BC080918000877F8093800072
+:1006C00010928D0010928C002F9808952F988330EF
+:1006D00041F4809180008860809380008FEF9FEFCD
+:1006E00012C09091800098609093800023E030E0E9
+:1006F000281B3109220F331F8FEF9FEF02C0969501
+:1007000087952A95E2F790938D0080938C00089549
+:100710008B3B910568F4883A910530F5853A91054F
+:10072000C0F48430910598F4019709F06FC071C04E
+:10073000803E910508F46AC0883E910540F09C0116
+:10074000205F31092031310508F060C05CC09C0198
+:10075000A1C0853A910509F45FC0863A910509F474
+:100760005EC023E830E496C0883A910509F45AC087
+:10077000893A910509F459C08A3A910509F458C09B
+:100780008B3A910509F457C08C3A910509F456C08B
+:100790008D3A910509F455C0803B910509F454C088
+:1007A0008E3A910509F453C08F3A910509F452C06D
+:1007B000813B910509F451C0823B910509F450C079
+:1007C000833B910509F44FC0843B910509F44EC069
+:1007D000853B910509F44DC0863B910509F44CC059
+:1007E000873B910509F44BC0883B910509F44AC049
+:1007F000893B910509F449C08A3B910509F048C03D
+:100800002AE236E447C09C01306544C020E030E075
+:1008100041C021E030E03EC021E830E43BC022E8A6
+:1008200030E438C022EE34E435C029EE34E432C07E
+:100830002AEE34E42FC025EB34E42CC026EB34E45C
+:1008400029C027EB34E426C02CEC34E423C02DEC83
+:1008500034E420C023E835E41DC02AE835E41AC09A
+:1008600022E935E417C024E935E414C021E236E476
+:1008700011C023E236E40EC024E236E40BC025E2C8
+:1008800036E408C026E236E405C027E236E402C0BA
+:1008900020E034E4C90108959CE0799FF00111241F
+:1008A0009CE3899FE00DF11D1124E60FF11DEE0F71
+:1008B000FF1FE25DFE4F25913491C9010895880F15
+:1008C000991F82559040FC0125913491C9010895EA
+:1008D000880F991F825D9E4FFC0125913491C901BB
+:1008E00008950E944C049C019A9581159F4110F433
+:1008F000C9010895C90190528115904128F4C90198
+:100900009F700E9468040895C90190538115904119
+:1009100020F4C9019927906C0895C901905440971B
+:1009200028F4C9018F709927946D0895203180E4CF
+:10093000380719F480E091ED0895213190E43907EA
+:1009400019F480E090ED0895223140E4340719F461
+:1009500080E092ED0895233180E4380719F480E0B7
+:1009600093ED0895211590E5390799F40E945623D7
+:1009700040E065E088E491E00E94600F2FEF44E3DF
+:100980008CE0215040408040E1F700C000000C9412
+:10099000FE29213090E5390731F48091F002816021
+:1009A0008093F0020895C90190558115904108F097
+:1009B00062C0432F55274F70552741305105F9F438
+:1009C000C90174E0880F991F7A95E1F78827937021
+:1009D000B901E3E0660F771FEA95E1F760767727C4
+:1009E000862B972B9C682370332702C0440F551F1A
+:1009F0002A95E2F74F715527842B952B08954230A5
+:100A0000510529F4922F8827816F906A0895433009
+:100A10005105B9F4C90153E0880F991F5A95E1F7C0
+:100A2000807E97702370332741E050E002C0440F6E
+:100A3000551F2A95E2F74F715527842B952B9C68FB
+:100A400008954430510589F5C90143E0880F991F85
+:100A50004A95E1F7807E97702370332741E050E09C
+:100A600002C0440F551F2A95E2F74F715527842B7A
+:100A7000952B9A680895C90190568115904118F4F4
+:100A8000C901906F0895C90190578115904120F4D4
+:100A9000C9019F7090620895C901905881159041D5
+:100AA00020F4C9019F70906A0895203E3105E0F45A
+:100AB000203C310568F52133310509F475C048F44F
+:100AC0002932310509F46BC02A32310509F07BC0A7
+:100AD00075C02933310501F122383105E9F025339C
+:100AE000310509F070C051C0233E3105B1F140F429
+:100AF000203E3105D1F0223E310509F064C01CC012
+:100B0000263E310579F1273E310509F05CC038C039
+:100B1000C9010E945F0408958091010380FD02C015
+:100B200081FF51C080EE90E04FC08091010380FFB3
+:100B3000F9CF89E390E048C08091010382FF0AC0A9
+:100B40008091010384FF03C080E090E03DC083EE0C
+:100B500090E03AC082EE90E037C08091010382FFBE
+:100B6000EFCFF8CF8091010383FF07C0809101038D
+:100B700084FDEACF87EE90E027C086EE90E024C0A7
+:100B80008091010383FFF2CFF8CF8091010385FFAD
+:100B900003C089E290E018C085E390E015C0809121
+:100BA000010385FDF9CFF5CF8091010386FF03C0D6
+:100BB0008AE290E009C081E390E006C080910103E1
+:100BC00086FDF9CFF5CFC9010E94880308950895E5
+:100BD0005F926F927F928F929F92AF92BF92CF92CD
+:100BE000DF92EF92FF920F931F93CF93DF93CDB7D6
+:100BF000DEB72A970FB6F894DEBF0FBECDBF9E01B9
+:100C00002F5F3F4F4E018BE0880E911C60E070E03B
+:100C100000E010E0E12CF12CC12CD12CA12CB12C46
+:100C20008AE0782E622E532E41E050E0E3E9F1E0B5
+:100C3000A62DB52D872D01900D928A95E1F7F9012A
+:100C4000819191919F01FC01E07FFF27E032F10546
+:100C500059F48F709927FA0102C0EE0FFF1F8A9591
+:100C6000E2F7AE2ABF2A37C0E033F10559F48F709E
+:100C70009927FA0102C0EE0FFF1F8A95E2F7CE2AEC
+:100C8000DF2A29C0E034F10559F48F709927FA0161
+:100C900002C0EE0FFF1F8A95E2F7EE2AFF2A1BC063
+:100CA000E035F10559F48F709927FA0102C0EE0F73
+:100CB000FF1F8A95E2F70E2B1F2B0DC0E036F105C2
+:100CC00051F48F709927FA0102C0EE0FFF1F8A9529
+:100CD000E2F76E2B7F2B2815390509F0A7CF94B1C9
+:100CE0008A2D8095892384B985B18A2985B997B1E0
+:100CF0008C2D8095892387B988B18C2988B99AB1C0
+:100D00008E2D809589238AB98BB18E298BB99DB19F
+:100D1000802F809589238DB98EB1802B8EB990B3A9
+:100D2000862F8095892380BB81B3862B81BB2A9631
+:100D30000FB6F894DEBF0FBECDBFDF91CF911F91EC
+:100D40000F91FF90EF90DF90CF90BF90AF909F906A
+:100D50008F907F906F905F9008955F926F927F92D7
+:100D60008F929F92AF92BF92CF92DF92EF92FF92BB
+:100D70000F931F93CF93DF93CDB7DEB768970FB66E
+:100D8000F894DEBF0FBECDBF85B7806885BF85B73D
+:100D9000806885BF0E94E8059E012F5F3F4F4E018E
+:100DA00089E1880E911C60E070E000E010E0E12C29
+:100DB000F12CC12CD12CA12CB12C98E1792E622ED2
+:100DC000532E41E050E0EDE9F1E0A62DB52D872D41
+:100DD00001900D928A95E1F7F901819191919F011E
+:100DE000FC01E07FFF27E032F10559F48F7099276D
+:100DF000FA0102C0EE0FFF1F8A95E2F7AE2ABF2A62
+:100E000037C0E033F10559F48F709927FA0102C019
+:100E1000EE0FFF1F8A95E2F7CE2ADF2A29C0E034C1
+:100E2000F10559F48F709927FA0102C0EE0FFF1FE8
+:100E30008A95E2F7EE2AFF2A1BC0E035F10559F446
+:100E40008F709927FA0102C0EE0FFF1F8A95E2F713
+:100E50000E2B1F2B0DC0E036F10551F48F70992732
+:100E6000FA0102C0EE0FFF1F8A95E2F76E2B7F2B6F
+:100E70002815390509F0A7CF94B18A2D80958923CB
+:100E800084B985B18A2985B997B18C2D809589233C
+:100E900087B988B18C2988B99AB18E2D809589231C
+:100EA0008AB98BB18E298BB99DB1802F809589230A
+:100EB0008DB98EB1802B8EB990B3862F8095892302
+:100EC00080BB81B3862B81BB10922902109228022D
+:100ED000109233021092320210922B0210922A02C8
+:100EE000109235021092340210922D0210922C02B0
+:100EF000109237021092360210922F0210922E0298
+:100F0000109239021092380210923102109230027F
+:100F100010923B0210923A0287E393E0892BB9F0DA
+:100F200068960FB6F894DEBF0FBECDBFDF91CF91AC
+:100F30001F910F91FF90EF90DF90CF90BF90AF90F7
+:100F40009F908F907F906F905F900C94370368967E
+:100F50000FB6F894DEBF0FBECDBFDF91CF911F91CA
+:100F60000F91FF90EF90DF90CF90BF90AF909F9048
+:100F70008F907F906F905F9008955F926F927F92B5
+:100F80008F929F92AF92BF92CF92DF92EF92FF9299
+:100F90000F931F93CF93DF93CDB7DEB7A2970FB612
+:100FA000F894DEBF0FBECDBF7E0149E1E40EF11C17
+:100FB00022E3C22E22E0D22E5E0153E2A50EB11C26
+:100FC0003AE0532E470101E010E048E1642E55E07D
+:100FD000752EE3E9F1E0D401852D01900D928A95FB
+:100FE000E1F7F701819191917F019C01207F3327E7
+:100FF0002032310589F424B18F709927A80102C0ED
+:10100000440F551F8A95E2F7CA01242B24B995B1E4
+:101010008095892385B94FC02033310589F427B1E4
+:101020008F709927F80102C0EE0FFF1F8A95E2F733
+:10103000CF012E2B27B998B18095892388B93BC061
+:101040002034310589F42AB18F709927A80102C094
+:10105000440F551F8A95E2F7CA01242B2AB99BB188
+:10106000809589238BB927C02035310589F42DB1AE
+:101070008F709927F80102C0EE0FFF1F8A95E2F7E3
+:10108000CF012E2B2DB99EB1809589238EB913C027
+:101090002036310581F420B38F709927A80102C052
+:1010A000440F551F8A95E2F7CA01242B20BB91B348
+:1010B0008095892381BB50EA5A95F1F7BE016F5F95
+:1010C0007F4F80E090E020E030E0EDE9F1E0DE01EC
+:1010D0001196462D01900D924A95E1F7FB01419141
+:1010E0005191BF01FA01E07FFF27E032F10511F4D1
+:1010F000E3B113C0E033F10511F4E6B10EC0E03402
+:10110000F10511F4E9B109C0E035F10511F4ECB1D4
+:1011100004C0E036F105B9F4EFB1F0E04F705527A7
+:1011200002C0F595E7954A95E2F7E0FD08C0A801F1
+:10113000022E02C0440F551F0A94E2F702C040E09D
+:1011400050E0842B952B2F5F3F4F2C30310509F059
+:10115000BCCFF601208131812817390721F0918316
+:101160008083709270010E94E805F2E0CF0ED11CDE
+:10117000EA14FB0409F02DCF809170018823A1F1BE
+:10118000815080937001882339F08FE99FE00197A7
+:10119000F1F700C0000028C0809132029091330224
+:1011A0009093290280932802809134029091350215
+:1011B00090932B0280932A028091360290913702FD
+:1011C00090932D0280932C028091380290913902E5
+:1011D00090932F0280932E0280913A0290913B02CD
+:1011E000909331028093300282E493E0892B11F0D6
+:1011F0000E94420381E0A2960FB6F894DEBF0FBEB4
+:10120000CDBFDF91CF911F910F91FF90EF90DF90B5
+:10121000CF90BF90AF909F908F907F906F905F9096
+:101220000895E82FF0E0EE0FFF1FE85DFD4F80818D
+:10123000918108950895CF92DF92EF92FF920F93DC
+:101240001F93CF93DF93CDB7DEB7CC5BD2400FB601
+:10125000F894DEBF0FBECDBF8C01862F642F88238C
+:1012600079F0F80192812FE7482F992329F083E044
+:1012700093E00E94C41904C083E093E00E94D41953
+:10128000F80180818B3091F59181943009F0A8C2EA
+:101290009281809173019923B1F08F5F80937301E4
+:1012A00096E4E5EBF1E0DE01A958BD4F01900D9207
+:1012B0009A95E1F7E0917101F0917201EE0FFF1F35
+:1012C00027E732E036C096E4E5EBF1E0DE01AF5C03
+:1012D000BD4F01900D929A95E1F7E0917101F09167
+:1012E0007201EE0FFF1F21E332E093C08A3009F054
+:1012F000CBC0F8019181943009F072C29281809143
+:101300007301992309F473C081508093730196E4AB
+:10131000E5EBF1E0DE01A551BE4F01900D929A95EB
+:10132000E1F7E0917101F0917201EE0FFF1F2BEEDA
+:1013300031E02C0F3D1FE20FF31F60817181680FB8
+:10134000711D882777FD8095982F0E94AC3120E091
+:1013500030E040E451E40E94113120E030E040E808
+:1013600050E40E94A9309B01AC0160E070E080E095
+:1013700090E40E94C33221E230ED42E053E40E9447
+:1013800060324CE050E00E94BB0F20E04BE760E091
+:1013900083E093E00E94B41920E04BE761E083E032
+:1013A00093E00E94B41920E04BE762E083E093E011
+:1013B0000E94B41920E04BE763E083E093E00E94D1
+:1013C000B41920E04BE764E083E093E0C454DD4FC0
+:1013D0000FB6F894DEBF0FBECDBFDF91CF911F9146
+:1013E0000F91FF90EF90DF90CF900C94B41996E49A
+:1013F000E5EBF1E0DE01AB55BE4F01900D929A9501
+:10140000E1F7E0917101F0917201EE0FFF1F25EA03
+:1014100031E02C0F3D1FE20FF31F60817181680FD7
+:10142000711D882777FD8095982F0E94AC3120E0B0
+:1014300030E040E451E40E94113120E030E040E827
+:1014400050E40E94A9309B01AC0160E070E080E0B4
+:1014500090E40E94C33221E230ED42E053E40E9466
+:1014600060320E94EB0CC454DD4F0FB6F894DEBF1F
+:101470000FBECDBFDF91CF911F910F91FF90EF90E5
+:10148000DF90CF900C94BE0C893009F0D3C0F801E6
+:101490009181943009F0A4C19281992309F4A0C1EB
+:1014A00080917101909172010196909372018093E5
+:1014B000710120E04BE760E083E093E00E94B41903
+:1014C00020E04BE761E083E093E00E94B41920E064
+:1014D0004BE762E083E093E00E94B41920E04BE721
+:1014E00063E083E093E00E94B41920E04BE764E0FE
+:1014F00083E093E00E94B4190E94BE0C00E010E06B
+:10150000E6E4FE2E80917301E5EBF1E0DE01A15AE5
+:10151000BE4F9F2D01900D929A95E1F7E0917101D8
+:10152000F0917201E00FF11FEE0FFF1F2FE531E088
+:101530002C0F3D1FE20FF31F60817181680F711D39
+:10154000882777FD8095982F0E94AC3120E030E00D
+:1015500040E451E40E94113120E030E040E850E4E2
+:101560000E94A9309B01AC0160E070E080E090E453
+:101570000E94C33221E230ED42E053E40E94603227
+:101580004CE050E00E94BB0F3FEF87EE93E03150FC
+:1015900080409040E1F700C0000080917301E5EBCE
+:1015A000F1E0DE01A75EBE4F9F2D01900D929A954E
+:1015B000E1F7E0917101F0917201E00FF11FEE0F80
+:1015C000FF1F29E131E02C0F3D1FE20FF31F608167
+:1015D0007181680F711D882777FD8095982F0E9473
+:1015E000AC3120E030E040E451E40E94113120E0D1
+:1015F00030E040E850E40E94A9309B01AC0160E07B
+:1016000070E080E090E40E94C33221E230ED42E0DD
+:1016100053E40E9460320E94EB0C8FEF9CE701972D
+:10162000F1F700C000000F5F1F4F0830110509F0EF
+:1016300069CF94C1883009F0D3C0F801918194300A
+:1016400009F0CEC09281992309F4CAC0809171013A
+:10165000909172010197909372018093710120E043
+:101660004BE760E083E093E00E94B41920E04BE791
+:1016700061E083E093E00E94B41920E04BE762E070
+:1016800083E093E00E94B41920E04BE763E083E03D
+:1016900093E00E94B41920E04BE764E083E093E01C
+:1016A0000E94B4190E94BE0C00E010E056E4F52E32
+:1016B00080917301E5EBF1E0DE01AD52BF4F9F2D4C
+:1016C00001900D929A95E1F7E0917101F09172010C
+:1016D000E00FF11FEE0FFF1F23ED30E02C0F3D1F39
+:1016E000E20FF31F60817181680F711D882777FDFC
+:1016F0008095982F0E94AC3120E030E040E451E426
+:101700000E94113120E030E040E850E40E94A9300E
+:101710009B01AC0160E070E080E090E40E94C33285
+:1017200021E230ED42E053E40E9460324CE050E0B0
+:101730000E94BB0F3FEF87EE93E031508040904016
+:10174000E1F700C0000080917301E5EBF1E0DE01FC
+:10175000A357BF4F9F2D01900D929A95E1F7E0910D
+:101760007101F0917201E00FF11FEE0FFF1F2DE8E4
+:1017700030E02C0F3D1FE20FF31F60817181680F75
+:10178000711D882777FD8095982F0E94AC3120E04D
+:1017900030E040E451E40E94113120E030E040E8C4
+:1017A00050E40E94A9309B01AC0160E070E080E051
+:1017B00090E40E94C33221E230ED42E053E40E9403
+:1017C00060320E94EB0C8FEF9CE70197F1F700C0AD
+:1017D00000000F5F1F4F0830110509F069CFBEC030
+:1017E000F801228190917301222309F45DC026E45F
+:1017F000E5EBF1E0DE01A95BBF4F01900D922A9568
+:10180000E1F7E0917101F0917201E80FF11DEE0F27
+:10181000FF1F27E430E02C0F3D1FE20FF31F608114
+:101820007181690F711D882777FD8095982F0E941F
+:10183000AC3120E030E040E451E40E9411316B0112
+:101840007C01F801818165E070E0681B71098827DF
+:1018500077FD8095982F0E94AC319B01AC01C701A8
+:10186000B6010E94A9309B01AC0160E070E080E00D
+:1018700090E40E94C33221E230ED42E053E40E9442
+:1018800060324FE050E0C454DD4F0FB6F894DEBF35
+:101890000FBECDBFDF91CF911F910F91FF90EF90C1
+:1018A000DF90CF900C94BB0F26E4E5EBF1E0DE0176
+:1018B000119601900D922A95E1F7E0917101F09156
+:1018C0007201E80FF11DEE0FFF1F21E030E02C0F39
+:1018D0003D1FE20FF31F60817181690F711D882721
+:1018E00077FD8095982F0E94AC3120E030E040E4F5
+:1018F00051E40E9411316B017C01F801818165E0A6
+:1019000070E0681B7109882777FD8095982F0E94E9
+:10191000AC319B01AC01C701B6010E94A9309B010B
+:10192000AC0160E070E080E090E40E94C33221E20C
+:1019300030ED42E053E40E946032C454DD4F0FB6F4
+:10194000F894DEBF0FBECDBFDF91CF911F910F91F5
+:10195000FF90EF90DF90CF900C94EB0CC454DD4FD0
+:101960000FB6F894DEBF0FBECDBFDF91CF911F91B0
+:101970000F91FF90EF90DF90CF9008951092870223
+:1019800010928602809171008D7F8093710080910A
+:1019900090008F7780939000109248021092470237
+:1019A00010928002109281021092820210928302A1
+:1019B00010927F0210927E02EEE5F2E0AEE4B2E019
+:1019C00011921192119211921D921D9282E0EE37A6
+:1019D000F807B1F708956F927F928F929F92AF921E
+:1019E000BF92CF92DF92EF92FF920F931F93CF930C
+:1019F000DF936B017C010EE712E04CE5A42E42E080
+:101A0000B42EC7E0D0E0A7019601F801929182912F
+:101A1000729162918F010E940D31882349F02197C4
+:101A2000F2E0AF1AB108CF3F8FEFD80761F734C0AB
+:101A3000F8011082118212821382F5011182108244
+:101A4000FE01EE0FFF1FEE0FFF1FE25AFD4FDE01FA
+:101A5000AA0FBB1FA25BBD4FCE011AC001964481E5
+:101A600055816681778140835183628373831482B9
+:101A700015821682178212962D913C91139711961A
+:101A80003C932E9313961C921E92129734961296A4
+:101A90008730910519F7C3CF809186029091870214
+:101AA000019797FD05C0909387028093860204C03A
+:101AB0001092870210928602E0918602F0918702CE
+:101AC0003097C9F4809171008D7F8093710080916F
+:101AD00090008F7780939000109280021092810284
+:101AE000109282021092830210927F0210927E0264
+:101AF0001092470285C03197DF01AA0FBB1FAA0FC2
+:101B0000BB1FA25ABD4FCD90DD90ED90FC90EE0F23
+:101B1000FF1FE25BFD4FC081D18160908002709019
+:101B200081028090820290908302A7019601662D27
+:101B3000772D882D992D0E940D3187FF25C0262DE8
+:101B4000372D482D592DC701B6010E94A83020E03D
+:101B500030E04AEF54E40E9411315B018C012A2DE0
+:101B60003B2D402F512F662D772D882D992D0E94CA
+:101B7000A9303B014C01A7019601772D992D0E94B8
+:101B80000D31181664F72EC0A7019601662D772D2A
+:101B9000882D992D0E945C32181634F5A701960104
+:101BA000662D772D882D992D0E94A83020E030E0F9
+:101BB0004AEF54E40E9411315B018C012A2D3B2D28
+:101BC000402F512F662D772D882D992D0E94A830FA
+:101BD0003B014C01A7019601772D992D0E945C32A3
+:101BE00087FFECCF10924D02C0928002D09281020A
+:101BF000E0928202F0928302D0937F02C0937E0231
+:101C0000DF91CF911F910F91FF90EF90DF90CF90D8
+:101C1000BF90AF909F908F907F906F9008953E9A65
+:101C2000E1E7F0E080818D7F808382E08093900007
+:101C30008AE18093910008951F920F920FB60F9240
+:101C40001124CF92DF92EF92FF922F933F934F9305
+:101C50005F936F937F938F939F93AF93BF93CF9334
+:101C6000DF93EF93FF9380914702882309F479C0B3
+:101C700020E030E0A90160918002709181028091A2
+:101C80008202909183020E945C3218160CF069C0A7
+:101C900020E030E040E251E46091490270914A0254
+:101CA00080914B0290914C020E945C321816BCF459
+:101CB00080918402909185020196609186027091D4
+:101CC00087020E9448349093850280938402109288
+:101CD000490210924A0210924B0210924C02C0919B
+:101CE0008402D0918502CC0FDD1FCC0FDD1FC25ABC
+:101CF000DD4F288139814A815B8160E074E284E7AD
+:101D00009BE40E9411310E94793170939700609397
+:101D10009600288139814A815B8160E074E284E722
+:101D20009BE40E9411310E947931759567957093FB
+:101D300099006093980020E030E040E85FE3609114
+:101D4000490270914A0280914B0290914C020E948C
+:101D5000A9306093490270934A0280934B0290939A
+:101D60004C0280914802882309F493C0C09043023A
+:101D7000D0904402E0904502F090460220E030E02E
+:101D8000A901C701B6010E945C321816F4F4A7013C
+:101D9000960160E074E284E79BE40E9411310E94A6
+:101DA00079317093970060939600A701960160E0E7
+:101DB00074E284E79BE40E9411310E9479317595A9
+:101DC0006795709399006093980060913D027091BF
+:101DD0003E026F5F7F4F70933E0260933D0280E052
+:101DE00090E00E94AA3120913F0230914002409140
+:101DF0004102509142020E945C3287FD4AC08091AC
+:101E00003C028F5F80933C029091F0038917A0F011
+:101E10008091F503882319F010923C020DC0809147
+:101E200071008D7F80937100809190008F778093F7
+:101E30009000109248022DC0E091F103F091F2035E
+:101E400080913C0298E0899FE00DF11D1124808172
+:101E50009181A281B3818093430290934402A09325
+:101E60004502B093460220E030E040E85EE3648142
+:101E70007581868197810E94603260933F027093E2
+:101E80004002809341029093420210923E021092CF
+:101E90003D02FF91EF91DF91CF91BF91AF919F9163
+:101EA0008F917F916F915F914F913F912F91FF9013
+:101EB000EF90DF90CF900F900FBE0F901F9018956E
+:101EC0000F931F93CF93DF9300D0CDB7DEB78C0174
+:101ED00080914702882331F04A8369830E94BE0CB7
+:101EE00069814A8181E0809348021093F203009354
+:101EF000F1036093F0034093F503109249021092AE
+:101F00004A0210924B0210924C0210923C02F801CD
+:101F10004081518162817381409343025093440216
+:101F2000609345027093460220E030E040E85EE3B3
+:101F300064817581868197810E94603260933F023F
+:101F400070934002809341029093420210923E02AD
+:101F500010923D02809171008260809371008091A7
+:101F600090008068809390000F900F90DF91CF9148
+:101F70001F910F9108956F927F928F929F92AF92CF
+:101F8000BF92CF92DF92EF92FF920F931F93CF9366
+:101F9000DF936B017C01EA018091480281110E946C
+:101FA000BE0C81E08093470220E030E0A901C70128
+:101FB000B6010E945C3218160CF09AC06090800244
+:101FC00070908102809082029090830220E030E045
+:101FD000A901662D772D882D992D0E940D31811133
+:101FE00028C0C0928002D0928102E0928202F092D8
+:101FF0008302D0937F02C0937E02809186029091EB
+:102000008702FC01EE0FFF1FEE0FFF1FE25AFD4F8C
+:10201000C082D182E282F382FC01EE0FFF1FE25BFD
+:10202000FD4FD183C08301969093870280938602EF
+:102030005FC0A7019601662D772D882D992D0E94EE
+:102040000D3187FF25C0262D372D482D592DC7016D
+:10205000B6010E94A83020E030E04AEF54E40E942C
+:1020600011315B018C012A2D3B2D402F512F662D04
+:10207000772D882D992D0E94A9303B014C01A70195
+:102080009601772D992D0E940D31181664F7A9CF6E
+:10209000A7019601662D772D882D992D0E945C321F
+:1020A00018160CF09ECFA7019601662D772D882D6E
+:1020B000992D0E94A83020E030E04AEF54E40E94BD
+:1020C00011315B018C012A2D3B2D402F512F662DA4
+:1020D000772D882D992D0E94A8303B014C01A70136
+:1020E0009601772D992D0E945C3287FFECCF79CF36
+:1020F000809171008260809371008091900080686F
+:1021000080939000DF91CF911F910F91FF90EF90FE
+:10211000DF90CF90BF90AF909F908F907F906F9007
+:102120000895809191020895CF93DF9300D01F927C
+:10213000CDB7DEB72091FA03243021F523E02983BF
+:102140009B838A832093E9008FEF06C095ED9A95D3
+:10215000F1F70000882329F09091E800815095FF65
+:10216000F5CF8091E80085FF0DC040E050E063E0CE
+:1021700070E0CE0101960E947E148091E8008E7777
+:102180008093E8000F900F900F90DF91CF9108950A
+:10219000CF93DF9300D01F92CDB7DEB72091FA0323
+:1021A000243029F522E029839B838A8383E080936E
+:1021B000E9008FEF06C095ED9A95F1F700008823AE
+:1021C00029F09091E800815095FFF5CF8091E800CB
+:1021D00085FF0DC040E050E063E070E0CE01019665
+:1021E0000E947E148091E8008E778093E8000F9023
+:1021F0000F900F90DF91CF9108952091FA03243032
+:10220000F9F422E02093E9002FEF06C035ED3A956E
+:10221000F1F70000222329F03091E800215035FF2A
+:10222000F5CF2091E80025FF0BC040E050E065E0CD
+:1022300070E00E947E148091E8008E778093E80021
+:102240000895CF93DF93EC018091FA03843041F538
+:1022500081E08093E9008FEF06C095ED9A95F1F744
+:102260000000882329F09091E800815095FFF5CF78
+:102270008091E80085FF14C040E050E068E070E025
+:10228000CE010E947E148091E8008E778093E80052
+:1022900088E0FE01A9E8B2E001900D928A95E1F78D
+:1022A000DF91CF910895BF92CF92DF92EF92FF928C
+:1022B0000F931F93CF93DF937C01B62EE90100E0CB
+:1022C00010E0C42ED12C0BC04991202F2B0D2F775D
+:1022D0004F776FE0C7010E94B4190F5F1F4F0C15B5
+:1022E0001D0594F3DF91CF911F910F91FF90EF9017
+:1022F000DF90CF90BF90089570E06F5F7F4F6F7059
+:1023000077270C94B4190F931F93CF93C42F633086
+:10231000710509F04AC0842F807F803849F18039E7
+:1023200009F043C0622F6F7770E080E090E00E9478
+:10233000AC3120E030E040E451E40E9411319B01D7
+:10234000AC0160E070E080E090E40E94C3320F775F
+:1023500010E023E0159507952A95E1F72DEC3CEC6C
+:1023600042E053E40E946032A8010E94BB0F1DC0EE
+:10237000622F6F7770E080E090E00E94AC3120E047
+:1023800030E040E451E40E9411319B01AC0160E077
+:1023900070E080E090E40E94C3322DEC3CEC42E01F
+:1023A00053E40E9460320E94EB0CCC3F29F4CF91A1
+:1023B0001F910F910C94BE0CCF911F910F91089516
+:1023C0000F931F93CF93DF93CDB7DEB727970FB649
+:1023D000F894DEBF0FBECDBF8C0114C08A810E946D
+:1023E0008E199A819D839B819E839C819F838111FD
+:1023F0001EC089818430B1F08730A1F08630A1F011
+:102400008530A1F0BE016F5F7F4F84E791E00E94AD
+:10241000FB1C8111E3CF84E791E00E94EC1C0E9439
+:1024200067190DC083E003C082E001C081E0AE0106
+:102430004B5F5F4F682FC8010E94211AE3CF279698
+:102440000FB6F894DEBF0FBECDBFDF91CF911F91C5
+:102450000F910895EF92FF920F93CF93DF9300D0E7
+:1024600000D000D0CDB7DEB77B014A832B830C832D
+:10247000842F2E834D830E948E192E814D818111D0
+:102480001BC082E0E816F10479F083E0E816F1045D
+:1024900021F0EA94EF2821F50BC0073F11F487E003
+:1024A00001C084E089830BC0273FD9F786E0FACFCB
+:1024B000473FB9F785E0F6CF42954F704983BE019B
+:1024C0006F5F7F4F84E791E00E94B11C84E791E049
+:1024D0000E94CF1C84E791E00E94EC1C0E946719C7
+:1024E00026960FB6F894DEBF0FBECDBFDF91CF9119
+:1024F0000F91FF90EF9008958091F903811109C029
+:102500000E946D160E94CA168091E200846080933A
+:10251000E20008951092F9030895089508950C9427
+:102520006129809192028F5F8093920262E30E9400
+:102530002834911135C01092920280919302882321
+:1025400079F18091FA03843049F58091E9008F7028
+:102550009091EC0090FF02C090E801C090E0982BB1
+:1025600084E08093E9008091EB0080FF14C08091AB
+:10257000EE0087FD03C00FC01092F1008091E800CB
+:1025800085FDFACF8091E80080FF05C08091E800CA
+:102590008E778093E8009F709093E90010929302E9
+:1025A000089542E061EC81E00E94E31542E061ECB5
+:1025B00082E00E94E31542E061EC83E00E94E315B3
+:1025C00042E261EC84E00E94E31542E361E885E0C9
+:1025D0000E94E31542E360E886E00C94E3158091E5
+:1025E000FC03833009F454C030F4813071F0823040
+:1025F00009F0A5C08CC08A3009F479C08B3009F489
+:102600005FC0893009F09BC020C08091FB03813AF4
+:1026100009F095C08091E800877F8093E800809161
+:10262000FF0390910004892B21F060E080E090E0AE
+:1026300003C068E089E892E070E00E941C15809178
+:10264000E8008B778093E80008958091FB03813246
+:1026500009F075C08091FF0390910004892B09F067
+:102660006EC08091E800877F8093E80005C080916C
+:10267000FA03882309F463C08091E80082FFF7CF52
+:102680008091F100809391028091E8008B7753C094
+:102690008091FB03813A09F052C08091FF03909131
+:1026A0000004892B09F04BC08091E800877F80935C
+:1026B000E8008091E80080FFFCCF80918A0136C05D
+:1026C0008091FB038132D9F58091FF039091000442
+:1026D000892BA9F58091E800877F8093E8000E940C
+:1026E0001A168091FD0380938A010C9456238091E1
+:1026F000FB03813221F58091E800877F8093E80019
+:102700000E941A168091FE0380938802089580919A
+:10271000FB03813AA1F48091E800877F8093E80071
+:102720008091E80080FFFCCF809188028093F100C7
+:102730008091E8008E778093E8000C941A16089533
+:1027400083E093E00E94F0196AE272E183E093E093
+:102750000E94461A60EE71E183E093E00E944A1AFB
+:1027600084B7877F84BF88E10FB6F89480936000B8
+:10277000109260000FBE90E080E80FB6F89480934E
+:102780006100909361000FBE0E94741D0E946D163F
+:102790000E94CA168091E20084608093E2007894DF
+:1027A00063E871E183E093E00E94EC196CE771E16A
+:1027B00083E093E00E94E41963E571E183E093E034
+:1027C0000E94E8190E940F0E0E9467190E94761D50
+:1027D00080E891E00E94201D0BC00E941E2980917C
+:1027E000F803882329F00E94492981110E94681466
+:1027F0008091FA03853089F383E093E00E94F91B0E
+:102800000E94801DF5CF292F332723303105B1F0E9
+:102810004CF42130310509F44DC02230310509F066
+:102820004EC007C02132310541F12232310591F10C
+:1028300046C0E0EDF0E084EE93E045C0992781309A
+:10284000910569F08230910589F0892B09F037C034
+:10285000E0EEF3E0E491F0E080EE93E034C0E2EBF0
+:10286000F3E0E491F0E082EB93E02DC0E6E8F3E0E2
+:10287000E491F0E086E893E026C0643000F5E62FAE
+:10288000F0E0EE0FFF1FE550FE4F80819181E9E0FF
+:10289000F0E019C0643098F4E62FF0E0DF01AA0FF1
+:1028A000BB1FAD5FBD4F8D919C91E55FFD4FE081FA
+:1028B000F0E009C0E2E1F0E084EB94E004C0E0E085
+:1028C000F0E080E090E0DA018D939C93CF010895D1
+:1028D00080E189BD82E189BD09B400FEFDCF809110
+:1028E000D8008F7D8093D8008091E0008260809333
+:1028F000E0008091E00081FDFCCF0895BF92CF926F
+:10290000DF92EF92FF920F931F93CF93DF937C019F
+:102910008B01EA010E943B16B82E811133C020972B
+:1029200031F028813981021B130BE20EF31EC12CFA
+:10293000D12C23C08091E80085FD15C08091E8006E
+:102940008E778093E800209749F0888199818C0DDB
+:102950009D1D9983888325E0B22E14C00E943B16EA
+:10296000882359F00EC0F70181917F018093F10017
+:1029700001501109FFEFCF1ADF0A01151105D1F639
+:1029800001C0B82E8B2DDF91CF911F910F91FF9039
+:10299000EF90DF90CF90BF900895BF92CF92DF92DB
+:1029A000EF92FF920F931F93CF93DF937C018B01E4
+:1029B000EA010E943B16B82E811133C0209731F0F6
+:1029C00028813981021B130BE20EF31EC12CD12C7E
+:1029D00023C08091E80085FD15C08091E8008B77C9
+:1029E0008093E800209749F0888199818C0D9D1D86
+:1029F0009983888345E0B42E14C00E943B16882337
+:102A000059F00EC08091F100F70181937F010150D0
+:102A10001109FFEFCF1ADF0A01151105D1F601C028
+:102A2000B82E8B2DDF91CF911F910F91FF90EF90DA
+:102A3000DF90CF90BF90089540910104509102041F
+:102A40004617570748F06115710539F44091E800C1
+:102A50004E774093E80001C0BA01FC0140E033C06A
+:102A60008091FA03882309F444C0853009F443C0F7
+:102A70008091E80083FD41C08091E80082FD33C071
+:102A80008091E80080FF1FC09091F3008091F200D8
+:102A9000392F20E0A901482BCA0106C0419140937B
+:102AA000F1006150710901966115710519F08830C6
+:102AB0009105A0F341E0089709F040E08091E8001B
+:102AC0008E778093E8006115710551F64111C8CFEA
+:102AD0000AC08091FA03882361F0853061F080910B
+:102AE000E80083FD0AC08091E80082FFF2CF80E019
+:102AF000089582E0089583E0089581E0089540916B
+:102B00000104509102044617570748F061157105FA
+:102B100039F44091E8004E774093E80001C0BA01D3
+:102B2000FC0140E034C08091FA03882309F445C0D9
+:102B3000853009F444C08091E80083FD42C0809153
+:102B4000E80082FD34C08091E80080FF20C09091B1
+:102B5000F3008091F200392F20E0A901482BCA012F
+:102B600007C044914093F10031966150710901967C
+:102B70006115710519F08830910598F341E00897C7
+:102B800009F040E08091E8008E778093E8006115BD
+:102B9000710549F64111C7CF0AC08091FA03882315
+:102BA00061F0853061F08091E80083FD0AC080917A
+:102BB000E80082FFF2CF80E0089582E0089583E08C
+:102BC000089581E00895982F2CC09093E9009817FC
+:102BD00039F07091EC002091ED005091F00003C0AD
+:102BE000242F762F50E021FD02C09F5F1AC0309144
+:102BF000EB003E7F3093EB003091ED003D7F309352
+:102C0000ED003091EB0031603093EB007093EC00FD
+:102C10002093ED005093F0002091EE0027FDE5CFCA
+:102C200007C0973090F28F708093E90081E008959B
+:102C300080E008958091FB0387FD05C08091E80046
+:102C400080FF0EC012C08091E80082FD05C0809117
+:102C5000FA038111F8CF08958091E8008B7708C0BE
+:102C60008091FA038111EACF08958091E8008E7770
+:102C70008093E80008958091E4009091E50045E696
+:102C80002091EC0020FD1FC023C02091FA032223D5
+:102C900091F0253091F02091EB0025FD10C020919E
+:102CA000E4003091E5002817390751F34150C9017C
+:102CB00039F784E0089582E0089583E0089581E083
+:102CC000089580E008952091E80020FFDECFF9CF3D
+:102CD0002091E80022FFD9CFF4CF0E94DB160E949A
+:102CE000E316E0EEF0E0808181608083E8EDF0E0C3
+:102CF00080818F77808319BCA7EDB0E08C918E7FA7
+:102D00008C9380818F7E80831092F90308950F93B6
+:102D10001F93CF93DF930E94DB160E94E316C8ED4A
+:102D2000D0E088818F7788838881806888838881D4
+:102D30008F7D888319BC1092FA031092F6031092CB
+:102D4000F8031092F70300EE10E0F80180818B7F0A
+:102D5000808388818160888342E060E080E00E9417
+:102D6000E315E1EEF0E080818E7F8083E2EEF0E01B
+:102D7000808181608083808188608083F801808188
+:102D80008E7F8083888180618883DF91CF911F91BE
+:102D90000F910895E8EDF0E080818F7E8083E7ED6C
+:102DA000F0E080818160808384E082BF81E0809355
+:102DB000F9030C948716E8EDF0E080818E7F808324
+:102DC0001092E20008951092DA001092E100089546
+:102DD0001F920F920FB60F9211242F933F934F9390
+:102DE0005F936F937F938F939F93AF93BF93EF9373
+:102DF000FF938091E10082FF0BC08091E20082FF8F
+:102E000007C08091E1008B7F8093E1000E949112C6
+:102E10008091DA0080FF1FC08091D80080FF1BC026
+:102E20008091DA008E7F8093DA008091D90080FF54
+:102E30000DC080E189BD82E189BD09B400FEFDCFEE
+:102E400081E08093FA030E947C1205C019BC1092A5
+:102E5000FA030E948A128091E10080FF19C08091DC
+:102E6000E20080FF15C08091E2008E7F8093E20037
+:102E70008091E20080618093E2008091D8008062BE
+:102E80008093D80019BC85E08093FA030E948E12CB
+:102E90008091E10084FF30C08091E20084FF2CC06B
+:102EA00080E189BD82E189BD09B400FEFDCF80913A
+:102EB000D8008F7D8093D8008091E1008F7E809331
+:102EC000E1008091E2008F7E8093E2008091E20039
+:102ED00081608093E2008091F603882311F084E002
+:102EE00007C08091E30087FF02C083E001C081E05A
+:102EF0008093FA030E948F128091E10083FF29C022
+:102F00008091E20083FF25C08091E100877F80935C
+:102F1000E10082E08093FA031092F6038091E100D1
+:102F20008E7F8093E1008091E2008E7F8093E200AB
+:102F30008091E20080618093E20042E060E080E006
+:102F40000E94E3158091F00088608093F0000E9459
+:102F50008D12FF91EF91BF91AF919F918F917F91D2
+:102F60006F915F914F913F912F910F900FBE0F90F6
+:102F70001F9018951F920F920FB60F9211242F9346
+:102F80003F934F935F936F937F938F939F93AF93F1
+:102F9000BF93CF93EF93FF938091E9008F7090914F
+:102FA000EC0090FF02C090E801C090E0C92FC82B50
+:102FB0001092E9008091F000877F8093F000789470
+:102FC0000E94FE171092E9008091F00088608093C3
+:102FD000F000CF70C093E900FF91EF91CF91BF91C6
+:102FE000AF919F918F917F916F915F914F913F91A1
+:102FF0002F910F900FBE0F901F9018951F93CF9396
+:10300000DF93CDB7DEB7AC970FB6F894DEBF0FBE37
+:10301000CDBFEBEFF3E08091F100819324E0E3304A
+:10302000F207C9F70E94EF128091E80083FF37C1D1
+:103030008091FB039091FC03953009F488C038F42B
+:103040009130B1F170F0933009F029C131C098305E
+:1030500009F4F8C0993009F404C1963009F01FC191
+:103060009DC0803821F0823809F019C108C08091D4
+:10307000F7039091F803992389F082600FC0809143
+:10308000FF03909100048F7099278093E90080914D
+:10309000EB0085FB882780F91092E9009091E80009
+:1030A000977F9093E8008093F1001092F100D5C0D3
+:1030B000882319F0823009F0F2C08F7121F082303C
+:1030C00009F0EDC00BC08091FD03813009F0E7C02D
+:1030D000933009F080E08093F8032FC08091FD03C6
+:1030E00081112BC08091FF03909100048F7099276C
+:1030F000009709F4D4C08093E9002091EB0020FFF1
+:103100001CC02091FC03233021F48091EB008062ED
+:1031100012C09091EB0090619093EB0021E030E0C1
+:1031200001C0220F8A95EAF72093EA001092EA0084
+:103130008091EB0088608093EB001092E900809111
+:10314000E800877F8093E8000E941A16A8C08111CA
+:10315000A6C08091FD039091FE038F779927182FC9
+:103160009091E3009078982B9093E3008091E80091
+:10317000877F8093E8000E941A168091E80080FF04
+:10318000FCCF8091E30080688093E300112311F06D
+:1031900083E001C082E08093FA0381C080588230CE
+:1031A00008F07DC08091FD039091FE038C3D23E0EB
+:1031B000920779F583E08A838AE289834FB7F8948E
+:1031C000DE01139620E03EE051E2E32FF0E0509361
+:1031D0005700E49120FF03C0E295EF703F5FEF706E
+:1031E0008E2F90E0EA3010F0C79601C0C0968D9304
+:1031F0009D932F5F243149F74FBF8091E800877F6F
+:103200008093E8006AE270E0CE0101960E941C15EE
+:1032100013C0AE01455D5F4F6091FF030E94031430
+:103220000097E9F12091E800277F2093E800BC0196
+:103230008BA59CA50E947F158091E8008B778093D9
+:10324000E8002DC0803859F58091E800877F809391
+:10325000E8008091F6038093F1008091E8008E777A
+:1032600071CF81111CC09091FD039230C0F4809108
+:10327000E800877F8093E8009093F6030E941A1677
+:103280008091F603811104C08091E30087FF02C0A2
+:1032900084E001C081E08093FA030E94D112809102
+:1032A000E80083FF0AC08091E800877F8093E800F0
+:1032B0008091EB0080628093EB00AC960FB6F8949F
+:1032C000DEBF0FBECDBFDF91CF911F910895CF9389
+:1032D0008091FA038823B1F08091E9008F7090917A
+:1032E000EC0090FF02C090E801C090E0C92FC82B0D
+:1032F0001092E9008091E80083FD0E94FE17CF70D4
+:10330000C093E900CF910895881F8827881F0895EA
+:1033100091E0883F08F490E0892F0895982F907FDE
+:10332000903B99F038F4903981F0903A71F09038F0
+:10333000C9F40BC0903DA1F018F4903C99F410C072
+:10334000903E19F0903F71F402C083E00895E82F99
+:10335000E15FEF3038F4F0E0E15FFD4F80810895E8
+:1033600082E0089580E008950F932F774F776F7074
+:10337000606BDC01ED91FC91022F242F462F63E05E
+:1033800070E009950F9108950F932F774F776F7025
+:103390006069DC01ED91FC91022F242F462F63E040
+:1033A00070E009950F9108950F932F774F776F7005
+:1033B0006068DC01ED91FC91022F242F462F63E021
+:1033C00070E009950F910895FC017383628308955D
+:1033D000FC01738F628F0895FC01758F648F0895CF
+:1033E000CF93DF93EC011DA21FA21EA2BC01685D5A
+:1033F0007F4F40EC88519F4F0E942D1C1B821A82E8
+:103400001D821C821F821E82198618861B861A86C0
+:103410001D861C861F861E86198A188A1B8A1A8A90
+:103420001D8A1C8A1F8A1E8A198E188E1B8E1A8E60
+:103430001D8E1C8E1F8E1E8E19A218A2DF91CF9199
+:103440000895CF92DF92FF920F931F93CF93DF9354
+:103450001F92CDB7DEB7F62E6A018C0108511F4FBF
+:1034600008C0F60161916F01C80149830E94341CB4
+:1034700049818C2D841B8F15A0F30F90DF91CF9184
+:103480001F910F91FF90DF90CF900895FC01718301
+:1034900060830895FC0171A360A30895AF92BF9269
+:1034A000CF92DF92EF92FF920F931F93CF93DF9310
+:1034B00000D01F92CDB7DEB77C016B01142FB22E66
+:1034C000A02EDC0195968C9195978430F1F45A9654
+:1034D000ED91FC915B97309709F4D8C0CB0101972F
+:1034E00063E070E00E943434DB01AA0FBB1FA60F1B
+:1034F000B71F49832A830B834C2D4A1B9E012F5FE4
+:103500003F4FBD01C7010995B1C06230710509F493
+:1035100053C06330710529F06130710509F09CC01A
+:1035200083C0842F807F803A01F130F48038B9F075
+:10353000803909F0ABC00DC0803EE9F0803F09F151
+:10354000803B09F0A3C0D7011296ED91FC9113972F
+:1035500023C0D7011496ED91FC9115971DC0D7019A
+:103560001696ED91FC91179717C0D7011896ED911B
+:10357000FC91199711C0D7011A96ED91FC911B97F8
+:103580000BC0423F09F082C0D7011C96ED91FC911F
+:103590001D97309731F47AC0309709F477C0123F05
+:1035A00021F42A2D4B2D62EF04C0612F6F702A2D5C
+:1035B0004B2DC70109955AC0842F807F803D59F05B
+:1035C000803F79F0803C09F061C0D7011E96ED91F3
+:1035D000FC911F9719C0D7015096ED91FC9151971E
+:1035E00013C0433F31F4D7015296ED91FC915397AC
+:1035F00008C0413F09F04AC0D7015496ED91FC91B3
+:103600005597309741F442C0309709F43FC0133FBB
+:1036100011F0113F19F44B2D612F03C0612F6F7012
+:103620004B2DC701099522C0842F0E948819882339
+:1036300031F0D7015696ED91FC91579707C0163F90
+:1036400029F5D7015896ED91FC9159973097F1F0F3
+:10365000612FC70109950AC064307105A8F416C02E
+:103660000A2D2B2D412FB601C7010995D7015E9672
+:10367000ED91FC915F97309789F00A2D2B2D412F0A
+:10368000B601C70109950AC0C12CD12CD7015C969F
+:10369000ED91FC915D97309719F7E8CF0F900F905F
+:1036A0000F90DF91CF911F910F91FF90EF90DF90DE
+:1036B000CF90BF90AF900895EF92FF920F931F931A
+:1036C000CF93DF93EC01162F862F0E948819882351
+:1036D00069F0FDA081E08DA300E020E0412F61E0D2
+:1036E00070E0CE010E944E1AFDA27CC0812F0E9484
+:1036F00084194DA1882309F440C0443029F01AA34D
+:1037000021E030E03FA32EA3812F0E948E1981304B
+:1037100031F070F0823051F0833059F507C08DA33D
+:1037200000E020E0412F61E070E01EC08DA35AC090
+:10373000103F19F0173FE9F404C084E08DA31AA3E9
+:103740003FC02EA13FA1C90163E070E00E94343464
+:103750008C0F9D1FFC0112A3B9016F5F7F4F7FA3E8
+:103760006EA30CA12BA14AA1CE010E944E1A1DA24C
+:1037700039C01DA21FA21EA235C0442399F12EA15B
+:103780003FA1C90163E070E00E9434347C01FE0176
+:10379000E80FF91F12A3B9016F5F7F4F7FA36EA3DC
+:1037A0008130910591F082E0E816F104D9F40CA182
+:1037B0002BA14AA1CE010E944E1A8DA1843091F016
+:1037C00081E090E09FA38EA30DC0423059F400E049
+:1037D0002BA14AA1CE010E944E1A8DA1843011F076
+:1037E000FFA2EEA2DF91CF911F910F91FF90EF907A
+:1037F0000895CF92DF92EF92FF920F931F93CF9392
+:10380000DF93EC01E8A1F9A1309709F009958E0149
+:1038100008511F4FC8010E94661CE12CF12CC82ED4
+:10382000D12C0FC060E0C8010E947A1C682FCE0125
+:103830000E945C1B61E0C8010E948B1C8FEFE81A9C
+:10384000F80AEC14FD0470F3DF91CF911F910F91F2
+:10385000FF90EF90DF90CF900895FC014283748336
+:1038600063831182108208950F931F93CF93DF9388
+:10387000EC01062F0E94AC1C182F298130E0C901F1
+:1038800001966A8170E00E944834488150E08417B4
+:10389000950729F4812F0E94AF1C80E012C0EB81B4
+:1038A000FC81E20FF31F00832981822F90E00196B3
+:1038B0006A8170E00E9448348983812F0E94AF1C86
+:1038C00081E0DF91CF911F910F910895CF93DF9306
+:1038D000EC010E94AC1C29819881291710F0C22F9D
+:1038E00002C0CA81C20FC91B0E94AF1C8C2FDF917E
+:1038F000CF910895FC012081862F90E0820F911DC9
+:10390000628170E00E9448340380F481E02DE80F6A
+:10391000F91F808108950F931F93CF93DF931F9218
+:10392000CDB7DEB78C0169830E94AC1C482FF8012B
+:1039300080816981262F30E0280F311D6281C90105
+:1039400070E00E9448348083842F0F90DF91CF91E4
+:103950001F910F910C94AF1C8FB7F89408958FBFEF
+:103960000895FC01CB012091FA032430B1F42181A8
+:103970002F702093E90040E050E064E070E00E9486
+:103980007E1481110BC09091E80095FD07C09091C5
+:10399000E8009E779093E800089582E008952091D2
+:1039A000FA032430A9F4FC0181818F708093E9002F
+:1039B0003091F3002091F200932F80E0822B892B2D
+:1039C00049F08091E8008E778093E8000C943B16D4
+:1039D00082E0089580E008952091FA03243051F4A4
+:1039E000FC0121812F702093E9002091E80020FD47
+:1039F0000C94CF1C0895FC01CB012091FA032430D4
+:103A000011F080E0089526812F702093E900209125
+:103A1000E80022FFF6CF2091E80025FFF2CF40E03A
+:103A200050E064E070E00E94CD148091E80085FDD4
+:103A300005C08091E8008B778093E80081E00895CD
+:103A400090939502809394020895E0919402F091EE
+:103A50009502309721F00190F081E02D099480E0EB
+:103A60000895E0919402F0919502309721F0028040
+:103A7000F381E02D09940895E0919402F09195026C
+:103A8000309721F00480F581E02D0994089520916C
+:103A90009602309197028217930771F090939702E4
+:103AA00080939602E0919402F0919502309721F074
+:103AB0000680F781E02D09940895209198023091B5
+:103AC00099028217930771F090939902809398025C
+:103AD000E0919402F0919502309721F00084F185F5
+:103AE000E02D0994089508950C94731D0E94952962
+:103AF0000E94AD060E94692A0C9411300C94E705CF
+:103B00005F926F927F928F929F92AF92BF92CF926D
+:103B1000DF92EF92FF920F931F93CF93DF93CDB776
+:103B2000DEB72A970FB6F894DEBF0FBECDBF0E9456
+:103B3000BD079AE9C92E92E0D92E00E010E0AA2430
+:103B4000A394B12C502E802F0E9411093C01F60144
+:103B5000E190F1906F01E826F926E114F10431F4C7
+:103B60000F5F1F4F0530110569F73AC08091F002D1
+:103B700081FD0E941A0920E030E04501022E02C0BA
+:103B8000880C991C0A94E2F7C4018E219F21892B8D
+:103B900009F12E835F826820792081E0672809F48B
+:103BA00080E088870E949E298160782F9A87898784
+:103BB0004E815F8168858A850E94391EF801EE0F6B
+:103BC000FF1FE656FD4F80819181882599259183BD
+:103BD000808316C02F5F3F4F2C30310571F6C0CF68
+:103BE0008FEF89838A831B820E949E298160782FB0
+:103BF0009D838C8349815A816B818D810E94391EFE
+:103C00000E94562D1091A4020E94251D1817D9F06C
+:103C10000E94251D8093A4022A960FB6F894DEBF59
+:103C20000FBECDBFDF91CF911F910F91FF90EF900D
+:103C3000DF90CF90BF90AF909F908F907F906F90CC
+:103C40005F900C947E1D2A960FB6F894DEBF0FBECF
+:103C5000CDBFDF91CF911F910F91FF90EF90DF903B
+:103C6000CF90BF90AF909F908F907F906F905F901C
+:103C70000895CF93DF93CDB7DEB72B970FB6F894A7
+:103C8000DEBF0FBECDBF4F83588769877A878B878A
+:103C9000DE01119686E0FD0111928A95E9F785E033
+:103CA000FE01379601900D928A95E1F749815A817C
+:103CB0006B817C818D819E810E9415262B960FB68B
+:103CC000F894DEBF0FBECDBFDF91CF910895CF93A3
+:103CD000C82F882309F4C1C0823859F40E94251DD9
+:103CE00081FDBBC089E30E947C280E94F82889E3FB
+:103CF0000CC0833879F40E94251D80FDAEC083E599
+:103D00000E947C280E94F82883E50E949E28CF917B
+:103D10000C94F828843859F40E94251D82FD9DC01A
+:103D200087E40E947C280E94F82887E4EECF845024
+:103D3000813A48F48C2F0E94732F81118EC08C2FF2
+:103D40000E947C28E4CF8C2F805E883050F4C770AE
+:103D500081E090E001C0880FCA95EAF70E94BF2871
+:103D6000D6CF8C2F855A833078F4C53A29F0C63ADD
+:103D700031F482E890E005C081E890E002C083E879
+:103D800090E0CF910C94471D8C2F885A833108F016
+:103D900064C0C83A39F1C93A41F1CA3A49F1CB3A5B
+:103DA00051F1CC3A59F1CD3A61F1C03B69F1CE3ACB
+:103DB00071F1CF3A79F1C13B81F1C23B89F1C33B4B
+:103DC00091F1C43B99F1C53BA1F1C63BA9F1C73BB9
+:103DD000B1F1C83BB9F1C93BC1F1CA3BC9F58AE2AF
+:103DE00092E038C082EE90E035C089EE90E032C0BB
+:103DF0008AEE90E02FC085EB90E02CC086EB90E03F
+:103E000029C087EB90E026C08CEC90E023C08DECBD
+:103E100090E020C083E891E01DC08AE891E01AC0DC
+:103E200082E991E017C084E991E014C081E292E058
+:103E300011C083E292E00EC084E292E00BC085E202
+:103E400092E008C086E292E005C087E292E002C0FC
+:103E500080E090E0CF910C945D1DCF910895882370
+:103E600009F44DC0823859F40E94251D81FF47C0D6
+:103E700089E30E947C280E94F82889E30CC08338DB
+:103E800071F40E94251D80FF3AC083E50E947C28C2
+:103E90000E94F82883E50E949E280C94F828843814
+:103EA00059F40E94251D82FF2AC087E40E947C28C5
+:103EB0000E94F82887E4EFCF982F9450913A08F4A5
+:103EC000EACF982F905E983058F4282F277081E021
+:103ED00090E001C0880F2A95EAF70E94C528DDCF3F
+:103EE000982F955A933020F480E090E00C94471D71
+:103EF000885A833120F480E090E00C945D1D089591
+:103F0000882321F00E94BF280C94F8280895882364
+:103F100021F00E94C5280C94F8280895BF92CF92F2
+:103F2000DF92EF92FF920F931F93CF93DF93CDB762
+:103F3000DEB727970FB6F894DEBF0FBECDBF8C015A
+:103F400085E0F801DE01119601900D928A95E1F766
+:103F5000F80130812181F280558152955F70838113
+:103F60009481892B39F02F3F41F481E090E03F3F6D
+:103F700031F003C081E090E002C080E090E080FD7D
+:103F800073C339832A8389819A815E830E94392889
+:103F9000B92E8F830E9438280E9460272B2D2295EE
+:103FA0002F7030E05E816F812530310509F4E6C065
+:103FB0006CF4243031050CF0A2C04B2D407F8B2DCA
+:103FC0008F70223031050CF045C017C02C30310500
+:103FD0004CF42A3031050CF0E7C12830310509F0E6
+:103FE00043C3E5C02D30310509F4BAC20CF4A2C2B6
+:103FF0002F30310509F038C323C3182F411101C0F8
+:1040000002C01295107FFF2059F0112309F46BC2F2
+:10401000812F6F830E94CF280E94F8286F8163C28E
+:10402000862F0E942F1F112309F41EC3812F0E9487
+:10403000D52827960FB6F894DEBF0FBECDBFDF910F
+:10404000CF911F910F91FF90EF90DF90CF90BF9095
+:104050000C94F828403211F08295807F662319F085
+:10406000613071F523C0FF20B1F0511101C032C0A1
+:10407000513081F527960FB6F894DEBF0FBECDBF45
+:10408000DF91CF911F910F91FF90EF90DF90CF9034
+:10409000BF900C94DF28511101C003C0513009F4C6
+:1040A000E3C28E830E94E2288E819AC1FF2021F014
+:1040B000563008F0D9C20EC0553008F0D5C290C1B4
+:1040C000FF20C9F0552331F0F801958190FF0BC214
+:1040D0009F70958327960FB6F894DEBF0FBECDBFB5
+:1040E000DF91CF911F910F91FF90EF90DF90CF90D4
+:1040F000BF900C94801F552309F472C109C22B2D67
+:1041000026952695237030E02115310529F02130C0
+:10411000310509F0A9C219C0FF2021F0862F9B2D7F
+:10412000937002C080E090E027960FB6F894DEBF4F
+:104130000FBECDBFDF91CF911F910F91FF90EF90F8
+:10414000DF90CF90BF900C94471DFF2021F0862F69
+:104150009B2D937002C080E090E027960FB6F894F4
+:10416000DEBF0FBECDBFDF91CF911F910F91FF90AA
+:10417000EF90DF90CF90BF900C945D1D862FFF20B5
+:1041800019F00E945C2C02C00E94C42C27960FB626
+:10419000F894DEBF0FBECDBFDF91CF911F910F917D
+:1041A000FF90EF90DF90CF90BF900C944B2D8B2D14
+:1041B000837009F079C0F11057C2262F22952695F9
+:1041C0002770220F220F862F8F70C82ED12CE12C42
+:1041D000F12C022E04C0CC0CDD1CEE1CFF1C0A943A
+:1041E000D2F764FF10C06FE070E080E090E004C0A0
+:1041F000660F771F881F991F2A95D2F760957095D3
+:104200008095909503C060E070E0CB012B2D269542
+:1042100026952370422F50E042305105D9F04330AB
+:10422000510569F16C297D298E299F29413051055D
+:1042300051F127960FB6F894DEBF0FBECDBFDF91C8
+:10424000CF911F910F91FF90EF90DF90CF90BF9093
+:104250000C9475276C297D298E299F2927960FB6E6
+:10426000F894DEBF0FBECDBFDF91CF911F910F91AC
+:10427000FF90EF90DF90CF90BF900C9487270E9423
+:104280007527C701B60127960FB6F894DEBF0FBE9B
+:10429000CDBFDF91CF911F910F91FF90EF90DF90F5
+:1042A000CF90BF900C946327FF2019F08B2D817065
+:1042B00001C08695882309F4D7C1262F229526951B
+:1042C0002770220F220F862F8F70C82ED12CE12C41
+:1042D000F12C022E04C0CC0CDD1CEE1CFF1C0A9439
+:1042E000D2F764FF10C06FE070E080E090E004C09F
+:1042F000660F771F881F991F2A95D2F760957095D2
+:104300008095909503C060E070E0CB012B2D269541
+:1043100026952370422F50E042305105D9F04330AA
+:10432000510569F16C297D298E299F29413051055C
+:1043300051F127960FB6F894DEBF0FBECDBFDF91C7
+:10434000CF911F910F91FF90EF90DF90CF90BF9092
+:104350000C9414286C297D298E299F2927960FB645
+:10436000F894DEBF0FBECDBFDF91CF911F910F91AB
+:10437000FF90EF90DF90CF90BF900C9426280E9482
+:104380001428C701B60127960FB6F894DEBF0FBEFA
+:10439000CDBFDF91CF911F910F91FF90EF90DF90F4
+:1043A000CF90BF900C940228603F59F120F4603EFA
+:1043B00008F494C008C0623F09F467C0F0F1633F9D
+:1043C00009F08CC065C0162F1F708B2D8F71FF20D8
+:1043D00021F00E94AD27812F7DCE0E94C827812F1A
+:1043E00027960FB6F894DEBF0FBECDBFDF91CF91F9
+:1043F0001F910F91FF90EF90DF90CF90BF900C94A2
+:10440000871FFF20B1F0553008F02EC18B2D8F7122
+:1044100027960FB6F894DEBF0FBECDBFDF91CF91C8
+:104420001F910F91FF90EF90DF90CF90BF900C9471
+:10443000E727563008F018C1E9CFFF2099F08B2DFF
+:104440008F7127960FB6F894DEBF0FBECDBFDF91F8
+:10445000CF911F910F91FF90EF90DF90CF90BF9081
+:104460000C94AD278B2D8F7127960FB6F894DEBF75
+:104470000FBECDBFDF91CF911F910F91FF90EF90B5
+:10448000DF90CF90BF900C94C827F110EBCFD7CF1F
+:10449000FF2099F08B2D8F7127960FB6F894DEBF11
+:1044A0000FBECDBFDF91CF911F910F91FF90EF9085
+:1044B000DF90CF90BF900C949E2727960FB6F8946C
+:1044C000DEBF0FBECDBFDF91CF911F910F91FF9047
+:1044D000EF90DF90CF90BF900C949927FF20A9F028
+:1044E000552309F4ACCF862F27960FB6F894DEBF7C
+:1044F0000FBECDBFDF91CF911F910F91FF90EF9035
+:10450000DF90CF90BF900C94671E552309F4AACF7B
+:10451000862F27960FB6F894DEBF0FBECDBFDF9172
+:10452000CF911F910F91FF90EF90DF90CF90BF90B0
+:104530000C942F1F4B2D4F70C8010E941A03279611
+:104540000FB6F894DEBF0FBECDBFDF91CF911F91A4
+:104550000F91FF90EF90DF90CF90BF900C94CB26FF
+:10456000F11082C09B2D9F70492F50E042305105C1
+:1045700099F144F44115510569F04130510509F0B4
+:1045800073C019C043305105C1F14430510509F0E1
+:104590006BC044C027960FB6F894DEBF0FBECDBFE8
+:1045A000DF91CF911F910F91FF90EF90DF90CF900F
+:1045B000BF900C94223027960FB6F894DEBF0FBE42
+:1045C000CDBFDF91CF911F910F91FF90EF90DF90C2
+:1045D000CF90BF900C94393027960FB6F894DEBF79
+:1045E0000FBECDBFDF91CF911F910F91FF90EF9044
+:1045F000DF90CF90BF900C94553027960FB6F8946B
+:10460000DEBF0FBECDBFDF91CF911F910F91FF9005
+:10461000EF90DF90CF90BF900C946830862F279654
+:104620000FB6F894DEBF0FBECDBFDF91CF911F91C3
+:104630000F91FF90EF90DF90CF90BF900C948C3053
+:104640004B2D4F70C80127960FB6F894DEBF0FBEF2
+:10465000CDBFDF91CF911F910F91FF90EF90DF9031
+:10466000CF90BF900C941B0927960FB6F894DEBF2D
+:104670000FBECDBFDF91CF911F910F91FF90EF90B3
+:10468000DF90CF90BF9008950E94DC280E94B1284F
+:104690000E94F8280E94F72D0E944B2D80E090E0A8
+:1046A0000E94471D80E090E00C945D1D0E94CC2884
+:1046B0000C9444230E943928292F22952F7030E032
+:1046C0002C3031054CF42A3031056CF4225031097C
+:1046D0002230310590F407C02C30310551F02F30D5
+:1046E000310559F406C0803E10F0803F31F481E07E
+:1046F000089593FB882780F9089580E00895CF936B
+:10470000DF9300D000D01F92CDB7DEB70F900F908F
+:104710000F900F900F90DF91CF910895CF93DF937B
+:1047200000D000D000D0CDB7DEB726960FB6F894F3
+:10473000DEBF0FBECDBFDF91CF9108951F93CF9302
+:10474000DF93C091DB0216E012C0D0E01C9FF001A5
+:104750001D9FF00D1124E555FD4F4081518162816F
+:104760007381848195810E948E232196C7708091E8
+:10477000DC02C813EACFDF91CF911F9108954091D9
+:10478000A5025091A6026091A7027091A8028091A3
+:10479000A9029091AA020C948E230F931F93CF939A
+:1047A000DF938091AA0282958F7009F069C0809191
+:1047B000A702882309F464C0A091DB02D091DC0237
+:1047C000B091A502C091A6028091A8029091A90281
+:1047D00021E030E0BF3F11F020E030E0122FBC01BB
+:1047E0006095709506E04AC0009721F0CF3F29F40C
+:1047F000212F05C021E030E002C020E030E020FDA4
+:104800003BC04A2F50E0049FF001059FF00D11249A
+:10481000E555FD4F2181C2132FC02081B2132CC05A
+:104820002281211129C0238134812817390718F0EA
+:10483000281B390B02C0260F371F283C3105E0F436
+:104840008091AA028F7080618093AA0286E0849F83
+:10485000F001859FF00D1124E055FD4F80818F7090
+:104860008061808385EA92E00E948E1FDF91CF9164
+:104870001F910F910C949E23AF5FA770AD13B4CF1F
+:10488000DF91CF911F910F910895EF92FF920F93B7
+:104890001F93CF93DF93CDB7DEB762970FB6F8942F
+:1048A000DEBF0FBECDBF8C0185E0F801DE011D9695
+:1048B00001900D928A95E1F7D8014C9111965C9187
+:1048C000119712966C9112971396ED90FC90149795
+:1048D0007091A502E091A6028091A8029091A90290
+:1048E000009739F0EF3F41F421E030E07F3F31F0B5
+:1048F00003C021E030E002C020E030E020FD5CC1D8
+:104900002091A702222309F4F1C0E816F90628F045
+:104910009701281B390BC90104C0809590958E0D15
+:104920009F1D883C910508F098C08091AA02982F9D
+:10493000907F09F064C0E51314C0741312C06111B4
+:1049400010C08F7080618093AA020E94BF2385EA05
+:1049500092E00E948E1F8091AA02D80115968C9336
+:1049600043C1EF2839F05F3F41F481E090E04F3FD1
+:1049700031F003C081E090E002C080E090E080FD73
+:1049800003C081E0862702C080E090E080FF2EC057
+:104990008091DB022091DC0236E013C090E0389F6A
+:1049A000F001399FF00D1124E555FD4F718157132A
+:1049B00006C07081471303C07281671317C0019648
+:1049C00087708213EBCF12C19F7059F0882309F4CE
+:1049D0000BC107C09F7029F0F8019581907F09F401
+:1049E00003C1805E883008F4FFC0D2C0662309F49A
+:1049F000FBC08091AA0281608093AA02F5C0E513F2
+:104A000008C0741306C0611104C0D80115968C93B8
+:104A10009DC04D875E878D859E856A8B0E945A2337
+:104A20006A89882309F4B4C0662309F4B1C02091CF
+:104A3000AA02822F82958F7090E002970CF4C6C074
+:104A40008091A5029091A60298878F831986FB8694
+:104A5000EA862C87CE01079646C08091AA02982F3D
+:104A6000907F59F47E2DF98AE88A89890E947F23F4
+:104A700085EA92E00E948E1F95C0E51311C0741361
+:104A80000FC061110DC0F8018583C8010E948E1FFF
+:104A9000E5EAF2E086E0DF011D928A95E9F7A2C01F
+:104AA0004D875E878D859E856A8B0E945A236A8911
+:104AB000882309F46DC0662309F46AC02091AA0214
+:104AC000822F82958F7090E002970CF47FC08091C6
+:104AD000A5029091A6029A8389831B82FD82EC82B3
+:104AE0002E83CE0101960E948E1F70C0E816F90633
+:104AF00028F09701281B390BC90104C080959095B7
+:104B00008E0D9F1D883C910508F046C0662309F470
+:104B10003FC0E51330C074132EC02091AA0220FDBF
+:104B200021C0322F32953F70832F90E00097D1F053
+:104B3000D80115962C9315970F9741F0832F8F5F0F
+:104B40008295807F2F70282B15962C93C8010E9488
+:104B50008E1F86E0F801A5EAB2E001900D928A95D9
+:104B6000E1F73EC086E0F801A5EAB2E001900D92BF
+:104B70008A95E1F737C04D875E878D859E850E94B7
+:104B80005A23811123C08091AA0281608093AA02D6
+:104B9000C8010E948E1F26C07E2DF98AE88A898965
+:104BA0000E947F23E5EAF2E086E0DF011D928A950C
+:104BB000E9F70E94BF2318C0662351F34D875E8733
+:104BC0008D859E850E945A23882311F386E0F80183
+:104BD000A5EAB2E001900D928A95E1F70E94CD23FB
+:104BE0000E94BF2381E014C080E012C04D875E8721
+:104BF0008D859E850E943928292F22952F7030E0BF
+:104C0000223031050CF4E0CE243031050CF6E2CE32
+:104C100062960FB6F894DEBF0FBECDBFDF91CF9185
+:104C20001F910F91FF90EF9008951F93CF93DF9303
+:104C3000CDB7DEB72C970FB6F894DEBF0FBECDBF51
+:104C40004F83588769877A878B879C87CE01079621
+:104C50000E9445248823D9F02F8138858A859B8539
+:104C6000892B39F03F3F19F080E090E004C02F3FDE
+:104C7000D9F781E090E0892B09F06DC04F8158850C
+:104C800069857A858B859C850E948E2364C086E029
+:104C9000FE013796DE01119601900D928A95E1F79B
+:104CA000FF81E8854A855B854115510539F0EF3F65
+:104CB00041F481E090E0FF3F31F003C081E090E0FB
+:104CC00002C080E090E080FD46C02091DC0230E030
+:104CD000C9010196877099276091DB0270E0861701
+:104CE000970709F440C0F983EA835D834C8396E01B
+:104CF000929FD001939FB00D1124A555BD4FFE0189
+:104D0000319601900D929A95E1F78093DC020E9412
+:104D10009E2321C0189FC001112485559D4F0E94DC
+:104D20004524882371F1E091DB021E9FF0011124DC
+:104D3000E555FD4F40815181628173818481958168
+:104D40000E948E238091DB0290E001968770992764
+:104D50008093DB0201C016E08091DB029091DC02BF
+:104D60008913D8CF0EC00E9456231092DC021092F5
+:104D7000DB02E5EAF2E086E0DF011D928A95E9F7C1
+:104D8000EACF2C960FB6F894DEBF0FBECDBFDF91F1
+:104D9000CF911F910895DF92EF92FF920F931F938F
+:104DA000CF93DF93EC01009709F46EC0D12CEE2471
+:104DB000E394F12C8E010F5F1F4FFE018491843725
+:104DC00048F4843008F04CC0813071F0823009F032
+:104DD0005BC01EC0853709F43FC080F1982F9458FE
+:104DE000903708F051C03FC02296F8018491982F67
+:104DF000905E983050F48770FE2D01C0FF0F8A95A9
+:104E0000EAF78F2F0E94CF2813C00E94671E2FC081
+:104E10002296F8018491982F905E983060F4877004
+:104E2000FE2D01C0FF0F8A95EAF78F2F0E94D5282B
+:104E30000E94F8281CC00E942F1F19C02296F8015A
+:104E4000049107C08FE99FE00197F1F700C00000CF
+:104E500001500111F7CF0BC02296F801D49007C082
+:104E60000E94671E03C08F770E942F1FE8018D2DBF
+:104E700007C08150EFE9FFE03197F1F700C0000073
+:104E8000882309F497CFF5CFDF91CF911F910F9130
+:104E9000FF90EF90DF9008956093E1027093E2023B
+:104EA0008093E3029093E4020C9444236093DD0228
+:104EB0007093DE028093DF029093E0020C9444230F
+:104EC00008950C944C270F931F930091E1021091C9
+:104ED000E2022091E3023091E402602B712B822BDD
+:104EE000932B1F910F910C944C270F931F930091BC
+:104EF000E1021091E2022091E3023091E40260238A
+:104F00007123822393231F910F910C944C270F93AD
+:104F10001F930091E1021091E2022091E30230918F
+:104F2000E40260277127822793271F910F910C9429
+:104F30004C2760E070E0CB010C94562741E050E034
+:104F400060E070E004C0440F551F661F771F8A950C
+:104F5000D2F7CB01BA010C94562741E050E060E053
+:104F600070E004C0440F551F661F771F8A95D2F763
+:104F70008091DD029091DE02A091DF02B091E0020B
+:104F8000482B592B6A2B7B2BCB01BA010C9456274B
+:104F900041E050E060E070E004C0440F551F661F20
+:104FA000771F8A95D2F740955095609570958091BE
+:104FB000DD029091DE02A091DF02B091E002482371
+:104FC00059236A237B23CB01BA010C94562741E075
+:104FD00050E060E070E004C0440F551F661F771F6B
+:104FE0008A95D2F78091DD029091DE02A091DF02D6
+:104FF000B091E002482759276A277B27CB01BA01E5
+:105000000C9456270F931F930091DD021091DE023E
+:105010002091DF023091E002602B712B822B932BC9
+:105020001F910F910C9456270F931F930091DD024F
+:105030001091DE022091DF023091E00260237123A3
+:10504000822393231F910F910C9456270F931F9344
+:105050000091DD021091DE022091DF023091E0022A
+:1050600060277127822793271F910F910C94562751
+:105070000895CF92DF92EF92FF920F931F93CF93F9
+:10508000DF93EC01C090E102D090E202E090E302F5
+:10509000F090E4028091DD029091DE02A091DF02A7
+:1050A000B091E002C82AD92AEA2AFB2A0FE110E0CF
+:1050B000B701A601002E04C07695679557954795D0
+:1050C0000A94D2F740FF08C0BE01802F0E947104ED
+:1050D0008130910509F007C00150110948F7BE0160
+:1050E00080E00E947104DF91CF911F910F91FF909A
+:1050F000EF90DF90CF90089540918B0150918C01FB
+:1051000020E030E09FEFFA01E20FF31F62816817A1
+:10511000A1F09F3F19F4611101C0922F2F5F3F4F03
+:105120002630310581F707C0FA01E90FF11D97FD1F
+:10513000FA95828308959F3FB9F7089540918B01B6
+:1051400050918C0120E030E0FA01E20FF31F9281D0
+:10515000981301C012822F5F3F4F26303105A1F70F
+:10516000089581E090E0E0918B01F0918C01E80FCF
+:10517000F91F1082019688309105A9F70895909142
+:10518000E502982B9093E502089580959091E502B1
+:1051900098239093E50208951092E5020895909166
+:1051A000E602982B9093E602089580959091E6028E
+:1051B00098239093E60208951092E6020895809352
+:1051C000E70208951092E702089540918B015091F3
+:1051D0008C0120E030E080E0FA01E20FF31F9181C2
+:1051E00091118F5F2F5F3F4F27303105A9F7089549
+:1051F000E0918B01F0918C018091E5028083E09138
+:105200008B01F0918C0180819091E602892B808343
+:105210009091E702992361F0E0918B01F0918C016C
+:105220008081892B80830E94E52881110E94E228D9
+:1052300080918B0190918C010C94311D8091FA0327
+:10524000843021F11092F10220E488E190E00FB661
+:10525000F894A895809360000FBE2093600080E0D2
+:105260000E94590383B7817F846083BF83B78160C5
+:1052700083BF7894889583B78E7F83BF88E10FB60C
+:10528000F89480936000109260000FBE0895089516
+:105290000895CF9380E00E9459030E9447290E94FD
+:1052A000BD070E944829C0E08C2F0E941109892B5C
+:1052B00029F4CF5FC530C1F780E001C081E0CF9114
+:1052C00008950E94562380E00E9459030E941130E5
+:1052D0000E94251D0C94E7051F920F920FB60F92A6
+:1052E00011248F939F93AF93BF938091F10281110B
+:1052F00013C08091F2029091F302A091F402B09158
+:10530000F5024196A11DB11D8093F2029093F30224
+:10531000A093F402B093F502BF91AF919F918F914A
+:105320000F900FBE0F901F90189582E084BD93E000
+:1053300095BD9AEF97BD80936E0008958FB7F8944E
+:105340004091F2025091F3026091F4027091F502E3
+:105350008FBFCA010895CF92DF92EF92FF920F9311
+:105360001F932FB7F8944091F2025091F30260918D
+:10537000F4027091F5022FBF6A017B01EE24FF2435
+:105380008C0120E030E0C016D106E206F30620F0E2
+:105390009A01281B390B05C09C0120953095240FDC
+:1053A000351FC9011F910F91FF90EF90DF90CF90B3
+:1053B00008951F920F920FB60F9211248F939F930F
+:1053C000AF93BF938091F2029091F302A091F40207
+:1053D000B091F5020196A11DB11D8093F202909348
+:1053E000F302A093F402B093F502BF91AF919F91A5
+:1053F0008F910F900FBE0F901F9018950E946D1601
+:10540000F8942FEF87EA91E6215080409040E1F731
+:1054100000C0000087E090EBDC01809304049093CF
+:105420000504A0930604B09307042CE088E190E003
+:105430000FB6F894A895809360000FBE209360008B
+:10544000FFCFCF92DF92EF92FF920F931F93CF93F4
+:10545000DF93C82ED12C01E010E08D2D0E941109A0
+:105460007C01C0E0D0E098010C2E02C0220F331F57
+:105470000A94E2F72E213F21232B29F42196CC30E8
+:10548000D10589F708C06C2F7D2D80E00E944C0467
+:10549000C812F4CF06C0D39485E0D812DECF80E0E6
+:1054A00001C081E0DF91CF911F910F91FF90EF90AC
+:1054B000DF90CF900895CF93C82F8CE20E94212ACD
+:1054C000882321F08C2FCF910C94212A80E0CF915A
+:1054D0000895CF930E94AC2B811102C00E948D2BA6
+:1054E000C5E608C00E94BD078FE39CE90197F1F76C
+:1054F00000C00000C150B1F789E20E945B2A81110F
+:105500000AC18AE20E945B2A81110E948D2B85E0EC
+:105510000E945B2A81110E94FE290E94B72B809372
+:10552000F00287E00E945B2A882399F18BE10E94B8
+:105530005B2A882351F09091F00291FB882780F933
+:1055400021E0822780FB91F922C08EE00E945B2A35
+:10555000882351F09091F00292FB882780F921E096
+:10556000822780FB92F913C080E10E945B2A909110
+:10557000F002882341F093FB882780F921E08227FD
+:1055800080FB93F904C0892F809580FB90F990935C
+:10559000F0028091F0020E94BB2B0E94C92B8093E5
+:1055A000010380EE0E945B2A882341F08091010371
+:1055B000982F909590FB80F98093010389E30E94D6
+:1055C0005B2A882359F09091010391FB882780F989
+:1055D00021E0822780FB91F99093010382EE0E94E3
+:1055E0005B2A882359F09091010392FB882780F968
+:1055F00021E0822780FB92F99093010386EE0E94BE
+:105600005B2A882359F09091010393FB882780F946
+:1056100021E0822780FB93F99093010383EE0E949F
+:105620005B2A882359F09091010394FB882780F925
+:1056300021E0822780FB94F99093010385E30E9487
+:105640005B2A882359F09091010395FB882780F904
+:1056500021E0822780FB95F99093010381E30E946A
+:105660005B2A882359F09091010396FB882780F9E3
+:1056700021E0822780FB96F99093010381E10E944B
+:105680005B2A882359F09091010397FB882780F9C2
+:1056900021E0822780FB97F9909301038091010319
+:1056A0000E94CD2B87E20E945B2AC82F8EE10E94C8
+:1056B0005B2A8111C2608FE10E945B2A8111C46064
+:1056C00080E20E945B2A8111C86081E20E945B2A0D
+:1056D0008111C06182E20E945B2A8111C06283E273
+:1056E0000E945B2A8111C06484E20E945B2A8823A5
+:1056F00011F0C06802C0CC2329F08C2F0E94C42B6B
+:105700006C2F03C00E94C02B682F70E080E090E0F7
+:10571000CF910C946127CF9108956DEE7EEF80E0DC
+:1057200090E00E94783460E082E090E00E946A3469
+:1057300060E083E090E00E946A3460E084E090E002
+:105740000E946A3460E085E090E00E946A3460E084
+:1057500086E090E00C946A3480E090E00E9464342B
+:1057600021E08D3E9E4F09F020E0822F089582E0D7
+:1057700090E00C945C34682F82E090E00C946A34E2
+:1057800083E090E00C945C34682F83E090E00C940C
+:105790006A3484E090E00C945C34682F84E090E0FC
+:1057A0000C946A3486E090E00C945C34682F86E0B8
+:1057B00090E00C946A348091FE0280FF0BC06091EF
+:1057C000900185E0689FB0011124759567957595E6
+:1057D00067952AC081FF09C06091900185E0689FAC
+:1057E000B0011124759567951FC082FF07C06091B5
+:1057F000900185E0689FB001112416C04091F80225
+:105800004423C9F060918F01461788F720919001D9
+:1058100085E0289F90011124429FC001439F900D75
+:10582000112470E00E9448346038710540F461151D
+:10583000710539F002C065E070E0862F08958FE7AA
+:10584000089581E008958091FE0280FF08C0609174
+:105850008E0170E0759567957595679521C081FFFC
+:1058600006C060918E0170E07595679519C082FF42
+:1058700004C060918E0170E010C08091F80288230E
+:10588000C1F060918D018617A0F790918E01989FCD
+:10589000C001112470E00E9448346038710528F47A
+:1058A0006115710521F0862F08958FE7089581E035
+:1058B000089561E070E0F4CF803F21F40E94DB2B7B
+:1058C000819504C0813F29F40E94DB2B8093FB0269
+:1058D0000895823F21F40E94DB2B819504C0833F11
+:1058E00029F40E94DB2B8093FA020895893F19F472
+:1058F0000E94232C05C08A3F31F40E94232C8195FD
+:105900008093FC0208958B3F21F40E94232C819503
+:1059100004C08C3F29F40E94232C8093FD0208953B
+:10592000843F21F48091F902816017C0853F21F402
+:105930008091F902826011C0863F21F48091F902C2
+:1059400084600BC0873F21F48091F902886005C014
+:10595000883F31F48091F90280618093F9020895C3
+:105960008D3F21F48091FE0281600BC08E3F21F4B7
+:105970008091FE02826005C08F3F29F48091FE0273
+:1059800084608093FE020895803F29F48091FB0299
+:1059900087FF6EC007C0813F41F48091FB0218165B
+:1059A0000CF066C01092FB0263C09091FA02823F35
+:1059B00019F497FF5DC005C0833F31F419160CF050
+:1059C00057C01092FA0254C0893F31F48091FC0212
+:1059D00018160CF04DC006C08A3F39F48091FC02C5
+:1059E00087FF46C01092FC0243C08B3F29F4809190
+:1059F000FD0287FF3DC006C08C3F39F48091FD0257
+:105A00001816B4F51092FD0233C0843F21F4809142
+:105A1000F9028E7F05C0853F31F48091F9028D7FB8
+:105A20008093F90225C0863F21F48091F9028B7F93
+:105A3000F7CF873F21F48091F902877FF1CF883F2C
+:105A400021F48091F9028F7EEBCF8D3F21F480917C
+:105A5000FE028E7F0BC08E3F21F48091FE028D7F6F
+:105A600005C08F3F29F48091FE028B7F8093FE0258
+:105A70008091FA0281110EC08091FB0281110AC04F
+:105A80008091FC02811106C08091FD02811102C04B
+:105A90001092F802089589EF92E00E943C1D0E9446
+:105AA0009E299093F7028093F6020895CF938091F8
+:105AB000F6029091F7020E94AB294091F80244232C
+:105AC00021F02091910130E006C0209192015AE02E
+:105AD000259F900111248217930708F486C08091B6
+:105AE000FA0281110DC09091FB02911109C09091B1
+:105AF000FC02911105C09091FD02992309F475C033
+:105B00004F3F19F04F5F4093F802181624F40E949B
+:105B1000DB2B8093FA028091FA0287FF05C00E9476
+:105B2000DB2B81958093FA028091FB02181624F4F6
+:105B30000E94DB2B8093FB028091FB0287FF05C054
+:105B40000E94DB2B81958093FB026091FA02662311
+:105B500039F1C091FB02CC2319F1772767FD7095CD
+:105B6000872F972F0E94AC3123E333E343E35FE3B6
+:105B70000E9460320E9479316093FA026C2F77277D
+:105B800067FD7095872F972F0E94AC3123E333E395
+:105B900043E35FE30E9460320E9479316093FB022D
+:105BA0008091FC02181624F40E94232C8093FC029E
+:105BB0008091FC0287FF05C00E94232C8195809371
+:105BC000FC028091FD02181624F40E94232C80937D
+:105BD000FD028091FD0287FF05C00E94232C819564
+:105BE0008093FD02CF910C944B2DCF910895E9EF56
+:105BF000F2E085E0DF011D928A95E9F71092F80244
+:105C00001092FE020895833089F130F4813061F002
+:105C1000823009F06EC019C0853009F449C0B8F16E
+:105C2000863009F066C055C020919201862F90E021
+:105C3000820F911D8F3F910520F4620F60939201B6
+:105C400008958FEF80939201089520919101862FFE
+:105C500090E0820F911D8F3F910520F4620F6093B9
+:105C6000910108958FEF8093910108952091900103
+:105C7000862F90E0820F911D8F3F910520F4620FD7
+:105C80006093900108958FEF809390010895209183
+:105C90008F01862F90E0820F911D8F3F910520F498
+:105CA000620F60938F0108958FEF80938F010895A5
+:105CB00020918E01862F90E0820F911D8F3F9105DC
+:105CC00020F4620F60938E0108958FEF80938E0110
+:105CD000089520918D01862F90E0820F911D8F3FB6
+:105CE000910520F4620F60938D0108958FEF8093EA
+:105CF0008D010895833021F130F4813059F08230E4
+:105D000009F049C012C0853089F128F1863009F0C8
+:105D100042C037C080919201681720F4861B80939F
+:105D2000920108951092920108958091910168174F
+:105D300020F4861B8093910108951092910108959B
+:105D400080919001681720F4861B8093900108953C
+:105D500010929001089580918F01681720F4861B9E
+:105D600080938F01089510928F01089580918E0184
+:105D7000681720F4861B80938E01089510928E017F
+:105D8000089580918D01681720F4861B80938D0102
+:105D9000089510928D01089541E050E060E070E0B8
+:105DA00004C0440F551F661F771F8A95D2F7CB0199
+:105DB000BA010E9461270C945623873200F58E3178
+:105DC00008F086C08E3009F466C060F4873009F4AC
+:105DD0004DC018F4863049F531C0883041F18B3020
+:105DE00021F57BC0863109F478C018F48031E9F4DC
+:105DF0005CC0893109F471C08B31B9F442C0883379
+:105E000009F46BC048F4893209F460C0853309F4A1
+:105E10005DC0873251F45AC0833409F457C018F476
+:105E20008A3318F057C0883499F080E008950E94B2
+:105E3000B72B0E94C92B0E94D22B4FC08091F00239
+:105E4000817F8E7F8093F00281E08093FF0208952E
+:105E50000E9456232FEF83ED90E321508040904025
+:105E6000E1F700C000000E94FE2937C08091F002D7
+:105E700080FF03C0817F8E7F01C081608093F0022C
+:105E80002CC09091F00291FB882780F921E08227B5
+:105E900080FB91F913C09091F00292FB882780F962
+:105EA00021E0822780FB92F909C09091F00293FBD8
+:105EB000882780F921E0822780FB93F99093F002F4
+:105EC000882359F091609093F00207C080E003C0EE
+:105ED0008D5101C089530E94CC2E81E0089580E04D
+:105EE000089580E00895CF93C82F8091FF028130FC
+:105EF00071F020F0823009F089C037C0A0918B0189
+:105F0000B0918C018C91823209F082C007C0A091BF
+:105F10008B01B0918C018C91823249F48C2F0E94BC
+:105F20006F2F81111EC08C2F0E94DD2E1CC08C2F64
+:105F30000E94712F811115C0C43169F030F4CB304B
+:105F400081F0C03109F068C009C0C93221F0C833FE
+:105F500009F062C006C01092FF025EC082E080932A
+:105F6000FF0281E090E081705AC0C932C9F060F44C
+:105F7000C431B1F020F4C73009F04CC034C0CE5168
+:105F8000C63008F047C017C0CE3439F120F4CB3406
+:105F900009F040C01CC0C135C1F0C235D9F513C0ED
+:105FA00080910003882319F01092000333C081E030
+:105FB0008093FF0234C0EC2FF0E0E25EFD4F808161
+:105FC0008093000327C061E003C061E007C06AE07E
+:105FD000809100030E94032E1DC06AE0809100039F
+:105FE0000E947A2E17C08EE18093920182E3809303
+:105FF00091018AE08093900184E180938F0188E091
+:1060000080938E0188E280938D0104C01092FF027C
+:1060100080E005C081E003C080E090E0A4CFCF9194
+:1060200008950E94AC2B811102C00E948D2B0E940A
+:10603000D22B8093030480FF02C0869501C080E0CC
+:106040000C94590380910304982F9695292F30E0E2
+:10605000233031054CF49F5F990F8170892B81604B
+:10606000809303040E94D62B8091030486950C94A0
+:10607000590380910304982F969591F09158990FA8
+:106080008170892B809303048E7F91E009F490E066
+:106090008091030490FB80F9809303040E94D62B27
+:1060A0008091030486950C94590380910304982FE2
+:1060B000909590FB80F9809303040E94D62B8091E9
+:1060C000030480FF02C0869501C080E00C94590350
+:1060D00030910304232F26952F5F2F77822F90E096
+:1060E000317004972CF4220F232B2093030402C059
+:1060F0003093030480910304282F2E7F91E009F44C
+:1061000090E090FB80F9809303040E94D62B80914D
+:10611000030486950C94590320910304922F9695BD
+:106120009827990F822F8170892B809303048E7F8B
+:1061300091E009F490E08091030490FB80F9809352
+:1061400003040E94D62B8091030486950C94590376
+:106150005058BB27AA270ED075C166D130F06BD13D
+:1061600020F031F49F3F11F41EF45BC10EF4E09572
+:10617000E7FB51C1E92F77D180F3BA1762077307A4
+:106180008407950718F071F49EF58FC10EF4E09521
+:106190000B2EBA2FA02D0B01B90190010C01CA01E1
+:1061A000A0011124FF27591B99F0593F50F4503E8C
+:1061B00068F11A16F040A22F232F342F4427585F7E
+:1061C000F3CF469537952795A795F0405395C9F796
+:1061D0007EF41F16BA0B620B730B840BBAF091504E
+:1061E000A1F0FF0FBB1F661F771F881FC2F70EC0ED
+:1061F000BA0F621F731F841F48F4879577956795C0
+:10620000B795F7959E3F08F0B3CF9395880F08F0A8
+:106210009927EE0F979587950895D9D008F481E0D6
+:1062200008950CD00FC107D140F0FED030F021F41A
+:106230005F3F19F0F0C0511139C1F3C014D198F388
+:106240009923C9F35523B1F3951B550BBB27AA27F7
+:1062500062177307840738F09F5F5F4F220F331F69
+:10626000441FAA1FA9F333D00E2E3AF0E0E830D035
+:1062700091505040E695001CCAF729D0FE2F27D038
+:10628000660F771F881FBB1F261737074807AB0706
+:10629000B0E809F0BB0B802DBF01FF2793585F4F7B
+:1062A0002AF09E3F510568F0B6C000C15F3FECF395
+:1062B000983EDCF3869577956795B795F7959F5F40
+:1062C000C9F7880F911D9695879597F90895E1E094
+:1062D000660F771F881FBB1F621773078407BA07F3
+:1062E00020F0621B730B840BBA0BEE1F88F7E0954E
+:1062F000089504D06894B111D9C00895BCD088F035
+:106300009F5790F0B92F9927B751A0F0D1F0660FA1
+:10631000771F881F991F1AF0BA95C9F712C0B130BC
+:1063200081F0C3D0B1E00895C0C0672F782F8827CF
+:10633000B85F39F0B93FCCF3869577956795B395FB
+:10634000D9F73EF490958095709561957F4F8F4F6A
+:106350009F4F0895E89409C097FB3EF4909580956F
+:10636000709561957F4F8F4F9F4F9923A9F0F92F1B
+:1063700096E9BB279395F695879577956795B79599
+:10638000F111F8CFFAF4BB0F11F460FF1BC06F5F7F
+:106390007F4F8F4F9F4F16C0882311F096E911C091
+:1063A000772321F09EE8872F762F05C0662371F0B2
+:1063B00096E8862F70E060E02AF09A95660F771FC6
+:1063C000881FDAF7880F9695879597F90895990FA2
+:1063D0000008550FAA0BE0E8FEEF16161706E807AF
+:1063E000F907C0F012161306E407F50798F0621BD0
+:1063F000730B840B950B39F40A2661F0232B242BA5
+:10640000252B21F408950A2609F4A140A6958FEFC3
+:10641000811D811D089597F99F6780E870E060E015
+:1064200008959FEF80EC089500240A94161617062D
+:1064300018060906089500240A9412161306140675
+:1064400005060895092E0394000C11F4882352F0D8
+:10645000BB0F40F4BF2B11F460FF04C06F5F7F4F90
+:106460008F4F9F4F089557FD9058440F551F59F077
+:106470005F3F71F04795880F97FB991F61F09F3F31
+:1064800079F087950895121613061406551FF2CF5A
+:106490004695F1DF08C0161617061806991FF1CFAA
+:1064A00086957105610508940895E894BB276627D1
+:1064B0007727CB0197F908958ADF08F48FEF0895C5
+:1064C0000BD0C0CFB1DF28F0B6DF18F0952309F06C
+:1064D000A2CFA7CF1124EACFC6DFA0F3959FD1F3B7
+:1064E000950F50E0551F629FF001729FBB27F00D82
+:1064F000B11D639FAA27F00DB11DAA1F649F6627D7
+:10650000B00DA11D661F829F2227B00DA11D621F25
+:10651000739FB00DA11D621F839FA00D611D221FDF
+:10652000749F3327A00D611D231F849F600D211DC3
+:10653000822F762F6A2F11249F5750408AF0E1F066
+:1065400088234AF0EE0FFF1FBB1F661F771F881FAF
+:1065500091505040A9F79E3F510570F05CCFA6CFF7
+:106560005F3FECF3983EDCF3869577956795B7959A
+:10657000F795E7959F5FC1F7FE2B880F911D9695C4
+:10658000879597F90895FA01EE0FFF1F30962105C0
+:10659000310599F16115710561F48038BFE39B07FE
+:1065A00049F168949038810561F08038BFEF9B070E
+:1065B00041F0992342F5FF3FE1053105210511F135
+:1065C000E8940894E795D901AA2329F4AB2FBE2FAC
+:1065D000F85FD0F310C0FF5F70F4A695E0F7F739CD
+:1065E00050F019F0FF3A38F49F779F930CD00F903A
+:1065F00007FC905808953EF014CF60E070E080E80A
+:106600009FE308954FE79F775F934F933F932F93B7
+:106610009ED02F913F914F915F9152DF05C019F4A9
+:106620000EF0F9CE42CFFDCE26DFC8F39638C0F784
+:1066300007F80F92E8942BE33AEA48EB5FE74EDF66
+:106640000F920F920F924DB75EB70F92C0D0ECEA47
+:10665000F0E016D04F915F91EF91FF91E595EE1F1D
+:10666000FF1F49F0FE57E0684427EE0F441FFA95DC
+:10667000E1F74195550B32D00F9007FE26C00895E3
+:10668000DF93CF931F930F93FF92EF92DF927B01E3
+:106690008C01689405C0DA2EEF011EDFFE01E8943C
+:1066A000A5912591359145915591AEF3EF0162DDAC
+:1066B000FE019701A801DA9479F7DF90EF90FF903F
+:1066C0000F911F91CF91DF9108959B01AC0160E084
+:1066D00070E080E89FE3A5CD9ECEACC0CCDEE8F3B1
+:1066E0009923D9F3940F511DBBF39150504094F06E
+:1066F00059F0882332F0660F771F881F9150504061
+:10670000C1F79E3F510544F7880F911D96958795D7
+:1067100097F908955F3FACF0983E9CF0BB278695B3
+:1067200077956795B79508F4B1609395C1F7BB0F5E
+:1067300058F711F460FFE8CF6F5F7F4F8F4F9F4F87
+:10674000E3CFB4CE0EF076C06CCE689464CE93DE08
+:10675000C8F39923D1F3C6F3DF93CF931F930F931D
+:10676000FF92C92FDD2788232AF02197660F771F14
+:10677000881FDAF720E030E040E85FEB9FE38839DC
+:1067800020F0803E30F021968F77E3DCE4EDF0E0FE
+:1067900003C0DFDCE1E0F1E073DF8B01BE01EC015F
+:1067A000FB2E6F5771097595771F880B990BD4DDF8
+:1067B00028E132E741E35FE38FDEAF2D9801AE01C0
+:1067C000FF900F911F91CF91DF91D4DC3BCEFA0166
+:1067D000DC01AA0FBB1F9B01AC01BF5728F4222785
+:1067E0003327442750781FC0B75188F4AB2F0024BB
+:1067F000469537952795011CA395D2F3002069F0A3
+:10680000220F331F441FB395DAF30DD0A1CC6130B2
+:106810007105A0E88A07B94630F49B01AC016627F0
+:10682000772788279078309621F020833183428320
+:10683000538308959F3F31F0915020F487957795C9
+:106840006795B795880F911D9695879597F9089547
+:10685000991B79E004C0991F961708F0961B881FB2
+:106860007A95C9F780950895AA1BBB1B51E107C013
+:10687000AA1FBB1FA617B70710F0A61BB70B881FD0
+:10688000991F5A95A9F780959095BC01CD0108955F
+:1068900097FB072E16F4009407D077FD09D00E94CD
+:1068A000343407FC05D03EF4909581959F4F0895B0
+:1068B000709561957F4F0895F999FECF92BD81BD86
+:1068C000F89A992780B50895A8E1B0E042E050E039
+:1068D0000C947F34262FF999FECF1FBA92BD81BD4B
+:1068E00020BD0FB6F894FA9AF99A0FBE0196089552
+:1068F0000E946A34272F0C946B34DC01CB01FC011D
+:10690000F999FECF06C0F2BDE1BDF89A319600B408
+:0E6910000D9241505040B8F70895F894FFCF13
+:10691E0055D0A44600001644000000000000484276
+:10692E0061978A460000C8430000000000004842FC
+:10693E0055D024460000C843000000000000484225
+:10694E0000005C460000C843000000000000484202
+:10695E0061978A4600007A4455D0A4460000C84389
+:10696E00000000000000484200005C460000C843E2
+:10697E00000000000000484255D024460000164496
+:10698E000507000C058540000001064000000100CF
+:10699E0091102111FD10C810941001E8022808145E
+:1069AE000A321E42004500250026004300610060A9
+:1069BE000020003700640065006600670044004652
+:1069CE000024004700000002000400050007000933
+:1069DE00000B000C000E0010001100130015001724
+:1069EE000018001A001C001D001F002100230024A7
+:1069FE00002600280029002B002D002F0030003229
+:106A0E000034003500370039003B00F6030F042830
+:106A1E0004410469051C05E604C6043F4D362002F8
+:106A2E000302000001000101010101000101010248
+:086A3E00030405060708090026
+:00000001FF
diff --git a/keyboard/preonic/preonic_pcb_silent.hex b/keyboard/preonic/preonic_pcb_silent.hex
new file mode 100644
index 000000000..cc59d3fe8
--- /dev/null
+++ b/keyboard/preonic/preonic_pcb_silent.hex
@@ -0,0 +1,1189 @@
+:100000000C9465020C94A9020C94A9020C94A90208
+:100010000C94A9020C94A9020C94A9020C94A902B4
+:100020000C94A9020C94A9020C94430D0C94150E87
+:100030000C942B1C0C94A9020C94A9020C94A902F8
+:100040000C94A9020C94A9020C94A9020C94A90284
+:100050000C94A9020C94981C0C94A9020C94A9026B
+:100060000C94A9020C94A9020C94A9020C94A90264
+:100070000C94A9020C94A9020C94A9020C94A90254
+:100080000C94A9020C94A9020C94A9020C94A90244
+:100090000C94A9020C94A9020C94A9020C94A90234
+:1000A0000C94A9020C94A9020C94A90235001E001C
+:1000B0001F0020002100220023002400250026002C
+:1000C00027002A002B0014001A0008001500170052
+:1000D0001C0018000C00120013002A002900040064
+:1000E0001600070009000A000B000D000E000F00AB
+:1000F00033003400E1001D001B000600190005005C
+:100100001100100036003700380028000030E000F1
+:10011000E200E30003522C002C0004525000510076
+:1001200052004F0035001E001F0020002100220059
+:10013000230024002500260027002A002B0014009D
+:100140001A00090013000A000D000F0018001C001F
+:1001500033002A00290004001500160017000700CC
+:100160000B00110008000C0012003400E1001D001B
+:100170001B000600190005000E00100036003700B5
+:10018000380028000030E000E200E30003522C00B9
+:100190002C0004525000510052004F0035001E0048
+:1001A0001F0020002100220023002400250026003B
+:1001B00027002A002B0034003600370013001C00F3
+:1001C00009000A00060015000F002A00290004009B
+:1001D0001200080018000C0007000B0017001100A7
+:1001E00016003800E100330014000D000E001B0063
+:1001F000050010001A0019001D0028000030E00062
+:10020000E200E30003522C002C0004525000510085
+:1002100052004F0035001E001F0020002100220068
+:10022000230024002500260027002A0035021E0294
+:100230001F0220022102220223022402250226029A
+:1002400027022A0001003A003B003C003D003E002E
+:100250003F002D022E022F02300231020100400029
+:100260004100420043004400450000530153025343
+:100270000050010001000100010001000100010027
+:1002800001000100AB00AA00A900AE0035001E006D
+:100290001F0020002100220023002400250026004A
+:1002A00027002A0035001E001F0020002100220028
+:1002B000230024002500260027002A0001003A0020
+:1002C0003B003C003D003E003F002D002E002F0073
+:1002D0003000310001004000410042004300440072
+:1002E000450000530153025300500100010001007A
+:1002F000010001000100010001000100AB00AA00A3
+:10030000A900AE002A0354006800650020005000D8
+:10031000720065006F006E006900630020004B00F2
+:100320006500790062006F006100720064000000E7
+:100330002C034F007200740068006F006C006900AD
+:100340006E0065006100720020004B0065007900BE
+:1003500062006F006100720064007300000004031B
+:10036000090409027400040100A0FA090400000154
+:1003700003010100092111010001223F000705814D
+:100380000308000A09040100010301020009211108
+:10039000010001224D000705820308000A0904023A
+:1003A00000010300000009211101000122360007AD
+:1003B00005830308000A0904030002030000000982
+:1003C00021110100012220000705840320000107FC
+:1003D0000504032000011201100100000008EDFED9
+:1003E00061600100010200010631FF0974A10109E9
+:1003F00075150025FF9520750881020976150025E1
+:10040000FF952075089102C005010980A1018502B0
+:1004100016010026B7001A01002AB70075109501D1
+:100420008100C0050C0901A1018503160100269C6D
+:10043000021A01002A9C02751095018100C0050175
+:100440000902A1010901A1000509190129051500E9
+:10045000250195057501810295017503810105014D
+:10046000093009311581257F950275088106093803
+:100470001581257F950175088106050C0A3802153E
+:1004800081257F950175088106C0C005010906A177
+:1004900001050719E029E715002501950875018177
+:1004A0000295017508810105081901290595057551
+:1004B0000191029501750391010507190029FF15A6
+:1004C0000025FF950675088100C011241FBECFEFDF
+:1004D000DAE0DEBFCDBF04B603FE24C08091F10197
+:1004E0009091F201A091F301B091F4018730904B0B
+:1004F000A740B04BB9F41092F1011092F2011092A2
+:10050000F3011092F40114BE84B7877F84BF88E1A1
+:100510000FB6F89480936000109260000FBEE0E088
+:10052000F8E3099511E0A0E0B1E0E0EEF9E402C0E3
+:1005300005900D92A435B107D9F711E0A4E5B1E01B
+:1005400001C01D92A13FB107E1F70E94720A0C940D
+:10055000EE240C94000061110DC0FC0182818823FF
+:1005600031F085EE0E9426110E94272303C085EEFC
+:100570000E94EE1180E090E00895089508950E9491
+:10058000D1026E9A769A8DEB92E0892B11F00C9441
+:10059000BD0208958EEB92E0892B11F00C94BE02FF
+:1005A0000895279A2F988FEF9FEF9093870080935D
+:1005B00086008AE08093800089E1809381000C941A
+:1005C000D02281110BC080918000877F80938000B2
+:1005D00010928D0010928C002F9808952F988330E0
+:1005E00041F4809180008860809380008FEF9FEFBE
+:1005F00012C09091800098609093800023E030E0DA
+:10060000281B3109220F331F8FEF9FEF02C09695F1
+:1006100087952A95E2F790938D0080938C0008953A
+:100620008B3B910568F4883A910530F5853A910540
+:10063000C0F48430910598F4019709F06FC071C03F
+:10064000803E910508F46AC0883E910540F09C0107
+:10065000205F31092031310508F060C05CC09C0189
+:10066000A1C0853A910509F45FC0863A910509F465
+:100670005EC023E830E496C0883A910509F45AC078
+:10068000893A910509F459C08A3A910509F458C08C
+:100690008B3A910509F457C08C3A910509F456C07C
+:1006A0008D3A910509F455C0803B910509F454C079
+:1006B0008E3A910509F453C08F3A910509F452C05E
+:1006C000813B910509F451C0823B910509F450C06A
+:1006D000833B910509F44FC0843B910509F44EC05A
+:1006E000853B910509F44DC0863B910509F44CC04A
+:1006F000873B910509F44BC0883B910509F44AC03A
+:10070000893B910509F449C08A3B910509F048C02D
+:100710002AE236E447C09C01306544C020E030E066
+:1007200041C021E030E03EC021E830E43BC022E897
+:1007300030E438C022EE34E435C029EE34E432C06F
+:100740002AEE34E42FC025EB34E42CC026EB34E44D
+:1007500029C027EB34E426C02CEC34E423C02DEC74
+:1007600034E420C023E835E41DC02AE835E41AC08B
+:1007700022E935E417C024E935E414C021E236E467
+:1007800011C023E236E40EC024E236E40BC025E2B9
+:1007900036E408C026E236E405C027E236E402C0AB
+:1007A00020E034E4C901089508959CE0799FF001A8
+:1007B00011249CE3899FE00DF11D1124E60FF11D2A
+:1007C000EE0FFF1FE455FF4F25913491C9010895A5
+:1007D000880F991F845D9040FC0125913491C901D7
+:1007E0000895880F991F84559F4FFC0125913491DE
+:1007F000C90108950E94D5039C019A9581159F41D6
+:1008000010F4C9010895C90190528115904128F44E
+:10081000C9019F700E94F1030895C9019053811589
+:10082000904120F4C9019927906C0895C901905412
+:10083000409728F4C9018F709927946D089520314D
+:1008400080E4380719F480E091ED0895213190E4B7
+:10085000390719F480E090ED0895223140E434071F
+:1008600019F480E092ED0895233180E4380719F4FB
+:1008700080E093ED0895211590E5390769F40E9411
+:1008800015162FEF44E38CE0215040408040E1F703
+:1008900000C000000C94BD1C213090E5390731F4F4
+:1008A0008091D00181608093D0010895C901905555
+:1008B0008115904108F062C0432F55274F7055278E
+:1008C00041305105F9F4C90174E0880F991F7A95F8
+:1008D000E1F788279370B901E3E0660F771FEA9587
+:1008E000E1F760767727862B972B9C682370332758
+:1008F00002C0440F551F2A95E2F74F715527842BEC
+:10090000952B08954230510529F4922F8827816F45
+:10091000906A089543305105B9F4C90153E0880F36
+:10092000991F5A95E1F7807E97702370332741E035
+:1009300050E002C0440F551F2A95E2F74F7155272A
+:10094000842B952B9C6808954430510549F5C901C5
+:1009500043E0880F991F4A95E1F7807E97702370D6
+:10096000332741E050E002C0440F551F2A95E2F7BB
+:100970004F715527842B952B9A680895C90190577C
+:100980008115904120F4C9019F7090620895C901BA
+:1009900090588115904120F4C9019F70906A089584
+:1009A000203E3105E0F4203C310568F52133310566
+:1009B00009F475C048F42932310509F46BC02A32B4
+:1009C000310509F07BC075C02933310501F12238AA
+:1009D0003105E9F02533310509F070C051C0233EDF
+:1009E0003105B1F140F4203E3105D1F0223E310510
+:1009F00009F064C01CC0263E310579F1273E31055F
+:100A000009F05CC038C0C9010E94E80308958091D4
+:100A1000E10180FD02C081FF51C080EE90E04FC037
+:100A20008091E10180FFF9CF89E390E048C0809197
+:100A3000E10182FF0AC08091E10184FF03C080E0F0
+:100A400090E03DC083EE90E03AC082EE90E037C087
+:100A50008091E10182FFEFCFF8CF8091E10183FF28
+:100A600007C08091E10184FDEACF87EE90E027C0C6
+:100A700086EE90E024C08091E10183FFF2CFF8CFB1
+:100A80008091E10185FF03C089E290E018C085E311
+:100A900090E015C08091E10185FDF9CFF5CF8091FF
+:100AA000E10186FF03C08AE290E009C081E390E0A3
+:100AB00006C08091E10186FDF9CFF5CFC9010E9402
+:100AC0001003089508955F926F927F928F929F9284
+:100AD000AF92BF92CF92DF92EF92FF920F931F934C
+:100AE000CF93DF93CDB7DEB72A970FB6F894DEBF6A
+:100AF0000FBECDBF9E012F5F3F4F4E018BE0880E92
+:100B0000911C60E070E000E010E0E12CF12CC12CC1
+:100B1000D12CA12CB12C8AE0782E622E532E41E0EC
+:100B200050E0E4E1F1E0A62DB52D872D01900D9266
+:100B30008A95E1F7F901819191919F01FC01E07F94
+:100B4000FF27E032F10559F48F709927FA0102C0AE
+:100B5000EE0FFF1F8A95E2F7AE2ABF2A37C0E033B7
+:100B6000F10559F48F709927FA0102C0EE0FFF1FAB
+:100B70008A95E2F7CE2ADF2A29C0E034F10559F43C
+:100B80008F709927FA0102C0EE0FFF1F8A95E2F7D6
+:100B9000EE2AFF2A1BC0E035F10559F48F70992722
+:100BA000FA0102C0EE0FFF1F8A95E2F70E2B1F2BF2
+:100BB0000DC0E036F10551F48F709927FA0102C09B
+:100BC000EE0FFF1F8A95E2F76E2B7F2B2815390554
+:100BD00009F0A7CF94B18A2D8095892384B985B176
+:100BE0008A2985B997B18C2D8095892387B988B1D9
+:100BF0008C2988B99AB18E2D809589238AB98BB1B9
+:100C00008E298BB99DB1802F809589238DB98EB1A6
+:100C1000802B8EB990B3862F8095892380BB81B3BA
+:100C2000862B81BB2A960FB6F894DEBF0FBECDBFD0
+:100C3000DF91CF911F910F91FF90EF90DF90CF90B8
+:100C4000BF90AF909F908F907F906F905F9008952E
+:100C50005F926F927F928F929F92AF92BF92CF924C
+:100C6000DF92EF92FF920F931F93CF93DF93CDB755
+:100C7000DEB768970FB6F894DEBF0FBECDBF85B75D
+:100C8000806885BF85B7806885BF0E9463059E0127
+:100C90002F5F3F4F4E0189E1880E911C60E070E0AC
+:100CA00000E010E0E12CF12CC12CD12CA12CB12CB6
+:100CB00098E1792E622E532E41E050E0EEE1F1E012
+:100CC000A62DB52D872D01900D928A95E1F7F9019A
+:100CD000819191919F01FC01E07FFF27E032F105B6
+:100CE00059F48F709927FA0102C0EE0FFF1F8A9501
+:100CF000E2F7AE2ABF2A37C0E033F10559F48F700E
+:100D00009927FA0102C0EE0FFF1F8A95E2F7CE2A5B
+:100D1000DF2A29C0E034F10559F48F709927FA01D0
+:100D200002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0D2
+:100D3000E035F10559F48F709927FA0102C0EE0FE2
+:100D4000FF1F8A95E2F70E2B1F2B0DC0E036F10531
+:100D500051F48F709927FA0102C0EE0FFF1F8A9598
+:100D6000E2F76E2B7F2B2815390509F0A7CF94B138
+:100D70008A2D8095892384B985B18A2985B997B14F
+:100D80008C2D8095892387B988B18C2988B99AB12F
+:100D90008E2D809589238AB98BB18E298BB99DB10F
+:100DA000802F809589238DB98EB1802B8EB990B319
+:100DB000862F8095892380BB81B3862B81BB1092BF
+:100DC00055011092540110925F0110925E01109231
+:100DD0005701109256011092610110926001109219
+:100DE0005901109258011092630110926201109201
+:100DF0005B0110925A0110926501109264011092E9
+:100E00005D0110925C0110926701109266018FEBF8
+:100E100092E0892BB9F068960FB6F894DEBF0FBE4A
+:100E2000CDBFDF91CF911F910F91FF90EF90DF9099
+:100E3000CF90BF90AF909F908F907F906F905F907A
+:100E40000C94BF0268960FB6F894DEBF0FBECDBFFC
+:100E5000DF91CF911F910F91FF90EF90DF90CF9096
+:100E6000BF90AF909F908F907F906F905F9008950C
+:100E70005F926F927F928F929F92AF92BF92CF922A
+:100E8000DF92EF92FF920F931F93CF93DF93CDB733
+:100E9000DEB7A2970FB6F894DEBF0FBECDBF7E01BE
+:100EA00049E1E40EF11C2EE5C22E21E0D22E5E01B6
+:100EB00053E2A50EB11C3AE0532E470101E010E0C9
+:100EC00048E1642E55E0752EE4E1F1E0D401852D72
+:100ED00001900D928A95E1F7F701819191917F013F
+:100EE0009C01207F33272032310589F424B18F7093
+:100EF0009927A80102C0440F551F8A95E2F7CA013D
+:100F0000242B24B995B18095892385B94FC020330E
+:100F1000310589F427B18F709927F80102C0EE0FCF
+:100F2000FF1F8A95E2F7CF012E2B27B998B1809544
+:100F3000892388B93BC02034310589F42AB18F70E8
+:100F40009927A80102C0440F551F8A95E2F7CA01EC
+:100F5000242B2AB99BB1809589238BB927C02035D2
+:100F6000310589F42DB18F709927F80102C0EE0F79
+:100F7000FF1F8A95E2F7CF012E2B2DB99EB18095E8
+:100F800089238EB913C02036310581F420B38F70C8
+:100F90009927A80102C0440F551F8A95E2F7CA019C
+:100FA000242B20BB91B38095892381BB50EA5A95AD
+:100FB000F1F7BE016F5F7F4F80E090E020E030E00E
+:100FC000EEE1F1E0DE011196462D01900D924A9579
+:100FD000E1F7FB0141915191BF01FA01E07FFF2749
+:100FE000E032F10511F4E3B113C0E033F10511F47F
+:100FF000E6B10EC0E034F10511F4E9B109C0E03505
+:10100000F10511F4ECB104C0E036F105B9F4EFB12B
+:10101000F0E04F70552702C0F595E7954A95E2F745
+:10102000E0FD08C0A801022E02C0440F551F0A941B
+:10103000E2F702C040E050E0842B952B2F5F3F4F3A
+:101040002C30310509F0BCCFF60120813181281701
+:10105000390721F091838083709200010E9463051B
+:10106000F2E0CF0ED11CEA14FB0409F02DCF8091E1
+:1010700000018823A1F1815080930001882339F079
+:101080008FE99FE00197F1F700C0000028C0809130
+:101090005E0190915F01909355018093540180917E
+:1010A0006001909161019093570180935601809166
+:1010B000620190916301909359018093580180914E
+:1010C00064019091650190935B0180935A01809136
+:1010D00066019091670190935D0180935C018AECB9
+:1010E00092E0892B11F00E94CA0281E0A2960FB60D
+:1010F000F894DEBF0FBECDBFDF91CF911F910F914E
+:10110000FF90EF90DF90CF90BF90AF909F908F9027
+:101110007F906F905F900895E82FF0E0EE0FFF1F33
+:10112000EC5AFE4F8081918108950895809171015C
+:101130000895CF93DF9300D01F92CDB7DEB72091F3
+:10114000E701243021F523E029839B838A832093C0
+:10115000E9008FEF06C095ED9A95F1F7000088231E
+:1011600029F09091E800815095FFF5CF8091E8003B
+:1011700085FF0DC040E050E063E070E0CE010196D5
+:101180000E94280B8091E8008E778093E8000F90F2
+:101190000F900F90DF91CF910895CF93DF9300D000
+:1011A0001F92CDB7DEB72091E701243029F522E068
+:1011B00029839B838A8383E08093E9008FEF06C0B5
+:1011C00095ED9A95F1F70000882329F09091E800B9
+:1011D000815095FFF5CF8091E80085FF0DC040E07C
+:1011E00050E063E070E0CE0101960E94280B8091F0
+:1011F000E8008E778093E8000F900F900F90DF91BA
+:10120000CF9108952091E7012430F9F422E0209352
+:10121000E9002FEF06C035ED3A95F1F700002223E3
+:1012200029F03091E800215035FFF5CF2091E800FA
+:1012300025FF0BC040E050E065E070E00E94280B05
+:101240008091E8008E778093E8000895CF93DF9334
+:10125000EC018091E701843041F581E08093E90061
+:101260008FEF06C095ED9A95F1F70000882329F0DD
+:101270009091E800815095FFF5CF8091E80085FFBF
+:1012800014C040E050E068E070E0CE010E94280BFE
+:101290008091E8008E778093E80088E0FE01A9E65F
+:1012A000B1E001900D928A95E1F7DF91CF91089519
+:1012B0008091E601811109C00E94C80C0E94250D91
+:1012C0008091E20084608093E20008951092E6012C
+:1012D0000895089508950C94201C809172018F5FE9
+:1012E0008093720162E30E948924911135C01092AB
+:1012F000720180917301882379F18091E701843034
+:1013000049F58091E9008F709091EC0090FF02C048
+:1013100090E801C090E0982B84E08093E9008091F0
+:10132000EB0080FF14C08091EE0087FD03C00FC06A
+:101330001092F1008091E80085FDFACF8091E800DD
+:1013400080FF05C08091E8008E778093E8009F7051
+:101350009093E90010927301089542E061EC81E0FE
+:101360000E943E0C42E061EC82E00E943E0C42E0B2
+:1013700061EC83E00E943E0C42E261EC84E00C945C
+:101380003E0C8091E901833009F454C030F481307F
+:1013900071F0823009F0A5C08CC08A3009F479C0A0
+:1013A0008B3009F45FC0893009F09BC020C0809168
+:1013B000E801813A09F095C08091E800877F809329
+:1013C000E8008091EC019091ED01892B21F060E023
+:1013D00080E090E003C068E089E691E070E00E9460
+:1013E000770B8091E8008B778093E80008958091D7
+:1013F000E801813209F075C08091EC019091ED0116
+:10140000892B09F06EC08091E800877F8093E80007
+:1014100005C08091E701882309F463C08091E8004A
+:1014200082FFF7CF8091F100809371018091E800F5
+:101430008B7753C08091E801813A09F052C08091C6
+:10144000EC019091ED01892B09F04BC08091E800EF
+:10145000877F8093E8008091E80080FFFCCF809137
+:101460000B0136C08091E8018132D9F58091EC0101
+:101470009091ED01892BA9F58091E800877F8093F9
+:10148000E8000E94750C8091EA0180930B010C9496
+:1014900015168091E801813221F58091E800877F5F
+:1014A0008093E8000E94750C8091EB0180936801A5
+:1014B00008958091E801813AA1F48091E800877F46
+:1014C0008093E8008091E80080FFFCCF8091680164
+:1014D0008093F1008091E8008E778093E8000C946F
+:1014E000750C089584B7877F84BF88E10FB6F894A0
+:1014F00080936000109260000FBE90E080E80FB60D
+:10150000F89480936100909361000FBE0E943310A5
+:101510000E94C80C0E94250D8091E2008460809397
+:10152000E20078940E94C20F0E94351081E091E0A1
+:101530000E94DF0F0BC00E94DD1B8091E501882314
+:1015400029F00E94081C81110E94120B8091E70172
+:10155000853089F30E943F10F9CF292F332723309C
+:101560003105B1F04CF42130310509F44DC0223081
+:10157000310509F04EC007C02132310541F1223258
+:10158000310591F146C0E4E7F0E082E693E045C022
+:1015900099278130910569F08230910589F0892B76
+:1015A00009F037C0EEE5F3E0E491F0E08EE593E07A
+:1015B00034C0E0E3F3E0E491F0E080E393E02DC099
+:1015C000E4E0F3E0E491F0E084E093E026C06430EE
+:1015D00000F5E62FF0E0EE0FFF1FEA5CFE4F808182
+:1015E0009181E9E0F0E019C0643098F4E62FF0E072
+:1015F000DF01AA0FBB1FA25CBE4F8D919C91EA5BDD
+:10160000FE4FE081F0E009C0E2E1F0E086ED93E01A
+:1016100004C0E0E0F0E080E090E0DA018D939C937C
+:10162000CF01089580E189BD82E189BD09B400FE42
+:10163000FDCF8091D8008F7D8093D8008091E0000D
+:1016400082608093E0008091E00081FDFCCF0895EE
+:10165000BF92CF92DF92EF92FF920F931F93CF939F
+:10166000DF937C018B01EA010E94960CB82E811158
+:1016700033C0209731F028813981021B130BE20E11
+:10168000F31EC12CD12C23C08091E80085FD15C02C
+:101690008091E8008E778093E800209749F0888158
+:1016A00099818C0D9D1D9983888325E0B22E14C0ED
+:1016B0000E94960C882359F00EC0F70181917F019A
+:1016C0008093F10001501109FFEFCF1ADF0A0115D5
+:1016D0001105D1F601C0B82E8B2DDF91CF911F914E
+:1016E0000F91FF90EF90DF90CF90BF9008954091C1
+:1016F000EE015091EF014617570748F0611571054B
+:1017000039F44091E8004E774093E80001C0BA01F7
+:10171000FC0140E033C08091E701882309F444C014
+:10172000853009F443C08091E80083FD41C0809179
+:10173000E80082FD33C08091E80080FF1FC09091D7
+:10174000F3008091F200392F20E0A901482BCA0153
+:1017500006C041914093F1006150710901966115F5
+:10176000710519F088309105A0F341E0089709F060
+:1017700040E08091E8008E778093E8006115710564
+:1017800051F64111C8CF0AC08091E701882361F06A
+:10179000853061F08091E80083FD0AC08091E80007
+:1017A00082FFF2CF80E0089582E0089583E00895FB
+:1017B00081E008954091EE015091EF0146175707DF
+:1017C00048F06115710539F44091E8004E77409377
+:1017D000E80001C0BA01FC0140E034C08091E7019B
+:1017E000882309F445C0853009F444C08091E8009D
+:1017F00083FD42C08091E80082FD34C08091E80002
+:1018000080FF20C09091F3008091F200392F20E0FA
+:10181000A901482BCA0107C044914093F1003196B9
+:101820006150710901966115710519F088309105B3
+:1018300098F341E0089709F040E08091E8008E7746
+:101840008093E8006115710549F64111C7CF0AC0C0
+:101850008091E701882361F0853061F08091E80094
+:1018600083FD0AC08091E80082FFF2CF80E00895F6
+:1018700082E0089583E0089581E00895982F2CC0B8
+:101880009093E900981739F07091EC002091ED00E9
+:101890005091F00003C0242F762F50E021FD02C0AC
+:1018A0009F5F1AC03091EB003E7F3093EB00309188
+:1018B000ED003D7F3093ED003091EB0031603093CF
+:1018C000EB007093EC002093ED005093F00020911A
+:1018D000EE0027FDE5CF07C0973090F28F70809320
+:1018E000E90081E0089580E008958091E80187FD96
+:1018F00005C08091E80080FF0EC012C08091E80012
+:1019000082FD05C08091E7018111F8CF0895809193
+:10191000E8008B7708C08091E7018111EACF089534
+:101920008091E8008E778093E80008958091E4002C
+:101930009091E50045E62091EC0020FD1FC023C0FA
+:101940002091E701222391F0253091F02091EB00C6
+:1019500025FD10C02091E4003091E50028173907DB
+:1019600051F34150C90139F784E0089582E00895A8
+:1019700083E0089581E0089580E008952091E800D3
+:1019800020FFDECFF9CF2091E80022FFD9CFF4CF9E
+:101990000E94360D0E943E0DE0EEF0E080818160F5
+:1019A0008083E8EDF0E080818F77808319BCA7ED1C
+:1019B000B0E08C918E7F8C9380818F7E808310929B
+:1019C000E60108950F931F93CF93DF930E94360D86
+:1019D0000E943E0DC8EDD0E088818F778883888192
+:1019E0008068888388818F7D888319BC1092E70185
+:1019F0001092E3011092E5011092E40100EE10E074
+:101A0000F80180818B7F808388818160888342E0B8
+:101A100060E080E00E943E0CE1EEF0E080818E7F8D
+:101A20008083E2EEF0E08081816080838081886045
+:101A30008083F80180818E7F8083888180618883A4
+:101A4000DF91CF911F910F910895E8EDF0E0808133
+:101A50008F7E8083E7EDF0E080818160808384E089
+:101A600082BF81E08093E6010C94E20CE8EDF0E0A7
+:101A700080818E7F80831092E20008951092DA00B8
+:101A80001092E10008951F920F920FB60F92112449
+:101A90002F933F934F935F936F937F938F939F9376
+:101AA000AF93BF93EF93FF938091E10082FF0BC050
+:101AB0008091E20082FF07C08091E1008B7F8093DC
+:101AC000E1000E946D098091DA0080FF1FC08091C3
+:101AD000D80080FF1BC08091DA008E7F8093DA00EF
+:101AE0008091D90080FF0DC080E189BD82E189BD70
+:101AF00009B400FEFDCF81E08093E7010E94580900
+:101B000005C019BC1092E7010E9466098091E100AE
+:101B100080FF19C08091E20080FF15C08091E20033
+:101B20008E7F8093E2008091E20080618093E200EA
+:101B30008091D80080628093D80019BC85E08093A2
+:101B4000E7010E946A098091E10084FF30C0809122
+:101B5000E20084FF2CC080E189BD82E189BD09B427
+:101B600000FEFDCF8091D8008F7D8093D8008091BA
+:101B7000E1008F7E8093E1008091E2008F7E809370
+:101B8000E2008091E20081608093E2008091E301B5
+:101B9000882311F084E007C08091E30087FF02C032
+:101BA00083E001C081E08093E7010E946B0980918E
+:101BB000E10083FF29C08091E20083FF25C080916E
+:101BC000E100877F8093E10082E08093E70110923B
+:101BD000E3018091E1008E7F8093E1008091E2003B
+:101BE0008E7F8093E2008091E20080618093E2002A
+:101BF00042E060E080E00E943E0C8091F00088604E
+:101C00008093F0000E946909FF91EF91BF91AF911D
+:101C10009F918F917F916F915F914F913F912F9104
+:101C20000F900FBE0F901F9018951F920F920FB636
+:101C30000F9211242F933F934F935F936F937F9352
+:101C40008F939F93AF93BF93CF93EF93FF93809125
+:101C5000E9008F709091EC0090FF02C090E801C005
+:101C600090E0C92FC82B1092E9008091F000877F87
+:101C70008093F00078940E94590E1092E9008091B0
+:101C8000F00088608093F000CF70C093E900FF916E
+:101C9000EF91CF91BF91AF919F918F917F916F9174
+:101CA0005F914F913F912F910F900FBE0F901F901A
+:101CB00018951F93CF93DF93CDB7DEB7AC970FB6D0
+:101CC000F894DEBF0FBECDBFE8EEF1E08091F100E9
+:101CD000819321E0E03FF207C9F70E94C10980919A
+:101CE000E80083FF37C18091E8019091E9019530C8
+:101CF00009F488C038F49130B1F170F0933009F0F4
+:101D000029C131C0983009F4F8C0993009F404C1F0
+:101D1000963009F01FC19DC0803821F0823809F04B
+:101D200019C108C08091E4019091E501992389F0DF
+:101D300082600FC08091EC019091ED018F70992726
+:101D40008093E9008091EB0085FB882780F9109251
+:101D5000E9009091E800977F9093E8008093F1006C
+:101D60001092F100D5C0882319F0823009F0F2C03A
+:101D70008F7121F0823009F0EDC00BC08091EA0133
+:101D8000813009F0E7C0933009F080E08093E501ED
+:101D90002FC08091EA0181112BC08091EC019091BC
+:101DA000ED018F709927009709F4D4C08093E90062
+:101DB0002091EB0020FF1CC02091E901233021F489
+:101DC0008091EB00806212C09091EB009061909343
+:101DD000EB0021E030E001C0220F8A95EAF7209362
+:101DE000EA001092EA008091EB0088608093EB009B
+:101DF0001092E9008091E800877F8093E8000E94BC
+:101E0000750CA8C08111A6C08091EA019091EB01E8
+:101E10008F779927182F9091E3009078982B9093C3
+:101E2000E3008091E800877F8093E8000E94750CB2
+:101E30008091E80080FFFCCF8091E3008068809370
+:101E4000E300112311F083E001C082E08093E701F9
+:101E500081C08058823008F07DC08091EA01909165
+:101E6000EB018C3D23E0920779F583E08A838AE2D7
+:101E700089834FB7F894DE01139620E03EE051E2EB
+:101E8000E32FF0E050935700E49120FF03C0E29568
+:101E9000EF703F5FEF708E2F90E0EA3010F0C79642
+:101EA00001C0C0968D939D932F5F243149F74FBF9A
+:101EB0008091E800877F8093E8006AE270E0CE01BD
+:101EC00001960E94770B13C0AE01455D5F4F609194
+:101ED000EC010E94AD0A0097E9F12091E800277F0C
+:101EE0002093E800BC018BA59CA50E94DA0B809191
+:101EF000E8008B778093E8002DC0803859F58091F9
+:101F0000E800877F8093E8008091E3018093F100EF
+:101F10008091E8008E7771CF81111CC09091EA0109
+:101F20009230C0F48091E800877F8093E80090931E
+:101F3000E3010E94750C8091E301811104C080913E
+:101F4000E30087FF02C084E001C081E08093E701E5
+:101F50000E94AD098091E80083FF0AC08091E800EB
+:101F6000877F8093E8008091EB0080628093EB0094
+:101F7000AC960FB6F894DEBF0FBECDBFDF91CF9108
+:101F80001F910895CF938091E7018823B1F080914C
+:101F9000E9008F709091EC0090FF02C090E801C0C2
+:101FA00090E0C92FC82B1092E9008091E80083FDD2
+:101FB0000E94590ECF70C093E900CF91089590937D
+:101FC0007501809374010895E0917401F091750199
+:101FD000309721F00190F081E02D099480E0089580
+:101FE000E0917401F0917501309721F00280F38146
+:101FF000E02D09940895E0917401F09175013097F6
+:1020000021F00480F581E02D099408952091760156
+:10201000309177018217930771F090937701809345
+:102020007601E0917401F0917501309721F00680FE
+:10203000F781E02D0994089520917801309179017C
+:102040008217930771F09093790180937801E09162
+:102050007401F0917501309721F00084F185E02D35
+:102060000994089508950C9432100E94541C0E9403
+:1020700028060E94281D0C94D0220C9462055F92C1
+:102080006F927F928F929F92AF92BF92CF92DF9288
+:10209000EF92FF920F931F93CF93DF93CDB7DEB7ED
+:1020A0002A970FB6F894DEBF0FBECDBF0E94380747
+:1020B0009AE7C92E91E0D92E00E010E0AA24A3945B
+:1020C000B12C502E802F0E948C083C01F601E1902B
+:1020D000F1906F01E826F926E114F10431F40F5F65
+:1020E0001F4F0530110569F73AC08091D00181FD7D
+:1020F0000E94950820E030E04501022E02C0880CC5
+:10210000991C0A94E2F7C4018E219F21892B09F1C1
+:102110002E835F826820792081E0672809F480E0BF
+:1021200088870E945D1C8160782F9A8789874E81FD
+:102130005F8168858A850E94F810F801EE0FFF1F05
+:10214000E658FE4F8081918188259925918380836F
+:1021500016C02F5F3F4F2C30310571F6C0CF8FEF87
+:1021600089838A831B820E945D1C8160782F9D83F6
+:102170008C8349815A816B818D810E94F8100E9465
+:102180001520109184010E94E40F1817D9F00E94C5
+:10219000E40F809384012A960FB6F894DEBF0FBE39
+:1021A000CDBFDF91CF911F910F91FF90EF90DF9006
+:1021B000CF90BF90AF909F908F907F906F905F90E7
+:1021C0000C943D102A960FB6F894DEBF0FBECDBF1B
+:1021D000DF91CF911F910F91FF90EF90DF90CF9003
+:1021E000BF90AF909F908F907F906F905F90089579
+:1021F000CF93DF93CDB7DEB72B970FB6F894DEBF42
+:102200000FBECDBF4F83588769877A878B87DE01E2
+:10221000119686E0FD0111928A95E9F785E0FE01AD
+:10222000379601900D928A95E1F749815A816B8129
+:102230007C818D819E810E94D4182B960FB6F894D4
+:10224000DEBF0FBECDBFDF91CF910895CF93C82FD2
+:10225000882309F4C1C0823859F40E94E40F81FD3B
+:10226000BBC089E30E943B1B0E94B71B89E30CC0E3
+:10227000833879F40E94E40F80FDAEC083E50E94AC
+:102280003B1B0E94B71B83E50E945D1BCF910C9402
+:10229000B71B843859F40E94E40F82FD9DC087E487
+:1022A0000E943B1B0E94B71B87E4EECF8450813A0B
+:1022B00048F48C2F0E94322281118EC08C2F0E94F4
+:1022C0003B1BE4CF8C2F805E883050F4C77081E0D8
+:1022D00090E001C0880FCA95EAF70E947E1BD6CF16
+:1022E0008C2F855A833078F4C53A29F0C63A31F4F8
+:1022F00082E890E005C081E890E002C083E890E0C9
+:10230000CF910C9406108C2F885A833108F064C04A
+:10231000C83A39F1C93A41F1CA3A49F1CB3A51F1D7
+:10232000CC3A59F1CD3A61F1C03B69F1CE3A71F145
+:10233000CF3A79F1C13B81F1C23B89F1C33B91F1C5
+:10234000C43B99F1C53BA1F1C63BA9F1C73BB1F133
+:10235000C83BB9F1C93BC1F1CA3BC9F58AE292E079
+:1023600038C082EE90E035C089EE90E032C08AEE4F
+:1023700090E02FC085EB90E02CC086EB90E029C068
+:1023800087EB90E026C08CEC90E023C08DEC90E0D1
+:1023900020C083E891E01DC08AE891E01AC082E97C
+:1023A00091E017C084E991E014C081E292E011C08D
+:1023B00083E292E00EC084E292E00BC085E292E0FC
+:1023C00008C086E292E005C087E292E002C080E0A9
+:1023D00090E0CF910C941C10CF910895882309F4BC
+:1023E0004DC0823859F40E94E40F81FF47C089E351
+:1023F0000E943B1B0E94B71B89E30CC0833871F419
+:102400000E94E40F80FF3AC083E50E943B1B0E94BC
+:10241000B71B83E50E945D1B0C94B71B843859F4ED
+:102420000E94E40F82FF2AC087E40E943B1B0E94A7
+:10243000B71B87E4EFCF982F9450913A08F4EACF76
+:10244000982F905E983058F4282F277081E090E004
+:1024500001C0880F2A95EAF70E94841BDDCF982FD0
+:10246000955A933020F480E090E00C940610885A3E
+:10247000833120F480E090E00C941C1008958823B0
+:1024800021F00E947E1B0C94B71B0895882321F035
+:102490000E94841B0C94B71B0895BF92CF92DF92C9
+:1024A000EF92FF920F931F93CF93DF93CDB7DEB7D9
+:1024B00027970FB6F894DEBF0FBECDBF8C0185E025
+:1024C000F801DE01119601900D928A95E1F7F8016D
+:1024D00030812181F280558152955F708381948192
+:1024E000892B39F02F3F41F481E090E03F3F31F0FC
+:1024F00003C081E090E002C080E090E080FD73C303
+:1025000039832A8389819A815E830E94F81AB92EC1
+:102510008F830E94F71A0E941F1A2B2D22952F706D
+:1025200030E05E816F812530310509F4E6C06CF43E
+:10253000243031050CF0A2C04B2D407F8B2D8F70C5
+:10254000223031050CF045C017C02C3031054CF459
+:102550002A3031050CF0E7C12830310509F043C3BA
+:10256000E5C02D30310509F4BAC20CF4A2C22F30F7
+:10257000310509F038C323C3182F411101C002C02F
+:102580001295107FFF2059F0112309F46BC2812F9F
+:102590006F830E948E1B0E94B71B6F8163C2862FC0
+:1025A0000E94EE11112309F41EC3812F0E94941B77
+:1025B00027960FB6F894DEBF0FBECDBFDF91CF9147
+:1025C0001F910F91FF90EF90DF90CF90BF900C94F0
+:1025D000B71B403211F08295807F662319F061307D
+:1025E00071F523C0FF20B1F0511101C032C051304C
+:1025F00081F527960FB6F894DEBF0FBECDBFDF91F1
+:10260000CF911F910F91FF90EF90DF90CF90BF90EF
+:102610000C949E1B511101C003C0513009F4E3C258
+:102620008E830E94A11B8E819AC1FF2021F056301B
+:1026300008F0D9C20EC0553008F0D5C290C1FF20B5
+:10264000C9F0552331F0F801958190FF0BC29F70BE
+:10265000958327960FB6F894DEBF0FBECDBFDF91EE
+:10266000CF911F910F91FF90EF90DF90CF90BF908F
+:102670000C943F12552309F472C109C22B2D2695E3
+:102680002695237030E02115310529F021303105E0
+:1026900009F0A9C219C0FF2021F0862F9B2D93704D
+:1026A00002C080E090E027960FB6F894DEBF0FBE20
+:1026B000CDBFDF91CF911F910F91FF90EF90DF90F1
+:1026C000CF90BF900C940610FF2021F0862F9B2DF9
+:1026D000937002C080E090E027960FB6F894DEBFBA
+:1026E0000FBECDBFDF91CF911F910F91FF90EF9063
+:1026F000DF90CF90BF900C941C10862FFF2019F014
+:102700000E941B1F02C00E94831F27960FB6F894D9
+:10271000DEBF0FBECDBFDF91CF911F910F91FF9014
+:10272000EF90DF90CF90BF900C940A208B2D837098
+:1027300009F079C0F11057C2262F229526952770EF
+:10274000220F220F862F8F70C82ED12CE12CF12C56
+:10275000022E04C0CC0CDD1CEE1CFF1C0A94D2F728
+:1027600064FF10C06FE070E080E090E004C0660F8E
+:10277000771F881F991F2A95D2F7609570958095CD
+:10278000909503C060E070E0CB012B2D2695269537
+:102790002370422F50E042305105D9F043305105AB
+:1027A00069F16C297D298E299F294130510551F10C
+:1027B00027960FB6F894DEBF0FBECDBFDF91CF9145
+:1027C0001F910F91FF90EF90DF90CF90BF900C94EE
+:1027D000341A6C297D298E299F2927960FB6F894E3
+:1027E000DEBF0FBECDBFDF91CF911F910F91FF9044
+:1027F000EF90DF90CF90BF900C94461A0E94341A4D
+:10280000C701B60127960FB6F894DEBF0FBECDBF45
+:10281000DF91CF911F910F91FF90EF90DF90CF90BC
+:10282000BF900C94221AFF2019F08B2D817001C0EB
+:102830008695882309F4D7C1262F229526952770DF
+:10284000220F220F862F8F70C82ED12CE12CF12C55
+:10285000022E04C0CC0CDD1CEE1CFF1C0A94D2F727
+:1028600064FF10C06FE070E080E090E004C0660F8D
+:10287000771F881F991F2A95D2F7609570958095CC
+:10288000909503C060E070E0CB012B2D2695269536
+:102890002370422F50E042305105D9F043305105AA
+:1028A00069F16C297D298E299F294130510551F10B
+:1028B00027960FB6F894DEBF0FBECDBFDF91CF9144
+:1028C0001F910F91FF90EF90DF90CF90BF900C94ED
+:1028D000D31A6C297D298E299F2927960FB6F89443
+:1028E000DEBF0FBECDBFDF91CF911F910F91FF9043
+:1028F000EF90DF90CF90BF900C94E51A0E94D31A0E
+:10290000C701B60127960FB6F894DEBF0FBECDBF44
+:10291000DF91CF911F910F91FF90EF90DF90CF90BB
+:10292000BF900C94C11A603F59F120F4603E08F446
+:1029300094C008C0623F09F467C0F0F1633F09F03A
+:102940008CC065C0162F1F708B2D8F71FF2021F05A
+:102950000E946C1A812F7DCE0E94871A812F2796A4
+:102960000FB6F894DEBF0FBECDBFDF91CF911F91A0
+:102970000F91FF90EF90DF90CF90BF900C94461294
+:10298000FF20B1F0553008F02EC18B2D8F712796A6
+:102990000FB6F894DEBF0FBECDBFDF91CF911F9170
+:1029A0000F91FF90EF90DF90CF90BF900C94A61AFC
+:1029B000563008F018C1E9CFFF2099F08B2D8F71A8
+:1029C00027960FB6F894DEBF0FBECDBFDF91CF9133
+:1029D0001F910F91FF90EF90DF90CF90BF900C94DC
+:1029E0006C1A8B2D8F7127960FB6F894DEBF0FBE31
+:1029F000CDBFDF91CF911F910F91FF90EF90DF90AE
+:102A0000CF90BF900C94871AF110EBCFD7CFFF2057
+:102A100099F08B2D8F7127960FB6F894DEBF0FBEFD
+:102A2000CDBFDF91CF911F910F91FF90EF90DF907D
+:102A3000CF90BF900C945D1A27960FB6F894DEBF26
+:102A40000FBECDBFDF91CF911F910F91FF90EF90FF
+:102A5000DF90CF90BF900C94581AFF20A9F0552317
+:102A600009F4ACCF862F27960FB6F894DEBF0FBEC1
+:102A7000CDBFDF91CF911F910F91FF90EF90DF902D
+:102A8000CF90BF900C942611552309F4AACF862F1E
+:102A900027960FB6F894DEBF0FBECDBFDF91CF9162
+:102AA0001F910F91FF90EF90DF90CF90BF900C940B
+:102AB000EE114B2D4F70C8010E94AB0227960FB646
+:102AC000F894DEBF0FBECDBFDF91CF911F910F9164
+:102AD000FF90EF90DF90CF90BF900C948A19F11087
+:102AE00082C09B2D9F70492F50E04230510599F1D3
+:102AF00044F44115510569F04130510509F073C0A6
+:102B000019C043305105C1F14430510509F06BC083
+:102B100044C027960FB6F894DEBF0FBECDBFDF913D
+:102B2000CF911F910F91FF90EF90DF90CF90BF90CA
+:102B30000C94E12227960FB6F894DEBF0FBECDBFEE
+:102B4000DF91CF911F910F91FF90EF90DF90CF9089
+:102B5000BF900C94F82227960FB6F894DEBF0FBEF4
+:102B6000CDBFDF91CF911F910F91FF90EF90DF903C
+:102B7000CF90BF900C94142327960FB6F894DEBF25
+:102B80000FBECDBFDF91CF911F910F91FF90EF90BE
+:102B9000DF90CF90BF900C942723862F27960FB6F7
+:102BA000F894DEBF0FBECDBFDF91CF911F910F9183
+:102BB000FF90EF90DF90CF90BF900C944B234B2D64
+:102BC0004F70C80127960FB6F894DEBF0FBECDBF79
+:102BD000DF91CF911F910F91FF90EF90DF90CF90F9
+:102BE000BF900C94D40327960FB6F894DEBF0FBEA7
+:102BF000CDBFDF91CF911F910F91FF90EF90DF90AC
+:102C0000CF90BF9008950E949B1B0E94701B0E9452
+:102C1000B71B0E94B6200E940A2080E090E00E942C
+:102C2000061080E090E00C941C100E948B1B0C940A
+:102C300003160E94F81A292F22952F7030E02C30AD
+:102C400031054CF42A3031056CF422503109223020
+:102C5000310590F407C02C30310551F02F3031058B
+:102C600059F406C0803E10F0803F31F481E00895B1
+:102C700093FB882780F9089580E00895CF93DF9330
+:102C800000D000D01F92CDB7DEB70F900F900F90FD
+:102C90000F900F90DF91CF910895CF93DF9300D0E5
+:102CA00000D000D0CDB7DEB726960FB6F894DEBFC1
+:102CB0000FBECDBFDF91CF9108951F93CF93DF93C8
+:102CC000C091BB0116E012C0D0E01C9FF0011D9F17
+:102CD000F00D1124E557FE4F4081518162817381CF
+:102CE000848195810E944D162196C7708091BC0108
+:102CF000C813EACFDF91CF911F91089540918501CC
+:102D000050918601609187017091880180918901BD
+:102D100090918A010C944D160F931F93CF93DF93DC
+:102D200080918A0182958F7009F069C08091870136
+:102D3000882309F464C0A091BB01D091BC01B0917B
+:102D40008501C0918601809188019091890121E0DF
+:102D500030E0BF3F11F020E030E0122FBC01609561
+:102D6000709506E04AC0009721F0CF3F29F4212F4B
+:102D700005C021E030E002C020E030E020FD3BC093
+:102D80004A2F50E0049FF001059FF00D1124E557F4
+:102D9000FE4F2181C2132FC02081B2132CC022818B
+:102DA000211129C0238134812817390718F0281BE5
+:102DB000390B02C0260F371F283C3105E0F4809103
+:102DC0008A018F70806180938A0186E0849FF00180
+:102DD000859FF00D1124E057FE4F80818F70806138
+:102DE000808385E891E00E944D12DF91CF911F9181
+:102DF0000F910C945D16AF5FA770AD13B4CFDF9148
+:102E0000CF911F910F910895EF92FF920F931F930F
+:102E1000CF93DF93CDB7DEB762970FB6F894DEBFDE
+:102E20000FBECDBF8C0185E0F801DE011D9601903B
+:102E30000D928A95E1F7D8014C9111965C9111970A
+:102E400012966C9112971396ED90FC9014977091D6
+:102E50008501E09186018091880190918901009718
+:102E600039F0EF3F41F421E030E07F3F31F003C023
+:102E700021E030E002C020E030E020FD5CC1209184
+:102E80008701222309F4F1C0E816F90628F097011A
+:102E9000281B390BC90104C0809590958E0D9F1D8C
+:102EA000883C910508F098C080918A01982F907F06
+:102EB00009F064C0E51314C0741312C0611110C08E
+:102EC0008F70806180938A010E947E1685E891E070
+:102ED0000E944D1280918A01D80115968C9343C1AE
+:102EE000EF2839F05F3F41F481E090E04F3F31F04F
+:102EF00003C081E090E002C080E090E080FD03C06C
+:102F000081E0862702C080E090E080FF2EC08091A3
+:102F1000BB012091BC0136E013C090E0389FF00166
+:102F2000399FF00D1124E557FE4F7181571306C0EC
+:102F30007081471303C07281671317C001968770B1
+:102F40008213EBCF12C19F7059F0882309F40BC193
+:102F500007C09F7029F0F8019581907F09F403C1A3
+:102F6000805E883008F4FFC0D2C0662309F4FBC03D
+:102F700080918A01816080938A01F5C0E51308C0C1
+:102F8000741306C0611104C0D80115968C939DC0BE
+:102F90004D875E878D859E856A8B0E9419166A898A
+:102FA000882309F4B4C0662309F4B1C020918A01D2
+:102FB000822F82958F7090E002970CF4C6C08091AA
+:102FC00085019091860198878F831986FB86EA8612
+:102FD0002C87CE01079646C080918A01982F907F5A
+:102FE00059F47E2DF98AE88A89890E943E1685E87F
+:102FF00091E00E944D1295C0E51311C074130FC0EB
+:1030000061110DC0F8018583C8010E944D12E5E8E9
+:10301000F1E086E0DF011D928A95E9F7A2C04D87B5
+:103020005E878D859E856A8B0E9419166A89882322
+:1030300009F46DC0662309F46AC020918A01822FC9
+:1030400082958F7090E002970CF47FC0809185018B
+:10305000909186019A8389831B82FD82EC822E8364
+:10306000CE0101960E944D1270C0E816F90628F0B4
+:103070009701281B390BC90104C0809590958E0DCE
+:103080009F1D883C910508F046C0662309F43FC0A7
+:10309000E51330C074132EC020918A0120FD21C099
+:1030A000322F32953F70832F90E00097D1F0D801F6
+:1030B00015962C9315970F9741F0832F8F5F82956C
+:1030C000807F2F70282B15962C93C8010E944D12DB
+:1030D00086E0F801A5E8B1E001900D928A95E1F74C
+:1030E0003EC086E0F801A5E8B1E001900D928A9516
+:1030F000E1F737C04D875E878D859E850E94191642
+:10310000811123C080918A01816080938A01C80166
+:103110000E944D1226C07E2DF98AE88A89890E9474
+:103120003E16E5E8F1E086E0DF011D928A95E9F7B9
+:103130000E947E1618C0662351F34D875E878D85E9
+:103140009E850E941916882311F386E0F801A5E8F0
+:10315000B1E001900D928A95E1F70E948C160E94D1
+:103160007E1681E014C080E012C04D875E878D8599
+:103170009E850E94F81A292F22952F7030E0223068
+:1031800031050CF4E0CE243031050CF6E2CE629627
+:103190000FB6F894DEBF0FBECDBFDF91CF911F9168
+:1031A0000F91FF90EF9008951F93CF93DF93CDB7CA
+:1031B000DEB72C970FB6F894DEBF0FBECDBF4F839E
+:1031C000588769877A878B879C87CE0107960E94EC
+:1031D00004178823D9F02F8138858A859B85892B10
+:1031E00039F03F3F19F080E090E004C02F3FD9F75D
+:1031F00081E090E0892B09F06DC04F815885698589
+:103200007A858B859C850E944D1664C086E0FE0100
+:103210003796DE01119601900D928A95E1F7FF81B4
+:10322000E8854A855B854115510539F0EF3F41F44A
+:1032300081E090E0FF3F31F003C081E090E002C008
+:1032400080E090E080FD46C02091BC0130E0C901E3
+:103250000196877099276091BB0170E086179707E8
+:1032600009F440C0F983EA835D834C8396E0929F22
+:10327000D001939FB00D1124A557BE4FFE0131968A
+:1032800001900D929A95E1F78093BC010E945D1622
+:1032900021C0189FC001112485579E4F0E9404171A
+:1032A000882371F1E091BB011E9FF0011124E557C5
+:1032B000FE4F4081518162817381848195810E949A
+:1032C0004D168091BB0190E00196877099278093FD
+:1032D000BB0101C016E08091BB019091BC01891334
+:1032E000D8CF0EC00E9415161092BC011092BB01DF
+:1032F000E5E8F1E086E0DF011D928A95E9F7EACF83
+:103300002C960FB6F894DEBF0FBECDBFDF91CF91E4
+:103310001F910895DF92EF92FF920F931F93CF9327
+:10332000DF93EC01009709F46EC0D12CEE24E394F6
+:10333000F12C8E010F5F1F4FFE018491843748F4FA
+:10334000843008F04CC0813071F0823009F05BC0ED
+:103350001EC0853709F43FC080F1982F94589037EC
+:1033600008F051C03FC02296F8018491982F905EDA
+:10337000983050F48770FE2D01C0FF0F8A95EAF750
+:103380008F2F0E948E1B13C00E9426112FC02296E1
+:10339000F8018491982F905E983060F48770FE2D2C
+:1033A00001C0FF0F8A95EAF78F2F0E94941B0E949D
+:1033B000B71B1CC00E94EE1119C02296F80104919F
+:1033C00007C08FE99FE00197F1F700C000000150AE
+:1033D0000111F7CF0BC02296F801D49007C00E94CC
+:1033E000261103C08F770E94EE11E8018D2D07C0D2
+:1033F0008150EFE9FFE03197F1F700C0000088232A
+:1034000009F497CFF5CFDF91CF911F910F91FF90E6
+:10341000EF90DF9008956093C1017093C201809393
+:10342000C3019093C4010C9403166093BD01709383
+:10343000BE018093BF019093C0010C9403160895C0
+:103440000C940B1A0F931F930091C1011091C201AC
+:103450002091C3013091C401602B712B822B932BDF
+:103460001F910F910C940B1A0F931F930091C101A0
+:103470001091C2012091C3013091C40160237123D6
+:10348000822393231F910F910C940B1A0F931F9378
+:103490000091C1011091C2012091C3013091C4017A
+:1034A00060277127822793271F910F910C940B1A85
+:1034B00060E070E0CB010C94151A41E050E060E050
+:1034C00070E004C0440F551F661F771F8A95D2F71E
+:1034D000CB01BA010C94151A41E050E060E070E0B5
+:1034E00004C0440F551F661F771F8A95D2F780913D
+:1034F000BD019091BE01A091BF01B091C001482BC8
+:10350000592B6A2B7B2BCB01BA010C94151A41E085
+:1035100050E060E070E004C0440F551F661F771F45
+:103520008A95D2F740955095609570958091BD0130
+:103530009091BE01A091BF01B091C00148235923D1
+:103540006A237B23CB01BA010C94151A41E050E0A9
+:1035500060E070E004C0440F551F661F771F8A9516
+:10356000D2F78091BD019091BE01A091BF01B091B1
+:10357000C001482759276A277B27CB01BA010C9441
+:10358000151A0F931F930091BD011091BE01209158
+:10359000BF013091C001602B712B822B932B1F91A7
+:1035A0000F910C94151A0F931F930091BD01109168
+:1035B000BE012091BF013091C0016023712382239D
+:1035C00093231F910F910C94151A0F931F93009141
+:1035D000BD011091BE012091BF013091C001602753
+:1035E0007127822793271F910F910C94151A089524
+:1035F000CF92DF92EF92FF920F931F93CF93DF93BF
+:10360000EC01C090C101D090C201E090C301F090E4
+:10361000C4018091BD019091BE01A091BF01B09104
+:10362000C001C82AD92AEA2AFB2A0FE110E0B70113
+:10363000A601002E04C076956795579547950A9484
+:10364000D2F740FF08C0BE01802F0E94FA038130EC
+:10365000910509F007C00150110948F7BE0180E04B
+:103660000E94FA03DF91CF911F910F91FF90EF908D
+:10367000DF90CF90089540910C0150910D0120E012
+:1036800030E09FEFFA01E20FF31F62816817A1F0AB
+:103690009F3F19F4611101C0922F2F5F3F4F2630D9
+:1036A000310581F707C0FA01E90FF11D97FDFA9581
+:1036B000828308959F3FB9F7089540910C0150917E
+:1036C0000D0120E030E0FA01E20FF31F9281981320
+:1036D00001C012822F5F3F4F26303105A1F70895B8
+:1036E00081E090E0E0910C01F0910D01E80FF91FED
+:1036F0001082019688309105A9F708959091C5012F
+:10370000982B9093C501089580959091C5019823B9
+:103710009093C50108951092C50108959091C60136
+:10372000982B9093C601089580959091C601982397
+:103730009093C60108951092C60108958093C70121
+:1037400008951092C701089540910C0150910D0108
+:1037500020E030E080E0FA01E20FF31F9181911147
+:103760008F5F2F5F3F4F27303105A9F70895E09114
+:103770000C01F0910D018091C5018083E0910C0155
+:10378000F0910D0180819091C601892B80839091E9
+:10379000C701992361F0E0910C01F0910D01808146
+:1037A000892B80830E94A41B81110E94A11B809100
+:1037B0000C0190910D010C94F00F8091E701843081
+:1037C00021F11092D10120E488E190E00FB6F89445
+:1037D000A895809360000FBE2093600080E00E9457
+:1037E000E10283B7817F846083BF83B7816083BF39
+:1037F0007894889583B78E7F83BF88E10FB6F8945D
+:1038000080936000109260000FBE0895089508959F
+:10381000CF9380E00E94E1020E94061C0E943807BC
+:103820000E94071CC0E08C2F0E948C08892B29F471
+:10383000CF5FC530C1F780E001C081E0CF9108952E
+:103840000E94151680E00E94E1020E94D0220E9490
+:10385000E40F0C9462051F920F920FB60F92112481
+:103860008F939F93AF93BF938091D101811113C028
+:103870008091D2019091D301A091D401B091D50152
+:103880004196A11DB11D8093D2019093D301A093C5
+:10389000D401B093D501BF91AF919F918F910F90BB
+:1038A0000FBE0F901F90189582E084BD93E095BDE8
+:1038B0009AEF97BD80936E0008958FB7F89440916A
+:1038C000D2015091D3016091D4017091D5018FBF85
+:1038D000CA010895CF92DF92EF92FF920F931F9348
+:1038E0002FB7F8944091D2015091D3016091D40147
+:1038F0007091D5012FBF6A017B01EE24FF248C015A
+:1039000020E030E0C016D106E206F30620F09A016E
+:10391000281B390B05C09C0120953095240F351FBD
+:10392000C9011F910F91FF90EF90DF90CF90089504
+:103930001F920F920FB60F9211248F939F93AF9304
+:10394000BF938091D2019091D301A091D401B09105
+:10395000D5010196A11DB11D8093D2019093D30191
+:10396000A093D401B093D501BF91AF919F918F9156
+:103970000F900FBE0F901F9018950E94C80CF894DE
+:103980002FEF87EA91E6215080409040E1F700C098
+:10399000000087E090EBDC018093F1019093F2014D
+:1039A000A093F301B093F4012CE088E190E00FB60E
+:1039B000F894A895809360000FBE20936000FFCF1D
+:1039C000CF92DF92EF92FF920F931F93CF93DF93EB
+:1039D000C82ED12C01E010E08D2D0E948C087C01B6
+:1039E000C0E0D0E098010C2E02C0220F331F0A94D1
+:1039F000E2F72E213F21232B29F42196CC30D1054B
+:103A000089F708C06C2F7D2D80E00E94D503C81275
+:103A1000F4CF06C0D39485E0D812DECF80E001C099
+:103A200081E0DF91CF911F910F91FF90EF90DF9098
+:103A3000CF900895CF93C82F8CE20E94E01C88237A
+:103A400021F08C2FCF910C94E01C80E0CF91089551
+:103A5000CF930E946B1E811102C00E944C1EC5E6CE
+:103A600008C00E9438078FE39CE90197F1F700C076
+:103A70000000C150B1F789E20E941A1D81110AC1EC
+:103A80008AE20E941A1D81110E944C1E85E00E944C
+:103A90001A1D81110E94BD1C0E94761E8093D001C8
+:103AA00087E00E941A1D882399F18BE10E941A1D5C
+:103AB000882351F09091D00191FB882780F921E073
+:103AC000822780FB91F922C08EE00E941A1D882374
+:103AD00051F09091D00192FB882780F921E0822754
+:103AE00080FB92F913C080E10E941A1D9091D001D1
+:103AF000882341F093FB882780F921E0822780FB0F
+:103B000093F904C0892F809580FB90F99093D001A0
+:103B10008091D0010E947A1E0E94881E8093E1014C
+:103B200080EE0E941A1D882341F08091E101982FB8
+:103B3000909590FB80F98093E10189E30E941A1D22
+:103B4000882359F09091E10191FB882780F921E0C9
+:103B5000822780FB91F99093E10182EE0E941A1D69
+:103B6000882359F09091E10192FB882780F921E0A8
+:103B7000822780FB92F99093E10186EE0E941A1D44
+:103B8000882359F09091E10193FB882780F921E087
+:103B9000822780FB93F99093E10183EE0E941A1D26
+:103BA000882359F09091E10194FB882780F921E066
+:103BB000822780FB94F99093E10185E30E941A1D0E
+:103BC000882359F09091E10195FB882780F921E045
+:103BD000822780FB95F99093E10181E30E941A1DF1
+:103BE000882359F09091E10196FB882780F921E024
+:103BF000822780FB96F99093E10181E10E941A1DD2
+:103C0000882359F09091E10197FB882780F921E002
+:103C1000822780FB97F99093E1018091E1010E9456
+:103C20008C1E87E20E941A1DC82F8EE10E941A1D69
+:103C30008111C2608FE10E941A1D8111C46080E26F
+:103C40000E941A1D8111C86081E20E941A1D811113
+:103C5000C06182E20E941A1D8111C06283E20E944B
+:103C60001A1D8111C06484E20E941A1D882311F07C
+:103C7000C06802C0CC2329F08C2F0E94831E6C2FB9
+:103C800003C00E947F1E682F70E080E090E0CF911B
+:103C90000C94201ACF9108956DEE7EEF80E090E0B5
+:103CA0000E94D92460E082E090E00E94CB2460E092
+:103CB00083E090E00E94CB2460E084E090E00E94EA
+:103CC000CB2460E085E090E00E94CB2460E086E0B9
+:103CD00090E00C94CB2480E090E00E94C52421E089
+:103CE0008D3E9E4F09F020E0822F089582E090E003
+:103CF0000C94BD24682F82E090E00C94CB2483E0E8
+:103D000090E00C94BD24682F83E090E00C94CB24C9
+:103D100084E090E00C94BD24682F84E090E00C9443
+:103D2000CB2486E090E00C94BD24682F86E090E0E0
+:103D30000C94CB248091DE0180FF0BC060911101B7
+:103D400085E0689FB0011124759567957595679515
+:103D50002AC081FF09C06091110185E0689FB00110
+:103D60001124759567951FC082FF07C060911101EE
+:103D700085E0689FB001112416C04091D80144230A
+:103D8000C9F060911001461788F72091110185E074
+:103D9000289F90011124429FC001439F900D112440
+:103DA00070E00E9495246038710540F4611571053A
+:103DB00039F002C065E070E0862F08958FE708951E
+:103DC00081E008958091DE0180FF08C060910F01BD
+:103DD00070E0759567957595679521C081FF06C060
+:103DE00060910F0170E07595679519C082FF04C05E
+:103DF00060910F0170E010C08091D8018823C1F05C
+:103E000060910E018617A0F790910F01989FC00155
+:103E1000112470E00E9495246038710528F4611522
+:103E2000710521F0862F08958FE7089581E00895A8
+:103E300061E070E0F4CF803F21F40E949A1E8195EA
+:103E400004C0813F29F40E949A1E8093DB010895EB
+:103E5000823F21F40E949A1E819504C0833F29F479
+:103E60000E949A1E8093DA010895893F19F40E94F6
+:103E7000E21E05C08A3F31F40E94E21E81958093C4
+:103E8000DC0108958B3F21F40E94E21E819504C05D
+:103E90008C3F29F40E94E21E8093DD010895843F47
+:103EA00021F48091D901816017C0853F21F4809170
+:103EB000D901826011C0863F21F48091D9018460CC
+:103EC0000BC0873F21F48091D901886005C0883FED
+:103ED00031F48091D90180618093D90108958D3F9B
+:103EE00021F48091DE0181600BC08E3F21F480912E
+:103EF000DE01826005C08F3F29F48091DE0184607D
+:103F00008093DE010895803F29F48091DB0187FFD3
+:103F10006EC007C0813F41F48091DB0118160CF0A0
+:103F200066C01092DB0163C09091DA01823F19F400
+:103F300097FF5DC005C0833F31F419160CF057C0E0
+:103F40001092DA0154C0893F31F48091DC011816D7
+:103F50000CF04DC006C08A3F39F48091DC0187FF28
+:103F600046C01092DC0143C08B3F29F48091DD01F3
+:103F700087FF3DC006C08C3F39F48091DD011816E3
+:103F8000B4F51092DD0133C0843F21F48091D90152
+:103F90008E7F05C0853F31F48091D9018D7F80935C
+:103FA000D90125C0863F21F48091D9018B7FF7CFBD
+:103FB000873F21F48091D901877FF1CF883F21F499
+:103FC0008091D9018F7EEBCF8D3F21F48091DE016E
+:103FD0008E7F0BC08E3F21F48091DE018D7F05C066
+:103FE0008F3F29F48091DE018B7F8093DE018091E9
+:103FF000DA0181110EC08091DB0181110AC080912C
+:10400000DC01811106C08091DD01811102C0109296
+:10401000D801089589ED91E00E94FB0F0E945D1C7C
+:104020009093D7018093D6010895CF938091D601C4
+:104030009091D7010E946A1C4091D801442321F03D
+:104040002091120130E006C0209113015AE0259F13
+:10405000900111248217930708F486C08091DA0139
+:1040600081110DC09091DB01911109C09091DC018B
+:10407000911105C09091DD01992309F475C04F3F5E
+:1040800019F04F5F4093D801181624F40E949A1E2D
+:104090008093DA018091DA0187FF05C00E949A1EA1
+:1040A00081958093DA018091DB01181624F40E9437
+:1040B0009A1E8093DB018091DB0187FF05C00E947F
+:1040C0009A1E81958093DB016091DA01662339F1B4
+:1040D000C091DB01CC2319F1772767FD7095872FFD
+:1040E000972F0E949A2323E333E343E35FE30E9485
+:1040F000FE230E9467236093DA016C2F772767FD08
+:104100007095872F972F0E949A2323E333E343E38D
+:104110005FE30E94FE230E9467236093DB0180918E
+:10412000DC01181624F40E94E21E8093DC018091C9
+:10413000DC0187FF05C00E94E21E81958093DC01AF
+:104140008091DD01181624F40E94E21E8093DD01A7
+:104150008091DD0187FF05C00E94E21E819580935A
+:10416000DD01CF910C940A20CF910895E9EDF1E0A3
+:1041700085E0DF011D928A95E9F71092D80110922F
+:10418000DE010895833089F130F4813061F08230AE
+:1041900009F06EC019C0853009F449C0B8F1863005
+:1041A00009F066C055C020911301862F90E0820F60
+:1041B000911D8F3F910520F4620F609313010895C4
+:1041C0008FEF80931301089520911201862F90E0C4
+:1041D000820F911D8F3F910520F4620F60931201B1
+:1041E00008958FEF80931201089520911101862F79
+:1041F00090E0820F911D8F3F910520F4620F609334
+:10420000110108958FEF80931101089520911001FD
+:10421000862F90E0820F911D8F3F910520F4620F51
+:104220006093100108958FEF8093100108952091FD
+:104230000F01862F90E0820F911D8F3F910520F492
+:10424000620F60930F0108958FEF80930F0108951F
+:1042500020910E01862F90E0820F911D8F3F9105D6
+:1042600020F4620F60930E0108958FEF80930E018A
+:104270000895833021F130F4813059F0823009F013
+:1042800049C012C0853089F128F1863009F042C05A
+:1042900037C080911301681720F4861B80931301A7
+:1042A000089510921301089580911201681720F467
+:1042B000861B809312010895109212010895809137
+:1042C0001101681720F4861B809311010895109244
+:1042D0001101089580911001681720F4861B8093C6
+:1042E0001001089510921001089580910F01681730
+:1042F00020F4861B80930F01089510920F010895FA
+:1043000080910E01681720F4861B80930E0108959A
+:1043100010920E01089541E050E060E070E004C0AA
+:10432000440F551F661F771F8A95D2F7CB01BA013C
+:104330000E94201A0C941516873200F58E3108F071
+:1043400086C08E3009F466C060F4873009F44DC031
+:1043500018F4863049F531C0883041F18B3021F5B1
+:104360007BC0863109F478C018F48031E9F45CC070
+:10437000893109F471C08B31B9F442C0883309F432
+:104380006BC048F4893209F460C0853309F45DC01C
+:10439000873251F45AC0833409F457C018F48A3371
+:1043A00018F057C0883499F080E008950E94761E76
+:1043B0000E94881E0E94911E4FC08091D001817F73
+:1043C0008E7F8093D00181E08093DF0108950E9469
+:1043D00015162FEF83ED90E3215080409040E1F7D8
+:1043E00000C000000E94BD1C37C08091D00180FF3A
+:1043F00003C0817F8E7F01C081608093D0012CC07B
+:104400009091D00191FB882780F921E0822780FBE1
+:1044100091F913C09091D00192FB882780F921E097
+:10442000822780FB92F909C09091D00193FB8827E5
+:1044300080F921E0822780FB93F99093D0018823B3
+:1044400059F091609093D00107C080E003C08D5176
+:1044500001C089530E948B2181E0089580E0089576
+:1044600080E00895CF93C82F8091DF01813071F0F3
+:1044700020F0823009F089C037C0A0910C01B091C2
+:104480000D018C91823209F082C007C0A0910C010D
+:10449000B0910D018C91823249F48C2F0E942E2212
+:1044A00081111EC08C2F0E949C211CC08C2F0E9449
+:1044B0003022811115C0C43169F030F4CB3081F065
+:1044C000C03109F068C009C0C93221F0C83309F011
+:1044D00062C006C01092DF015EC082E08093DF01FF
+:1044E00081E090E081705AC0C932C9F060F4C431F3
+:1044F000B1F020F4C73009F04CC034C0CE51C63002
+:1045000008F047C017C0CE3439F120F4CB3409F09D
+:1045100040C01CC0C135C1F0C235D9F513C080916F
+:10452000E001882319F01092E00133C081E080930C
+:10453000DF0134C0EC2FF0E0E65BFE4F808180931A
+:10454000E00127C061E003C061E007C06AE080913C
+:10455000E0010E94C2201DC06AE08091E0010E943B
+:10456000392117C08EE18093130182E380931201F9
+:104570008AE08093110184E18093100188E08093A8
+:104580000F0188E280930E0104C01092DF0180E0E9
+:1045900005C081E003C080E090E0A4CFCF910895F2
+:1045A0000E946B1E811102C00E944C1E0E94911E2F
+:1045B0008093F00180FF02C0869501C080E00C94DA
+:1045C000E1028091F001982F9695292F30E0233059
+:1045D00031054CF49F5F990F8170892B8160809326
+:1045E000F0010E94951E8091F00186950C94E102E5
+:1045F0008091F001982F969591F09158990F8170C4
+:10460000892B8093F0018E7F91E009F490E08091F6
+:10461000F00190FB80F98093F0010E94951E80913B
+:10462000F00186950C94E1028091F001982F90950D
+:1046300090FB80F98093F0010E94951E8091F0011B
+:1046400080FF02C0869501C080E00C94E1023091A9
+:10465000F001232F26952F5F2F77822F90E0317066
+:1046600004972CF4220F232B2093F00102C03093E7
+:10467000F0018091F001282F2E7F91E009F490E065
+:1046800090FB80F98093F0010E94951E8091F001CB
+:1046900086950C94E1022091F001922F969598272F
+:1046A000990F822F8170892B8093F0018E7F91E08A
+:1046B00009F490E08091F00190FB80F98093F00183
+:1046C0000E94951E8091F00186950C94E10204D021
+:1046D0006894B1118DC0089570D088F09F5790F004
+:1046E000B92F9927B751A0F0D1F0660F771F881F17
+:1046F000991F1AF0BA95C9F712C0B13081F077D07E
+:10470000B1E0089574C0672F782F8827B85F39F01B
+:10471000B93FCCF3869577956795B395D9F73EF475
+:1047200090958095709561957F4F8F4F9F4F08951D
+:10473000E89409C097FB3EF490958095709561953B
+:104740007F4F8F4F9F4F9923A9F0F92F96E9BB27F1
+:104750009395F695879577956795B795F111F8CF6D
+:10476000FAF4BB0F11F460FF1BC06F5F7F4F8F4FD8
+:104770009F4F16C0882311F096E911C0772321F0CE
+:104780009EE8872F762F05C0662371F096E8862F66
+:1047900070E060E02AF09A95660F771F881FDAF7BD
+:1047A000880F9695879597F9089557FD9058440F6F
+:1047B000551F59F05F3F71F04795880F97FB991F80
+:1047C00061F09F3F79F0879508951216130614063D
+:1047D000551FF2CF4695F1DF08C0161617061806CA
+:1047E000991FF1CF86957105610508940895E894A5
+:1047F000BB2766277727CB0197F908950BD078C0A0
+:1048000069D028F06ED018F0952309F05AC05FC027
+:104810001124EECFCADFA0F3959FD1F3950F50E09E
+:10482000551F629FF001729FBB27F00DB11D639F62
+:10483000AA27F00DB11DAA1F649F6627B00DA11D08
+:10484000661F829F2227B00DA11D621F739FB00DAE
+:10485000A11D621F839FA00D611D221F749F33271E
+:10486000A00D611D231F849F600D211D822F762FB7
+:104870006A2F11249F5750408AF0E1F088234AF0B4
+:10488000EE0FFF1FBB1F661F771F881F9150504000
+:10489000A9F79E3F510570F014C0AACF5F3FECF31B
+:1048A000983EDCF3869577956795B795F795E795EC
+:1048B0009F5FC1F7FE2B880F911D9695879597F9FD
+:1048C000089597F99F6780E870E060E008959FEF92
+:1048D00080EC089500240A94161617061806090697
+:1048E000089500240A941216130614060506089566
+:1048F000092E0394000C11F4882352F0BB0F40F4EE
+:10490000BF2B11F460FF04C06F5F7F4F8F4F9F4F2D
+:104910000895991B79E004C0991F961708F0961B1B
+:10492000881F7A95C9F78095089597FB072E16F48E
+:10493000009407D077FD09D00E94A92407FC05D078
+:104940003EF4909581959F4F0895709561957F4FA6
+:104950000895AA1BBB1B51E107C0AA1FBB1FA617C6
+:10496000B70710F0A61BB70B881F991F5A95A9F718
+:1049700080959095BC01CD010895F999FECF92BD27
+:1049800081BDF89A992780B50895A8E1B0E042E08A
+:1049900050E00C94E024262FF999FECF1FBA92BD67
+:1049A00081BD20BD0FB6F894FA9AF99A0FBE019610
+:1049B00008950E94CB24272F0C94CC24DC01CB013A
+:1049C000FC01F999FECF06C0F2BDE1BDF89A31961F
+:1049D00000B40D9241505040B8F70895F894FFCFBD
+:1049E00005960826090209CD08990801C80128087A
+:1049F000140A321E420045002500260043006100D3
+:104A00006000200037006400650066006700440015
+:104A100046002400470074038D03A603BF038B04E4
+:104A20003E040804E8033F4D362001020304050656
+:044A3000070809006A
+:00000001FF
diff --git a/keyboard/retro_refit/Makefile b/keyboard/retro_refit/Makefile
index ec51227ff..918b43071 100644
--- a/keyboard/retro_refit/Makefile
+++ b/keyboard/retro_refit/Makefile
@@ -113,18 +113,19 @@ 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
+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
+KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES # MIDI controls
-# UNICODE_ENABLE = YES # Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+# MIDI_ENABLE = YES # MIDI controls
+# UNICODE_ENABLE = YES # Unicode
+# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
diff --git a/keyboard/retro_refit/config.h b/keyboard/retro_refit/config.h
index ba9a861ed..05fceb92b 100644
--- a/keyboard/retro_refit/config.h
+++ b/keyboard/retro_refit/config.h
@@ -53,11 +53,54 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
-/* key combination for command */
+
+/* Force NKRO Mode - If forced on, must be disabled via magic key (default = LShift+RShift+N) */
+#define FORCE_NKRO
+
+/*
+ * Magic key options
+ * These options allow the magic key functionality to be changed. This is useful
+ * if your keyboard/keypad is missing keys and you want magic key support.
+ */
+
+/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* remap magic keys */
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+#define MAGIC_KEY_LOCK BSLS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
@@ -76,4 +119,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-#endif
+#endif \ No newline at end of file
diff --git a/keyboard/retro_refit/retro_refit.c b/keyboard/retro_refit/retro_refit.c
index 0b13eb830..78b6edca7 100644
--- a/keyboard/retro_refit/retro_refit.c
+++ b/keyboard/retro_refit/retro_refit.c
@@ -2,39 +2,39 @@
__attribute__ ((weak))
void matrix_init_user(void) {
- // leave this function blank - it can be defined in a keymap file
+ // leave this function blank - it can be defined in a keymap file
};
__attribute__ ((weak))
void matrix_scan_user(void) {
- // leave this function blank - it can be defined in a keymap file
+ // leave this function blank - it can be defined in a keymap file
};
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
- // leave this function blank - it can be defined in a keymap file
+ // leave this function blank - it can be defined in a keymap file
};
void matrix_init_kb(void) {
- // put your keyboard start-up code here
- // runs once when the firmware starts up
-
- // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
- DDRD |= (1<<6);
- PORTD |= (1<<6);
-
- matrix_init_user();
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+
+ // Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
+ DDRD |= (1<<6);
+ PORTD |= (1<<6);
+
+ matrix_init_user();
};
void amatrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
- matrix_scan_user();
+ matrix_scan_user();
};
void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+ // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low
@@ -62,7 +62,7 @@ void led_set_kb(uint8_t usb_led) {
// Hi-Z
DDRC &= ~(1<<6);
PORTC &= ~(1<<6);
- }
-
- led_set_user(usb_led);
+ }
+
+ led_set_user(usb_led);
}; \ No newline at end of file
diff --git a/quantum/audio.c b/quantum/audio.c
index 3a3a1a491..bbdbc824c 100644
--- a/quantum/audio.c
+++ b/quantum/audio.c
@@ -4,12 +4,19 @@
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/io.h>
-
+#include "print.h"
#include "audio.h"
#include "keymap_common.h"
+#include "eeconfig.h"
+
+#include "vibrato_lut.h"
+
#define PI 3.14159265
+#define CPU_PRESCALER 8
+
+// Largely untested PWM audio mode (doesn't sound as good)
// #define PWM_AUDIO
#ifdef PWM_AUDIO
@@ -45,89 +52,133 @@ uint16_t place_int = 0;
bool repeat = true;
uint8_t * sample;
uint16_t sample_length = 0;
-
+double freq = 0;
bool notes = false;
bool note = false;
float note_frequency = 0;
float note_length = 0;
+float note_tempo = TEMPO_DEFAULT;
+float note_timbre = TIMBRE_DEFAULT;
uint16_t note_position = 0;
float (* notes_pointer)[][2];
-uint8_t notes_length;
+uint8_t notes_count;
bool notes_repeat;
+float notes_rest;
+bool note_resting = false;
+
uint8_t current_note = 0;
+uint8_t rest_counter = 0;
-void stop_all_notes() {
- voices = 0;
- #ifdef PWM_AUDIO
- TIMSK3 &= ~_BV(OCIE3A);
- #else
- TIMSK3 &= ~_BV(OCIE3A);
- TCCR3A &= ~_BV(COM3A1);
- #endif
- notes = false;
- note = false;
- frequency = 0;
- volume = 0;
+float vibrato_counter = 0;
+float vibrato_strength = .5;
+float vibrato_rate = 0.125;
- for (int i = 0; i < 8; i++) {
- frequencies[i] = 0;
- volumes[i] = 0;
- }
+float polyphony_rate = 0;
+
+bool inited = false;
+
+audio_config_t audio_config;
+
+
+void audio_toggle(void) {
+ audio_config.enable ^= 1;
+ eeconfig_write_audio(audio_config.raw);
}
-void stop_note(double freq) {
- #ifdef PWM_AUDIO
- freq = freq / SAMPLE_RATE;
- #endif
- for (int i = 7; i >= 0; i--) {
- if (frequencies[i] == freq) {
- frequencies[i] = 0;
- volumes[i] = 0;
- for (int j = i; (j < 7); j++) {
- frequencies[j] = frequencies[j+1];
- frequencies[j+1] = 0;
- volumes[j] = volumes[j+1];
- volumes[j+1] = 0;
- }
- }
- }
- voices--;
- if (voices < 0)
- voices = 0;
- if (voices == 0) {
- #ifdef PWM_AUDIO
- TIMSK3 &= ~_BV(OCIE3A);
- #else
- TIMSK3 &= ~_BV(OCIE3A);
- TCCR3A &= ~_BV(COM3A1);
- #endif
- frequency = 0;
- volume = 0;
- note = false;
+void audio_on(void) {
+ audio_config.enable = 1;
+ eeconfig_write_audio(audio_config.raw);
+}
+
+void audio_off(void) {
+ audio_config.enable = 0;
+ eeconfig_write_audio(audio_config.raw);
+}
+
+// Vibrato rate functions
+
+void set_vibrato_rate(float rate) {
+ vibrato_rate = rate;
+}
+
+void increase_vibrato_rate(float change) {
+ vibrato_rate *= change;
+}
+
+void decrease_vibrato_rate(float change) {
+ vibrato_rate /= change;
+}
+
+#ifdef VIBRATO_STRENGTH_ENABLE
+
+void set_vibrato_strength(float strength) {
+ vibrato_strength = strength;
+}
+
+void increase_vibrato_strength(float change) {
+ vibrato_strength *= change;
+}
+
+void decrease_vibrato_strength(float change) {
+ vibrato_strength /= change;
+}
+
+#endif
+
+// Polyphony functions
+
+void set_polyphony_rate(float rate) {
+ polyphony_rate = rate;
+}
+
+void enable_polyphony() {
+ polyphony_rate = 5;
+}
+
+void disable_polyphony() {
+ polyphony_rate = 0;
+}
+
+void increase_polyphony_rate(float change) {
+ polyphony_rate *= change;
+}
+
+void decrease_polyphony_rate(float change) {
+ polyphony_rate /= change;
+}
+
+// Timbre function
+
+void set_timbre(float timbre) {
+ note_timbre = timbre;
+}
+
+// Tempo functions
+
+void set_tempo(float tempo) {
+ note_tempo = tempo;
+}
+
+void decrease_tempo(uint8_t tempo_change) {
+ note_tempo += (float) tempo_change;
+}
+
+void increase_tempo(uint8_t tempo_change) {
+ if (note_tempo - (float) tempo_change < 10) {
+ note_tempo = 10;
} else {
- double freq = frequencies[voices - 1];
- int vol = volumes[voices - 1];
- double starting_f = frequency;
- if (frequency < freq) {
- sliding = true;
- for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
- frequency = f;
- }
- sliding = false;
- } else if (frequency > freq) {
- sliding = true;
- for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
- frequency = f;
- }
- sliding = false;
- }
- frequency = freq;
- volume = vol;
+ note_tempo -= (float) tempo_change;
}
}
-void init_notes() {
+void audio_init() {
+
+ /* check signature */
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+ audio_config.raw = eeconfig_read_audio();
#ifdef PWM_AUDIO
PLLFRQ = _BV(PDIV2);
@@ -144,7 +195,7 @@ void init_notes() {
DDRC |= _BV(PORTC6);
TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
-
+
TCCR3A = 0x0; // Options not needed
TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
@@ -156,24 +207,103 @@ void init_notes() {
TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
#endif
+
+ inited = true;
}
+void stop_all_notes() {
+ if (!inited) {
+ audio_init();
+ }
+ voices = 0;
+ #ifdef PWM_AUDIO
+ TIMSK3 &= ~_BV(OCIE3A);
+ #else
+ TIMSK3 &= ~_BV(OCIE3A);
+ TCCR3A &= ~_BV(COM3A1);
+ #endif
+ notes = false;
+ note = false;
+ frequency = 0;
+ volume = 0;
-ISR(TIMER3_COMPA_vect) {
+ for (int i = 0; i < 8; i++) {
+ frequencies[i] = 0;
+ volumes[i] = 0;
+ }
+}
+
+void stop_note(double freq) {
+ if (note) {
+ if (!inited) {
+ audio_init();
+ }
+ #ifdef PWM_AUDIO
+ freq = freq / SAMPLE_RATE;
+ #endif
+ for (int i = 7; i >= 0; i--) {
+ if (frequencies[i] == freq) {
+ frequencies[i] = 0;
+ volumes[i] = 0;
+ for (int j = i; (j < 7); j++) {
+ frequencies[j] = frequencies[j+1];
+ frequencies[j+1] = 0;
+ volumes[j] = volumes[j+1];
+ volumes[j+1] = 0;
+ }
+ break;
+ }
+ }
+ voices--;
+ if (voices < 0)
+ voices = 0;
+ if (voice_place >= voices) {
+ voice_place = 0;
+ }
+ if (voices == 0) {
+ #ifdef PWM_AUDIO
+ TIMSK3 &= ~_BV(OCIE3A);
+ #else
+ TIMSK3 &= ~_BV(OCIE3A);
+ TCCR3A &= ~_BV(COM3A1);
+ #endif
+ frequency = 0;
+ volume = 0;
+ note = false;
+ }
+ }
+}
+
+float mod(float a, int b)
+{
+ float r = fmod(a, b);
+ return r < 0 ? r + b : r;
+}
+
+float vibrato(float average_freq) {
+ #ifdef VIBRATO_STRENGTH_ENABLE
+ float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength);
+ #else
+ float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter];
+ #endif
+ vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH);
+ return vibrated_freq;
+}
+ISR(TIMER3_COMPA_vect) {
if (note) {
#ifdef PWM_AUDIO
if (voices == 1) {
// SINE
OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
-
+
// SQUARE
// if (((int)place) >= 1024){
// OCR4A = 0xFF >> 2;
// } else {
// OCR4A = 0x00;
// }
-
+
// SAWTOOTH
// OCR4A = (int)place / 4;
@@ -210,16 +340,37 @@ ISR(TIMER3_COMPA_vect) {
OCR4A = sum;
}
#else
- if (frequency > 0) {
- // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
- // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
- if (place > 10) {
- voice_place = (voice_place + 1) % voices;
- place = 0.0;
+ if (voices > 0) {
+ if (polyphony_rate > 0) {
+ if (voices > 1) {
+ voice_place %= voices;
+ if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) {
+ voice_place = (voice_place + 1) % voices;
+ place = 0.0;
+ }
+ }
+ if (vibrato_strength > 0) {
+ freq = vibrato(frequencies[voice_place]);
+ } else {
+ freq = frequencies[voice_place];
+ }
+ } else {
+ if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) {
+ frequency = frequency * pow(2, 440/frequency/12/2);
+ } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) {
+ frequency = frequency * pow(2, -440/frequency/12/2);
+ } else {
+ frequency = frequencies[voices - 1];
+ }
+
+ if (vibrato_strength > 0) {
+ freq = vibrato(frequency);
+ } else {
+ freq = frequency;
+ }
}
- ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
- OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period
- place++;
+ ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
+ OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
}
#endif
}
@@ -245,16 +396,32 @@ ISR(TIMER3_COMPA_vect) {
place -= SINE_LENGTH;
#else
if (note_frequency > 0) {
- ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period
- OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period
+ float freq;
+
+ if (vibrato_strength > 0) {
+ freq = vibrato(note_frequency);
+ } else {
+ freq = note_frequency;
+ }
+
+ ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period
+ OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period
+ } else {
+ ICR3 = 0;
+ OCR3A = 0;
}
#endif
note_position++;
- if (note_position >= note_length) {
+ bool end_of_note = false;
+ if (ICR3 > 0)
+ end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF));
+ else
+ end_of_note = (note_position >= (note_length * 0x7FF));
+ if (end_of_note) {
current_note++;
- if (current_note >= notes_length) {
+ if (current_note >= notes_count) {
if (notes_repeat) {
current_note = 0;
} else {
@@ -268,37 +435,57 @@ ISR(TIMER3_COMPA_vect) {
return;
}
}
- #ifdef PWM_AUDIO
- note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
- note_length = (*notes_pointer)[current_note][1];
- #else
- note_frequency = (*notes_pointer)[current_note][0];
- note_length = (*notes_pointer)[current_note][1] / 4;
- #endif
+ if (!note_resting && (notes_rest > 0)) {
+ note_resting = true;
+ note_frequency = 0;
+ note_length = notes_rest;
+ current_note--;
+ } else {
+ note_resting = false;
+ #ifdef PWM_AUDIO
+ note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
+ note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
+ #else
+ note_frequency = (*notes_pointer)[current_note][0];
+ note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
+ #endif
+ }
note_position = 0;
}
}
+ if (!audio_config.enable) {
+ notes = false;
+ note = false;
+ }
}
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
+void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest) {
+
+if (audio_config.enable) {
+ TIMSK3 &= ~_BV(OCIE3A);
+ if (!inited) {
+ audio_init();
+ }
+ // Cancel note if a note is playing
if (note)
stop_all_notes();
notes = true;
notes_pointer = np;
- notes_length = n_length;
+ notes_count = n_count;
notes_repeat = n_repeat;
+ notes_rest = n_rest;
place = 0;
current_note = 0;
#ifdef PWM_AUDIO
note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
- note_length = (*notes_pointer)[current_note][1];
+ note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100);
#else
note_frequency = (*notes_pointer)[current_note][0];
- note_length = (*notes_pointer)[current_note][1] / 4;
+ note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100);
#endif
note_position = 0;
@@ -311,7 +498,15 @@ void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
#endif
}
+}
+
void play_sample(uint8_t * s, uint16_t l, bool r) {
+
+if (audio_config.enable) {
+ TIMSK3 &= ~_BV(OCIE3A);
+ if (!inited) {
+ audio_init();
+ }
stop_all_notes();
place_int = 0;
sample = s;
@@ -322,9 +517,19 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
TIMSK3 |= _BV(OCIE3A);
#else
#endif
+
+}
+
}
void play_note(double freq, int vol) {
+
+if (audio_config.enable && voices < 8) {
+ TIMSK3 &= ~_BV(OCIE3A);
+ if (!inited) {
+ audio_init();
+ }
+ // Cancel notes if notes are playing
if (notes)
stop_all_notes();
note = true;
@@ -332,23 +537,8 @@ void play_note(double freq, int vol) {
freq = freq / SAMPLE_RATE;
#endif
if (freq > 0) {
- if (frequency != 0) {
- double starting_f = frequency;
- if (frequency < freq) {
- for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
- frequency = f;
- }
- } else if (frequency > freq) {
- for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
- frequency = f;
- }
- }
- }
- frequency = freq;
- volume = vol;
-
- frequencies[voices] = frequency;
- volumes[voices] = volume;
+ frequencies[voices] = freq;
+ volumes[voices] = vol;
voices++;
}
@@ -358,5 +548,23 @@ void play_note(double freq, int vol) {
TIMSK3 |= _BV(OCIE3A);
TCCR3A |= _BV(COM3A1);
#endif
+}
+
+}
+
+//------------------------------------------------------------------------------
+// Override these functions in your keymap file to play different tunes on
+// startup and bootloader jump
+__attribute__ ((weak))
+void play_startup_tone()
+{
+}
+
+
-} \ No newline at end of file
+__attribute__ ((weak))
+void play_goodbye_tone()
+{
+
+}
+//------------------------------------------------------------------------------
diff --git a/quantum/audio.h b/quantum/audio.h
index 99203cea7..0fe3eac9a 100644
--- a/quantum/audio.h
+++ b/quantum/audio.h
@@ -2,10 +2,74 @@
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
+#include "musical_notes.h"
+#include "song_list.h"
+
+#ifndef AUDIO_H
+#define AUDIO_H
+
+// Enable vibrato strength/amplitude - slows down ISR too much
+// #define VIBRATO_STRENGTH_ENABLE
+
+typedef union {
+ uint8_t raw;
+ struct {
+ bool enable :1;
+ uint8_t level :7;
+ };
+} audio_config_t;
+
+void audio_toggle(void);
+void audio_on(void);
+void audio_off(void);
+
+// Vibrato rate functions
+
+void set_vibrato_rate(float rate);
+void increase_vibrato_rate(float change);
+void decrease_vibrato_rate(float change);
+
+#ifdef VIBRATO_STRENGTH_ENABLE
+
+void set_vibrato_strength(float strength);
+void increase_vibrato_strength(float change);
+void decrease_vibrato_strength(float change);
+
+#endif
+
+// Polyphony functions
+
+void set_polyphony_rate(float rate);
+void enable_polyphony();
+void disable_polyphony();
+void increase_polyphony_rate(float change);
+void decrease_polyphony_rate(float change);
+
+void set_timbre(float timbre);
+void set_tempo(float tempo);
+
+void increase_tempo(uint8_t tempo_change);
+void decrease_tempo(uint8_t tempo_change);
void play_sample(uint8_t * s, uint16_t l, bool r);
void play_note(double freq, int vol);
void stop_note(double freq);
-void stop_all_notes();
-void init_notes();
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); \ No newline at end of file
+void stop_all_notes(void);
+void play_notes(float (*np)[][2], uint8_t n_count, bool n_repeat, float n_rest);
+
+#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
+ 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
+ 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
+ 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
+ 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
+
+// These macros are used to allow play_notes to play an array of indeterminate
+// length. This works around the limitation of C's sizeof operation on pointers.
+// The global float array for the song must be used here.
+#define NOTE_ARRAY_SIZE(x) ((int)(sizeof(x) / (sizeof(x[0]))))
+#define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style));
+
+void play_goodbye_tone(void);
+void play_startup_tone(void);
+
+#endif \ No newline at end of file
diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c
index 7068ca4f3..43debf4ef 100644
--- a/quantum/keymap_common.c
+++ b/quantum/keymap_common.c
@@ -25,141 +25,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "debug.h"
#include "backlight.h"
#include "keymap_midi.h"
+#include "bootloader.h"
+#include "eeconfig.h"
+
+extern keymap_config_t keymap_config;
#include <stdio.h>
#include <inttypes.h>
#ifdef AUDIO_ENABLE
#include "audio.h"
-
- float goodbye[][2] = {
- {440.0*pow(2.0,(67)/12.0), 400},
- {0, 50},
- {440.0*pow(2.0,(60)/12.0), 400},
- {0, 50},
- {440.0*pow(2.0,(55)/12.0), 600},
- };
-#endif
+#endif /* AUDIO_ENABLE */
static action_t keycode_to_action(uint16_t keycode);
/* converts key to action */
action_t action_for_key(uint8_t layer, keypos_t key)
{
- // 16bit keycodes - important
+ // 16bit keycodes - important
uint16_t keycode = keymap_key_to_keycode(layer, key);
- if (keycode >= 0x0100 && keycode < 0x2000) {
- // Has a modifier
- action_t action;
- // Split it up
- action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
- return action;
- } else if (keycode >= 0x2000 && keycode < 0x3000) {
- // Is a shortcut for function layer, pull last 12bits
- // This means we have 4,096 FN macros at our disposal
- return keymap_func_to_action(keycode & 0xFFF);
- } else if (keycode >= 0x3000 && keycode < 0x4000) {
- // When the code starts with 3, it's an action macro.
- action_t action;
- action.code = ACTION_MACRO(keycode & 0xFF);
- return action;
-#ifdef BACKLIGHT_ENABLE
- } else if (keycode >= BL_0 && keycode <= BL_15) {
- action_t action;
- action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
- return action;
- } else if (keycode == BL_DEC) {
- action_t action;
- action.code = ACTION_BACKLIGHT_DECREASE();
- return action;
- } else if (keycode == BL_INC) {
- action_t action;
- action.code = ACTION_BACKLIGHT_INCREASE();
- return action;
- } else if (keycode == BL_TOGG) {
- action_t action;
- action.code = ACTION_BACKLIGHT_TOGGLE();
- return action;
- } else if (keycode == BL_STEP) {
- action_t action;
- action.code = ACTION_BACKLIGHT_STEP();
- return action;
-#endif
- } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
- clear_keyboard();
- #ifdef AUDIO_ENABLE
- play_notes(&goodbye, 5, false);
- #endif
- _delay_ms(250);
- #ifdef ATREUS_ASTAR
- *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
- #endif
- bootloader_jump();
- return;
- } else if (keycode == DEBUG) { // DEBUG is 0x5001
- // TODO: Does this actually work?
- print("\nDEBUG: enabled.\n");
- debug_enable = true;
- return;
- } else if (keycode >= 0x5000 && keycode < 0x6000) {
- // Layer movement shortcuts
- // See .h to see constraints/usage
- int type = (keycode >> 0x8) & 0xF;
- if (type == 0x1) {
- // Layer set "GOTO"
- int when = (keycode >> 0x4) & 0x3;
- int layer = keycode & 0xF;
- action_t action;
- action.code = ACTION_LAYER_SET(layer, when);
- return action;
- } else if (type == 0x2) {
- // Momentary layer
- int layer = keycode & 0xFF;
- action_t action;
- action.code = ACTION_LAYER_MOMENTARY(layer);
- return action;
- } else if (type == 0x3) {
- // Set default layer
- int layer = keycode & 0xFF;
- action_t action;
- action.code = ACTION_DEFAULT_LAYER_SET(layer);
- return action;
- } else if (type == 0x4) {
- // Set default layer
- int layer = keycode & 0xFF;
- action_t action;
- action.code = ACTION_LAYER_TOGGLE(layer);
- return action;
- }
-#ifdef MIDI_ENABLE
- } else if (keycode >= 0x6000 && keycode < 0x7000) {
- action_t action;
- action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
- return action;
-#endif
- } else if (keycode >= 0x7000 && keycode < 0x8000) {
- action_t action;
- action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
- return action;
- } else if (keycode >= 0x8000 && keycode < 0x9000) {
- action_t action;
- action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
- return action;
-#ifdef UNICODE_ENABLE
- } else if (keycode >= 0x8000000) {
- action_t action;
- uint16_t unicode = keycode & ~(0x8000);
- action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
- return action;
-#endif
- } else {
-
- }
-
switch (keycode) {
case KC_FN0 ... KC_FN31:
return keymap_fn_to_action(keycode);
-#ifdef BOOTMAGIC_ENABLE
case KC_CAPSLOCK:
case KC_LOCKING_CAPS:
if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
@@ -223,7 +110,6 @@ action_t action_for_key(uint8_t layer, keypos_t key)
return keycode_to_action(KC_BSLASH);
}
return keycode_to_action(KC_BSPACE);
-#endif
default:
return keycode_to_action(keycode);
}
@@ -264,6 +150,143 @@ static action_t keycode_to_action(uint16_t keycode)
case KC_TRNS:
action.code = ACTION_TRANSPARENT;
break;
+ case 0x0100 ... 0x1FFF: ;
+ // Has a modifier
+ // Split it up
+ action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key
+ break;
+ case 0x2000 ... 0x2FFF:
+ // Is a shortcut for function layer, pull last 12bits
+ // This means we have 4,096 FN macros at our disposal
+ return keymap_func_to_action(keycode & 0xFFF);
+ break;
+ case 0x3000 ... 0x3FFF: ;
+ // When the code starts with 3, it's an action macro.
+ action.code = ACTION_MACRO(keycode & 0xFF);
+ break;
+ #ifdef BACKLIGHT_ENABLE
+ case BL_0 ... BL_15:
+ action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F);
+ break;
+ case BL_DEC:
+ action.code = ACTION_BACKLIGHT_DECREASE();
+ break;
+ case BL_INC:
+ action.code = ACTION_BACKLIGHT_INCREASE();
+ break;
+ case BL_TOGG:
+ action.code = ACTION_BACKLIGHT_TOGGLE();
+ break;
+ case BL_STEP:
+ action.code = ACTION_BACKLIGHT_STEP();
+ break;
+ #endif
+ case RESET: ; // RESET is 0x5000, which is why this is here
+ clear_keyboard();
+ #ifdef AUDIO_ENABLE
+ stop_all_notes();
+ play_goodbye_tone();
+ #endif
+ _delay_ms(250);
+ #ifdef ATREUS_ASTAR
+ *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
+ #endif
+ bootloader_jump();
+ break;
+ case DEBUG: ; // DEBUG is 0x5001
+ print("\nDEBUG: enabled.\n");
+ debug_enable = true;
+ break;
+ case 0x5002 ... 0x50FF:
+ // MAGIC actions (BOOTMAGIC without the boot)
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+ /* keymap config */
+ keymap_config.raw = eeconfig_read_keymap();
+ if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) {
+ keymap_config.swap_control_capslock = 1;
+ } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) {
+ keymap_config.capslock_to_control = 1;
+ } else if (keycode == MAGIC_SWAP_LALT_LGUI) {
+ keymap_config.swap_lalt_lgui = 1;
+ } else if (keycode == MAGIC_SWAP_RALT_RGUI) {
+ keymap_config.swap_ralt_rgui = 1;
+ } else if (keycode == MAGIC_NO_GUI) {
+ keymap_config.no_gui = 1;
+ } else if (keycode == MAGIC_SWAP_GRAVE_ESC) {
+ keymap_config.swap_grave_esc = 1;
+ } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) {
+ keymap_config.swap_backslash_backspace = 1;
+ } else if (keycode == MAGIC_HOST_NKRO) {
+ keymap_config.nkro = 1;
+ } else if (keycode == MAGIC_SWAP_ALT_GUI) {
+ keymap_config.swap_lalt_lgui = 1;
+ keymap_config.swap_ralt_rgui = 1;
+ }
+ /* UNs */
+ else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) {
+ keymap_config.swap_control_capslock = 0;
+ } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) {
+ keymap_config.capslock_to_control = 0;
+ } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) {
+ keymap_config.swap_lalt_lgui = 0;
+ } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) {
+ keymap_config.swap_ralt_rgui = 0;
+ } else if (keycode == MAGIC_UNNO_GUI) {
+ keymap_config.no_gui = 0;
+ } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) {
+ keymap_config.swap_grave_esc = 0;
+ } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) {
+ keymap_config.swap_backslash_backspace = 0;
+ } else if (keycode == MAGIC_UNHOST_NKRO) {
+ keymap_config.nkro = 0;
+ } else if (keycode == MAGIC_UNSWAP_ALT_GUI) {
+ keymap_config.swap_lalt_lgui = 0;
+ keymap_config.swap_ralt_rgui = 0;
+ }
+ eeconfig_write_keymap(keymap_config.raw);
+ break;
+ case 0x5100 ... 0x5FFF: ;
+ // Layer movement shortcuts
+ // See .h to see constraints/usage
+ int type = (keycode >> 0x8) & 0xF;
+ if (type == 0x1) {
+ // Layer set "GOTO"
+ int when = (keycode >> 0x4) & 0x3;
+ int layer = keycode & 0xF;
+ action.code = ACTION_LAYER_SET(layer, when);
+ } else if (type == 0x2) {
+ // Momentary layer
+ int layer = keycode & 0xFF;
+ action.code = ACTION_LAYER_MOMENTARY(layer);
+ } else if (type == 0x3) {
+ // Set default layer
+ int layer = keycode & 0xFF;
+ action.code = ACTION_DEFAULT_LAYER_SET(layer);
+ } else if (type == 0x4) {
+ // Set default layer
+ int layer = keycode & 0xFF;
+ action.code = ACTION_LAYER_TOGGLE(layer);
+ }
+ break;
+ #ifdef MIDI_ENABLE
+ case 0x6000 ... 0x6FFF:
+ action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
+ break;
+ #endif
+ case 0x7000 ... 0x7FFF:
+ action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
+ break;
+ case 0x8000 ... 0x8FFF:
+ action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
+ break;
+ #ifdef UNICODE_ENABLE
+ case 0x8000000 ... 0x8FFFFFF:
+ uint16_t unicode = keycode & ~(0x8000);
+ action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8);
+ break;
+ #endif
default:
action.code = ACTION_NO;
break;
@@ -275,7 +298,7 @@ static action_t keycode_to_action(uint16_t keycode)
/* translates key to keycode */
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
- // Read entire word (16bits)
+ // Read entire word (16bits)
return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]);
}
@@ -287,6 +310,14 @@ action_t keymap_fn_to_action(uint16_t keycode)
action_t keymap_func_to_action(uint16_t keycode)
{
- // For FUNC without 8bit limit
+ // For FUNC without 8bit limit
return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
}
+
+void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+ if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
+ layer_on(layer3);
+ } else {
+ layer_off(layer3);
+ }
+}
diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h
index 3db40772e..ce87e4770 100644
--- a/quantum/keymap_common.h
+++ b/quantum/keymap_common.h
@@ -30,7 +30,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #include "print.h"
#include "debug.h"
-#ifdef BOOTMAGIC_ENABLE
/* NOTE: Not portable. Bit field order depends on implementation */
typedef union {
uint16_t raw;
@@ -45,8 +44,6 @@ typedef union {
bool nkro:1;
};
} keymap_config_t;
-keymap_config_t keymap_config;
-#endif
/* translates key to keycode */
@@ -168,6 +165,30 @@ extern const uint16_t fn_actions[];
#define RESET 0x5000
#define DEBUG 0x5001
+// MAGIC keycodes
+#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002
+#define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003
+#define MAGIC_CAPSLOCK_TO_CONTROL 0x5004
+#define MAGIC_UNCAPSLOCK_TO_CONTROL 0x5005
+#define MAGIC_SWAP_LALT_LGUI 0x5006
+#define MAGIC_UNSWAP_LALT_LGUI 0x5007
+#define MAGIC_SWAP_RALT_RGUI 0x5008
+#define MAGIC_UNSWAP_RALT_RGUI 0x5009
+#define MAGIC_NO_GUI 0x500a
+#define MAGIC_UNNO_GUI 0x500b
+#define MAGIC_SWAP_GRAVE_ESC 0x500c
+#define MAGIC_UNSWAP_GRAVE_ESC 0x500d
+#define MAGIC_SWAP_BACKSLASH_BACKSPACE 0x500e
+#define MAGIC_UNSWAP_BACKSLASH_BACKSPACE 0x500f
+#define MAGIC_HOST_NKRO 0x5010
+#define MAGIC_UNHOST_NKRO 0x5011
+#define MAGIC_SWAP_ALT_GUI 0x5012
+#define MAGIC_UNSWAP_ALT_GUI 0x5013
+
+#define AG_SWAP MAGIC_SWAP_ALT_GUI
+#define AG_NORM MAGIC_UNSWAP_ALT_GUI
+
+
// GOTO layer - 16 layers max
// when:
// ON_PRESS = 1
@@ -184,8 +205,6 @@ extern const uint16_t fn_actions[];
// Toggle to layer - 256 layer max
#define TG(layer) (layer | 0x5400)
-#define MIDI(n) (n | 0x6000)
-
// M-od, T-ap - 256 keycode max
#define MT(mod, kc) (kc | 0x7000 | ((mod & 0xF) << 8))
#define CTL_T(kc) MT(0x1, kc)
@@ -210,5 +229,10 @@ extern const uint16_t fn_actions[];
#define UNICODE(n) (n | 0x8000)
#define UC(n) UNICODE(n)
+// For tri-layer
+void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
+#define IS_LAYER_ON(layer) ((layer_state) & (1UL<<(layer)))
+#define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer)))
+
#endif
diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h
index da91b4bf4..d0b77fb80 100644
--- a/quantum/keymap_extras/keymap_german_osx.h
+++ b/quantum/keymap_extras/keymap_german_osx.h
@@ -9,92 +9,92 @@
// Alt gr
// normal characters
-#define DE_Z KC_Y
-#define DE_Y KC_Z
+#define DE_OSX_Z KC_Y
+#define DE_OSX_Y KC_Z
-#define DE_A KC_A
-#define DE_B KC_B
-#define DE_C KC_C
-#define DE_D KC_D
-#define DE_E KC_E
-#define DE_F KC_F
-#define DE_G KC_G
-#define DE_H KC_H
-#define DE_I KC_I
-#define DE_J KC_J
-#define DE_K KC_K
-#define DE_L KC_L
-#define DE_M KC_M
-#define DE_N KC_N
-#define DE_O KC_O
-#define DE_P KC_P
-#define DE_Q KC_Q
-#define DE_R KC_R
-#define DE_S KC_S
-#define DE_T KC_T
-#define DE_U KC_U
-#define DE_V KC_V
-#define DE_W KC_W
-#define DE_X KC_X
+#define DE_OSX_A KC_A
+#define DE_OSX_B KC_B
+#define DE_OSX_C KC_C
+#define DE_OSX_D KC_D
+#define DE_OSX_E KC_E
+#define DE_OSX_F KC_F
+#define DE_OSX_G KC_G
+#define DE_OSX_H KC_H
+#define DE_OSX_I KC_I
+#define DE_OSX_J KC_J
+#define DE_OSX_K KC_K
+#define DE_OSX_L KC_L
+#define DE_OSX_M KC_M
+#define DE_OSX_N KC_N
+#define DE_OSX_O KC_O
+#define DE_OSX_P KC_P
+#define DE_OSX_Q KC_Q
+#define DE_OSX_R KC_R
+#define DE_OSX_S KC_S
+#define DE_OSX_T KC_T
+#define DE_OSX_U KC_U
+#define DE_OSX_V KC_V
+#define DE_OSX_W KC_W
+#define DE_OSX_X KC_X
-#define DE_0 KC_0
-#define DE_1 KC_1
-#define DE_2 KC_2
-#define DE_3 KC_3
-#define DE_4 KC_4
-#define DE_5 KC_5
-#define DE_6 KC_6
-#define DE_7 KC_7
-#define DE_8 KC_8
-#define DE_9 KC_9
+#define DE_OSX_0 KC_0
+#define DE_OSX_1 KC_1
+#define DE_OSX_2 KC_2
+#define DE_OSX_3 KC_3
+#define DE_OSX_4 KC_4
+#define DE_OSX_5 KC_5
+#define DE_OSX_6 KC_6
+#define DE_OSX_7 KC_7
+#define DE_OSX_8 KC_8
+#define DE_OSX_9 KC_9
-#define DE_DOT KC_DOT
-#define DE_COMM KC_COMM
+#define DE_OSX_DOT KC_DOT
+#define DE_OSX_COMM KC_COMM
-#define DE_SS KC_MINS
-#define DE_AE KC_QUOT
-#define DE_UE KC_LBRC
-#define DE_OE KC_SCLN
+#define DE_OSX_SS KC_MINS
+#define DE_OSX_AE KC_QUOT
+#define DE_OSX_UE KC_LBRC
+#define DE_OSX_OE KC_SCLN
-#define DE_CIRC KC_NUBS // accent circumflex ^ and ring °
-#define DE_ACUT KC_EQL // accent acute ´ and grave `
-#define DE_PLUS KC_RBRC // + and * and ~
-#define DE_HASH KC_BSLS // # and '
-#define DE_LESS KC_GRV // < and > and |
-#define DE_MINS KC_SLSH // - and _
+#define DE_OSX_CIRC KC_NUBS // accent circumflex ^ and ring °
+#define DE_OSX_ACUT KC_EQL // accent acute ´ and grave `
+#define DE_OSX_PLUS KC_RBRC // + and * and ~
+#define DE_OSX_HASH KC_BSLS // # and '
+#define DE_OSX_LESS KC_GRV // < and > and |
+#define DE_OSX_MINS KC_SLSH // - and _
// shifted characters
-#define DE_RING LSFT(DE_CIRC) // °
-#define DE_EXLM LSFT(KC_1) // !
-#define DE_DQOT LSFT(KC_2) // "
-#define DE_PARA LSFT(KC_3) // §
-#define DE_DLR LSFT(KC_4) // $
-#define DE_PERC LSFT(KC_5) // %
-#define DE_AMPR LSFT(KC_6) // &
-#define DE_SLSH LSFT(KC_7) // /
-#define DE_LPRN LSFT(KC_8) // (
-#define DE_RPRN LSFT(KC_9) // )
-#define DE_EQL LSFT(KC_0) // =
-#define DE_QST LSFT(DE_SS) // ?
-#define DE_GRV LSFT(DE_ACUT) // `
-#define DE_ASTR LSFT(DE_PLUS) // *
-#define DE_QUOT LSFT(DE_HASH) // '
-#define DE_MORE LSFT(DE_LESS) // >
-#define DE_COLN LSFT(KC_DOT) // :
-#define DE_SCLN LSFT(KC_COMM) // ;
-#define DE_UNDS LSFT(DE_MINS) // _
+#define DE_OSX_RING LSFT(DE_OSX_CIRC) // °
+#define DE_OSX_EXLM LSFT(KC_1) // !
+#define DE_OSX_DQOT LSFT(KC_2) // "
+#define DE_OSX_PARA LSFT(KC_3) // §
+#define DE_OSX_DLR LSFT(KC_4) // $
+#define DE_OSX_PERC LSFT(KC_5) // %
+#define DE_OSX_AMPR LSFT(KC_6) // &
+#define DE_OSX_SLSH LSFT(KC_7) // /
+#define DE_OSX_LPRN LSFT(KC_8) // (
+#define DE_OSX_RPRN LSFT(KC_9) // )
+#define DE_OSX_EQL LSFT(KC_0) // =
+#define DE_OSX_QST LSFT(DE_OSX_SS) // ?
+#define DE_OSX_GRV LSFT(DE_OSX_ACUT) // `
+#define DE_OSX_ASTR LSFT(DE_OSX_PLUS) // *
+#define DE_OSX_QUOT LSFT(DE_OSX_HASH) // '
+#define DE_OSX_MORE LSFT(DE_OSX_LESS) // >
+#define DE_OSX_COLN LSFT(KC_DOT) // :
+#define DE_OSX_SCLN LSFT(KC_COMM) // ;
+#define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _
// Alt-ed characters
-#define DE_SQ2 LALT(KC_2) // ²
-#define DE_SQ3 LALT(KC_3) // ³
-#define DE_LCBR LALT(KC_8) // {
-#define DE_LBRC LALT(KC_5) // [
-#define DE_RBRC LALT(KC_6) // ]
-#define DE_RCBR LALT(KC_9) // }
-#define DE_BSLS LALT(LSFT(KC_7)) // backslash
-#define DE_AT LALT(DE_L) // @
-#define DE_EURO LALT(KC_E) // €
-#define DE_TILD LALT(DE_N) // ~
-#define DE_PIPE LALT(DE_7) // |
+#define DE_OSX_SQ2 LALT(KC_2) // ²
+#define DE_OSX_SQ3 LALT(KC_3) // ³
+#define DE_OSX_LCBR LALT(KC_8) // {
+#define DE_OSX_LBRC LALT(KC_5) // [
+#define DE_OSX_RBRC LALT(KC_6) // ]
+#define DE_OSX_RCBR LALT(KC_9) // }
+#define DE_OSX_BSLS LALT(LSFT(KC_7)) // backslash
+#define DE_OSX_AT LALT(DE_OSX_L) // @
+#define DE_OSX_EURO LALT(KC_E) // €
+#define DE_OSX_TILD LALT(DE_OSX_N) // ~
+#define DE_OSX_PIPE LALT(DE_OSX_7) // |
#endif
diff --git a/quantum/keymap_midi.c b/quantum/keymap_midi.c
index e37ea3103..ac45d2589 100644
--- a/quantum/keymap_midi.c
+++ b/quantum/keymap_midi.c
@@ -99,11 +99,11 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.pressed) {
// midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
- midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+ // midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
// midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
- midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+ // midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
} \ No newline at end of file
diff --git a/quantum/keymap_midi.h b/quantum/keymap_midi.h
index a89420ce2..795f26380 100644
--- a/quantum/keymap_midi.h
+++ b/quantum/keymap_midi.h
@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <lufa.h>
-#define MIDI 0x6000
+#define MIDI(n) ((n) | 0x6000)
#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000
#define CHNL(note, channel) (note + (channel << 8))
diff --git a/quantum/led.c b/quantum/led.c
index 9cdb8a5c2..208e348f3 100644
--- a/quantum/led.c
+++ b/quantum/led.c
@@ -24,6 +24,7 @@ void led_set_kb(uint8_t usb_led) {
}
+__attribute__ ((weak))
void led_set(uint8_t usb_led)
{
diff --git a/quantum/musical_notes.h b/quantum/musical_notes.h
new file mode 100644
index 000000000..b08d16a6f
--- /dev/null
+++ b/quantum/musical_notes.h
@@ -0,0 +1,217 @@
+#ifndef MUSICAL_NOTES_H
+#define MUSICAL_NOTES_H
+
+// Tempo Placeholder
+#define TEMPO_DEFAULT 100
+
+
+#define SONG(notes...) { notes }
+
+
+// Note Types
+#define MUSICAL_NOTE(note, duration) {(NOTE##note), duration}
+#define WHOLE_NOTE(note) MUSICAL_NOTE(note, 64)
+#define HALF_NOTE(note) MUSICAL_NOTE(note, 32)
+#define QUARTER_NOTE(note) MUSICAL_NOTE(note, 16)
+#define EIGHTH_NOTE(note) MUSICAL_NOTE(note, 8)
+#define SIXTEENTH_NOTE(note) MUSICAL_NOTE(note, 4)
+
+#define WHOLE_DOT_NOTE(note) MUSICAL_NOTE(note, 64+32)
+#define HALF_DOT_NOTE(note) MUSICAL_NOTE(note, 32+16)
+#define QUARTER_DOT_NOTE(note) MUSICAL_NOTE(note, 16+8)
+#define EIGHTH_DOT_NOTE(note) MUSICAL_NOTE(note, 8+4)
+#define SIXTEENTH_DOT_NOTE(note) MUSICAL_NOTE(note, 4+2)
+
+// Note Type Shortcuts
+#define M__NOTE(note, duration) MUSICAL_NOTE(note, duration)
+#define W__NOTE(n) WHOLE_NOTE(n)
+#define H__NOTE(n) HALF_NOTE(n)
+#define Q__NOTE(n) QUARTER_NOTE(n)
+#define E__NOTE(n) EIGHTH_NOTE(n)
+#define S__NOTE(n) SIXTEENTH_NOTE(n)
+#define WD_NOTE(n) WHOLE_DOT_NOTE(n)
+#define HD_NOTE(n) HALF_DOT_NOTE(n)
+#define QD_NOTE(n) QUARTER_DOT_NOTE(n)
+#define ED_NOTE(n) EIGHTH_DOT_NOTE(n)
+#define SD_NOTE(n) SIXTEENTH_DOT_NOTE(n)
+
+// Note Styles
+// Staccato makes sure there is a rest between each note. Think: TA TA TA
+// Legato makes notes flow together. Think: TAAA
+#define STACCATO 0.01
+#define LEGATO 0
+
+// Note Timbre
+// Changes how the notes sound
+#define TIMBRE_12 0.125
+#define TIMBRE_25 0.250
+#define TIMBRE_50 0.500
+#define TIMBRE_75 0.750
+#define TIMBRE_DEFAULT TIMBRE_50
+
+
+// Notes - # = Octave
+
+#define NOTE_REST 0.00
+
+/* These notes are currently bugged
+#define NOTE_C0 16.35
+#define NOTE_CS0 17.32
+#define NOTE_D0 18.35
+#define NOTE_DS0 19.45
+#define NOTE_E0 20.60
+#define NOTE_F0 21.83
+#define NOTE_FS0 23.12
+#define NOTE_G0 24.50
+#define NOTE_GS0 25.96
+#define NOTE_A0 27.50
+#define NOTE_AS0 29.14
+#define NOTE_B0 30.87
+#define NOTE_C1 32.70
+#define NOTE_CS1 34.65
+#define NOTE_D1 36.71
+#define NOTE_DS1 38.89
+#define NOTE_E1 41.20
+#define NOTE_F1 43.65
+#define NOTE_FS1 46.25
+#define NOTE_G1 49.00
+#define NOTE_GS1 51.91
+#define NOTE_A1 55.00
+#define NOTE_AS1 58.27
+*/
+
+#define NOTE_B1 61.74
+#define NOTE_C2 65.41
+#define NOTE_CS2 69.30
+#define NOTE_D2 73.42
+#define NOTE_DS2 77.78
+#define NOTE_E2 82.41
+#define NOTE_F2 87.31
+#define NOTE_FS2 92.50
+#define NOTE_G2 98.00
+#define NOTE_GS2 103.83
+#define NOTE_A2 110.00
+#define NOTE_AS2 116.54
+#define NOTE_B2 123.47
+#define NOTE_C3 130.81
+#define NOTE_CS3 138.59
+#define NOTE_D3 146.83
+#define NOTE_DS3 155.56
+#define NOTE_E3 164.81
+#define NOTE_F3 174.61
+#define NOTE_FS3 185.00
+#define NOTE_G3 196.00
+#define NOTE_GS3 207.65
+#define NOTE_A3 220.00
+#define NOTE_AS3 233.08
+#define NOTE_B3 246.94
+#define NOTE_C4 261.63
+#define NOTE_CS4 277.18
+#define NOTE_D4 293.66
+#define NOTE_DS4 311.13
+#define NOTE_E4 329.63
+#define NOTE_F4 349.23
+#define NOTE_FS4 369.99
+#define NOTE_G4 392.00
+#define NOTE_GS4 415.30
+#define NOTE_A4 440.00
+#define NOTE_AS4 466.16
+#define NOTE_B4 493.88
+#define NOTE_C5 523.25
+#define NOTE_CS5 554.37
+#define NOTE_D5 587.33
+#define NOTE_DS5 622.25
+#define NOTE_E5 659.26
+#define NOTE_F5 698.46
+#define NOTE_FS5 739.99
+#define NOTE_G5 783.99
+#define NOTE_GS5 830.61
+#define NOTE_A5 880.00
+#define NOTE_AS5 932.33
+#define NOTE_B5 987.77
+#define NOTE_C6 1046.50
+#define NOTE_CS6 1108.73
+#define NOTE_D6 1174.66
+#define NOTE_DS6 1244.51
+#define NOTE_E6 1318.51
+#define NOTE_F6 1396.91
+#define NOTE_FS6 1479.98
+#define NOTE_G6 1567.98
+#define NOTE_GS6 1661.22
+#define NOTE_A6 1760.00
+#define NOTE_AS6 1864.66
+#define NOTE_B6 1975.53
+#define NOTE_C7 2093.00
+#define NOTE_CS7 2217.46
+#define NOTE_D7 2349.32
+#define NOTE_DS7 2489.02
+#define NOTE_E7 2637.02
+#define NOTE_F7 2793.83
+#define NOTE_FS7 2959.96
+#define NOTE_G7 3135.96
+#define NOTE_GS7 3322.44
+#define NOTE_A7 3520.00
+#define NOTE_AS7 3729.31
+#define NOTE_B7 3951.07
+#define NOTE_C8 4186.01
+#define NOTE_CS8 4434.92
+#define NOTE_D8 4698.64
+#define NOTE_DS8 4978.03
+#define NOTE_E8 5274.04
+#define NOTE_F8 5587.65
+#define NOTE_FS8 5919.91
+#define NOTE_G8 6271.93
+#define NOTE_GS8 6644.88
+#define NOTE_A8 7040.00
+#define NOTE_AS8 7458.62
+#define NOTE_B8 7902.13
+
+// Flat Aliases
+#define NOTE_DF0 NOTE_CS0
+#define NOTE_EF0 NOTE_DS0
+#define NOTE_GF0 NOTE_FS0
+#define NOTE_AF0 NOTE_GS0
+#define NOTE_BF0 NOTE_AS0
+#define NOTE_DF1 NOTE_CS1
+#define NOTE_EF1 NOTE_DS1
+#define NOTE_GF1 NOTE_FS1
+#define NOTE_AF1 NOTE_GS1
+#define NOTE_BF1 NOTE_AS1
+#define NOTE_DF2 NOTE_CS2
+#define NOTE_EF2 NOTE_DS2
+#define NOTE_GF2 NOTE_FS2
+#define NOTE_AF2 NOTE_GS2
+#define NOTE_BF2 NOTE_AS2
+#define NOTE_DF3 NOTE_CS3
+#define NOTE_EF3 NOTE_DS3
+#define NOTE_GF3 NOTE_FS3
+#define NOTE_AF3 NOTE_GS3
+#define NOTE_BF3 NOTE_AS3
+#define NOTE_DF4 NOTE_CS4
+#define NOTE_EF4 NOTE_DS4
+#define NOTE_GF4 NOTE_FS4
+#define NOTE_AF4 NOTE_GS4
+#define NOTE_BF4 NOTE_AS4
+#define NOTE_DF5 NOTE_CS5
+#define NOTE_EF5 NOTE_DS5
+#define NOTE_GF5 NOTE_FS5
+#define NOTE_AF5 NOTE_GS5
+#define NOTE_BF5 NOTE_AS5
+#define NOTE_DF6 NOTE_CS6
+#define NOTE_EF6 NOTE_DS6
+#define NOTE_GF6 NOTE_FS6
+#define NOTE_AF6 NOTE_GS6
+#define NOTE_BF6 NOTE_AS6
+#define NOTE_DF7 NOTE_CS7
+#define NOTE_EF7 NOTE_DS7
+#define NOTE_GF7 NOTE_FS7
+#define NOTE_AF7 NOTE_GS7
+#define NOTE_BF7 NOTE_AS7
+#define NOTE_DF8 NOTE_CS8
+#define NOTE_EF8 NOTE_DS8
+#define NOTE_GF8 NOTE_FS8
+#define NOTE_AF8 NOTE_GS8
+#define NOTE_BF8 NOTE_AS8
+
+
+#endif \ No newline at end of file
diff --git a/quantum/quantum.mk b/quantum/quantum.mk
index de93af7e8..1fe7390eb 100644
--- a/quantum/quantum.mk
+++ b/quantum/quantum.mk
@@ -23,19 +23,19 @@ ifndef CUSTOM_MATRIX
SRC += $(QUANTUM_DIR)/matrix.c
endif
-ifdef MIDI_ENABLE
+ifeq ($(strip $(MIDI_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/keymap_midi.c
endif
-ifdef AUDIO_ENABLE
+ifeq ($(strip $(AUDIO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/audio.c
endif
-ifdef UNICODE_ENABLE
+ifeq ($(strip $(UNICODE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/keymap_unicode.c
endif
-ifdef RGBLIGHT_ENABLE
+ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/light_ws2812.c
SRC += $(QUANTUM_DIR)/rgblight.c
OPT_DEFS += -DRGBLIGHT_ENABLE
@@ -46,6 +46,7 @@ endif
# Search Path
VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
+VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras
include $(TMK_DIR)/protocol/lufa.mk
diff --git a/quantum/song_list.h b/quantum/song_list.h
new file mode 100644
index 000000000..e992bd18a
--- /dev/null
+++ b/quantum/song_list.h
@@ -0,0 +1,101 @@
+#include "musical_notes.h"
+
+#ifndef SONG_LIST_H
+#define SONG_LIST_H
+
+#define ODE_TO_JOY \
+ Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \
+ Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \
+ Q__NOTE(_C4), Q__NOTE(_C4), Q__NOTE(_D4), Q__NOTE(_E4), \
+ QD_NOTE(_E4), E__NOTE(_D4), H__NOTE(_D4),
+
+#define ROCK_A_BYE_BABY \
+ QD_NOTE(_B4), E__NOTE(_D4), Q__NOTE(_B5), \
+ H__NOTE(_A5), Q__NOTE(_G5), \
+ QD_NOTE(_B4), E__NOTE(_D5), Q__NOTE(_G5), \
+ H__NOTE(_FS5),
+
+#define CLOSE_ENCOUNTERS_5_NOTE \
+ Q__NOTE(_D5), \
+ Q__NOTE(_E5), \
+ Q__NOTE(_C5), \
+ Q__NOTE(_C4), \
+ Q__NOTE(_G4),
+
+#define DOE_A_DEER \
+ QD_NOTE(_C4), E__NOTE(_D4), \
+ QD_NOTE(_E4), E__NOTE(_C4), \
+ Q__NOTE(_E4), Q__NOTE(_C4), \
+ Q__NOTE(_E4),
+
+#define GOODBYE_SOUND \
+ E__NOTE(_E7), \
+ E__NOTE(_A6), \
+ ED_NOTE(_E6),
+
+#define STARTUP_SOUND \
+ ED_NOTE(_E7 ), \
+ E__NOTE(_CS7), \
+ E__NOTE(_E6 ), \
+ E__NOTE(_A6 ), \
+ M__NOTE(_CS7, 20),
+
+#define QWERTY_SOUND \
+ E__NOTE(_GS6 ), \
+ E__NOTE(_A6 ), \
+ S__NOTE(_REST), \
+ Q__NOTE(_E7 ),
+
+#define COLEMAK_SOUND \
+ E__NOTE(_GS6 ), \
+ E__NOTE(_A6 ), \
+ S__NOTE(_REST), \
+ ED_NOTE(_E7 ), \
+ S__NOTE(_REST), \
+ ED_NOTE(_GS7 ),
+
+#define DVORAK_SOUND \
+ E__NOTE(_GS6 ), \
+ E__NOTE(_A6 ), \
+ S__NOTE(_REST), \
+ E__NOTE(_E7 ), \
+ S__NOTE(_REST), \
+ E__NOTE(_FS7 ), \
+ S__NOTE(_REST), \
+ E__NOTE(_E7 ),
+
+#define MUSIC_SCALE_SOUND \
+ E__NOTE(_A5 ), \
+ E__NOTE(_B5 ), \
+ E__NOTE(_CS6), \
+ E__NOTE(_D6 ), \
+ E__NOTE(_E6 ), \
+ E__NOTE(_FS6), \
+ E__NOTE(_GS6), \
+ E__NOTE(_A6 ),
+
+#define CAPS_LOCK_ON_SOUND \
+ E__NOTE(_A3), \
+ E__NOTE(_B3),
+
+#define CAPS_LOCK_OFF_SOUND \
+ E__NOTE(_B3), \
+ E__NOTE(_A3),
+
+#define SCROLL_LOCK_ON_SOUND \
+ E__NOTE(_D4), \
+ E__NOTE(_E4),
+
+#define SCROLL_LOCK_OFF_SOUND \
+ E__NOTE(_E4), \
+ E__NOTE(_D4),
+
+#define NUM_LOCK_ON_SOUND \
+ E__NOTE(_D5), \
+ E__NOTE(_E5),
+
+#define NUM_LOCK_OFF_SOUND \
+ E__NOTE(_E5), \
+ E__NOTE(_D5),
+
+#endif
diff --git a/quantum/template/Makefile b/quantum/template/Makefile
index 2efa69138..4fa195468 100644
--- a/quantum/template/Makefile
+++ b/quantum/template/Makefile
@@ -113,18 +113,19 @@ 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
+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
+KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES # MIDI controls
-# UNICODE_ENABLE = YES # Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+#NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+# MIDI_ENABLE = YES # MIDI controls
+# UNICODE_ENABLE = YES # Unicode
+# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
diff --git a/quantum/template/README.md b/quantum/template/README.md
index dc163a2f4..39f9f59d1 100644
--- a/quantum/template/README.md
+++ b/quantum/template/README.md
@@ -15,7 +15,7 @@ Depending on which keymap you would like to use, you will have to compile slight
To build with the default keymap, simply run `make`.
### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
+Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
diff --git a/quantum/template/config.h b/quantum/template/config.h
index 7d6149f43..e6fb7866c 100644
--- a/quantum/template/config.h
+++ b/quantum/template/config.h
@@ -32,34 +32,110 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 2
#define MATRIX_COLS 3
-// Planck PCB default pin-out
-// Change this to how you wired your keyboard
-// COLS: Left to right, ROWS: Top to bottom
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
#define COLS (int []){ F1, F0, B0 }
#define ROWS (int []){ D0, D5 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
-/* define if matrix has ghost */
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
-/* 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 */
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/quantum/template/template.c b/quantum/template/template.c
index 58e73cb09..cc52e496f 100644
--- a/quantum/template/template.c
+++ b/quantum/template/template.c
@@ -11,6 +11,11 @@ void matrix_scan_user(void) {
}
__attribute__ ((weak))
+void process_action_user(keyrecord_t *record) {
+ // leave this function blank - it can be defined in a keymap file
+}
+
+__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
}
@@ -18,19 +23,26 @@ void led_set_user(uint8_t usb_led) {
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
-
+
matrix_init_user();
}
void matrix_scan_kb(void) {
- // put your looping keyboard code here
- // runs every cycle (a lot)
+ // put your looping keyboard code here
+ // runs every cycle (a lot)
matrix_scan_user();
}
+void process_action_kb(keyrecord_t *record) {
+ // put your per-action keyboard code here
+ // runs for every action, just before processing by the firmware
+
+ process_action_user(record);
+}
+
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
led_set_user(usb_led);
-} \ No newline at end of file
+}
diff --git a/quantum/template/template.h b/quantum/template/template.h
index ba91abac3..b1c34d3cb 100644
--- a/quantum/template/template.h
+++ b/quantum/template/template.h
@@ -17,10 +17,11 @@
{ \
{ k00, k01, k02 }, \
{ k10, KC_NO, k11 }, \
-}
+}
void matrix_init_user(void);
void matrix_scan_user(void);
+void process_action_user(keyrecord_t *record);
void led_set_user(uint8_t usb_led);
-#endif \ No newline at end of file
+#endif
diff --git a/quantum/tools/README.md b/quantum/tools/README.md
new file mode 100644
index 000000000..070214423
--- /dev/null
+++ b/quantum/tools/README.md
@@ -0,0 +1,6 @@
+`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this:
+
+ dfu-programmer atmega32u4 erase
+ dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin
+
+ You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom. \ No newline at end of file
diff --git a/quantum/tools/eeprom_reset.hex b/quantum/tools/eeprom_reset.hex
new file mode 100644
index 000000000..a8a75389f
--- /dev/null
+++ b/quantum/tools/eeprom_reset.hex
@@ -0,0 +1,9 @@
+:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
+:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
+:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
+:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
+:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
+:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
+:00000001FF
diff --git a/quantum/vibrato_lut.h b/quantum/vibrato_lut.h
new file mode 100644
index 000000000..4c267a626
--- /dev/null
+++ b/quantum/vibrato_lut.h
@@ -0,0 +1,108 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+
+#define VIBRATO_LUT_LENGTH 100
+
+const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \
+1.00045346811453,
+1.00090535101508,
+1.00135386178926,
+1.00179722447259,
+1.00223368114872,
+1.0026614990145,
+1.00307897737994,
+1.00348445457284,
+1.00387631471807,
+1.00425299436105,
+1.00461298890553,
+1.00495485883603,
+1.00527723569589,
+1.00557882779254,
+1.00585842560279,
+1.00611490685176,
+1.00634724124066,
+1.00655449479987,
+1.00673583384565,
+1.00689052852052,
+1.00701795589922,
+1.00711760264454,
+1.0071890671992,
+1.00723206150266,
+1.0072464122237,
+1.00723206150266,
+1.0071890671992,
+1.00711760264454,
+1.00701795589922,
+1.00689052852052,
+1.00673583384565,
+1.00655449479987,
+1.00634724124066,
+1.00611490685176,
+1.00585842560279,
+1.00557882779254,
+1.00527723569589,
+1.00495485883603,
+1.00461298890553,
+1.00425299436105,
+1.00387631471807,
+1.00348445457284,
+1.00307897737994,
+1.0026614990145,
+1.00223368114872,
+1.00179722447259,
+1.00135386178926,
+1.00090535101508,
+1.00045346811453,
+1,
+0.999546737425598,
+0.999095467903976,
+0.998647968674285,
+0.998205999748565,
+0.99777129706302,
+0.997345565759612,
+0.996930473622346,
+0.996527644691494,
+0.996138653077835,
+0.99576501699778,
+0.995408193048995,
+0.995069570744927,
+0.994750467325326,
+0.994452122858643,
+0.994175695650927,
+0.993922257974591,
+0.99369279212925,
+0.993488186845591,
+0.993309234042139,
+0.993156625943589,
+0.993030952568311,
+0.99293269959154,
+0.992862246589715,
+0.992819865670409,
+0.992805720491269,
+0.992819865670409,
+0.992862246589715,
+0.99293269959154,
+0.993030952568311,
+0.993156625943589,
+0.993309234042139,
+0.993488186845591,
+0.99369279212925,
+0.993922257974591,
+0.994175695650927,
+0.994452122858643,
+0.994750467325326,
+0.995069570744927,
+0.995408193048995,
+0.99576501699778,
+0.996138653077835,
+0.996527644691494,
+0.996930473622346,
+0.997345565759612,
+0.99777129706302,
+0.998205999748565,
+0.998647968674285,
+0.999095467903976,
+0.999546737425598,
+1
+}; \ No newline at end of file
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 89c366f55..9cb2eb8ec 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -17,66 +17,70 @@ SRC += $(COMMON_DIR)/host.c \
# Option modules
-ifdef BOOTMAGIC_ENABLE
+ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes)
SRC += $(COMMON_DIR)/bootmagic.c
SRC += $(COMMON_DIR)/avr/eeconfig.c
OPT_DEFS += -DBOOTMAGIC_ENABLE
+else
+ SRC += $(COMMON_DIR)/magic.c
+ SRC += $(COMMON_DIR)/avr/eeconfig.c
endif
-ifdef MOUSEKEY_ENABLE
+ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
SRC += $(COMMON_DIR)/mousekey.c
OPT_DEFS += -DMOUSEKEY_ENABLE
OPT_DEFS += -DMOUSE_ENABLE
endif
-ifdef EXTRAKEY_ENABLE
+ifeq ($(strip $(EXTRAKEY_ENABLE)), yes)
OPT_DEFS += -DEXTRAKEY_ENABLE
endif
-ifdef CONSOLE_ENABLE
+ifeq ($(strip $(CONSOLE_ENABLE)), yes)
OPT_DEFS += -DCONSOLE_ENABLE
else
OPT_DEFS += -DNO_PRINT
OPT_DEFS += -DNO_DEBUG
endif
-ifdef COMMAND_ENABLE
+ifeq ($(strip $(COMMAND_ENABLE)), yes)
SRC += $(COMMON_DIR)/command.c
OPT_DEFS += -DCOMMAND_ENABLE
endif
-ifdef NKRO_ENABLE
+ifeq ($(strip $(NKRO_ENABLE)), yes)
OPT_DEFS += -DNKRO_ENABLE
endif
-ifdef MIDI_ENABLE
+ifeq ($(strip $(MIDI_ENABLE)), yes)
OPT_DEFS += -DMIDI_ENABLE
endif
-ifdef AUDIO_ENABLE
+ifeq ($(strip $(AUDIO_ENABLE)), yes)
OPT_DEFS += -DAUDIO_ENABLE
endif
-ifdef USB_6KRO_ENABLE
+ifeq ($(strip $(USB_6KRO_ENABLE)), yes)
OPT_DEFS += -DUSB_6KRO_ENABLE
endif
-ifdef SLEEP_LED_ENABLE
+ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
SRC += $(COMMON_DIR)/sleep_led.c
OPT_DEFS += -DSLEEP_LED_ENABLE
OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
endif
-ifdef BACKLIGHT_ENABLE
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
SRC += $(COMMON_DIR)/backlight.c
+ SRC += $(COMMON_DIR)/avr/eeconfig.c
OPT_DEFS += -DBACKLIGHT_ENABLE
endif
-ifdef BLUETOOTH_ENABLE
+ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_ENABLE
endif
-ifdef KEYMAP_SECTION_ENABLE
+ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
OPT_DEFS += -DKEYMAP_SECTION_ENABLE
ifeq ($(strip $(MCU)),atmega32u2)
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index 4197c53ed..0162fbd63 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -27,11 +27,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_util.h"
#include "action.h"
-#ifdef DEBUG_ACTION
+//#ifdef DEBUG_ACTION
#include "debug.h"
-#else
-#include "nodebug.h"
-#endif
+//#else
+//#include "nodebug.h"
+//#endif
void action_exec(keyevent_t event)
@@ -53,6 +53,25 @@ void action_exec(keyevent_t event)
#endif
}
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+bool disable_action_cache = false;
+
+void process_action_nocache(keyrecord_t *record)
+{
+ disable_action_cache = true;
+ process_action(record);
+ disable_action_cache = false;
+}
+#else
+void process_action_nocache(keyrecord_t *record)
+{
+ process_action(record);
+}
+#endif
+
+__attribute__ ((weak))
+void process_action_kb(keyrecord_t *record) {}
+
void process_action(keyrecord_t *record)
{
keyevent_t event = record->event;
@@ -62,7 +81,9 @@ void process_action(keyrecord_t *record)
if (IS_NOEVENT(event)) { return; }
- action_t action = layer_switch_get_action(event.key);
+ process_action_kb(record);
+
+ action_t action = store_or_get_action(event.pressed, event.key);
dprint("ACTION: "); debug_action(action);
#ifndef NO_ACTION_LAYER
dprint(" layer_state: "); layer_debug();
@@ -83,14 +104,24 @@ void process_action(keyrecord_t *record)
action.key.mods<<4;
if (event.pressed) {
if (mods) {
- add_weak_mods(mods);
+ if (IS_MOD(action.key.code)) {
+ // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless.
+ // this also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT)
+ add_mods(mods);
+ } else {
+ add_weak_mods(mods);
+ }
send_keyboard_report();
}
register_code(action.key.code);
} else {
unregister_code(action.key.code);
if (mods) {
- del_weak_mods(mods);
+ if (IS_MOD(action.key.code)) {
+ del_mods(mods);
+ } else {
+ del_weak_mods(mods);
+ }
send_keyboard_report();
}
}
diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h
index 8a4736d7b..44ec3047b 100644
--- a/tmk_core/common/action.h
+++ b/tmk_core/common/action.h
@@ -58,7 +58,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt);
/* user defined special function */
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt);
+/* keyboard-specific key event (pre)processing */
+void process_action_kb(keyrecord_t *record);
+
/* Utilities for actions. */
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+extern bool disable_action_cache;
+#endif
+void process_action_nocache(keyrecord_t *record);
void process_action(keyrecord_t *record);
void register_code(uint8_t code);
void unregister_code(uint8_t code);
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h
index 4fe9c1d58..2b0b0b077 100644
--- a/tmk_core/common/action_code.h
+++ b/tmk_core/common/action_code.h
@@ -301,7 +301,7 @@ enum backlight_opt {
#define ACTION_BACKLIGHT_DECREASE() ACTION(ACT_BACKLIGHT, BACKLIGHT_DECREASE << 8)
#define ACTION_BACKLIGHT_TOGGLE() ACTION(ACT_BACKLIGHT, BACKLIGHT_TOGGLE << 8)
#define ACTION_BACKLIGHT_STEP() ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8)
-#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | level)
+#define ACTION_BACKLIGHT_LEVEL(level) ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | (level))
/* Command */
#define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt)<<8 | (addr))
/* Function */
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c
index c535615f4..845fbbb21 100644
--- a/tmk_core/common/action_layer.c
+++ b/tmk_core/common/action_layer.c
@@ -4,14 +4,14 @@
#include "util.h"
#include "action_layer.h"
-#ifdef DEBUG_ACTION
+//#ifdef DEBUG_ACTION
#include "debug.h"
-#else
-#include "nodebug.h"
-#endif
+//#else
+//#include "nodebug.h"
+//#endif
-/*
+/*
* Default Layer State
*/
uint32_t default_layer_state = 0;
@@ -52,7 +52,7 @@ void default_layer_xor(uint32_t state)
#ifndef NO_ACTION_LAYER
-/*
+/*
* Keymap Layer State
*/
uint32_t layer_state = 0;
@@ -110,9 +110,71 @@ void layer_debug(void)
}
#endif
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {0};
+void update_source_layers_cache(keypos_t key, uint8_t layer)
+{
+ const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
+ const uint8_t storage_row = key_number / 8;
+ const uint8_t storage_bit = key_number % 8;
-action_t layer_switch_get_action(keypos_t key)
+ for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
+ source_layers_cache[storage_row][bit_number] ^=
+ (-((layer & (1U << bit_number)) != 0)
+ ^ source_layers_cache[storage_row][bit_number])
+ & (1U << storage_bit);
+ }
+}
+
+uint8_t read_source_layers_cache(keypos_t key)
+{
+ const uint8_t key_number = key.col + (key.row * MATRIX_COLS);
+ const uint8_t storage_row = key_number / 8;
+ const uint8_t storage_bit = key_number % 8;
+ uint8_t layer = 0;
+
+ for (uint8_t bit_number = 0; bit_number < MAX_LAYER_BITS; bit_number++) {
+ layer |=
+ ((source_layers_cache[storage_row][bit_number]
+ & (1U << storage_bit)) != 0)
+ << bit_number;
+ }
+
+ return layer;
+}
+#endif
+
+/*
+ * Make sure the action triggered when the key is released is the same
+ * one as the one triggered on press. It's important for the mod keys
+ * when the layer is switched after the down event but before the up
+ * event as they may get stuck otherwise.
+ */
+action_t store_or_get_action(bool pressed, keypos_t key)
+{
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+ if (disable_action_cache) {
+ return layer_switch_get_action(key);
+ }
+
+ uint8_t layer;
+
+ if (pressed) {
+ layer = layer_switch_get_layer(key);
+ update_source_layers_cache(key, layer);
+ }
+ else {
+ layer = read_source_layers_cache(key);
+ }
+ return action_for_key(layer, key);
+#else
+ return layer_switch_get_action(key);
+#endif
+}
+
+
+int8_t layer_switch_get_layer(keypos_t key)
{
action_t action;
action.code = ACTION_TRANSPARENT;
@@ -124,15 +186,18 @@ action_t layer_switch_get_action(keypos_t key)
if (layers & (1UL<<i)) {
action = action_for_key(i, key);
if (action.code != ACTION_TRANSPARENT) {
- return action;
+ return i;
}
}
}
/* fall back to layer 0 */
- action = action_for_key(0, key);
- return action;
+ return 0;
#else
- action = action_for_key(biton32(default_layer_state), key);
- return action;
+ return biton32(default_layer_state);
#endif
}
+
+action_t layer_switch_get_action(keypos_t key)
+{
+ return action_for_key(layer_switch_get_layer(key), key);
+}
diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h
index b6da353cf..025cf5420 100644
--- a/tmk_core/common/action_layer.h
+++ b/tmk_core/common/action_layer.h
@@ -68,8 +68,20 @@ void layer_xor(uint32_t state);
#define layer_and(state)
#define layer_xor(state)
#define layer_debug()
+
+#endif
+
+/* pressed actions cache */
+#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
+/* The number of bits needed to represent the layer number: log2(32). */
+#define MAX_LAYER_BITS 5
+void update_source_layers_cache(keypos_t key, uint8_t layer);
+uint8_t read_source_layers_cache(keypos_t key);
#endif
+action_t store_or_get_action(bool pressed, keypos_t key);
+/* return the topmost non-transparent layer currently associated with key */
+int8_t layer_switch_get_layer(keypos_t key);
/* return action depending on current layer status */
action_t layer_switch_get_action(keypos_t key);
diff --git a/tmk_core/common/action_macro.c b/tmk_core/common/action_macro.c
index 7726b1190..cc78c8232 100644
--- a/tmk_core/common/action_macro.c
+++ b/tmk_core/common/action_macro.c
@@ -19,11 +19,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_macro.h"
#include "wait.h"
-#ifdef DEBUG_ACTION
+//#ifdef DEBUG_ACTION
#include "debug.h"
-#else
-#include "nodebug.h"
-#endif
+//#else
+//#include "nodebug.h"
+//#endif
#ifndef NO_ACTION_MACRO
diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c
index 826c23309..6b6fa1dfe 100644
--- a/tmk_core/common/action_tapping.c
+++ b/tmk_core/common/action_tapping.c
@@ -6,11 +6,11 @@
#include "keycode.h"
#include "timer.h"
-#ifdef DEBUG_ACTION
+//#ifdef DEBUG_ACTION
#include "debug.h"
-#else
-#include "nodebug.h"
-#endif
+//#else
+//#include "nodebug.h"
+//#endif
#ifndef NO_ACTION_TAPPING
@@ -139,7 +139,7 @@ bool process_tapping(keyrecord_t *keyp)
if (event.pressed) {
tapping_key.tap.interrupted = true;
}
- // enqueue
+ // enqueue
return false;
}
}
@@ -324,6 +324,7 @@ bool waiting_buffer_typed(keyevent_t event)
return false;
}
+__attribute__((unused))
bool waiting_buffer_has_anykey_pressed(void)
{
for (uint8_t i = waiting_buffer_tail; i != waiting_buffer_head; i = (i + 1) % WAITING_BUFFER_SIZE) {
diff --git a/tmk_core/common/avr/eeconfig.c b/tmk_core/common/avr/eeconfig.c
index 5bd47dc6a..25bb9e849 100644
--- a/tmk_core/common/avr/eeconfig.c
+++ b/tmk_core/common/avr/eeconfig.c
@@ -13,6 +13,9 @@ void eeconfig_init(void)
#ifdef BACKLIGHT_ENABLE
eeprom_write_byte(EECONFIG_BACKLIGHT, 0);
#endif
+#ifdef AUDIO_ENABLE
+ eeprom_write_byte(EECONFIG_AUDIO, 0xFF); // On by default
+#endif
}
void eeconfig_enable(void)
@@ -43,3 +46,8 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val
uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
#endif
+
+#ifdef AUDIO_ENABLE
+uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO); }
+void eeconfig_write_audio(uint8_t val) { eeprom_write_byte(EECONFIG_AUDIO, val); }
+#endif \ No newline at end of file
diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c
index caf0b0625..e295dbe18 100644
--- a/tmk_core/common/avr/suspend.c
+++ b/tmk_core/common/avr/suspend.c
@@ -9,10 +9,16 @@
#include "suspend.h"
#include "timer.h"
#include "led.h"
+
#ifdef PROTOCOL_LUFA
-#include "lufa.h"
+ #include "lufa.h"
#endif
+#ifdef AUDIO_ENABLE
+ #include "audio.h"
+#endif /* AUDIO_ENABLE */
+
+
#define wdt_intr_enable(value) \
__asm__ __volatile__ ( \
@@ -66,9 +72,16 @@ static void power_down(uint8_t wdto)
wdt_intr_enable(wdto);
#ifdef BACKLIGHT_ENABLE
-backlight_set(0);
+ backlight_set(0);
#endif
+ // Turn off LED indicators
+ led_set(0);
+
+ #ifdef AUDIO_ENABLE
+ stop_all_notes();
+ #endif /* AUDIO_ENABLE */
+
// TODO: more power saving
// See PicoPower application note
// - I/O port input with pullup
diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c
index d59bb01bb..f06abaf7f 100644
--- a/tmk_core/common/command.c
+++ b/tmk_core/common/command.c
@@ -49,9 +49,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "usbdrv.h"
#endif
+#ifdef AUDIO_ENABLE
+ #include "audio.h"
+#endif /* AUDIO_ENABLE */
+
static bool command_common(uint8_t code);
static void command_common_help(void);
+static void print_version(void);
+static void print_status(void);
static bool command_console(uint8_t code);
static void command_console_help(void);
#ifdef MOUSEKEY_ENABLE
@@ -112,38 +118,144 @@ bool command_console_extra(uint8_t code)
***********************************************************/
static void command_common_help(void)
{
- print("\n\t- Magic -\n"
- "d: debug\n"
- "x: debug matrix\n"
- "k: debug keyboard\n"
- "m: debug mouse\n"
- "v: version\n"
- "s: status\n"
- "c: console mode\n"
- "0-4: layer0-4(F10-F4)\n"
- "Paus: bootloader\n"
+ print( "\n\t- Magic -\n"
+ STR(MAGIC_KEY_DEBUG ) ": Debug Message Toggle\n"
+ STR(MAGIC_KEY_DEBUG_MATRIX) ": Matrix Debug Mode Toggle - Show keypresses in matrix grid\n"
+ STR(MAGIC_KEY_DEBUG_KBD ) ": Keyboard Debug Toggle - Show keypress report\n"
+ STR(MAGIC_KEY_DEBUG_MOUSE ) ": Debug Mouse Toggle\n"
+ STR(MAGIC_KEY_VERSION ) ": Version\n"
+ STR(MAGIC_KEY_STATUS ) ": Status\n"
+ STR(MAGIC_KEY_CONSOLE ) ": Activate Console Mode\n"
+
+#if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+ STR(MAGIC_KEY_LAYER0 ) ": Switch to Layer 0\n"
+ STR(MAGIC_KEY_LAYER1 ) ": Switch to Layer 1\n"
+ STR(MAGIC_KEY_LAYER2 ) ": Switch to Layer 2\n"
+ STR(MAGIC_KEY_LAYER3 ) ": Switch to Layer 3\n"
+ STR(MAGIC_KEY_LAYER4 ) ": Switch to Layer 4\n"
+ STR(MAGIC_KEY_LAYER5 ) ": Switch to Layer 5\n"
+ STR(MAGIC_KEY_LAYER6 ) ": Switch to Layer 6\n"
+ STR(MAGIC_KEY_LAYER7 ) ": Switch to Layer 7\n"
+ STR(MAGIC_KEY_LAYER8 ) ": Switch to Layer 8\n"
+ STR(MAGIC_KEY_LAYER9 ) ": Switch to Layer 9\n"
+#endif
+
+#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+ "F1-F10: Switch to Layer 0-9 (F10 = L0)\n"
+#endif
+
+#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+ "0-9: Switch to Layer 0-9\n"
+#endif
+
+ STR(MAGIC_KEY_LAYER0_ALT1 ) ": Switch to Layer 0 (alternate key 1)\n"
+ STR(MAGIC_KEY_LAYER0_ALT2 ) ": Switch to Layer 0 (alternate key 2)\n"
+ STR(MAGIC_KEY_BOOTLOADER ) ": Jump to Bootloader (Reset)\n"
#ifdef KEYBOARD_LOCK_ENABLE
- "Caps: Lock\n"
+ STR(MAGIC_KEY_LOCK ) ": Lock\n"
#endif
#ifdef BOOTMAGIC_ENABLE
- "e: eeprom\n"
+ STR(MAGIC_KEY_EEPROM ) ": Print EEPROM Settings\n"
#endif
#ifdef NKRO_ENABLE
- "n: NKRO\n"
+ STR(MAGIC_KEY_NKRO ) ": NKRO Toggle\n"
#endif
#ifdef SLEEP_LED_ENABLE
- "z: sleep LED test\n"
+ STR(MAGIC_KEY_SLEEP_LED ) ": Sleep LED Test\n"
#endif
);
}
+static void print_version(void)
+{
+ // print version & information
+ print("\n\t- Version -\n");
+ print("DESC: " STR(DESCRIPTION) "\n");
+ print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") "
+ "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") "
+ "VER: " STR(DEVICE_VER) "\n");
+ print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n");
+
+ /* build options */
+ print("OPTIONS:"
+
+#ifdef PROTOCOL_PJRC
+ " PJRC"
+#endif
+#ifdef PROTOCOL_LUFA
+ " LUFA"
+#endif
+#ifdef PROTOCOL_VUSB
+ " VUSB"
+#endif
+#ifdef BOOTMAGIC_ENABLE
+ " BOOTMAGIC"
+#endif
+#ifdef MOUSEKEY_ENABLE
+ " MOUSEKEY"
+#endif
+#ifdef EXTRAKEY_ENABLE
+ " EXTRAKEY"
+#endif
+#ifdef CONSOLE_ENABLE
+ " CONSOLE"
+#endif
+#ifdef COMMAND_ENABLE
+ " COMMAND"
+#endif
+#ifdef NKRO_ENABLE
+ " NKRO"
+#endif
+#ifdef KEYMAP_SECTION_ENABLE
+ " KEYMAP_SECTION"
+#endif
+
+ " " STR(BOOTLOADER_SIZE) "\n");
+
+ print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__)
+ " AVR-LIBC: " __AVR_LIBC_VERSION_STRING__
+ " AVR_ARCH: avr" STR(__AVR_ARCH__) "\n");
+
+ return;
+}
+
+static void print_status(void)
+{
+
+ print("\n\t- Status -\n");
+
+ print_val_hex8(host_keyboard_leds());
+ print_val_hex8(keyboard_protocol);
+ print_val_hex8(keyboard_idle);
+#ifdef NKRO_ENABLE
+ print_val_hex8(keyboard_nkro);
+#endif
+ print_val_hex32(timer_count);
+
+#ifdef PROTOCOL_PJRC
+ print_val_hex8(UDCON);
+ print_val_hex8(UDIEN);
+ print_val_hex8(UDINT);
+ print_val_hex8(usb_keyboard_leds);
+ print_val_hex8(usb_keyboard_idle_count);
+#endif
+
+#ifdef PROTOCOL_PJRC
+# if USB_COUNT_SOF
+ print_val_hex8(usbSofCount);
+# endif
+#endif
+ return;
+}
+
#ifdef BOOTMAGIC_ENABLE
static void print_eeconfig(void)
{
+#ifndef NO_PRINT
print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n");
debug_config_t dc;
@@ -172,30 +284,45 @@ static void print_eeconfig(void)
print("backlight_config.raw: "); print_hex8(bc.raw); print("\n");
print(".enable: "); print_dec(bc.enable); print("\n");
print(".level: "); print_dec(bc.level); print("\n");
-#endif
+#endif /* BACKLIGHT_ENABLE */
+
+#endif /* !NO_PRINT */
+
}
-#endif
+#endif /* BOOTMAGIC_ENABLE */
static bool command_common(uint8_t code)
{
+
+#ifdef KEYBOARD_LOCK_ENABLE
static host_driver_t *host_driver = 0;
+#endif
+
switch (code) {
+
#ifdef SLEEP_LED_ENABLE
- case KC_Z:
- // test breathing sleep LED
- print("Sleep LED test\n");
+
+ // test breathing sleep LED
+ case MAGIC_KC(MAGIC_KEY_SLEEP_LED):
+ print("Sleep LED Test\n");
sleep_led_toggle();
led_set(host_keyboard_leds());
break;
#endif
+
#ifdef BOOTMAGIC_ENABLE
- case KC_E:
+
+ // print stored eeprom config
+ case MAGIC_KC(MAGIC_KEY_EEPROM):
print("eeconfig:\n");
print_eeconfig();
break;
#endif
+
#ifdef KEYBOARD_LOCK_ENABLE
- case KC_CAPSLOCK:
+
+ // lock/unlock keyboard
+ case MAGIC_KC(MAGIC_KEY_LOCK):
if (host_get_driver()) {
host_driver = host_get_driver();
clear_keyboard();
@@ -207,11 +334,15 @@ static bool command_common(uint8_t code)
}
break;
#endif
- case KC_H:
- case KC_SLASH: /* ? */
+
+ // print help
+ case MAGIC_KC(MAGIC_KEY_HELP1):
+ case MAGIC_KC(MAGIC_KEY_HELP2):
command_common_help();
break;
- case KC_C:
+
+ // activate console
+ case MAGIC_KC(MAGIC_KEY_CONSOLE):
debug_matrix = false;
debug_keyboard = false;
debug_mouse = false;
@@ -220,25 +351,36 @@ static bool command_common(uint8_t code)
print("C> ");
command_state = CONSOLE;
break;
- case KC_PAUSE:
- clear_keyboard();
- print("\n\nbootloader... ");
+
+ // jump to bootloader
+ case MAGIC_KC(MAGIC_KEY_BOOTLOADER):
+ clear_keyboard(); // clear to prevent stuck keys
+ print("\n\nJumping to bootloader... ");
+ #ifdef AUDIO_ENABLE
+ play_goodbye_tone();
+ #endif
_delay_ms(1000);
bootloader_jump(); // not return
break;
- case KC_D:
+
+ // debug toggle
+ case MAGIC_KC(MAGIC_KEY_DEBUG):
+ debug_enable = !debug_enable;
if (debug_enable) {
+ print("\ndebug: on\n");
+ debug_matrix = true;
+ debug_keyboard = true;
+ debug_mouse = true;
+ } else {
print("\ndebug: off\n");
debug_matrix = false;
debug_keyboard = false;
debug_mouse = false;
- debug_enable = false;
- } else {
- print("\ndebug: on\n");
- debug_enable = true;
}
break;
- case KC_X: // debug matrix toggle
+
+ // debug matrix toggle
+ case MAGIC_KC(MAGIC_KEY_DEBUG_MATRIX):
debug_matrix = !debug_matrix;
if (debug_matrix) {
print("\nmatrix: on\n");
@@ -247,7 +389,9 @@ static bool command_common(uint8_t code)
print("\nmatrix: off\n");
}
break;
- case KC_K: // debug keyboard toggle
+
+ // debug keyboard toggle
+ case MAGIC_KC(MAGIC_KEY_DEBUG_KBD):
debug_keyboard = !debug_keyboard;
if (debug_keyboard) {
print("\nkeyboard: on\n");
@@ -256,87 +400,33 @@ static bool command_common(uint8_t code)
print("\nkeyboard: off\n");
}
break;
- case KC_M: // debug mouse toggle
+
+ // debug mouse toggle
+ case MAGIC_KC(MAGIC_KEY_DEBUG_MOUSE):
debug_mouse = !debug_mouse;
if (debug_mouse) {
print("\nmouse: on\n");
debug_enable = true;
} else {
- print("\nmouse: off\n");
+ print("\nmouse: off\n");
}
break;
- case KC_V: // print version & information
- print("\n\t- Version -\n");
- print("DESC: " STR(DESCRIPTION) "\n");
- print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") "
- "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") "
- "VER: " STR(DEVICE_VER) "\n");
- print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n");
- /* build options */
- print("OPTIONS:"
-#ifdef PROTOCOL_PJRC
- " PJRC"
-#endif
-#ifdef PROTOCOL_LUFA
- " LUFA"
-#endif
-#ifdef PROTOCOL_VUSB
- " VUSB"
-#endif
-#ifdef BOOTMAGIC_ENABLE
- " BOOTMAGIC"
-#endif
-#ifdef MOUSEKEY_ENABLE
- " MOUSEKEY"
-#endif
-#ifdef EXTRAKEY_ENABLE
- " EXTRAKEY"
-#endif
-#ifdef CONSOLE_ENABLE
- " CONSOLE"
-#endif
-#ifdef COMMAND_ENABLE
- " COMMAND"
-#endif
-#ifdef NKRO_ENABLE
- " NKRO"
-#endif
-#ifdef KEYMAP_SECTION_ENABLE
- " KEYMAP_SECTION"
-#endif
- " " STR(BOOTLOADER_SIZE) "\n");
- print("GCC: " STR(__GNUC__) "." STR(__GNUC_MINOR__) "." STR(__GNUC_PATCHLEVEL__)
- " AVR-LIBC: " __AVR_LIBC_VERSION_STRING__
- " AVR_ARCH: avr" STR(__AVR_ARCH__) "\n");
- break;
- case KC_S:
- print("\n\t- Status -\n");
- print_val_hex8(host_keyboard_leds());
- print_val_hex8(keyboard_protocol);
- print_val_hex8(keyboard_idle);
-#ifdef NKRO_ENABLE
- print_val_hex8(keyboard_nkro);
-#endif
- print_val_hex32(timer_count);
-
-#ifdef PROTOCOL_PJRC
- print_val_hex8(UDCON);
- print_val_hex8(UDIEN);
- print_val_hex8(UDINT);
- print_val_hex8(usb_keyboard_leds);
- print_val_hex8(usb_keyboard_idle_count);
-#endif
+ // print version
+ case MAGIC_KC(MAGIC_KEY_VERSION):
+ print_version();
+ break;
-#ifdef PROTOCOL_PJRC
-# if USB_COUNT_SOF
- print_val_hex8(usbSofCount);
-# endif
-#endif
+ // print status
+ case MAGIC_KC(MAGIC_KEY_STATUS):
+ print_status();
break;
+
#ifdef NKRO_ENABLE
- case KC_N:
- clear_keyboard(); //Prevents stuck keys.
+
+ // NKRO toggle
+ case MAGIC_KC(MAGIC_KEY_NKRO):
+ clear_keyboard(); // clear to prevent stuck keys
keyboard_nkro = !keyboard_nkro;
if (keyboard_nkro)
print("NKRO: on\n");
@@ -344,18 +434,78 @@ static bool command_common(uint8_t code)
print("NKRO: off\n");
break;
#endif
- case KC_ESC:
- case KC_GRV:
- case KC_0:
+
+ // switch layers
+
+ case MAGIC_KC(MAGIC_KEY_LAYER0_ALT1):
+ case MAGIC_KC(MAGIC_KEY_LAYER0_ALT2):
+ switch_default_layer(0);
+ break;
+
+#if MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+
+ case MAGIC_KC(MAGIC_KEY_LAYER0):
+ switch_default_layer(0);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER1):
+ switch_default_layer(1);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER2):
+ switch_default_layer(2);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER3):
+ switch_default_layer(3);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER4):
+ switch_default_layer(4);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER5):
+ switch_default_layer(5);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER6):
+ switch_default_layer(6);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER7):
+ switch_default_layer(7);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER8):
+ switch_default_layer(8);
+ break;
+
+ case MAGIC_KC(MAGIC_KEY_LAYER9):
+ switch_default_layer(9);
+ break;
+#endif
+
+
+#if MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+
+ case KC_F1 ... KC_F9:
+ switch_default_layer((code - KC_F1) + 1);
+ break;
case KC_F10:
switch_default_layer(0);
break;
+#endif
+
+#if MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+
case KC_1 ... KC_9:
switch_default_layer((code - KC_1) + 1);
break;
- case KC_F1 ... KC_F9:
- switch_default_layer((code - KC_F1) + 1);
+ case KC_0:
+ switch_default_layer(0);
break;
+#endif
+
default:
print("?");
return false;
@@ -412,6 +562,7 @@ static uint8_t mousekey_param = 0;
static void mousekey_param_print(void)
{
+#ifndef NO_PRINT
print("\n\t- Values -\n");
print("1: delay(*10ms): "); pdec(mk_delay); print("\n");
print("2: interval(ms): "); pdec(mk_interval); print("\n");
@@ -419,6 +570,8 @@ static void mousekey_param_print(void)
print("4: time_to_max: "); pdec(mk_time_to_max); print("\n");
print("5: wheel_max_speed: "); pdec(mk_wheel_max_speed); print("\n");
print("6: wheel_time_to_max: "); pdec(mk_wheel_time_to_max); print("\n");
+#endif /* !NO_PRINT */
+
}
//#define PRINT_SET_VAL(v) print(#v " = "); print_dec(v); print("\n");
@@ -538,7 +691,7 @@ static void mousekey_console_help(void)
"pgdown: -10\n"
"\n"
"speed = delta * max_speed * (repeat / time_to_max)\n");
- xprintf("where delta: cursor=%d, wheel=%d\n"
+ xprintf("where delta: cursor=%d, wheel=%d\n"
"See http://en.wikipedia.org/wiki/Mouse_keys\n", MOUSEKEY_MOVE_DELTA, MOUSEKEY_WHEEL_DELTA);
}
diff --git a/tmk_core/common/command.h b/tmk_core/common/command.h
index b57a6c1ce..92b18849b 100644
--- a/tmk_core/common/command.h
+++ b/tmk_core/common/command.h
@@ -32,4 +32,125 @@ bool command_proc(uint8_t code);
#define command_proc(code) false
#endif
+
+#ifndef MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+#endif
+
+#ifndef MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+#endif
+
+#ifndef MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+#endif
+
+#ifndef MAGIC_KEY_HELP1
+#define MAGIC_KEY_HELP1 H
+#endif
+
+#ifndef MAGIC_KEY_HELP2
+#define MAGIC_KEY_HELP2 SLASH
+#endif
+
+#ifndef MAGIC_KEY_DEBUG
+#define MAGIC_KEY_DEBUG D
+#endif
+
+#ifndef MAGIC_KEY_DEBUG_MATRIX
+#define MAGIC_KEY_DEBUG_MATRIX X
+#endif
+
+#ifndef MAGIC_KEY_DEBUG_KBD
+#define MAGIC_KEY_DEBUG_KBD K
+#endif
+
+#ifndef MAGIC_KEY_DEBUG_MOUSE
+#define MAGIC_KEY_DEBUG_MOUSE M
+#endif
+
+#ifndef MAGIC_KEY_VERSION
+#define MAGIC_KEY_VERSION V
+#endif
+
+#ifndef MAGIC_KEY_STATUS
+#define MAGIC_KEY_STATUS S
+#endif
+
+#ifndef MAGIC_KEY_CONSOLE
+#define MAGIC_KEY_CONSOLE C
+#endif
+
+#ifndef MAGIC_KEY_LAYER0_ALT1
+#define MAGIC_KEY_LAYER0_ALT1 ESC
+#endif
+
+#ifndef MAGIC_KEY_LAYER0_ALT2
+#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+#endif
+
+#ifndef MAGIC_KEY_LAYER0
+#define MAGIC_KEY_LAYER0 0
+#endif
+
+#ifndef MAGIC_KEY_LAYER1
+#define MAGIC_KEY_LAYER1 1
+#endif
+
+#ifndef MAGIC_KEY_LAYER2
+#define MAGIC_KEY_LAYER2 2
+#endif
+
+#ifndef MAGIC_KEY_LAYER3
+#define MAGIC_KEY_LAYER3 3
+#endif
+
+#ifndef MAGIC_KEY_LAYER4
+#define MAGIC_KEY_LAYER4 4
+#endif
+
+#ifndef MAGIC_KEY_LAYER5
+#define MAGIC_KEY_LAYER5 5
+#endif
+
+#ifndef MAGIC_KEY_LAYER6
+#define MAGIC_KEY_LAYER6 6
+#endif
+
+#ifndef MAGIC_KEY_LAYER7
+#define MAGIC_KEY_LAYER7 7
+#endif
+
+#ifndef MAGIC_KEY_LAYER8
+#define MAGIC_KEY_LAYER8 8
#endif
+
+#ifndef MAGIC_KEY_LAYER9
+#define MAGIC_KEY_LAYER9 9
+#endif
+
+#ifndef MAGIC_KEY_BOOTLOADER
+#define MAGIC_KEY_BOOTLOADER PAUSE
+#endif
+
+#ifndef MAGIC_KEY_LOCK
+#define MAGIC_KEY_LOCK CAPS
+#endif
+
+#ifndef MAGIC_KEY_EEPROM
+#define MAGIC_KEY_EEPROM E
+#endif
+
+#ifndef MAGIC_KEY_NKRO
+#define MAGIC_KEY_NKRO N
+#endif
+
+#ifndef MAGIC_KEY_SLEEP_LED
+#define MAGIC_KEY_SLEEP_LED Z
+
+#endif
+
+#define XMAGIC_KC(key) KC_##key
+#define MAGIC_KC(key) XMAGIC_KC(key)
+
+#endif \ No newline at end of file
diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h
index 3cd1a174f..ddefca134 100644
--- a/tmk_core/common/eeconfig.h
+++ b/tmk_core/common/eeconfig.h
@@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define EECONFIG_KEYMAP (uint8_t *)4
#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5
#define EECONFIG_BACKLIGHT (uint8_t *)6
+#define EECONFIG_AUDIO (uint8_t *)7
/* debug bit */
@@ -72,4 +73,9 @@ uint8_t eeconfig_read_backlight(void);
void eeconfig_write_backlight(uint8_t val);
#endif
+#ifdef AUDIO_ENABLE
+uint8_t eeconfig_read_audio(void);
+void eeconfig_write_audio(uint8_t val);
+#endif
+
#endif
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index eb7b096be..1d9981848 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -27,7 +27,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "command.h"
#include "util.h"
#include "sendchar.h"
-#include "bootmagic.h"
+#ifdef BOOTMAGIC_ENABLE
+ #include "bootmagic.h"
+#else
+ #include "magic.h"
+#endif
#include "eeconfig.h"
#include "backlight.h"
#ifdef MOUSEKEY_ENABLE
@@ -70,6 +74,7 @@ void keyboard_setup(void)
void keyboard_init(void)
{
+
timer_init();
matrix_init();
#ifdef PS2_MOUSE_ENABLE
@@ -85,11 +90,18 @@ void keyboard_init(void)
#ifdef BOOTMAGIC_ENABLE
bootmagic();
+#else
+ magic();
#endif
#ifdef BACKLIGHT_ENABLE
backlight_init();
#endif
+
+#if defined(NKRO_ENABLE) && defined(FORCE_NKRO)
+ keyboard_nkro = true;
+#endif
+
}
/*
diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c
index 11f4aa8aa..8955fc710 100644
--- a/tmk_core/common/keymap.c
+++ b/tmk_core/common/keymap.c
@@ -22,7 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_macro.h"
#include "wait.h"
#include "debug.h"
-
+#include "bootloader.h"
static action_t keycode_to_action(uint8_t keycode);
@@ -143,6 +143,7 @@ static action_t keycode_to_action(uint8_t keycode)
action.code = ACTION_TRANSPARENT;
break;
case KC_BOOTLOADER:
+ action.code = ACTION_NO;
clear_keyboard();
wait_ms(50);
bootloader_jump(); // not return
diff --git a/tmk_core/common/keymap.h b/tmk_core/common/keymap.h
index e1a6f992e..abc9bdb32 100644
--- a/tmk_core/common/keymap.h
+++ b/tmk_core/common/keymap.h
@@ -22,8 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdbool.h>
#include "action.h"
-
-#ifdef BOOTMAGIC_ENABLE
/* NOTE: Not portable. Bit field order depends on implementation */
typedef union {
uint8_t raw;
@@ -39,7 +37,6 @@ typedef union {
};
} keymap_config_t;
keymap_config_t keymap_config;
-#endif
/* translates key to keycode */
diff --git a/tmk_core/common/magic.c b/tmk_core/common/magic.c
new file mode 100644
index 000000000..f21d1346c
--- /dev/null
+++ b/tmk_core/common/magic.c
@@ -0,0 +1,36 @@
+#include <stdint.h>
+#include <stdbool.h>
+#include <util/delay.h>
+#include "matrix.h"
+#include "bootloader.h"
+#include "debug.h"
+#include "keymap.h"
+#include "host.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+#include "magic.h"
+
+keymap_config_t keymap_config;
+
+void magic(void)
+{
+ /* check signature */
+ if (!eeconfig_is_enabled()) {
+ eeconfig_init();
+ }
+
+ /* debug enable */
+ debug_config.raw = eeconfig_read_debug();
+
+ /* keymap config */
+ keymap_config.raw = eeconfig_read_keymap();
+
+#ifdef NKRO_ENABLE
+ keyboard_nkro = keymap_config.nkro;
+#endif
+
+ uint8_t default_layer = 0;
+ default_layer = eeconfig_read_default_layer();
+ default_layer_set((uint32_t)default_layer);
+
+} \ No newline at end of file
diff --git a/tmk_core/common/magic.h b/tmk_core/common/magic.h
new file mode 100644
index 000000000..3fa2d8b81
--- /dev/null
+++ b/tmk_core/common/magic.h
@@ -0,0 +1,6 @@
+#ifndef MAGIC_H
+#define MAGIC_H
+
+void magic(void);
+
+#endif
diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h
index c0e9e1430..4f3dde65a 100644
--- a/tmk_core/common/print.h
+++ b/tmk_core/common/print.h
@@ -2,17 +2,17 @@
/* Very basic print functions, intended to be used with usb_debug_only.c
* http://www.pjrc.com/teensy/
* Copyright (c) 2008 PJRC.COM, LLC
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -91,9 +91,9 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
#else /* NO_PRINT */
-#define xprintf
-#define print
-#define println
+#define xprintf(fmt, ...)
+#define print(s)
+#define println(s)
#define print_set_sendchar(func)
#define print_dec(data)
#define print_decs(data)
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index 4905760bb..9ac6298f1 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -17,7 +17,7 @@ LUFA_SRC = $(LUFA_DIR)/lufa.c \
$(LUFA_DIR)/descriptor.c \
$(LUFA_SRC_USB)
-ifdef MIDI_ENABLE
+ifeq ($(strip $(MIDI_ENABLE)), yes)
LUFA_SRC += $(LUFA_DIR)/midi/midi.c \
$(LUFA_DIR)/midi/midi_device.c \
$(LUFA_DIR)/midi/bytequeue/bytequeue.c \
@@ -25,7 +25,7 @@ ifdef MIDI_ENABLE
$(LUFA_SRC_USBCLASS)
endif
-ifdef BLUETOOTH_ENABLE
+ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
$(TMK_DIR)/protocol/serial_uart.c
endif
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 5d40dcf7b..f03f9a9b9 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2012 Jun Wako <wakojun@gmail.com>
* This file is based on:
* LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
@@ -152,10 +152,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);
}
@@ -183,10 +183,6 @@ static void Console_Task(void)
Endpoint_SelectEndpoint(ep);
}
-#else
-static void Console_Task(void)
-{
-}
#endif
@@ -216,7 +212,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();
@@ -313,7 +309,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
#ifdef MIDI_ENABLE
ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
- ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
#endif
}
@@ -439,7 +435,7 @@ void EVENT_USB_Device_ControlRequest(void)
}
/*******************************************************************************
- * Host driver
+ * Host driver
******************************************************************************/
static uint8_t keyboard_leds(void)
{
@@ -563,7 +559,7 @@ static void send_consumer(uint16_t data)
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x02);
bluefruit_serial_send((bitmap>>8)&0xFF);
- bluefruit_serial_send(bitmap&0xFF);
+ bluefruit_serial_send(bitmap&0xFF);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);