diff --git a/.pioenvs/.sconsign.dblite b/.pioenvs/.sconsign.dblite
index 0762f5f..18b001e 100644
Binary files a/.pioenvs/.sconsign.dblite and b/.pioenvs/.sconsign.dblite differ
diff --git a/.pioenvs/do-not-modify-files-here.url b/.pioenvs/do-not-modify-files-here.url
deleted file mode 100644
index c4a16e5..0000000
--- a/.pioenvs/do-not-modify-files-here.url
+++ /dev/null
@@ -1,3 +0,0 @@
-
-[InternetShortcut]
-URL=https://docs.platformio.org/page/projectconf/section_platformio.html#build-dir
diff --git a/.pioenvs/micro/firmware.elf b/.pioenvs/micro/firmware.elf
index ee1ec49..cc5844f 100755
Binary files a/.pioenvs/micro/firmware.elf and b/.pioenvs/micro/firmware.elf differ
diff --git a/.pioenvs/micro/firmware.hex b/.pioenvs/micro/firmware.hex
index 9542682..ab8bbcf 100644
--- a/.pioenvs/micro/firmware.hex
+++ b/.pioenvs/micro/firmware.hex
@@ -1,25 +1,25 @@
:100000000C94EA000C9412010C9412010C9412014D
:100010000C9412010C9412010C9412010C94120114
-:100020000C9412010C9412010C9462090C943F0A76
+:100020000C9412010C9412010C94D00B0C941D062C
:100030000C9412010C9412010C9412010C941201F4
:100040000C9412010C9412010C9412010C941201E4
-:100050000C9412010C9412010C9412010C94EC07F4
+:100050000C9412010C9412010C9412010C94A9043A
:100060000C9412010C9412010C9412010C941201C4
:100070000C9412010C9412010C9412010C941201B4
:100080000C9412010C9412010C9412010C941201A4
:100090000C9412010C9412010C9412010C94120194
-:1000A0000C9412010C9412010C941201C707CA0798
-:1000B000B907BD07C307EB07EB07EB07CE07D2076E
-:1000C000D607DC07E007EB07E60700000000240086
-:1000D00027002A002D003000000000002500280025
-:1000E0002B002E0031000000000023002600290014
-:1000F0002C002F000404040404030405020202027D
-:1001000004030202020206060606060604040202B0
-:100110000204040408020110408040102040804086
-:10012000800802040180402010020110801020404D
-:1001300040200000000200090F0000030401000C31
-:1001400000000000000000000000000000000000AF
-:1001500000070605040100080A0B0C0D09080B0036
+:1000A0000C9412010C9412010C9412015109540980
+:1000B000430947094D0975097509750958095C090E
+:1000C000600966096A0975097009000000002400CA
+:1000D00027002A002D003000000000002300260029
+:1000E00029002C002F00070605040100080A0B0C4C
+:1000F0000D0900000000250028002B002E00310013
+:1001000004040404040304050202020204030202BC
+:10011000020206060606060604040202020404049D
+:1001200008020110408040102040804080080204F6
+:10013000018040201002011080102040402000006B
+:10014000000200090F0000030401000C0000000081
+:1001500000000000000000000000000000080B008C
:10016000020202010009040000010202000005244D
:1001700000100105240101010424020605240600E3
:10018000010705810310004009040100020A000074
@@ -27,602 +27,561 @@
:1001A00003090412010002EF02014041233700005D
:1001B000010102030141726475696E6F204C4C436A
:1001C0000041726475696E6F204D6963726F000043
-:1001D000000F440E11241FBECFEFDAE0DEBFCDBF0B
-:1001E00012E0A0E0B1E0E4ECF5E202C005900D926F
-:1001F000A835B107D9F724E0A8E5B2E001C01D9207
-:10020000AF3EB207E1F710E0C9EED0E004C021979D
-:10021000FE010E94A211C83ED107C9F70E945810E2
-:100220000C94D5120C940000FC019281838969170B
-:1002300010F0982F04C0962F96959695969589174D
-:10024000A9F00188F289E02DE90FF11D97FDFA95DB
-:10025000677081E090E001C0880F6A95EAF720811D
-:10026000282381E090E021F480E0089580E090E090
-:100270000895DC0112963C91129753962C916317C6
-:1002800010F0E22F04C0E62FE695E695E6952E17CE
-:1002900019F10E2E000CFF0BDC0151962D913C91B3
-:1002A00052976770E20FF31F21E030E002C0220F87
-:1002B000331F6A95E2F7442319F03081232B04C0E1
-:1002C00020953095308123232083DC01ED91FC9132
-:1002D0000484F585E02D09940895E0915A02F09187
-:1002E0005B02309741F09381891740F09481891720
-:1002F00028F4CF01089580E090E008950580F6810C
-:10030000E02DEFCFDC011496ED91FC9115978FEF66
-:100310009FEF9587848708951F93CF93DF93EC0118
-:10032000122F8A819B81642BDC01ED91FC9101905D
-:10033000F081E02D09958A819B81DC01ED91FC9192
-:100340000190F081E02D612F09958A819B81DC016C
-:10035000ED91FC910680F781E02DDF91CF911F9107
-:1003600009940F931F93CF93DF93EC01122F8A818F
-:100370009B81642BDC01ED91FC910190F081E02DDB
-:1003800009958A819B81DC01ED91FC910190F081BE
-:10039000E02D612F09958A819B81DC01ED91FC9113
-:1003A0000190F081E02D602F09958A819B81DC010D
-:1003B000ED91FC910680F781E02DDF91CF911F91A7
-:1003C0000F910994CF93DF93EC018A819B81DC012B
-:1003D000ED91FC910084F185E02D09951816190620
-:1003E0005CF48A819B81DC01ED91FC910284F385B0
-:1003F000E02D099581E001C080E0DF91CF91089563
-:10040000089508950895089508950F931F93CF9325
-:10041000DF9300D000D0CDB7DEB7862F90E034E078
-:10042000959587953A95E1F78983462B4A832B83E7
-:100430000C830FE613E0F801838144E050E0BE0135
-:100440006F5F7F4F8F5F0E947D0CF80183818F5F0C
-:100450000E9458090F900F900F900F90DF91CF914D
-:100460001F910F910895CF92DF92EF92FF92CF9359
-:10047000DF9300D000D0CDB7DEB780915C039091C0
-:100480005D03A0915E03B0915F03409160035091C2
-:1004900061036091620370916303841B950BA60B4B
-:1004A000B70B8F739927AA27BB27892B8A2B8B2BF6
-:1004B00009F055C0809172030E94A10D882309F4B0
-:1004C0005FC0C0905C03D0905D03E0905E03F0904D
-:1004D0005F038FEFC81AD80AE80AF80A8FE3C82228
-:1004E000DD24EE24FF248091600390916103A091AC
-:1004F0006203B09163038C159D05AE05BF0579F1CC
-:10050000809172030E94A10D44E050E0BE016F5F34
-:100510007F4F809172030E94280D049704F180910F
-:100520005C0390915D03A0915E03B0915F03880F1F
-:10053000991F880F991FFC01E45AFD4F49815A8188
-:100540006B817C814083518362837383C0925C039F
-:10055000D0925D03E0925E03F0925F03BACF809188
-:10056000600390916103A0916203B0916303880FCF
-:10057000991F880F991FFC01E45AFD4F208101C08B
-:1005800020E040915C0350915D0360915E037091A7
-:100590005F038091600390916103A0916203B09129
-:1005A0006303481759076A077B07B9F08091600316
-:1005B00090916103A0916203B09163030196A11D24
-:1005C000B11D8F739927AA27BB278093600390934F
-:1005D0006103A0936203B093630381E0211101C022
-:1005E00080E00F900F900F900F90DF91CF91FF90D0
-:1005F000EF90DF90CF900895CF93DF93EC0148897F
-:1006000050E060E070E089899A890E94CE12E8810A
-:10061000F9810484F585E02DCE01DF91CF91099415
-:100620000F931F93CF93DF93E62FE295EF70E8507F
-:10063000E730F0F5022F142FEC01F0E0EE0FFF1F72
-:10064000E05DFE4F608171818A819B810E94D006AE
-:100650006DEC71E08A819B810E94D006612F70E071
-:100660006F5F7F4F8A819B810E941B0768ED71E05D
-:100670008A819B810E94D006402F50E060E070E0AC
-:1006800020E18A819B810E94D20664EE71E08A811A
-:100690009B810E94D0068A819B81DC01ED91FC91B7
-:1006A0000680F781E02DDF91CF911F910F91099482
-:1006B000DF91CF911F910F910895FF920F931F9398
-:1006C000CF93DF93E62FE295EF70E850E73008F024
-:1006D0004EC0F22E142FEC01F0E0EE0FFF1FE05D94
-:1006E000FE4F608171818A819B810E94D0066DECF2
-:1006F00071E08A819B810E94D006612F70E06F5F5C
-:100700007F4F8A819B810E941B0768ED71E08A817F
-:100710009B810E94D0064F2D50E060E070E020E108
-:100720008A819B810E94D20667EE71E08A819B815B
-:100730000E94D006402F50E060E070E020E18A8106
-:100740009B810E94D20664EE71E08A819B810E94A7
-:10075000D0068A819B81DC01ED91FC910680F781B6
-:10076000E02DDF91CF911F910F91FF900994DF91C0
-:10077000CF911F910F91FF900895CF93C82F8B3287
-:1007800058F5823108F0C251EC2FF0E0EF5AFE4FDD
-:10079000E49180917B00E3FB222720F930E095E093
-:1007A000220F331F9A95E1F78F7D282B20937B0032
-:1007B000E770E064E0937C0080917A00806480932D
-:1007C0007A0080917A0086FDFCCF8091780020919C
-:1007D000790090E0922B13C00E946D01009769F0A0
-:1007E000DC0113962C9113976C2F621BED91FC91F9
-:1007F0000680F781E02DCF91099480E090E0CF91C1
-:100800000895CF93DF93EC01888981506823CE014E
-:100810000E94550789850E94BD038985DF91CF918C
-:100820000C94BD03CF93DF93C82F8B3210F5682F44
-:1008300070E0FB01EE5CFE4F8491FB01ED5EFE4F2C
-:10084000D491FB01EC50FF4FC491CC2321F18111D5
-:100850000E94AF07EC2FF0E0EE0FFF1FEA51FF4FB1
-:10086000A591B491EC91ED2381E090E0B1F480E0AA
-:1008700014C00E946D01009771F0DC0113962C9159
-:1008800013976C2F621BED91FC910480F581E02D94
-:10089000DF91CF91099480E090E0DF91CF910895AE
-:1008A000CF93DF93EC01888981506823CE010E94A9
-:1008B00055078985DF91CF910C9412041F93CF9334
-:1008C000DF93C82F162F8B3240F5682F70E0FB01A5
-:1008D000EE5CFE4F8491FB01ED5EFE4FD491FB0177
-:1008E000EC50FF4FC491CC2361F181110E94AF07FE
-:1008F000EC2FF0E0EE0FFF1FE852FF4FA591B491EF
-:100900009FB7F894111104C08C91D095D82302C0E0
-:10091000EC91DE2BDC939FBF14C00E946D01009709
-:1009200081F0DC0113962C9113976C2F621BED91D3
-:10093000FC910280F381E02D412FDF91CF911F9137
-:100940000994DF91CF911F910895BF92CF92DF92CA
-:10095000EF92FF920F931F93CF93DF93EC0160E030
-:100960008E850E945E048F8581112BC010E08889DE
-:10097000181708F04FC0E989FA89E10FF11DC0800E
-:100980000D85BC84E12CF12CD12CB6010E2C02C0BB
-:10099000759567950A94E2F761708B2D0E945E044D
-:1009A00061E0802F0E945E0460E0802F0E945E0460
-:1009B0008FEFE81AF80A88E0E816F10431F71F5FB4
-:1009C000D6CF1889115017FD25C0E989FA89E10FA2
-:1009D000F11D17FDFA95C0800D85BC8487E0E82ED7
-:1009E000F12CD12CB6010E2C02C0759567950A9496
-:1009F000E2F761708B2D0E945E0461E0802F0E94FF
-:100A00005E0460E0802F0E945E0481E0E81AF10835
-:100A100048F7D8CF61E08E85DF91CF911F910F917C
-:100A2000FF90EF90DF90CF90BF900C945E04CF9337
-:100A3000DF938B3208F039C090E0FC01ED5EFE4F91
-:100A40002491FC01EC50FF4F8491882309F442C0AB
-:100A500090E0880F991FFC01E653FF4FC591D49198
-:100A6000FC01E852FF4FA591B491611109C09FB7F5
-:100A7000F8948881209582238883EC912E230BC0E3
-:100A8000623061F49FB7F8948881322F30958323C8
-:100A90008883EC912E2B2C939FBF1CC08FB7F894AA
-:100AA000E8812E2B28838FBF15C0D62FC82F0E9418
-:100AB0006D01009779F0DC0113962C9113976C2F40
-:100AC000621BED91FC910190F081E02D4D2FDF91A3
-:100AD000CF910994DF91CF910895CF93DF93EC01EB
-:100AE00061E08C850E94170561E08D850E941705E5
-:100AF00061E08E850E941705E881F9810684F785FB
-:100B0000E02DCE01DF91CF910994642FFC01818506
-:100B10000C9417050F931F93CF938C01C0E08C2F7B
-:100B200090E0F801268537858217930758F42285CF
-:100B30003385F901E80FF91F61E080810E941705F4
-:100B4000CF5FEDCFCF911F910F91089580E090E09E
-:100B5000089580E00895FC0182818F5BFB01808312
-:100B600081E008953FB7F89480917A0490917B04D6
-:100B7000A0917C04B0917D0426B5A89B05C02F3FB1
-:100B800019F00196A11DB11D3FBFBA2FA92F982FB3
-:100B90008827820F911DA11DB11DBC01CD0142E02E
-:100BA000660F771F881F991F4A95D1F70895611521
-:100BB000710579F0FB0101900020E9F73197AF0151
-:100BC000461B570BDC01ED91FC910280F381E02D77
-:100BD000099480E090E0089584E0E2E5F2E0DB0132
-:100BE00001900D928A95E1F784E00895CF92DF920B
-:100BF000EF92FF920F931F93CF93DF93CDB7DEB7A2
-:100C0000C456D1090FB6F894DEBF0FBECDBF6C013C
-:100C1000DB019C919E5F9C93FE01319684E6DF018F
-:100C20001D928A95E9F788E089838BE08A8322E028
-:100C30002C8391E09D839E8339E0398774E07A8725
-:100C40009E879F873A8B44E24B8B9C8B00E011E0A0
-:100C50001E8B0D8B89E0E82EF12CF88EEF8A998F90
-:100C60003B8F7C8F2F8F98A353E059A387E08CA3F1
-:100C70004DA39EA318A70FA301E410E01AA709A78C
-:100C800086E08BA74CA72DA79EA79FA789AB4AAB51
-:100C90002BAB2CAB2DAB3FAB48AF59AF9AAF5BAF93
-:100CA0009CAF2DAF9EAF21963FAF219722964FAFBD
-:100CB000229723965FAF239724962FAF24972596EC
-:100CC0007FAF259726969FAF269727969FAF2797AA
-:100CD00028969FAF28972A963FAF2A9745E02B96F4
-:100CE0004FAF2B972D962FAF2D9760E470E02F9686
-:100CF0007FAF6EAF2F9763964FAF639785E2649691
-:100D00008FAF649765969FAF659766969FAF66971E
-:100D100067969FAF679768963FAF689769964FAFA2
-:100D200069976B962FAF6B976D967FAF6EAF6D9790
-:100D3000A1964FAFA197A2968FAFA297A3969FAF10
-:100D4000A397A4969FAFA497A5965FAFA597D6014A
-:100D500012969C9112979B839B879F5F9A8F9D8F82
-:100D600013968C912C968FAF2C978F5F80686A9624
-:100D70008FAF6A9744E650E0BF0180E00E94E60929
-:100D8000CC59DF4F0FB6F894DEBF0FBECDBFDF9159
-:100D9000CF911F910F91FF90EF90DF90CF9008952A
-:100DA0000C94D7058F929F92AF92BF92EF92FF92D1
-:100DB0000F931F93CF93DF93CDB7DEB7A1970FB6F5
-:100DC000F894DEBF0FBECDBF7C01FA01CB0119A2A2
-:100DD000223008F42AE08E010F5D1F4F822E912CE5
-:100DE000A12CB12CBF01A50194010E948011F90131
-:100DF000CA01015011096A3014F4605D01C0695CD8
-:100E0000D8016C93232B242B252B61F7B801C70144
-:100E10000E94D705A1960FB6F894DEBF0FBECDBFD6
-:100E2000DF91CF911F910F91FF90EF90BF90AF9006
-:100E30009F908F900895CF92DF92EF92FF920F9341
-:100E40001F93CF93DF936B01770FEE08FF08F7FE38
-:100E50001FC0EC01E881F9810190F081E02D6DE285
-:100E600009958C0144275527BA014C195D096E0973
-:100E70007F092AE0CE010E94D206800F911FDF91E8
-:100E8000CF911F910F91FF90EF90DF90CF90089539
-:100E90002AE0B701A601DF91CF911F910F91FF903A
-:100EA000EF90DF90CF900C94D206EF92FF920F93C9
-:100EB0001F93CF93DF938C01D62FC0E0EE24E394F1
-:100EC000F12C8C2F90E0F801268537858217930747
-:100ED00088F4B7010C2E01C0660F0A94EAF76D235F
-:100EE00022853385F901E80FF91F80810E945E0495
-:100EF000CF5FE7CFDF91CF911F910F91FF90EF90E0
-:100F00000895CF92DF92EF92FF920E94B2056B019B
-:100F10007C010E94B205DC01CB018C199D09AE0950
-:100F2000BF09883E9340A105B10598F3FF90EF906B
-:100F3000DF90CF9008958091820481110DC082E0EE
-:100F400080937E0484E080937F0410928104109249
-:100F5000800481E0809382048EE794E0089590E01D
-:100F6000FC013197EF30F105B0F5EA5AFF4F0C94D0
-:100F7000A211809180008F7703C0809180008F7DC7
-:100F800080938000089580918000877FF9CF84B599
-:100F90008F7702C084B58F7D84BD089580919000C5
-:100FA0008F7707C0809190008F7D03C08091900063
-:100FB000877F8093900008958091C0008F7703C051
-:100FC0008091C0008F7D8093C00008958091C20001
-:100FD000877F8093C20008951F920F920FB60F92E1
-:100FE00011242F933F938F939F93AF93BF9380913F
-:100FF000670390916803A0916903B0916A033091EF
-:10100000790423E0230F2D3720F40196A11DB11D93
-:1010100005C026E8230F0296A11DB11D2093790477
-:101020008093670390936803A0936903B0936A0366
-:1010300080917A0490917B04A0917C04B0917D040E
-:101040000196A11DB11D80937A0490937B04A09317
-:101050007C04B0937D04BF91AF919F918F913F919C
-:101060002F910F900FBE0F901F9018954091E6049E
-:101070005091E7042091E4043091E50442175307AE
-:10108000B4F49091E8009570E1F39091E80092FD3E
-:1010900019C08093F1008091E6049091E7040196D5
-:1010A0008F739927892B19F48EEF8093E800809134
-:1010B000E6049091E70401969093E7048093E60498
-:1010C00081E0089580E008952FB7F89487708093A9
-:1010D000E9009091E800892F807295FF04C09091FB
-:1010E000F20080E4891B2FBF0895615030F02091F9
-:1010F000F100FC0120830196F8CF289A84E68093C2
-:10110000E9040895CF92DF92EF92FF920F931F931D
-:10111000CF93DF936C017A018B01C0E0D0E0CE1554
-:10112000DF0581F0D8016D918D01D601ED91FC9123
-:101130000190F081E02DC6010995892B11F02196CF
-:10114000EECF7E01C701DF91CF911F910F91FF90EC
-:10115000EF90DF90CF900895CF93DF931F92CDB79C
-:10116000DEB76983DC01ED91FC910280F381E02D13
-:1011700041E050E0BE016F5F7F4F09950F90DF9116
-:10118000CF91089583E00E94640890E0089580E084
-:1011900090E008950F931F93CF93DF93EC012B8979
-:1011A00088E0289F900111242115310529F0C901FB
-:1011B00007976817790728F0295F3F4F26173707E9
-:1011C00030F483E0769567958A95E1F76B8B1B8900
-:1011D00088898117F9F03C81E0917F03F0918003C9
-:1011E000828193814A8941502A81329F400D112486
-:1011F000012F0F775B812989359F200D11242F77CF
-:101200004F70DC01ED91FC910480F581E02D60EBE5
-:101210000995188BDF91CF911F910F910895FC01D3
-:1012200075876487089580E00895089508950F9361
-:10123000DC01ED91FC910480F581E02D00E0099541
-:101240000F9108950E94C912CF93DF93EC01898515
-:101250000E94BD032E853F8544E0880F991F4A9563
-:10126000E1F7821B930B9595879595958795280FA8
-:10127000391F3F872E87285F3F4FC90164E095954E
-:1012800087956A95E1F7EC85FD85309709F009951A
-:10129000E881F9810680F781E02DBC01CE01DF9164
-:1012A000CF91099480917B0390917C030C94401220
-:1012B0008093E9008091F200882319F08AE38093FB
-:1012C000E80008951F920F920FB60F9211242F93EA
-:1012D0003F934F935F936F937F938F939F93AF93BE
-:1012E000BF93CF93EF93FF93C091E1008091E10012
-:1012F000837F8093E100C3FF0FC01092E90081E07B
-:101300008093EB001092EC0082E38093ED0010924A
-:10131000660388E08093F000C2FF19C083E00E945A
-:1013200058098091EA04882339F08091EA048150B9
-:101330008093EA04882389F18091E904882339F0B5
-:101340008091E90481508093E904882341F1C4FF2E
-:1013500010C08091E2008E7E81608093E2008091D7
-:10136000E1008F7E8093E100809164038E7E806136
-:1013700011C0C0FF16C08091E2008E7E8061809314
-:10138000E2008091E1008E7E8093E1008091640311
-:101390008E7E81608093640304C05D98CDCF2898D1
-:1013A000D6CFFF91EF91CF91BF91AF919F918F9148
-:1013B0007F916F915F914F913F912F910F900FBE51
-:1013C0000F901F90189583E00C945809DF92EF92CC
-:1013D000FF920F931F93CF93DF93D82E8A017B0147
-:1013E000E40EF51EEB01CE15DF0571F0D7FE03C04C
-:1013F000FE01849101C088810E94360821968111E6
-:10140000F2CF8FEF9FEF01C0C801DF91CF911F9105
-:101410000F91FF90EF90DF9008950F931F93CF935C
-:10142000DF931F92CDB7DEB782E0898342E450E0BC
-:101430006DE571E080E80E94E6090E949B07DC01EF
-:1014400012960D911C9113970115110589F0D80181
-:10145000ED91FC910280F381E02DBE016F5F7F4F23
-:10146000C801099597FD04C0F80100851185ECCFEE
-:1014700089810F90DF91CF911F910F9108951F9255
-:101480000F920FB60F921124CF92DF92EF92FF923C
-:101490000F931F932F933F934F935F936F937F937C
-:1014A0008F939F93AF93BF93EF93FF93CF93DF936C
-:1014B000CDB7DEB76C97DEBFCDBF1092E90080914B
-:1014C000E80083FFFBC168E0CE0145960E947508E5
-:1014D00082EF8093E8008D8987FF05C09091E80036
-:1014E00090FFFCCF03C09EEF9093E800982F90767A
-:1014F00009F0C6C09E894F89588D2F89F88C9111AB
-:101500000CC0803829F4809165038093F10002C0FB
-:101510001092F1001092F10045C1913051F4811107
-:1015200041C14130510509F03DC1809165038D7F76
-:101530000BC0933061F4811135C14130510509F080
-:1015400031C1809165038260809365032BC1953022
-:1015500049F48091E80080FFFCCF822F806880935F
-:10156000E30020C1963009F05EC00B8D1C8D22E097
-:101570001092E9001092E7041092E604F21232C0D1
-:101580001092E5041092E4040E940D0A99E0BE0155
-:101590006F5F7F4FDB01E92F1D92EA95E9F7998391
-:1015A000FA8291E09E8390EA98879AEF998720913A
-:1015B000E6043091E704275F3F4F3C832B838D8304
-:1015C0001092E9001092E7041092E6041093E504EB
-:1015D0000093E40449E050E080E00E94E6090E94A4
-:1015E0000D0AE0C01093E5040093E4040E949B07F9
-:1015F000DC0112960D911C9113970115110509F448
-:10160000BBC0D801ED91FC910480F581E02DBE01B5
-:101610006B5E7F4FC8010995009709F0C7C0F801BC
-:1016200000851185EACF973009F445C1983021F43F
-:1016300081E08093F100B6C0993009F0B3C08370A7
-:1016400009F039C1E2E0F1E081E031E096E3208188
-:10165000211109C08EE78093EA001092EA008F8979
-:10166000809366039FC08093E9003093EB00219143
-:101670002093EC009093ED008F5F873041F7EACF25
-:101680008B8D9C8D1092E9001092E7041092E60475
-:101690009093E5048093E404898D811153C08E8971
-:1016A0009D89913A49F4813209F005C147E050E043
-:1016B0006CE071E080E0BBC0913209F0FCC0833285
-:1016C00069F48F89988DA0E0B0E080930801909331
-:1016D0000901A0930A01B0930B0164C0803269F440
-:1016E0008091E80082FFFCCF67E08CE091E00E94EF
-:1016F00075088BEF8093E80055C0823209F052C024
-:101700008F8980931301EEEFFFE7859194918B3FD2
-:101710009C4D19F0E0E0F8E002C0EEEFFAE08091B5
-:101720000C0190910D01A0910E01B0910F01803B31
-:101730009440A105B10509F09EC08091130180FF7E
-:1017400079C099C00E949B07FC0102811381011599
-:10175000110509F4B0C0D801ED91FC910190F08120
-:10176000E02DBE016B5E7F4FC801099581111AC043
-:10177000F80100851185EBCFF1E0FF1609F44EC0AA
-:10178000F3E0FF1298C08F89882309F44AC08230A1
-:1017900089F440E86DE081EC91E00E944B118823D0
-:1017A00009F489C08EEF8093E80088C018161906E6
-:1017B000CCF381C0813029F440E86BE085EB91E007
-:1017C000ECCF833009F077C00E949B07DC011296B2
-:1017D000ED90FC9013978E010F5F1F4F6801E1148D
-:1017E000F10479F0D701ED91FC910680F781E02DAD
-:1017F000B801C7010995080F111DF701E084F184B4
-:10180000EECFD8011C92F60101900020E9F7319744
-:10181000BF016C197D0940E0C601BFCF63EA71E0EA
-:1018200002C06FE971E0FB01449150E080E80E9442
-:10183000E609B8CFEE3F2AE0F20751F080819181AE
-:101840008737A7E79A0721F09093FF0A8093FE0A53
-:1018500087E797E791838083809160008093E80415
-:101860009BE088E10FB6F894A895809360000FBEC6
-:101870009093600097CF808191818737974709F0D7
-:1018800091CFA895809160008861809360008091DD
-:10189000E80480936000EE3FBAE0FB0739F08091E6
-:1018A000FE0A9091FF0A918380837CCF1092FF0AF9
-:1018B0001092FE0A77CF81E28093EB006C960FB610
-:1018C000F894DEBF0FBECDBFDF91CF91FF91EF91B6
-:1018D000BF91AF919F918F917F916F915F914F9148
-:1018E0003F912F911F910F91FF90EF90DF90CF903C
-:1018F0000F900FBE0F901F9018957F928F929F921E
-:10190000AF92BF92CF92DF92EF92FF920F931F930D
-:10191000CF93DF93C82E8B017A01809166038111EA
-:1019200003C08FEF9FEF70C08091640380FF05C0FC
-:101930008091E00082608093E000CE2DDF2DD12CDD
-:101940008AEFB82E8C2D8770982E8C2D8072882E61
-:101950008C2D8074782E9AE3A92E209719F4DD201F
-:1019600009F44DC08C2D0E946408811106C0BA9400
-:10197000BB20B9F20E948107F0CF282F30E0C217B8
-:10198000D3070CF48C2F9FB7F8949092E900209124
-:10199000E80025FF32C0282F30E0C21BD30B88207F
-:1019A00029F08150A0F01092F100FBCFF801C7FEA2
-:1019B0000AC0815050F044914093F1003196F9CF24
-:1019C00041914093F1008150D8F7020F131FDD20A1
-:1019D00019F0A092E8000AC08091E80085FD08C0D7
-:1019E000A092E800DD24D394209739F0D12C05C0D3
-:1019F000209719F47110A092E8009FBFAECF5D9AB6
-:101A000084E68093EA04C701DF91CF911F910F9183
-:101A1000FF90EF90DF90CF90BF90AF909F908F900E
-:101A20007F900895CF93DF93EC0180911301882379
-:101A300031F083E00E947D0C1816190634F081E025
-:101A400090E09B838A8380E090E0DF91CF910895BE
-:101A500090916603992311F057FF03C08FEF9FEF1A
-:101A600008959FB7F89487708093E9002091F20061
-:101A700030E0421753070CF49A01822FFB0144E631
-:101A8000815038F0289A4093E9045091F100519325
-:101A9000F7CF2115310521F08091F200882319F04C
-:101AA0009FBFC90108958BE68093E800F9CF0F939B
-:101AB0001F93CF93DF931F92CDB7DEB78C01FC014C
-:101AC0008485958597FF12C041E050E0BE016F5FAD
-:101AD0007F4F82E00E94280D019719F4898190E0E0
-:101AE00002C08FEF9FEFF80195878487F801848506
-:101AF00095850F90DF91CF911F910F910895CF930E
-:101B0000DF931F92CDB7DEB7FC018485958597FDE5
-:101B100005C02FEF3FEF358724870FC041E050E02D
-:101B2000BE016F5F7F4F82E00E94280D019719F47C
-:101B3000898190E002C08FEF9FEF0F90DF91CF91EE
-:101B400008959FB7F89487708093E9008091F20020
-:101B50009FBF0895FC018485958597FD06C082E0AE
-:101B60000E94A10D90E00196089582E00E94A10DCF
-:101B700090E008950F931F93CF93DF93EC018B01B7
-:101B8000FB0180810E94120421E0892B09F420E0EE
-:101B9000F8018181F22FF81BFF3F69F53FB7F894F8
-:101BA0008091670390916803A0916903B0916A03E3
-:101BB0003FBF4E855F8568897989841B950BA60B8D
-:101BC000B70B4E895F89688D798D481759076A0769
-:101BD0007B0710F53FB7F8948091670390916803F5
-:101BE000A0916903B0916A033FBF8E879F87A88B3E
-:101BF000B98B81E012C0F13079F43FB7F89480914D
-:101C0000670390916803A0916903B0916A033FBF95
-:101C10008E879F87A88BB98B80E0F8012183DF91A5
-:101C2000CF911F910F910895CF93DF93FC018EE127
-:101C300091E091838083A781B085109731F08581F1
-:101C4000968116969C938E93159780915802909149
-:101C50005902E817F90721F4B0935902A0935802EA
-:101C6000C581D681209711F0B887AF8380915A0241
-:101C700090915B02E817F90721F4D0935B02C093BF
-:101C80005A02DF91CF910895CF93DF93E9E4F4E016
-:101C900084E591E0749791838083A781B085109744
-:101CA00031F02581368116963C932E93159720911D
-:101CB0006B0330916C03E217F30721F4B0936C03CC
-:101CC000A0936B03C581D681209711F0B887AF83AD
-:101CD00020916D0330916E03E217F30721F4D09346
-:101CE0006E03C0936D0323E0E138F20799F680EAB2
-:101CF00091E09093540480935304809164049091F4
-:101D000065040E94401283E594E00E94140E86EB65
-:101D100091E090936804809367048091730490919C
-:101D200074040E94401287E694E0DF91CF910C94F6
-:101D3000140EFC018EE191E0918380836283168210
-:101D400015821086178280915A0290915B02892B2E
-:101D500021F4F0935B02E0935A02A0915802B091F3
-:101D60005902B087A783109721F01696FC93EE9343
-:101D70001597F0935902E0935802168215828091CC
-:101D800000018383680F6483609300010895FC0160
-:101D900084E591E0918380831282138281E08483C1
-:101DA000168215821086178280916D0390916E03C2
-:101DB000892B21F4F0936E03E0936D03A0916B03E4
-:101DC000B0916C03B087A783109721F01696FC930F
-:101DD000EE931597F0936C03E0936B0316821582D4
-:101DE0006187158614861786168688E891E09183A8
-:101DF00080838FEF808B87E0818B428B138A0895DD
-:101E000082E0809373038093740389E793E0909357
-:101E100076038093750310927803109277038EE512
-:101E200091E09093700380936F0380E8809379032F
-:101E300081E880937A030E949B07FC0121818091B5
-:101E4000730390E0820F911D0897C4F5A281B381BE
-:101E5000109729F48FE693E0938382830EC018963F
-:101E60008D919C911997009711F0DC01F8CF8FE6C6
-:101E700093E019969C938E931897808180937103B9
-:101E8000818180937203908180917403890F808394
-:101E900080E090917303891788F4A0917503B09145
-:101EA0007603A80FB11D9C91A181B0E0AF5FBE4F3A
-:101EB0009C9391819F5F91838F5FEBCF10929704EA
-:101EC0001092960488EE93E0A0E0B0E0809398042E
-:101ED00090939904A0939A04B0939B048AE691E0AE
-:101EE00090939504809394048FEF9FEF9093A104B7
-:101EF0008093A00480918A0481110BC010927C030E
-:101F000010927B0310927E0310927D0381E08093F8
-:101F10008A048BE793E09093800380937F0360E2D1
-:101F200087E694E00E94990E86EB91E09093680416
-:101F3000809367048CE18093700488EC91E0909327
-:101F4000720480937104109274041092730485E0FB
-:101F500090E0909376048093750480E290E09093F3
-:101F600078048093770487E694E00E948A0560E114
-:101F700083E594E00E94990E80EA91E090935404E6
-:101F80008093530410925C0481E080935D0492E09E
-:101F900090935E042EE020935F048093600420E120
-:101FA00020936104809362048FEF809366042093F2
-:101FB00055049093630482E090E00E94A8119093EE
-:101FC00065048093640483E594E00E946D0589E4D0
-:101FD00094E0909393048093920484E994E0909326
-:101FE0004C0480934B0490934E0480934D0480E006
-:101FF00092ECA1E0B0E080934F0490935004A09342
-:102000005104B093520484E991E090934A04809380
-:10201000490441E060916A0481E893E00E94C70EA0
-:1020200060916A046F5F42E085E993E00E94C70E09
-:1020300060916A046E5F43E089EA93E00E94C70EF4
-:1020400060916A046D5F44E08DEB93E00E94C70EDF
-:1020500060916A046C5F45E081ED93E00E94C70ED9
-:1020600060916A046B5F46E085EE93E00E94C70EC4
-:1020700060916A046A5F47E089EF93E00E94C70EAF
-:1020800060916A04695F48E08DE094E00E94C70EA9
-:1020900060916A04685F49E081E294E00E94C70EA3
-:1020A00060916A04675F4AE085E394E00C94C70E90
-:1020B000789484B5826084BD84B5816084BD85B523
-:1020C000826085BD85B5816085BD80916E0081602F
-:1020D00080936E00109281008091810082608093D5
-:1020E00081008091810081608093810080918000D7
-:1020F0008160809380008091910082608093910044
-:102100008091910081608093910080919000816026
-:10211000809390008091C10084608093C100809181
-:10212000C10082608093C1008091C1008160809372
-:10213000C1008091C30081608093C3008091C00082
-:1021400082608093C0008091C20081608093C20051
-:1021500080917A00846080937A0080917A00826016
-:1021600080937A0080917A00816080937A008091D8
-:102170007A00806880937A0010926603109265035B
-:10218000109264038091D70081608093D70080EA29
-:102190008093D80089B5806189BD89B5826089BD89
-:1021A00009B400FEFDCF0E9481078091D8008F7C8A
-:1021B00080618093D8008091E000807F8093E00070
-:1021C0008091E1008E7E8093E1008DE08093E200BB
-:1021D000559A209A5D982898CEE3D1E060E08991E5
-:1021E0000E94170581E0C434D807C1F788E4E82EBF
-:1021F00081E0F82E90E0C92E90E0D92EC0917F03A7
-:10220000D09180038A819B81892B01F58091920472
-:10221000909193049B838A83892B79F482E090E0E8
-:102220000E94A8119093930480939204DC01ED9294
-:10223000FC92998388839B838A838A819B81DC01BA
-:10224000ED91FC910190F081E02D099500916D03D5
-:1022500010916E030115110561F0D801ED91FC910B
-:102260000480F581E02DC8010995F80105811681EA
-:10227000F1CF8A819B81DC01ED91FC910280F38199
-:10228000E02D09958111F5CFC114D10409F4B6CF21
-:102290000E940000B3CFDF92EF92FF920F931F9343
-:1022A000CF93DF93D82EF92EE42E062F10E0C8012D
-:1022B0000196880F0E94360883E00E943608CD2DD3
-:1022C000DF2D0C0F1D1FC017D10789F0E7FE03C0DB
-:1022D000FE01849101C088810E943608F82E80E0BA
-:1022E0000E9436088F2121968111EDCF01C081E037
-:1022F000DF91CF911F910F91FF90EF90DF900895A4
-:10230000A1E21A2EAA1BBB1BFD010DC0AA1FBB1FF9
-:10231000EE1FFF1FA217B307E407F50720F0A21B6B
-:10232000B30BE40BF50B661F771F881F991F1A94D8
-:1023300069F760957095809590959B01AC01BD0102
-:10234000CF010895EE0FFF1F0590F491E02D099441
-:102350000F931F93CF93DF938230910510F482E0A7
-:1023600090E0E091ED04F091EE0420E030E0A0E098
-:10237000B0E0309719F140815181028113814817F3
-:102380005907C8F08417950769F4109731F0129631
-:102390000C93129713961C9327C00093ED0410938F
-:1023A000EE0422C02115310519F04217530718F425
-:1023B0009A01BD01EF01DF01F801DBCF21153105E5
-:1023C000F9F0281B390B2430310580F48A819B8178
-:1023D0006115710521F0FB019383828304C0909302
-:1023E000EE048093ED04FE01329644C0FE01E20F3C
-:1023F000F31F8193919322503109398328833AC086
-:102400002091EB043091EC04232B41F42091160130
-:10241000309117013093EC042093EB0420911401C8
-:10242000309115012115310541F42DB73EB740918A
-:10243000180150911901241B350BE091EB04F09128
-:10244000EC04E217F307A0F42E1B3F0B2817390703
-:1024500078F0AC014E5F5F4F2417350748F04E0F00
-:102460005F1F5093EC044093EB048193919302C05F
-:10247000E0E0F0E0CF01DF91CF911F910F9108953F
-:10248000CF93DF93009709F481C0FC013297138248
-:102490001282A091ED04B091EE04109781F4208196
-:1024A0003181820F931F2091EB043091EC042817A7
-:1024B000390751F5F093EC04E093EB0467C0ED01AC
-:1024C00020E030E0CE17DF0740F44A815B819E01B7
-:1024D00041155105F1F0EA01F5CFD383C283408164
-:1024E0005181840F951FC817D90759F488819981A4
-:1024F000840F951F0296918380838A819B819383A9
-:1025000082832115310529F4F093EE04E093ED0464
-:102510003DC0E901FB83EA8349915991C40FD51F5E
-:10252000EC17FD0761F480819181840F951F02965D
-:10253000E90199838883828193819B838A83E0E088
-:10254000F0E012968D919C911397009719F0FD0180
-:10255000DC01F7CF8D919C9111979D012E5F3F4F2C
-:10256000820F931F2091EB043091EC042817390758
-:1025700069F4309729F41092EE041092ED0402C031
-:1025800013821282B093EC04A093EB04DF91CF91FD
-:10259000089581E090E0F8940C94D512DC0101C01C
-:1025A0006D9341505040E0F7089510E0C9EED0E03F
-:1025B00004C0FE010E94A2112196CA3ED107C9F7AC
-:0425C000F894FFCFBD
-:1025C4002B00C18081000000FFFFFFFF00E100003D
-:1025D400000000000000EF0480000000000003027F
-:1025E40003020202020201020002000200020002CF
-:1025F400F301FD0107021502250235024602040516
-:10260400060708090000000000023302050217094A
-:102614000000000004020002000200000000A905FE
-:10262400F605A605EC0500000000AC08120DC20872
-:10263400E309AA0D7F0D570D000000000F090002E9
-:1026440024092209000000000F0900022409CA0815
-:10265400000000008201E2015D031003000000009D
-:10266400030239011401020201026D05A504FC02F2
-:102674000002000000008505030250040104010269
-:102684008A050002000200020F15141312094368A0
-:10269400616E6E656C3A2000094461746120313AC0
-:1026A400203078000D0A00094461746120323A2018
-:1026B4003078004E6F7465204F666609004E6F7463
-:1026C40065204F6E0909004B65792050726573735C
-:1026D4007572650900436F6E74726F6C2043686194
-:1026E4006E6765090050726F6772616D204368619F
-:1026F4006E676509004368616E6E656C2050726593
-:1027040073737572650050697463682042656E6402
-:0827140009004D494449000091
+:1001D000190F810C11241FBECFEFDAE0DEBFCDBFB7
+:1001E00012E0A0E0B1E0EEE1F3E202C005900D9272
+:1001F000A837B107D9F725E0A8E7B2E001C01D9202
+:10020000A636B207E1F710E0C9EED0E004C02197AE
+:10021000FE010E944F10C83ED107C9F70E94D60CBC
+:100220000C9482110C9400000F931F93CF93DF93D3
+:10023000EC012B8988E0289F9001112421153105BC
+:1002400029F0C90107976817790728F0295F3F4F00
+:100250002617370730F483E0769567958A95E1F79E
+:100260006B8B1B8988898117F9F03C81E0910E0422
+:10027000F0910F04828193814A8941502A81329FF3
+:10028000400D1124012F0F775B812989359F200DA7
+:1002900011242F774F70DC01ED91FC910480F581E2
+:1002A000E02D60EB0995188BDF91CF911F910F9195
+:1002B0000895FC0175876487089580E00895089586
+:1002C00008950F93DC01ED91FC910480F581E02D00
+:1002D00000E009950F910895FC01928183896917C7
+:1002E00010F0982F04C0962F96959695969589179D
+:1002F000A9F00188F289E02DE90FF11D97FDFA952B
+:10030000677081E090E001C0880F6A95EAF720816C
+:10031000282381E090E021F480E0089580E090E0DF
+:100320000895DC0112963C91129753962C91631715
+:1003300010F0E22F04C0E62FE695E695E6952E171D
+:1003400019F10E2E000CFF0BDC0151962D913C9102
+:1003500052976770E20FF31F21E030E002C0220FD6
+:10036000331F6A95E2F7442319F03081232B04C030
+:1003700020953095308123232083DC01ED91FC9181
+:100380000484F585E02D09940895E0917A02F091B6
+:100390007B02309741F09381891740F0948189174F
+:1003A00028F4CF01089580E090E008950580F6815B
+:1003B000E02DEFCFCF93C82F8B3258F5823108F064
+:1003C000C251EC2FF0E0EA51FF4FE49180917B00A5
+:1003D000E3FB222720F930E095E0220F331F9A95A6
+:1003E000E1F78F7D282B20937B00E770E064E0939A
+:1003F0007C0080917A00806480937A0080917A00FA
+:1004000086FDFCCF809178002091790090E0922BBE
+:1004100013C00E94C501009769F0DC0113962C916E
+:1004200013976C2F621BED91FC910680F781E02DF4
+:10043000CF91099480E090E0CF910895CF93DF931E
+:10044000EC0189850E94DA012E853F8544E0880F02
+:10045000991F4A95E1F7821B930B95958795959582
+:100460008795280F391F3F872E87285F3F4FC90187
+:1004700064E0959587956A95E1F7EC85FD85309761
+:1004800009F00995E881F9810680F781E02DBC012A
+:10049000CE01DF91CF910994CF93DF938B3208F097
+:1004A00039C090E0FC01E15EFE4F2491FC01E05078
+:1004B000FF4F8491882309F442C090E0880F991F70
+:1004C000FC01E653FF4FC591D491FC01EE50FF4F64
+:1004D000A591B491611109C09FB7F89488812095C6
+:1004E00082238883EC912E230BC0623061F49FB786
+:1004F000F8948881322F309583238883EC912E2BBA
+:100500002C939FBF1CC08FB7F894E8812E2B2883B3
+:100510008FBF15C0D62FC82F0E94C501009779F054
+:10052000DC0113962C9113976C2F621BED91FC91BB
+:100530000190F081E02D4D2FDF91CF910994DF9153
+:10054000CF910895CF93DF93EC0161E08C850E94F9
+:100550004C0261E08D850E944C0261E08E850E9414
+:100560004C02E881F9810684F785E02DCE01DF9108
+:10057000CF910994642FFC0181850C944C020F9358
+:100580001F93CF938C01C0E08C2F90E0F80126855B
+:1005900037858217930758F422853385F901E80FD0
+:1005A000F91F61E080810E944C02CF5FEDCFCF91B7
+:1005B0001F910F91089508950895089508950E9438
+:1005C000761180910A0490910B040C94ED100F9316
+:1005D0001F93CF93DF9300D000D0CDB7DEB7862F27
+:1005E00090E034E0959587953A95E1F78983462B1D
+:1005F0004A832B830C830EEF13E0F801838144E0E0
+:1006000050E0BE016F5F7F4F8F5F0E946C08F80162
+:1006100083818F5F0E94BA050F900F900F900F900B
+:10062000DF91CF911F910F910895CF92DF92EF92BA
+:10063000FF92CF93DF9300D000D0CDB7DEB780918B
+:100640007C0390917D03A0917E03B0917F03409144
+:100650008003509181036091820370918303841B16
+:10066000950BA60BB70B8F739927AA27BB27892B4E
+:100670008A2B8B2B09F055C0809101040E94300910
+:10068000882309F45FC0C0907C03D0907D03E09084
+:100690007E03F0907F038FEFC81AD80AE80AF80AA1
+:1006A0008FE3C822DD24EE24FF2480918003909103
+:1006B0008103A0918203B09183038C159D05AE0543
+:1006C000BF0579F1809101040E94300944E050E0B7
+:1006D000BE016F5F7F4F809101040E940109049762
+:1006E00004F180917C0390917D03A0917E03B091F1
+:1006F0007F03880F991F880F991FFC01E458FD4F55
+:1007000049815A816B817C814083518362837383E9
+:10071000C0927C03D0927D03E0927E03F0927F032F
+:10072000BACF8091800390918103A0918203B09110
+:100730008303880F991F880F991FFC01E458FD4F10
+:10074000208101C020E040917C0350917D036091A5
+:100750007E0370917F038091800390918103A0912B
+:100760008203B0918303481759076A077B07B9F0E2
+:100770008091800390918103A0918203B0918303C3
+:100780000196A11DB11D8F739927AA27BB278093BE
+:10079000800390938103A0938203B093830381E04D
+:1007A000211101C080E00F900F900F900F90DF910A
+:1007B000CF91FF90EF90DF90CF900895CF93DF938C
+:1007C000EC01488950E060E070E089899A890E94D4
+:1007D0007B11E881F9810484F585E02DCE01DF915C
+:1007E000CF910994CF93DF93C82F8B3210F5682FE8
+:1007F00070E0FB01E25CFE4F8491FB01E15EFE4F85
+:10080000D491FB01E050FF4FC491CC2321F1811121
+:100810000E943909EC2FF0E0EE0FFF1FE852FF4F66
+:10082000A591B491EC91ED2381E090E0B1F480E0EA
+:1008300014C00E94C501009771F0DC0113962C9141
+:1008400013976C2F621BED91FC910480F581E02DD4
+:10085000DF91CF91099480E090E0DF91CF910895EE
+:100860000F931F93CF93DF93EC018B01FB018081EA
+:100870000E94F20321E0892B09F420E0F801818134
+:10088000F22FF81BFF3F69F53FB7F8948091E8031A
+:100890009091E903A091EA03B091EB033FBF4E852D
+:1008A0005F8568897989841B950BA60BB70B4E89E8
+:1008B0005F89688D798D481759076A077B0710F59E
+:1008C0003FB7F8948091E8039091E903A091EA037F
+:1008D000B091EB033FBF8E879F87A88BB98B81E0D8
+:1008E00012C0F13079F43FB7F8948091E803909109
+:1008F000E903A091EA03B091EB033FBF8E879F8786
+:10090000A88BB98B80E0F8012183DF91CF911F91F3
+:100910000F910895CF93DF93EC018889815068236C
+:10092000CE010E94760B89850E94DA018985DF91CC
+:10093000CF910C94DA01CF93DF93EC018889815039
+:100940006823CE010E94760B8985DF91CF910C94AC
+:10095000F2031F920F920FB60F9211242F933F9321
+:100960008F939F93AF93BF938091E8039091E90396
+:10097000A091EA03B091EB033091E70323E0230F4A
+:100980002D3720F40196A11DB11D05C026E8230FC7
+:100990000296A11DB11D2093E7038093E803909375
+:1009A000E903A093EA03B093EB038091EC039091E9
+:1009B000ED03A091EE03B091EF030196A11DB11DCF
+:1009C0008093EC039093ED03A093EE03B093EF03B9
+:1009D000BF91AF919F918F913F912F910F900FBE3B
+:1009E0000F901F901895CF93DF938B3220F4DF91F7
+:1009F000CF910C947609D62FC82F0E94C50100977D
+:100A000079F0DC0113962C9113976C2F621BED91FA
+:100A1000FC910280F381E02D4D2FDF91CF9109945D
+:100A2000DF91CF910895BF92CF92DF92EF92FF9224
+:100A30000F931F93CF93DF93C82ED62EB42EC7E00B
+:100A4000D0E0022F10E087E0E82EF12CB11005C0B5
+:100A5000C7018C1B9D0BB80102C0B8018C2F02C0CE
+:100A6000759567958A95E2F761708C2D0E94F30465
+:100A700061E08D2D0E94F30460E08D2D0E94F3044F
+:100A8000219720F7DF91CF911F910F91FF90EF9069
+:100A9000DF90CF90BF9008951F93CF93DF93EC0129
+:100AA00060E08E850E94F3048F85811110C010E0F4
+:100AB00088891817E8F4E989FA89E10FF11D208186
+:100AC00040E06D858C850E9413051F5FF1CF18896A
+:100AD000115017FD0DC0E989FA89E10FF11D17FDCD
+:100AE000FA95208141E06D858C850E941305F0CF39
+:100AF00061E08E85DF91CF911F910C94F3044091BA
+:100B0000F3035091F4032091F1033091F203421763
+:100B10005307B4F49091E8009570E1F39091E800E8
+:100B200092FD19C08093F1008091F3039091F4033A
+:100B300001968F739927892B19F48EEF8093E80023
+:100B40008091F3039091F40301969093F4038093C2
+:100B5000F30381E0089580E00895615030F0209122
+:100B6000F100FC0120830196F8CF289A84E6809357
+:100B7000F70308958093E9008091F200882319F02B
+:100B80008AE38093E8000895DF92EF92FF920F933B
+:100B90001F93CF93DF93D82E8A017B01E40EF51EBD
+:100BA000EB01CE15DF0571F0D7FE03C0FE01849185
+:100BB00001C088810E947F0521968111F2CF8FEFBD
+:100BC0009FEF01C0C801DF91CF911F910F91FF905E
+:100BD000EF90DF9008950F931F93CF93DF931F92B1
+:100BE000CDB7DEB782E0898342E450E06DE571E085
+:100BF00080E80E94C4050E94BC0BDC0112960D9196
+:100C00001C9113970115110589F0D801ED91FC9104
+:100C10000280F381E02DBE016F5F7F4FC80109950F
+:100C200097FD04C0F80100851185ECCF89810F90F4
+:100C3000DF91CF911F910F9108951F920F920FB6E0
+:100C40000F921124CF92DF92EF92FF920F931F9396
+:100C50002F933F934F935F936F937F938F939F93C4
+:100C6000AF93BF93EF93FF93CF93DF93CDB7DEB7EF
+:100C70006C97DEBFCDBF1092E9008091E80083FF42
+:100C8000FBC168E0CE0145960E94AD0582EF8093DE
+:100C9000E8008D8987FF05C09091E80090FFFCCFA8
+:100CA00003C09EEF9093E800982F907609F0C6C09D
+:100CB0009E894F89588D2F89F88C91110CC08038EE
+:100CC00029F48091F0038093F10002C01092F100AA
+:100CD0001092F10045C1913051F4811141C1413070
+:100CE000510509F03DC18091F0038D7F0BC0933019
+:100CF00061F4811135C14130510509F031C1809154
+:100D0000F00382608093F0032BC1953049F4809109
+:100D1000E80080FFFCCF822F80688093E30020C131
+:100D2000963009F05EC00B8D1C8D22E01092E90018
+:100D30001092F4031092F303F21232C01092F203F5
+:100D40001092F1030E94EB0599E0BE016F5F7F4FA7
+:100D5000DB01E92F1D92EA95E9F79983FA8291E088
+:100D60009E8390EA98879AEF99872091F3033091B8
+:100D7000F403275F3F4F3C832B838D831092E90060
+:100D80001092F4031092F3031093F2030093F10313
+:100D900049E050E080E00E94C4050E94EB05E0C0FD
+:100DA0001093F2030093F1030E94BC0BDC01129636
+:100DB0000D911C9113970115110509F4BBC0D801C1
+:100DC000ED91FC910480F581E02DBE016B5E7F4FBB
+:100DD000C8010995009709F0C7C0F8010085118581
+:100DE000EACF973009F445C1983021F481E080932F
+:100DF000F100B6C0993009F0B3C0837009F039C171
+:100E0000EEE0F1E081E031E096E32081211109C0BC
+:100E10008EE78093EA001092EA008F898093F903AD
+:100E20009FC08093E9003093EB0021912093EC0068
+:100E30009093ED008F5F873041F7EACF8B8D9C8DCB
+:100E40001092E9001092F4031092F3039093F203CE
+:100E50008093F103898D811153C08E899D89913AC8
+:100E600049F4813209F005C147E050E065E071E0E6
+:100E700080E0BBC0913209F0FCC0833269F48F89F5
+:100E8000988DA0E0B0E08093010190930201A093BF
+:100E90000301B093040164C0803269F48091E800DA
+:100EA00082FFFCCF67E085E091E00E94AD058BEF0B
+:100EB0008093E80055C0823209F052C08F89809338
+:100EC0000C01EEEFFFE7859194918B3F9C4D19F05B
+:100ED000E0E0F8E002C0EEEFFAE0809105019091C9
+:100EE0000601A0910701B0910801803B9440A10543
+:100EF000B10509F09EC080910C0180FF79C099C0B6
+:100F00000E94BC0BFC01028113810115110509F43B
+:100F1000B0C0D801ED91FC910190F081E02DBE01AF
+:100F20006B5E7F4FC801099581111AC0F8010085D9
+:100F30001185EBCFF1E0FF1609F44EC0F3E0FF128C
+:100F400098C08F89882309F44AC0823089F440E828
+:100F50006DE081EC91E00E94AB0E882309F489C01A
+:100F60008EEF8093E80088C018161906CCF381C074
+:100F7000813029F440E86BE085EB91E0ECCF8330E1
+:100F800009F077C00E94BC0BDC011296ED90FC903A
+:100F900013978E010F5F1F4F6801E114F10479F080
+:100FA000D701ED91FC910680F781E02DB801C701D2
+:100FB0000995080F111DF701E084F184EECFD801E7
+:100FC0001C92F60101900020E9F73197BF016C19DE
+:100FD0007D0940E0C601BFCF63EA71E002C06FE95E
+:100FE00071E0FB01449150E080E80E94C405B8CF55
+:100FF000EE3F2AE0F20751F0808191818737A7E721
+:101000009A0721F09093FF0A8093FE0A87E797E7FB
+:1010100091838083809160008093F5039BE088E159
+:101020000FB6F894A895809360000FBE909360006F
+:1010300097CF808191818737974709F091CFA89505
+:10104000809160008861809360008091F5038093B7
+:101050006000EE3FBAE0FB0739F08091FE0A909104
+:10106000FF0A918380837CCF1092FF0A1092FE0AC0
+:1010700077CF81E28093EB006C960FB6F894DEBFD9
+:101080000FBECDBFDF91CF91FF91EF91BF91AF9197
+:101090009F918F917F916F915F914F913F912F9190
+:1010A0001F910F91FF90EF90DF90CF900F900FBEA8
+:1010B0000F901F9018952FB7F89487708093E900D0
+:1010C0009091E800892F807295FF04C09091F20002
+:1010D00080E4891B2FBF08957F928F929F92AF92D9
+:1010E000BF92CF92DF92EF92FF920F931F93CF9315
+:1010F000DF93C82E8B017A018091F903811103C01F
+:101100008FEF9FEF70C08091F60380FF05C0809144
+:10111000E00082608093E000CE2DDF2DD12C8AEF9D
+:10112000B82E8C2D8770982E8C2D8072882E8C2D49
+:101130008074782E9AE3A92E209719F4DD2009F403
+:101140004DC08C2D0E945B08811106C0BA94BB2053
+:10115000B9F20E94A20BF0CF282F30E0C217D307BC
+:101160000CF48C2F9FB7F8949092E9002091E8003E
+:1011700025FF32C0282F30E0C21BD30B882029F076
+:101180008150A0F01092F100FBCFF801C7FE0AC019
+:10119000815050F044914093F1003196F9CF419144
+:1011A0004093F1008150D8F7020F131FDD2019F092
+:1011B000A092E8000AC08091E80085FD08C0A092D6
+:1011C000E800DD24D394209739F0D12C05C0209776
+:1011D00019F47110A092E8009FBFAECF5D9A84E62B
+:1011E0008093F803C701DF91CF911F910F91FF907A
+:1011F000EF90DF90CF90BF90AF909F908F907F90B7
+:1012000008959091F903992311F057FF03C08FEFD0
+:101210009FEF08959FB7F89487708093E90020911D
+:10122000F20030E0421753070CF49A01822FFB01C1
+:1012300044E6815038F0289A4093F7035091F1002A
+:101240005193F7CF2115310521F08091F2008823C9
+:1012500019F09FBFC90108958BE68093E800F9CF8C
+:101260009FB7F89487708093E9008091F2009FBF48
+:10127000089590E0FC013197EF30F105B0F5EA5A9E
+:10128000FF4F0C944F10809180008F7703C08091A6
+:1012900080008F7D80938000089580918000877FFB
+:1012A000F9CF84B58F7702C084B58F7D84BD089552
+:1012B000809190008F7707C0809190008F7D03C050
+:1012C00080919000877F8093900008958091C00066
+:1012D0008F7703C08091C0008F7D8093C0000895F8
+:1012E0008091C200877F8093C20008951F93CF939F
+:1012F000DF93282F30E0F901E25CFE4F8491F90181
+:10130000E15EFE4FD491F901E050FF4FC491CC2330
+:10131000C1F0162F81110E943909EC2FF0E0EE0F79
+:10132000FF1FEE50FF4FA591B4919FB7F894111194
+:1013300004C08C91D095D82302C0EC91DE2BDC93B5
+:101340009FBFDF91CF911F9108953FB7F89480918F
+:10135000EC039091ED03A091EE03B091EF0326B55D
+:10136000A89B05C02F3F19F00196A11DB11D3FBFDD
+:10137000BA2FA92F982F8827820F911DA11DB11D6B
+:10138000BC01CD0142E0660F771F881F991F4A9567
+:10139000D1F7089580E090E0089580E00895CF921D
+:1013A000DF92EF92FF920F931F93CF93DF936C0125
+:1013B0007A018B01C0E0D0E0CE15DF0581F0D801C5
+:1013C0006D918D01D601ED91FC910190F081E02DA0
+:1013D000C6010995892B11F02196EECF7E01C70138
+:1013E000DF91CF911F910F91FF90EF90DF90CF9001
+:1013F0000895FC0182818F5BFB01808381E0089569
+:10140000CF93DF931F92CDB7DEB76983DC01ED91F7
+:10141000FC910280F381E02D41E050E0BE016F5F5E
+:101420007F4F09950F90DF91CF910895089580E047
+:1014300090E0089584E0E3E7F2E0DB0101900D9293
+:101440008A95E1F784E00895CF92DF92EF92FF92C0
+:101450000F931F93CF93DF93CDB7DEB7C456D10957
+:101460000FB6F894DEBF0FBECDBF6C01DB019C91BF
+:101470009E5F9C93FE01319684E6DF011D928A9562
+:10148000E9F788E089838BE08A8322E02C8391E06E
+:101490009D839E8339E0398774E07A879E879F8792
+:1014A0003A8B44E24B8B9C8B00E011E01E8B0D8B42
+:1014B00089E0E82EF12CF88EEF8A998F3B8F7C8F94
+:1014C0002F8F98A353E059A387E08CA34DA39EA32D
+:1014D00018A70FA301E410E01AA709A786E08BA7BD
+:1014E0004CA72DA79EA79FA789AB4AAB2BAB2CABD4
+:1014F0002DAB3FAB48AF59AF9AAF5BAF9CAF2DAFB1
+:101500009EAF21963FAF219722964FAF2297239609
+:101510005FAF239724962FAF249725967FAF25970B
+:1015200026969FAF269727969FAF279728969FAF1F
+:1015300028972A963FAF2A9745E02B964FAF2B97D7
+:101540002D962FAF2D9760E470E02F967FAF6EAF92
+:101550002F9763964FAF639785E264968FAF64973A
+:1015600065969FAF659766969FAF669767969FAFA4
+:10157000679768963FAF689769964FAF69976B9684
+:101580002FAF6B976D967FAF6EAF6D97A1964FAFF4
+:10159000A197A2968FAFA297A3969FAFA397A49669
+:1015A0009FAFA497A5965FAFA597D60112969C9181
+:1015B00012979B839B879F5F9A8F9D8F13968C9129
+:1015C0002C968FAF2C978F5F80686A968FAF6A9743
+:1015D00044E650E0BF0180E00E94C405CC59DF4FD3
+:1015E0000FB6F894DEBF0FBECDBFDF91CF911F9134
+:1015F0000F91FF90EF90DF90CF900895CF93DF93FE
+:10160000EC0180910C01882331F083E00E946C088A
+:101610001816190634F081E090E09B838A8380E0FD
+:1016200090E0DF91CF91089583E00C94BA0583E0B8
+:101630000E945B0890E008950F931F93CF93DF9370
+:101640001F92CDB7DEB78C01FC018485958597FF8D
+:1016500012C041E050E0BE016F5F7F4F82E00E9408
+:101660000109019719F4898190E002C08FEF9FEF83
+:10167000F80195878487F801848595850F90DF911F
+:10168000CF911F910F910895CF93DF931F92CDB704
+:10169000DEB7FC018485958597FD05C02FEF3FEFF0
+:1016A000358724870FC041E050E0BE016F5F7F4F58
+:1016B00082E00E940109019719F4898190E002C03B
+:1016C0008FEF9FEF0F90DF91CF910895FC018485FC
+:1016D000958597FD06C082E00E94300990E0019652
+:1016E000089582E00E94300990E00895EF92FF9201
+:1016F0000F931F93CF93DF938C01D62FC0E0EE247E
+:10170000E394F12C8C2F90E0F80126853785821721
+:10171000930788F4B7010C2E01C0660F0A94EAF70C
+:101720006D2322853385F901E80FF91F80810E941E
+:10173000F304CF5FE7CFDF91CF911F910F91FF901F
+:10174000EF900895CF92DF92EF92FF920E94A50949
+:101750006B017C010E94A509DC01CB018C199D095C
+:10176000AE09BF09883E9340A105B10598F3FF90EB
+:10177000EF90DF90CF9008958091020581110DC008
+:1017800082E08093FE0484E08093FF0410920105C0
+:101790001092000581E0809302058EEF94E0089599
+:1017A0001F920F920FB60F9211242F933F934F93D6
+:1017B0005F936F937F938F939F93AF93BF93CF93D9
+:1017C000EF93FF93C091E1008091E100837F8093CC
+:1017D000E100C3FF0FC01092E90081E08093EB00AD
+:1017E0001092EC0082E38093ED001092F90388E000
+:1017F0008093F000C2FF19C083E00E94BA05809177
+:10180000F803882339F08091F80381508093F8031E
+:10181000882389F18091F703882339F08091F703B9
+:1018200081508093F703882341F1C4FF10C0809159
+:10183000E2008E7E81608093E2008091E1008F7EE5
+:101840008093E1008091F6038E7E806111C0C0FF1D
+:1018500016C08091E2008E7E80618093E2008091CC
+:10186000E1008E7E8093E1008091F6038E7E8160A0
+:101870008093F60304C05D98CDCF2898D6CFFF9112
+:10188000EF91CF91BF91AF919F918F917F916F9188
+:101890005F914F913F912F910F900FBE0F901F902E
+:1018A0001895CF93DF93FC018EE191E091838083C3
+:1018B000A781B085109731F08581968116969C930B
+:1018C0008E9315978091780290917902E817F90725
+:1018D00021F4B0937902A0937802C581D681209734
+:1018E00011F0B887AF8380917A0290917B02E8175C
+:1018F000F90721F4D0937B02C0937A02DF91CF9154
+:101900000895CF93DF93E8EDF4E086E092E07497DA
+:1019100091838083A781B085109731F0258136812E
+:1019200016963C932E9315972091FA033091FB0362
+:10193000E217F30721F4B093FB03A093FA03C581E8
+:10194000D681209711F0B887AF832091FC033091A6
+:10195000FD03E217F30721F4D093FD03C093FC03CA
+:1019600024E0E031F20799F686E492E09093D904FE
+:101970008093D8048091E9049091EA040E94ED10CC
+:1019800088ED94E00E94510C8CE592E09093ED0478
+:101990008093EC048091F8049091F9040E94ED107A
+:1019A0008CEE94E0DF91CF910C94510C789484B537
+:1019B000826084BD84B5816084BD85B5826085BD4B
+:1019C00085B5816085BD80916E00816080936E00D9
+:1019D00010928100809181008260809381008091CB
+:1019E000810081608093810080918000816080937C
+:1019F000800080919100826080939100809191009D
+:101A0000816080939100809190008160809390002C
+:101A10008091C10084608093C1008091C100826088
+:101A20008093C1008091C10081608093C10080914A
+:101A3000C30081608093C3008091C0008260809366
+:101A4000C0008091C20081608093C20080917A00C2
+:101A5000846080937A0080917A00826080937A001B
+:101A600080917A00816080937A0080917A0080680A
+:101A700080937A001092F9031092F0031092F6030B
+:101A80008091D70081608093D70080EA8093D8004E
+:101A900089B5806189BD89B5826089BD09B400FEC0
+:101AA000FDCF0E94A20B8091D8008F7C8061809333
+:101AB000D8008091E000807F8093E0008091E10079
+:101AC0008E7E8093E1008DE08093E200559A209A0B
+:101AD0005D982898CCEFD1E060E089910E944C029B
+:101AE00082E0C230D807C1F787EE93E0E7E8F3E081
+:101AF00011928E179F07E1F788ED94E00E94A202F1
+:101B000011E03CEF232E31E0332E44E3442E41E03C
+:101B1000542E50E0652E50E0752E60E080E10E946A
+:101B2000760920E041E061E08EE00E94130521E0AB
+:101B300041E061E08EE00E94130561E080E10E94D7
+:101B400076099CE3C92E91E0D92E27E8A22E23E046
+:101B5000B22EE60175018CEF882E81E0982ED4011B
+:101B60008D914D010E94F203F701813099F580813A
+:101B700081114EC0888129818130B1F4E0910E0439
+:101B8000F0910F04A281B38190918603290F2F77E2
+:101B9000ED91FC9111970480F581E02D0FE74FE066
+:101BA00060E9CD01099513C0823089F4211106C086
+:101BB000809186038C3058F08C5007C0213039F466
+:101BC00080918603853C18F4845F80938603D70157
+:101BD0001C931EC080818823D9F088818130B1F4A4
+:101BE000E0910E04F0910F04A281B38129819091BC
+:101BF0008603290F2F77ED91FC9111970480F581D1
+:101C0000E02D0FE74FE060E8CD010995D7011C9268
+:101C1000B0E1EB0EF11C2296E2E08E16E2E09E06A9
+:101C200009F09DCF60E08EE00E94760960E080E1DF
+:101C30000E94760961E081E00E94760960E081E01F
+:101C40000E94760961E080E10E947609FFEFAF1AF9
+:101C5000BF0A8CE0C80ED11C2C143D0409F079CFCA
+:101C6000C0910E04D0910F048A819B81892B01F5CC
+:101C700080918403909185039B838A83892B79F4D7
+:101C800082E090E00E945510909385038093840336
+:101C9000DC014D925C92998388839B838A838A813D
+:101CA0009B81DC01ED91FC910190F081E02D099583
+:101CB000E090FC03F090FD03E114F10461F0D70122
+:101CC000ED91FC910480F581E02DC7010995F701A4
+:101CD000E580F680F1CF8A819B81DC01ED91FC915A
+:101CE0000280F381E02D09958111F5CF6114710413
+:101CF00009F413CF0E94000010CFFC018EE191E0A7
+:101D00009183808362831682158210861782809168
+:101D10007A0290917B02892B21F4F0937B02E0936D
+:101D20007A02A0917802B0917902B087A7831097C8
+:101D300021F01696FC93EE931597F0937902E093B9
+:101D4000780216821582809100018383680F648374
+:101D5000609300010895DF92EF92FF920F931F931B
+:101D6000CF93DF93D82EF92EE42E062F10E0C80172
+:101D70000196880F0E947F0583E00E947F05CD2D8C
+:101D8000DF2D0C0F1D1FC017D10789F0E7FE03C020
+:101D9000FE01849101C088810E947F05F82E80E0B9
+:101DA0000E947F058F2121968111EDCF01C081E036
+:101DB000DF91CF911F910F91FF90EF90DF900895E9
+:101DC000FC0186E092E0918380831282138281E09D
+:101DD000848316821582108617828091FC0390916D
+:101DE000FD03892B21F4F093FD03E093FC03A09104
+:101DF000FA03B091FB03B087A783109721F01696E2
+:101E0000FC93EE931597F093FB03E093FA0316828D
+:101E10001582618715861486178616868AE392E0F6
+:101E2000918380838FEF808B87E0818B428B138A35
+:101E3000089582E0809302048093030488E094E094
+:101E400090930504809304041092070410920604F2
+:101E500080E192E09093FF038093FE0380E88093FB
+:101E6000080481E8809309040E94BC0BFC012181D5
+:101E70008091020490E0820F911D0897C4F5A28121
+:101E8000B381109729F48EEF93E0938382830EC081
+:101E900018968D919C911997009711F0DC01F8CF5D
+:101EA0008EEF93E019969C938E9318978081809380
+:101EB0000004818180930104908180910304890F43
+:101EC000808380E090910204891788F4A091040433
+:101ED000B0910504A80FB11D9C91A181B0E0A35F52
+:101EE000BE4F9C9391819F5F91838F5FEBCF109248
+:101EF0000D0510920C0588EE93E0A0E0B0E0809311
+:101F00000E0590930F05A0931005B09311058CE179
+:101F100092E090930B0580930A058FEF9FEF9093CB
+:101F200017058093160580915A0581110BC01092F8
+:101F30000B0410920A0410920D0410920C0481E01C
+:101F400080935A058AE094E090930F0480930E04E6
+:101F500060E28CEE94E00E947D0E8CE592E090931E
+:101F6000ED048093EC048CE18093F5048EE692E01E
+:101F70009093F7048093F6041092F9041092F804F9
+:101F800085E090E09093FB048093FA0480E290E077
+:101F90009093FD048093FC048CEE94E00E94BF02B9
+:101FA00060E188ED94E00E947D0E86E492E09093DB
+:101FB000D9048093D8041092E10481E08093E20474
+:101FC00092E09093E3042EE02093E4048093E504F0
+:101FD00020E12093E6048093E7048FEF8093EB04E5
+:101FE0002093DA049093E80482E090E00E94551078
+:101FF0009093EA048093E90488ED94E00E94A202A1
+:1020000041E06091EF0480E194E00E94E00E609175
+:10201000EF046F5F42E084E294E00E94E00E609182
+:10202000EF046E5F43E088E394E00E94E00E60916D
+:10203000EF046D5F44E08CE494E00E94E00E609158
+:10204000EF046C5F45E080E694E00E94E00E609152
+:10205000EF046B5F46E084E794E00E94E00E60913D
+:10206000EF046A5F47E088E894E00E94E00E609128
+:10207000EF04695F48E08CE994E00E94E00E609113
+:10208000EF04685F49E080EB94E00E94E00E60910D
+:10209000EF04675F4AE084EC94E00C94E00EEE0FEE
+:1020A000FF1F0590F491E02D09940F931F93CF9398
+:1020B000DF938230910510F482E090E0E0916405B6
+:1020C000F091650520E030E0A0E0B0E0309719F134
+:1020D000408151810281138148175907C8F0841744
+:1020E000950769F4109731F012960C931297139696
+:1020F0001C9327C0009364051093650522C0211529
+:10210000310519F04217530718F49A01BD01EF0188
+:10211000DF01F801DBCF21153105F9F0281B390B60
+:102120002430310580F48A819B816115710521F08D
+:10213000FB019383828304C09093650580936405BB
+:10214000FE01329644C0FE01E20FF31F819391938A
+:1021500022503109398328833AC020916205309199
+:102160006305232B41F42091160130911701309320
+:10217000630520936205209114013091150121150A
+:10218000310541F42DB73EB7409118015091190126
+:10219000241B350BE0916205F0916305E217F3070C
+:1021A000A0F42E1B3F0B2817390778F0AC014E5FC7
+:1021B0005F4F2417350748F04E0F5F1F509363059C
+:1021C000409362058193919302C0E0E0F0E0CF017B
+:1021D000DF91CF911F910F910895CF93DF930097D7
+:1021E00009F481C0FC01329713821282A091640528
+:1021F000B0916505109781F420813181820F931F82
+:1022000020916205309163052817390751F5F09345
+:102210006305E093620567C0ED0120E030E0CE1772
+:10222000DF0740F44A815B819E0141155105F1F0C1
+:10223000EA01F5CFD383C28340815181840F951F7A
+:10224000C817D90759F488819981840F951F029680
+:10225000918380838A819B819383828321153105B9
+:1022600029F4F0936505E09364053DC0E901FB8323
+:10227000EA8349915991C40FD51FEC17FD0761F40A
+:1022800080819181840F951F0296E901998388834B
+:10229000828193819B838A83E0E0F0E012968D91A6
+:1022A0009C911397009719F0FD01DC01F7CF8D91F8
+:1022B0009C9111979D012E5F3F4F820F931F20919C
+:1022C0006205309163052817390769F4309729F4BE
+:1022D000109265051092640502C013821282B093B9
+:1022E0006305A0936205DF91CF91089581E090E0AE
+:1022F000F8940C948211DC0101C06D934150504060
+:10230000E0F7089510E0C9EED0E004C0FE010E949D
+:0E2310004F102196CA3ED107C9F7F894FFCFAF
+:10231E002BFFFFFFFF00E100000000000000C18066
+:10232E008100000000006605800000000000DD0254
+:10233E00DD02DC02DC02DB02160A160A160A160A97
+:10234E0000000000160A1503E702610100000000FC
+:10235E000000000000000000010001010102010365
+:10236E00010401050106010701080109010A010B1B
+:10237E00011201130114011501160117012F00009E
+:10238E0000000000000000000129012A012B012C91
+:10239E00012D012E012401250126012701280128E6
+:1023AE00011E011F01200121012201230000000056
+:1023BE00000000000000000001180119011A011BA5
+:1023CE00011C011D010C010D010E010F0110011167
+:1023DE0000000000000000000000000002000000ED
+:1023EE0000000000000000000000000000000000DF
+:1023FE0000000000000000000000000000000000CF
+:10240E0002010000000000000000000004050607A5
+:10241E00080900000000DE02160A160A000000007D
+:10242E00CD09240ACA091A0A00000000000AFE0A91
+:10243E00170B140B660B440B1C0B0000000059010C
+:10244E00160A1E02DF02000000005901160A1E02C3
+:10245E00140100000000DD0291016C01DC02DB02C0
+:10246E00A2024C05DE03160A00000000BA02DD02CD
+:10247E009B048A04DB02BF02160A160A160A1213FE
+:08248E0014150F4D49444900EB
:00000001FF
diff --git a/.pioenvs/structure.hash b/.pioenvs/structure.hash
index 7cdc213..d647d10 100644
--- a/.pioenvs/structure.hash
+++ b/.pioenvs/structure.hash
@@ -1 +1 @@
-d53bd8f470f949b5d5179e009803692baf79d4ac
\ No newline at end of file
+ff40efac42d76dcfb6ef5cb24bb1f872944d1abf
\ No newline at end of file
diff --git a/Arduino-MIDI.pdf b/res/doc/Arduino-MIDI.pdf
similarity index 100%
rename from Arduino-MIDI.pdf
rename to res/doc/Arduino-MIDI.pdf
diff --git a/Midi.fzz b/res/doc/Midi.fzz
similarity index 100%
rename from Midi.fzz
rename to res/doc/Midi.fzz
diff --git a/res/doc/buttonMatrixMap.ods b/res/doc/buttonMatrixMap.ods
new file mode 100644
index 0000000..4a7e9b4
Binary files /dev/null and b/res/doc/buttonMatrixMap.ods differ
diff --git a/pro_micro_pinout.jpg b/res/doc/pro_micro_pinout.jpg
similarity index 100%
rename from pro_micro_pinout.jpg
rename to res/doc/pro_micro_pinout.jpg
diff --git a/res/tools/hairless-midiserial/.directory b/res/tools/hairless-midiserial/.directory
new file mode 100644
index 0000000..587374b
--- /dev/null
+++ b/res/tools/hairless-midiserial/.directory
@@ -0,0 +1,6 @@
+[Dolphin]
+Timestamp=2019,2,22,13,59,17
+Version=4
+
+[Settings]
+HiddenFilesShown=true
diff --git a/res/tools/hairless-midiserial/README.txt b/res/tools/hairless-midiserial/README.txt
new file mode 100644
index 0000000..7557985
--- /dev/null
+++ b/res/tools/hairless-midiserial/README.txt
@@ -0,0 +1,74 @@
+This tar file contains the Hairless MIDI<->Serial Bridge and the
+Ardumidi Arduino MIDI library (part of ttymidi.)
+
+"Hairless MIDI<->Serial Bridge" allows you to send MIDI messages
+to/from a serial device (like an Arduino.)
+
+The project home page is http://projectgus.github.com/hairless-midiserial/
+
+If you're a command line kind of person, I suggest checking out
+ttymidi - http://www.varal.org/ttymidi/ - a different project that
+creates a Serial/MIDI bridge on the command line. Hairless Bridge is
+compatible with ttymidi.
+
+
+RUNNING THE BRIDGE
+==================
+
+Run "hairless-midiserial" in this directory.
+
+The executable is static linked, so you don't need to have installed Qt.
+
+
+ARDUINO LIBRARIES
+=================
+
+Hairless Bridge is compatible with at least two libraries for
+sending/receiving MIDI data from Arduino: Ardumidi, which is included,
+and "Arduino MIDI Library", which is available from
+http://arduino.cc/playground/Main/MIDILibrary
+
+It's up to you which library to use. "Arduino MIDI Library" is nicer
+in many ways, and seems to be the way of the future, but it doesn't
+let you easily send debug messages to your computer along with the
+MIDI messages.
+
+
+USING ARDUINO MIDI LIBRARY
+==========================
+
+If you use the Arduino MIDI Library, you can follow the instructions
+on their page: http://arduino.cc/playground/Main/MIDILibrary
+
+The only difference is you need to initialise the serial port -after-
+calling MIDI.begin(), like this:
+
+void setup() {
+ MIDI.begin(1);
+ Serial.begin(115200);
+}
+
+
+USING ARDUMIDI
+==============
+
+Ardumidi is an Arduino MIDI library, part of the separate ttymidi
+project (http://www.varal.org/ttymidi/). It can be used with Hairless
+MIDI<->Serial Bridge.
+
+To install Ardumidi, place the "Ardumidi" directory inside a
+"libraries" directory within your Arduino "sketchbook" directory. Then
+restart the Arduino IDE. Example sketches can be found in the example/ folder.
+
+
+LICENSE
+=======
+
+The Hairless MIDI<->Serial Bridge is licensed under the GNU Lesser
+General Public License 2.1, as described in the About box of the
+application.
+
+The Ardumidi library is licensed under the GNU General Public License
+3, as described in the file Ardumidi\LICENSE.
+
+
diff --git a/res/tools/hairless-midiserial/ardumidi/LICENSE b/res/tools/hairless-midiserial/ardumidi/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/res/tools/hairless-midiserial/ardumidi/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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 3 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 .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/res/tools/hairless-midiserial/ardumidi/ardumidi.cpp b/res/tools/hairless-midiserial/ardumidi/ardumidi.cpp
new file mode 100644
index 0000000..1dbc2ac
--- /dev/null
+++ b/res/tools/hairless-midiserial/ardumidi/ardumidi.cpp
@@ -0,0 +1,122 @@
+/*
+ This file is part of ttymidi.
+
+ ttymidi 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 3 of the License, or
+ (at your option) any later version.
+
+ ttymidi 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 ttymidi. If not, see .
+*/
+// file version 0.60
+
+#include "ardumidi.h"
+#include "HardwareSerial.h"
+
+void midi_note_off(byte channel, byte key, byte velocity)
+{
+ midi_command(0x80, channel, key, velocity);
+}
+
+void midi_note_on(byte channel, byte key, byte velocity)
+{
+ midi_command(0x90, channel, key, velocity);
+}
+
+void midi_key_pressure(byte channel, byte key, byte value)
+{
+ midi_command(0xA0, channel, key, value);
+}
+
+void midi_controller_change(byte channel, byte control, byte value)
+{
+ midi_command(0xB0, channel, control, value);
+}
+
+void midi_program_change(byte channel, byte program)
+{
+ midi_command_short(0xC0, channel, program);
+}
+
+void midi_channel_pressure(byte channel, byte value)
+{
+ midi_command_short(0xD0, channel, value);
+}
+
+void midi_pitch_bend(byte channel, int value)
+{
+ midi_command(0xE0, channel, value & 0x7F, value >> 7);
+}
+
+void midi_command(byte command, byte channel, byte param1, byte param2)
+{
+ Serial.print(command | (channel & 0x0F), BYTE);
+ Serial.print(param1 & 0x7F, BYTE);
+ Serial.print(param2 & 0x7F, BYTE);
+}
+
+void midi_command_short(byte command, byte channel, byte param1)
+{
+ Serial.print(command | (channel & 0x0F), BYTE);
+ Serial.print(param1 & 0x7F, BYTE);
+}
+
+void midi_print(char* msg, int len)
+{
+ Serial.print(0xFF, BYTE);
+ Serial.print(0x00, BYTE);
+ Serial.print(0x00, BYTE);
+ Serial.print(len , BYTE);
+ Serial.print(msg);
+}
+
+void midi_comment(char* msg)
+{
+ int len = 0;
+ char* ptr = msg;
+ while (*ptr++) len++;
+ midi_print(msg, len);
+}
+
+int midi_message_available() {
+ /*
+ This bit will check that next bytes to be read would actually
+ have the midi status bit. If not it will remove uncorrect bytes
+ from internal buffer
+ */
+ while ((Serial.available() > 0) && ((Serial.peek() & B10000000) != 0x80)) {
+ Serial.read();
+ }
+
+ /* Well we don't exactly know how many commands there might be in the Serial buffer
+ so we'll just guess it according the type of message that happens to be waiting
+ in the buffer. At least we get first one right! */
+ byte command = Serial.peek() & 11110000;
+ if (command != MIDI_PROGRAM_CHANGE && command != MIDI_CHANNEL_PRESSURE) {
+ return (Serial.available()/2);
+ }
+ return (Serial.available()/3);
+}
+
+MidiMessage read_midi_message() {
+ MidiMessage message;
+ byte midi_status = Serial.read();
+ message.command = (midi_status & B11110000);
+ message.channel = (midi_status & B00001111);
+ message.param1 = Serial.read();
+ if (message.command != MIDI_PROGRAM_CHANGE && message.command != MIDI_CHANNEL_PRESSURE) {
+ message.param2 = Serial.read();
+ }
+ return message;
+}
+
+int get_pitch_bend(MidiMessage m) {
+ return (m.param1 & 0x7F) + ((m.param2 & 0x7F) << 7);
+}
+
diff --git a/res/tools/hairless-midiserial/ardumidi/ardumidi.h b/res/tools/hairless-midiserial/ardumidi/ardumidi.h
new file mode 100644
index 0000000..bd708c8
--- /dev/null
+++ b/res/tools/hairless-midiserial/ardumidi/ardumidi.h
@@ -0,0 +1,83 @@
+/*
+ This file is part of ttymidi.
+
+ ttymidi 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 3 of the License, or
+ (at your option) any later version.
+
+ ttymidi 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 ttymidi. If not, see .
+*/
+// file version 0.60
+
+#ifndef ardumidi_h
+#define ardumidi_h
+
+#if (ARDUINO >= 100)
+ #include
+#else
+#include "WProgram.h"
+#endif
+
+// MIDI notes
+#define MIDI_C0 0
+#define MIDI_D0 2
+#define MIDI_E0 4
+#define MIDI_F0 5
+#define MIDI_G0 7
+#define MIDI_A0 9
+#define MIDI_B0 11
+#define MIDI_C 60
+#define MIDI_D 62
+#define MIDI_E 64
+#define MIDI_F 65
+#define MIDI_G 67
+#define MIDI_A 69
+#define MIDI_B 71
+#define MIDI_SHARP 1
+#define MIDI_FLAT -1
+#define MIDI_OCTAVE 12
+
+// MIDI out
+#define MIDI_NOTE_OFF 0x80
+#define MIDI_NOTE_ON 0x90
+#define MIDI_PRESSURE 0xA0
+#define MIDI_CONTROLLER_CHANGE 0xB0
+#define MIDI_PROGRAM_CHANGE 0xC0
+#define MIDI_CHANNEL_PRESSURE 0xD0
+#define MIDI_PITCH_BEND 0xE0
+
+struct MidiMessage {
+ byte command;
+ byte channel;
+ byte param1;
+ byte param2;
+};
+
+// MIDI in
+void midi_note_off(byte channel, byte key, byte velocity);
+void midi_note_on(byte channel, byte key, byte velocity);
+void midi_key_pressure(byte channel, byte key, byte value);
+void midi_controller_change(byte channel, byte control, byte value);
+void midi_program_change(byte channel, byte program);
+void midi_channel_pressure(byte channel, byte value);
+void midi_pitch_bend(byte channel, int value);
+void midi_command(byte command, byte channel, byte param1, byte param2);
+void midi_command_short(byte command, byte channel, byte param1);
+
+// MIDI out
+int midi_message_available();
+MidiMessage read_midi_message();
+int get_pitch_bend(MidiMessage msg);
+
+// Other
+void midi_print(char* msg, int len);
+void midi_comment(char* msg);
+
+#endif
diff --git a/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test/ardumidi_test.pde b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test/ardumidi_test.pde
new file mode 100644
index 0000000..58f1ba7
--- /dev/null
+++ b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test/ardumidi_test.pde
@@ -0,0 +1,80 @@
+/*
+ This file is public domain. Use it as you like.
+*/
+
+#include
+
+int ledPin = 13;
+int note_on = 0;
+
+void setup()
+{
+ Serial.begin(115200);
+ pinMode(ledPin, OUTPUT);
+}
+
+void loop()
+{
+
+ if (!note_on)
+ {
+ // play a Cminor chord on channel 0, at maximum volume (127)
+ midi_note_on(0, MIDI_C, 127);
+ midi_note_on(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127);
+ midi_note_on(0, MIDI_G + MIDI_OCTAVE, 127);
+
+ // The MIDI_* macros were created to make your life easier, but you
+ // don't have to use them. You may enter numbers instead if you know
+ // what you're doing.
+
+ note_on = 1;
+ digitalWrite(ledPin, HIGH);
+ }
+
+ else
+ {
+ // stop the Cminor chord
+ midi_note_off(0, MIDI_C, 127);
+ midi_note_off(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127);
+ midi_note_off(0, MIDI_G + MIDI_OCTAVE, 127);
+
+ note_on = 0;
+ digitalWrite(ledPin, LOW);
+ }
+
+ delay(500);
+}
+
+// Available commands:
+//
+// Start/stop playing a certain note:
+// midi_note_on(byte channel, byte key, byte velocity);
+// midi_note_off(byte channel, byte key, byte velocity);
+//
+// Change pressure of specific keys:
+// midi_key_pressure(byte channel, byte key, byte value);
+//
+// Change controller value (used for knobs, etc):
+// midi_controller_change(byte channel, byte controller, byte value);
+//
+// Change "program" (change the instrument):
+// midi_program_change(byte channel, byte program);
+//
+// Change key pressure of entire channels:
+// midi_channel_pressure(byte channel, byte value);
+//
+// Change pitch-bend wheel:
+// midi_pitch_bend(byte channel, int value);
+//
+// Send a comment:
+// midi_comment(char* str);
+//
+// Send a series of bytes (to be interpreted by another program):
+// midi_printbytes(char* bytes, int len);
+//
+// Parameters:
+// channel an integer from 0 to 15
+// pitch-bend value an integer from 0 to 16383
+// all other values an integer from 0 to 127
+//
+
diff --git a/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test_all_instruments/ardumidi_test_all_instruments.pde b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test_all_instruments/ardumidi_test_all_instruments.pde
new file mode 100644
index 0000000..a6b96db
--- /dev/null
+++ b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test_all_instruments/ardumidi_test_all_instruments.pde
@@ -0,0 +1,86 @@
+/*
+ This file is public domain. Use it as you like.
+*/
+
+#include
+
+int ledPin = 13;
+int note_on = 0;
+int voice = 0;
+
+void setup()
+{
+ Serial.begin(115200);
+ pinMode(ledPin, OUTPUT);
+}
+
+void loop()
+{
+
+ if (!note_on)
+ {
+ // play a Cminor chord on channel 0, at maximum volume (127)
+ midi_note_on(0, MIDI_C, 127);
+ midi_note_on(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127);
+ midi_note_on(0, MIDI_G + MIDI_OCTAVE, 127);
+
+ // The MIDI_* macros were created to make your life easier, but you
+ // don't have to use them. You may enter numbers instead if you know
+ // what you're doing.
+
+ note_on = 1;
+ digitalWrite(ledPin, HIGH);
+ }
+
+ else
+ {
+ // stop the Cminor chord
+ midi_note_off(0, MIDI_C, 127);
+ midi_note_off(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127);
+ midi_note_off(0, MIDI_G + MIDI_OCTAVE, 127);
+
+ // go to next instrument
+ voice++;
+ if (voice > 255) voice = 0;
+ midi_program_change(0, voice);
+
+ note_on = 0;
+ digitalWrite(ledPin, LOW);
+ }
+
+ delay(500);
+}
+
+// Available commands:
+//
+// Start/stop playing a certain note:
+// midi_note_on(byte channel, byte key, byte velocity);
+// midi_note_off(byte channel, byte key, byte velocity);
+//
+// Change pressure of specific keys:
+// midi_key_pressure(byte channel, byte key, byte value);
+//
+// Change controller value (used for knobs, etc):
+// midi_controller_change(byte channel, byte controller, byte value);
+//
+// Change "program" (change the instrument):
+// midi_program_change(byte channel, byte program);
+//
+// Change key pressure of entire channels:
+// midi_channel_pressure(byte channel, byte value);
+//
+// Change pitch-bend wheel:
+// midi_pitch_bend(byte channel, int value);
+//
+// Send a comment:
+// midi_comment(char* str);
+//
+// Send a series of bytes (to be interpreted by another program):
+// midi_printbytes(char* bytes, int len);
+//
+// Parameters:
+// channel an integer from 0 to 15
+// pitch-bend value an integer from 0 to 16383
+// all other values an integer from 0 to 127
+//
+
diff --git a/res/tools/hairless-midiserial/ardumidi/examples/from_alsa_to_arduino/from_alsa_to_arduino.pde b/res/tools/hairless-midiserial/ardumidi/examples/from_alsa_to_arduino/from_alsa_to_arduino.pde
new file mode 100644
index 0000000..7bdacda
--- /dev/null
+++ b/res/tools/hairless-midiserial/ardumidi/examples/from_alsa_to_arduino/from_alsa_to_arduino.pde
@@ -0,0 +1,39 @@
+/*
+ This file is public domain. Use it as you like.
+
+ This is an example program to showcase reading with
+ Arduino the MIDI output from an ALSA sequencer. This simply
+ toggles the Arduino LED whenever a MIDI "note on" or "note off"
+ event takes place.
+*/
+
+#include
+
+void setup()
+{
+ Serial.begin(115200);
+ pinMode(ledPin, OUTPUT);
+}
+
+int counter = 0;
+
+void loop()
+{
+ while (midi_message_available() > 0) {
+
+ MidiMessage m = read_midi_message();
+
+ if (m.command == MIDI_NOTE_ON) {
+ /*
+ If you want to find out which key was pressed, check
+ the value of m.param1
+ */
+ digitalWrite(ledPin, HIGH);
+ }
+
+ else if (m.command == MIDI_NOTE_OFF) {
+ digitalWrite(ledPin, LOW);
+ }
+
+ }
+}
diff --git a/res/tools/hairless-midiserial/hairless-midiserial b/res/tools/hairless-midiserial/hairless-midiserial
new file mode 100644
index 0000000..8170724
Binary files /dev/null and b/res/tools/hairless-midiserial/hairless-midiserial differ
diff --git a/src/main.cpp b/src/main.cpp
index 2683179..9cf2aa9 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,6 +1,10 @@
#include
#include
+#define NOTE_ON_CMD 0x90
+#define NOTE_OFF_CMD 0x80
+#define NOTE_VELOCITY 127
+
#define s * 1000
/* Pins */
@@ -11,7 +15,7 @@ const uint8_t scl{3};
/* Multiplexer */
#define MUX_ADDRSIZE 5
const uint8_t mux_sig{A10};
-const uint8_t mux_addr[MUX_ADDRSIZE]{15, 21, 20, 19, 18};
+const uint8_t mux_addr[MUX_ADDRSIZE]{18, 19, 20, 21, 15};
/* ShiftRegister (OUT) */
#define SHIFT_OUTPUTSIZE 16
const uint8_t shift_data{14};
@@ -30,7 +34,7 @@ ShiftRegisterOut shiftRegister(shift_data, shift_clock, shift_latch, MSBFIRST, S
/* keyboard (IN) */
/* Midi links */
-USBDebugMIDI_Interface midiInterface(115200);
+// USBDebugMIDI_Interface midiInterface(115200);
Analog potentiometers[] = {
{multiplexer.pin(0), MIDI_CC::Channel_Volume, 1},
@@ -45,63 +49,140 @@ Analog potentiometers[] = {
{multiplexer.pin(9), MIDI_CC::Channel_Volume, 10}
};
+byte matrix[16][6][2] = {
+/*00*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*01*/ {{1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}},
+/*02*/ {{1, 6}, {1, 7}, {1, 8}, {1, 9}, {1, 10}, {1, 11}},
+/*03*/ {{1, 18}, {1, 19}, {1, 20}, {1, 21}, {1, 22}, {1, 23}},
+/*04*/ {{1, 47}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*05*/ {{1, 41}, {1, 42}, {1, 43}, {1, 44}, {1, 45}, {1, 46}},
+/*06*/ {{1, 36}, {1, 37}, {1, 38}, {1, 39}, {1, 40}, {1, 40}},
+/*07*/ {{1, 30}, {1, 31}, {1, 32}, {1, 33}, {1, 34}, {1, 35}},
+/*08*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*09*/ {{1, 24}, {1, 25}, {1, 26}, {1, 27}, {1, 28}, {1, 29}},
+/*10*/ {{1, 12}, {1, 13}, {1, 14}, {1, 15}, {1, 16}, {1, 17}},
+/*11*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*12*/ {{2, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*13*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*14*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+/*15*/ {{2, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
+};
+
bool ref[6*16];
+unsigned char shift = 0;
+
void setup() {
- // Serial.begin(115200);
+ // Serial.begin(31250);
// while (Serial.available() == 0){
// delay(.5 s);
// }
+ // Serial.print("Serial OK");
+
for (size_t i = 0; i < KEYBOARD_INSIZE; ++i) {
ExtIO::pinMode(keyboard_in[i], INPUT);
}
- for (size_t i = 0; i < 6*8; ++i) {
+ for (size_t i = 0; i < 6*16; ++i) {
ref[i] = false;
}
+ // ExtIO::pinMode(shift_data, OUTPUT);
+ // ExtIO::pinMode(shift_latch, OUTPUT);
+ // ExtIO::pinMode(shift_clock, OUTPUT);
+ shiftRegister.begin();
}
-void loop() {
- // for (size_t i = 0; i < 16; ++i) {
- // shiftRegister.pin(i);
- // uint8_t rowValue[KEYBOARD_INSIZE];
- // bool pressed = false;
- // for (size_t j = 0; j < 6; ++j) {
- // if ((rowValue[i] = ExtIO::digitalRead(keyboard_in[j])) == HIGH) {
- // if (!ref[j * 16 + i]) {
- // Serial.print("key ");
- // Serial.print(j * 16 + i);
- // Serial.print(" pressed (received on pin ");
- // Serial.print(keyboard_in[j], DEC);
- // Serial.print(" & emmited on pin ");
- // Serial.print(i);
- // Serial.println(")");
- // ref[j * 16 + i] = true;
- // }
- // } else {
- // ref[j * 16 + i] = false;
- // }
- // }
- // }
+void scanPin(int pin) {
+ ExtIO::digitalWrite(shift_latch, LOW);
+ if (pin < 8) {
+ byte bitsToSend = 0b00000001 << pin;
+ ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
+ ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend);
+ } else {
+ byte bitsToSend = 0b00000001 << (pin - 8);
+ ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend);
+ ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
+ }
+ ExtIO::digitalWrite(shift_latch, HIGH);
+}
+void init_shift() {
+ ExtIO::digitalWrite(shift_latch, LOW);
+ ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
+ ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000001);
+ ExtIO::digitalWrite(shift_latch, HIGH);
+}
+
+void next_shift() {
+ ExtIO::digitalWrite(shift_data, LOW);
+ ExtIO::digitalWrite(shift_latch, LOW);
+ ExtIO::digitalWrite(shift_clock, HIGH);
+ ExtIO::digitalWrite(shift_clock, LOW);
+ ExtIO::digitalWrite(shift_latch, HIGH);
+}
+
+void noteOn(byte note);
+
+void noteOff(byte note);
+
+void loop() {
+ init_shift();
+ for (size_t i = 0; i < 16; ++i) {
+ // shiftRegister.digitalWrite(i, HIGH);
+ uint8_t rowValue[KEYBOARD_INSIZE];
+ bool pressed = false;
+ for (size_t j = 0; j < 6; ++j) {
+ if ((rowValue[i] = ExtIO::digitalRead(keyboard_in[j])) == HIGH) {
+ if (!ref[j * 16 + i]) {
+ byte type = matrix[i][j][0];
+ byte key = matrix[i][j][1];
+ if (type == 1) {
+ noteOn(key);
+ } else if (type == 2) {
+ if (key == 0 && shift >= 12) {
+ shift -= 12;
+ } else if (key == 1 && shift <= 0xFF - 47 - 12) {
+ shift += 12;
+ }
+ }
+ ref[j * 16 + i] = true;
+ }
+ } else {
+ if (ref[j * 16 + i]) {
+ if (matrix[i][j][0] == 1) {
+ noteOff(matrix[i][j][1]);
+ }
+ ref[j * 16 + i] = false;
+ }
+ }
+ }
+ next_shift();
+ // shiftRegister.digitalWrite(i, LOW);
+ // delay(3 s);
+ }
+
// for (uint8_t i = 0; i < 8; ++i) {
// byte bitsToSend = 0b00000001 << i;
- // digitalWrite(shift_latch, LOW);
- // shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend);
- // digitalWrite(shift_latch, HIGH);
+ // ExtIO::digitalWrite(shift_latch, LOW);
+ // // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend);
+ // // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
+ // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b11111111);
+ // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b11111111);
+ // ExtIO::digitalWrite(shift_latch, HIGH);
// Serial.print(" ");
// Serial.print(bitsToSend, BIN);
// Serial.println(" HIGH");
- // delay(1 s);
+ // delay(4 s);
// //bitWrite(bitsToSend, i, LOW);
- // digitalWrite(shift_latch, LOW);
- // shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
- // digitalWrite(shift_latch, HIGH);
+ // ExtIO::digitalWrite(shift_latch, LOW);
+ // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
+ // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000);
+ // ExtIO::digitalWrite(shift_latch, HIGH);
// Serial.print(i);
// Serial.println(" LOW");
- // delay(1 s);
+ // delay(4 s);
// }
// analogWrite(9, val[0] * 256 / 1024);
@@ -113,3 +194,18 @@ void loop() {
// loopAverage = (loopAverage + lastLoop) / 2;
//delay(.5 s);
}
+
+
+void noteOn(byte note) {
+ MIDI_Controller.MIDI()->send(NOTE_ON_CMD, 0, note + shift, NOTE_VELOCITY);
+ // Serial.write(NOTE_ON_CMD);
+ // Serial.write(note + shift);
+ // Serial.write(NOTE_VELOCITY);
+}
+
+void noteOff(byte note) {
+ MIDI_Controller.MIDI()->send(NOTE_OFF_CMD, 0, note + shift, NOTE_VELOCITY);
+ // Serial.write(NOTE_OFF_CMD);
+ // Serial.write(note + shift);
+ // Serial.write(NOTE_VELOCITY);
+}