diff options
Diffstat (limited to 'jack')
-rw-r--r-- | jack/autocorrect_data.h | 860 | ||||
-rw-r--r-- | jack/autocorrect_dict.txt | 12 | ||||
-rw-r--r-- | jack/color.c | 152 | ||||
-rw-r--r-- | jack/combos.def | 2 | ||||
-rw-r--r-- | jack/combos.h | 20 | ||||
-rw-r--r-- | jack/config.h | 70 | ||||
-rw-r--r-- | jack/dict.h | 207 | ||||
-rw-r--r-- | jack/introspection.c | 33 | ||||
-rw-r--r-- | jack/jack.c | 100 | ||||
-rw-r--r-- | jack/jack.h | 88 | ||||
-rw-r--r-- | jack/oled.c | 22 | ||||
-rw-r--r-- | jack/oled.h | 730 | ||||
-rw-r--r-- | jack/oledfont.h | 2 | ||||
-rw-r--r-- | jack/picosdk_math.mk | 153 | ||||
-rw-r--r-- | jack/post_rules.mk | 14 | ||||
-rw-r--r-- | jack/raw.py | 49 | ||||
-rw-r--r-- | jack/rgb_matrix_user.inc | 835 | ||||
-rw-r--r-- | jack/rules.mk | 43 | ||||
-rw-r--r-- | jack/tap_code.c | 159 | ||||
-rw-r--r-- | jack/tapping.c | 92 | ||||
-rw-r--r-- | jack/unicode.c | 31 |
21 files changed, 2256 insertions, 1418 deletions
diff --git a/jack/autocorrect_data.h b/jack/autocorrect_data.h index f9d6352..e83dcf9 100644 --- a/jack/autocorrect_data.h +++ b/jack/autocorrect_data.h @@ -1,17 +1,17 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#define AUTOCORRECT_MIN_LENGTH 5 -#define AUTOCORRECT_MAX_LENGTH 10 -#define DICTIONARY_SIZE 5867 +#define AUTOCORRECT_MIN_LENGTH 5 // ":abot" +#define AUTOCORRECT_MAX_LENGTH 10 // "competance" +#define DICTIONARY_SIZE 5705 static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { 0x6C, 0x40, 0x00, 0x04, 0x0A, 0x01, 0x06, 0x22, 0x01, 0x07, 0x7D, 0x01, - 0x08, 0x47, 0x03, 0x09, 0x8E, 0x08, 0x0A, 0xBF, 0x08, 0x0B, 0x43, 0x09, - 0x0C, 0xD2, 0x09, 0x0E, 0xDC, 0x09, 0x0F, 0xE8, 0x09, 0x10, 0x09, 0x0B, - 0x11, 0x3B, 0x0B, 0x12, 0x58, 0x0D, 0x13, 0x8C, 0x0D, 0x15, 0xA6, 0x0D, - 0x16, 0x6D, 0x0F, 0x17, 0x21, 0x11, 0x19, 0x59, 0x14, 0x1A, 0x90, 0x14, - 0x1C, 0xB6, 0x14, 0x00, 0x46, 0x5F, 0x00, 0x07, 0x67, 0x00, 0x08, 0x71, + 0x08, 0x3A, 0x03, 0x09, 0x71, 0x08, 0x0A, 0xA2, 0x08, 0x0B, 0x26, 0x09, + 0x0C, 0xB5, 0x09, 0x0E, 0xBF, 0x09, 0x0F, 0xCB, 0x09, 0x10, 0xEC, 0x0A, + 0x11, 0x0A, 0x0B, 0x12, 0x18, 0x0D, 0x13, 0x4C, 0x0D, 0x15, 0x66, 0x0D, + 0x16, 0x0B, 0x0F, 0x17, 0xBF, 0x10, 0x19, 0xE6, 0x13, 0x1A, 0x1D, 0x14, + 0x1C, 0x43, 0x14, 0x00, 0x46, 0x5F, 0x00, 0x07, 0x67, 0x00, 0x08, 0x71, 0x00, 0x0A, 0x9C, 0x00, 0x0F, 0xA8, 0x00, 0x11, 0xB0, 0x00, 0x12, 0xB8, 0x00, 0x16, 0xC2, 0x00, 0x17, 0xCD, 0x00, 0x18, 0x00, 0x01, 0x00, 0x0C, 0x0B, 0x1A, 0x2C, 0x00, 0x80, 0x68, 0x00, 0x16, 0x08, 0x18, 0x2C, 0x00, @@ -39,7 +39,7 @@ static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { 0x16, 0x04, 0x00, 0x86, 0x65, 0x73, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x00, 0x08, 0x0B, 0x06, 0x00, 0x81, 0x63, 0x6B, 0x00, 0x44, 0x93, 0x01, 0x08, 0x9F, 0x01, 0x0F, 0x7F, 0x02, 0x11, 0xA7, 0x02, 0x12, 0xDF, 0x02, - 0x15, 0xFA, 0x02, 0x18, 0x32, 0x03, 0x00, 0x0C, 0x0F, 0x19, 0x11, 0x0C, + 0x15, 0xFA, 0x02, 0x18, 0x25, 0x03, 0x00, 0x0C, 0x0F, 0x19, 0x11, 0x0C, 0x00, 0x83, 0x61, 0x6C, 0x69, 0x64, 0x00, 0x46, 0xC1, 0x01, 0x07, 0xCB, 0x01, 0x08, 0xD5, 0x01, 0x09, 0xE0, 0x01, 0x0A, 0xED, 0x01, 0x0C, 0xF7, 0x01, 0x13, 0x11, 0x02, 0x15, 0x2E, 0x02, 0x16, 0x51, 0x02, 0x17, 0x5D, @@ -69,429 +69,417 @@ static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { 0x83, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x00, 0x04, 0x00, 0x82, 0x6F, 0x75, 0x6E, 0x64, 0x00, 0x4C, 0xE6, 0x02, 0x15, 0xF1, 0x02, 0x00, 0x08, 0x15, 0x13, 0x00, 0x84, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x00, 0x06, 0x08, 0x15, - 0x00, 0x82, 0x6F, 0x72, 0x64, 0x00, 0x44, 0x04, 0x03, 0x08, 0x0F, 0x03, - 0x18, 0x28, 0x03, 0x00, 0x1A, 0x12, 0x09, 0x00, 0x83, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x00, 0x47, 0x16, 0x03, 0x0C, 0x20, 0x03, 0x00, 0x0C, 0x16, - 0x11, 0x12, 0x06, 0x00, 0x80, 0x65, 0x64, 0x00, 0x1A, 0x00, 0x83, 0x65, - 0x69, 0x72, 0x64, 0x00, 0x04, 0x0A, 0x2C, 0x00, 0x83, 0x75, 0x61, 0x72, - 0x64, 0x00, 0x12, 0x00, 0x4B, 0x3B, 0x03, 0x15, 0x41, 0x03, 0x00, 0x16, - 0x00, 0x80, 0x6C, 0x64, 0x00, 0x04, 0x00, 0x80, 0x6E, 0x64, 0x00, 0x44, - 0x75, 0x03, 0x05, 0x82, 0x03, 0x06, 0xAD, 0x03, 0x07, 0x2D, 0x04, 0x08, - 0x49, 0x04, 0x0A, 0x9D, 0x04, 0x0B, 0x15, 0x05, 0x0C, 0x66, 0x05, 0x0F, - 0x6F, 0x05, 0x11, 0x31, 0x06, 0x15, 0x3D, 0x06, 0x16, 0xA7, 0x06, 0x17, - 0x38, 0x07, 0x18, 0x13, 0x08, 0x19, 0x4C, 0x08, 0x00, 0x06, 0x13, 0x16, - 0x08, 0x10, 0x04, 0x11, 0x00, 0x82, 0x61, 0x63, 0x65, 0x00, 0x44, 0x89, - 0x03, 0x0F, 0x93, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x80, - 0x6C, 0x65, 0x00, 0x44, 0x9A, 0x03, 0x18, 0xA5, 0x03, 0x00, 0x0F, 0x0C, - 0x04, 0x19, 0x04, 0x00, 0x82, 0x62, 0x6C, 0x65, 0x00, 0x12, 0x07, 0x00, - 0x82, 0x62, 0x6C, 0x65, 0x00, 0x48, 0xBA, 0x03, 0x0C, 0xC5, 0x03, 0x11, - 0xCE, 0x03, 0x13, 0x20, 0x04, 0x00, 0x15, 0x08, 0x09, 0x08, 0x15, 0x00, - 0x81, 0x6E, 0x63, 0x65, 0x00, 0x08, 0x13, 0x00, 0x83, 0x69, 0x65, 0x63, - 0x65, 0x00, 0x44, 0xD8, 0x03, 0x08, 0xE5, 0x03, 0x18, 0x16, 0x04, 0x00, - 0x17, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x65, 0x6E, 0x63, 0x65, - 0x00, 0x55, 0xEC, 0x03, 0x17, 0x0B, 0x04, 0x00, 0x08, 0x00, 0x49, 0xF5, - 0x03, 0x0F, 0x02, 0x04, 0x00, 0x15, 0x2C, 0x00, 0x86, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x12, 0x17, 0x00, 0x83, 0x61, 0x6E, - 0x63, 0x65, 0x00, 0x11, 0x0C, 0x04, 0x10, 0x00, 0x81, 0x61, 0x6E, 0x63, - 0x65, 0x00, 0x14, 0x08, 0x16, 0x00, 0x82, 0x65, 0x6E, 0x63, 0x65, 0x00, - 0x04, 0x16, 0x08, 0x10, 0x04, 0x11, 0x00, 0x83, 0x70, 0x61, 0x63, 0x65, - 0x00, 0x0C, 0x15, 0x08, 0x19, 0x00, 0x52, 0x39, 0x04, 0x19, 0x3F, 0x04, - 0x00, 0x82, 0x72, 0x69, 0x64, 0x65, 0x00, 0x12, 0x00, 0x85, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x00, 0x17, 0x00, 0x44, 0x58, 0x04, 0x0C, 0x63, - 0x04, 0x11, 0x6D, 0x04, 0x17, 0x90, 0x04, 0x00, 0x15, 0x04, 0x18, 0x0A, - 0x00, 0x82, 0x6E, 0x74, 0x65, 0x65, 0x00, 0x10, 0x10, 0x12, 0x06, 0x00, - 0x81, 0x74, 0x65, 0x65, 0x00, 0x04, 0x15, 0x00, 0x44, 0x77, 0x04, 0x18, - 0x83, 0x04, 0x00, 0x0A, 0x00, 0x86, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, - 0x65, 0x65, 0x00, 0x04, 0x0A, 0x00, 0x87, 0x75, 0x61, 0x72, 0x61, 0x6E, - 0x74, 0x65, 0x65, 0x00, 0x0C, 0x10, 0x12, 0x06, 0x00, 0x84, 0x6D, 0x69, - 0x74, 0x74, 0x65, 0x65, 0x00, 0x44, 0xA7, 0x04, 0x07, 0xEA, 0x04, 0x10, - 0x0C, 0x05, 0x00, 0x4A, 0xB4, 0x04, 0x11, 0xBF, 0x04, 0x16, 0xC8, 0x04, - 0x18, 0xD1, 0x04, 0x00, 0x15, 0x12, 0x10, 0x00, 0x83, 0x74, 0x67, 0x61, - 0x67, 0x65, 0x00, 0x0B, 0x06, 0x00, 0x83, 0x61, 0x6E, 0x67, 0x65, 0x00, - 0x08, 0x10, 0x00, 0x82, 0x73, 0x61, 0x67, 0x65, 0x00, 0x0A, 0x00, 0x6C, - 0xDA, 0x04, 0x04, 0xE0, 0x04, 0x00, 0x83, 0x61, 0x75, 0x67, 0x65, 0x00, - 0x0F, 0x00, 0x84, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x08, 0x0F, - 0x00, 0x44, 0xF7, 0x04, 0x0C, 0xFD, 0x04, 0x0F, 0x06, 0x05, 0x00, 0x83, - 0x6C, 0x65, 0x67, 0x65, 0x00, 0x19, 0x0C, 0x15, 0x13, 0x00, 0x82, 0x67, - 0x65, 0x00, 0x04, 0x00, 0x82, 0x67, 0x65, 0x00, 0x04, 0x0C, 0x00, 0x83, - 0x6D, 0x61, 0x67, 0x65, 0x00, 0x17, 0x00, 0x47, 0x27, 0x05, 0x10, 0x31, - 0x05, 0x12, 0x3B, 0x05, 0x16, 0x44, 0x05, 0x17, 0x4D, 0x05, 0x00, 0x11, - 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12, 0x15, 0x09, - 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x20, - 0x74, 0x68, 0x65, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, - 0x00, 0x44, 0x54, 0x05, 0x18, 0x5C, 0x05, 0x00, 0x2C, 0x00, 0x82, 0x20, - 0x74, 0x68, 0x65, 0x00, 0x12, 0x05, 0x04, 0x00, 0x82, 0x20, 0x74, 0x68, - 0x65, 0x00, 0x1D, 0x16, 0x2C, 0x00, 0x82, 0x69, 0x7A, 0x65, 0x00, 0x45, - 0x82, 0x05, 0x0C, 0xF3, 0x05, 0x13, 0xFE, 0x05, 0x16, 0x1A, 0x06, 0x17, - 0x22, 0x06, 0x19, 0x2A, 0x06, 0x00, 0x44, 0x8C, 0x05, 0x0C, 0xDC, 0x05, - 0x0F, 0xE8, 0x05, 0x00, 0x4A, 0x96, 0x05, 0x0C, 0xA0, 0x05, 0x0F, 0xBE, - 0x05, 0x00, 0x0C, 0x0F, 0x08, 0x00, 0x83, 0x69, 0x62, 0x6C, 0x65, 0x00, - 0x0F, 0x00, 0x44, 0xA9, 0x05, 0x0C, 0xB4, 0x05, 0x00, 0x19, 0x04, 0x00, - 0x85, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, 0x19, 0x04, 0x00, - 0x84, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x44, 0xC5, 0x05, 0x0C, 0xD0, 0x05, - 0x00, 0x19, 0x04, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, - 0x19, 0x04, 0x00, 0x85, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, - 0x04, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x83, 0x62, 0x6C, 0x65, 0x00, - 0x0C, 0x04, 0x19, 0x04, 0x00, 0x82, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x1A, - 0x0B, 0x2C, 0x00, 0x84, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x00, 0x48, 0x05, - 0x06, 0x12, 0x0F, 0x06, 0x00, 0x12, 0x13, 0x00, 0x84, 0x65, 0x6F, 0x70, - 0x6C, 0x65, 0x00, 0x08, 0x12, 0x13, 0x00, 0x85, 0x65, 0x6F, 0x70, 0x6C, - 0x65, 0x00, 0x04, 0x09, 0x00, 0x82, 0x6C, 0x73, 0x65, 0x00, 0x0C, 0x0F, - 0x00, 0x81, 0x74, 0x6C, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x65, 0x6C, - 0x00, 0x0C, 0x08, 0x0A, 0x1C, 0x0B, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x65, - 0x00, 0x46, 0x4D, 0x06, 0x0C, 0x57, 0x06, 0x12, 0x63, 0x06, 0x15, 0x8A, - 0x06, 0x18, 0x91, 0x06, 0x00, 0x12, 0x16, 0x2C, 0x00, 0x83, 0x63, 0x6F, - 0x72, 0x65, 0x00, 0x18, 0x14, 0x04, 0x00, 0x84, 0x63, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x00, 0x47, 0x6D, 0x06, 0x08, 0x76, 0x06, 0x09, 0x7E, 0x06, - 0x00, 0x08, 0x05, 0x00, 0x83, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x05, 0x00, - 0x82, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x00, 0x83, - 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x08, 0x0B, 0x1A, 0x00, 0x81, 0x65, - 0x00, 0x17, 0x00, 0x6C, 0x9A, 0x06, 0x04, 0x9F, 0x06, 0x00, 0x82, 0x72, - 0x75, 0x65, 0x00, 0x10, 0x04, 0x00, 0x82, 0x65, 0x75, 0x72, 0x00, 0x44, - 0xBD, 0x06, 0x08, 0xE1, 0x06, 0x0C, 0xE9, 0x06, 0x0F, 0xF8, 0x06, 0x11, - 0x01, 0x07, 0x12, 0x1F, 0x07, 0x18, 0x2C, 0x07, 0x00, 0x46, 0xC7, 0x06, - 0x08, 0xCF, 0x06, 0x0F, 0xD9, 0x06, 0x00, 0x08, 0x05, 0x00, 0x81, 0x75, - 0x73, 0x65, 0x00, 0x05, 0x2C, 0x00, 0x82, 0x63, 0x61, 0x75, 0x73, 0x65, - 0x00, 0x09, 0x00, 0x83, 0x61, 0x6C, 0x73, 0x65, 0x00, 0x08, 0x0B, 0x17, - 0x00, 0x82, 0x73, 0x65, 0x00, 0x06, 0x15, 0x08, 0x06, 0x1B, 0x08, 0x00, - 0x86, 0x65, 0x72, 0x63, 0x69, 0x73, 0x65, 0x00, 0x0C, 0x04, 0x09, 0x00, - 0x83, 0x6C, 0x73, 0x65, 0x00, 0x48, 0x08, 0x07, 0x12, 0x13, 0x07, 0x00, - 0x16, 0x0C, 0x0F, 0x00, 0x84, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x00, 0x13, - 0x08, 0x15, 0x00, 0x84, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x00, 0x13, - 0x11, 0x04, 0x15, 0x17, 0x00, 0x83, 0x73, 0x70, 0x6F, 0x73, 0x65, 0x00, - 0x06, 0x04, 0x08, 0x05, 0x00, 0x84, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, - 0x44, 0x45, 0x07, 0x08, 0xF3, 0x07, 0x0F, 0xFE, 0x07, 0x19, 0x0A, 0x08, - 0x00, 0x47, 0x55, 0x07, 0x0A, 0x7A, 0x07, 0x0F, 0x87, 0x07, 0x13, 0xCA, - 0x07, 0x15, 0xD4, 0x07, 0x00, 0x12, 0x10, 0x00, 0x50, 0x5F, 0x07, 0x12, - 0x6E, 0x07, 0x00, 0x12, 0x06, 0x04, 0x00, 0x87, 0x63, 0x6F, 0x6D, 0x6D, - 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x06, 0x06, 0x04, 0x00, 0x84, 0x6D, - 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x12, 0x13, 0x12, 0x15, 0x13, 0x00, - 0x84, 0x61, 0x67, 0x61, 0x74, 0x65, 0x00, 0x46, 0x91, 0x07, 0x13, 0x9E, - 0x07, 0x18, 0xAB, 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00, 0x85, 0x63, - 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x10, 0x04, 0x08, 0x17, 0x00, 0x86, - 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x46, 0xB2, 0x07, 0x0F, 0xBF, - 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00, 0x86, 0x63, 0x75, 0x6C, 0x61, - 0x74, 0x65, 0x00, 0x04, 0x06, 0x00, 0x84, 0x63, 0x75, 0x6C, 0x61, 0x74, - 0x65, 0x00, 0x07, 0x18, 0x00, 0x84, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, - 0x48, 0xDB, 0x07, 0x18, 0xE8, 0x07, 0x00, 0x11, 0x04, 0x0A, 0x00, 0x86, - 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x06, 0x04, 0x00, 0x84, - 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0F, 0x0F, 0x04, 0x13, 0x00, - 0x83, 0x65, 0x74, 0x74, 0x65, 0x00, 0x04, 0x13, 0x10, 0x08, 0x17, 0x00, - 0x83, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x61, - 0x74, 0x65, 0x00, 0x4A, 0x1D, 0x08, 0x0C, 0x29, 0x08, 0x16, 0x33, 0x08, - 0x00, 0x08, 0x0F, 0x0F, 0x12, 0x06, 0x00, 0x82, 0x61, 0x67, 0x75, 0x65, - 0x00, 0x14, 0x11, 0x18, 0x00, 0x83, 0x69, 0x71, 0x75, 0x65, 0x00, 0x44, - 0x3A, 0x08, 0x15, 0x42, 0x08, 0x00, 0x06, 0x2C, 0x00, 0x82, 0x75, 0x73, - 0x65, 0x00, 0x08, 0x13, 0x00, 0x84, 0x75, 0x72, 0x73, 0x75, 0x65, 0x00, - 0x4C, 0x53, 0x08, 0x12, 0x78, 0x08, 0x00, 0x48, 0x5D, 0x08, 0x0B, 0x67, - 0x08, 0x0F, 0x70, 0x08, 0x00, 0x0F, 0x08, 0x05, 0x00, 0x83, 0x69, 0x65, - 0x76, 0x65, 0x00, 0x06, 0x04, 0x2C, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, - 0x08, 0x05, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, 0x52, 0x7F, 0x08, 0x19, - 0x86, 0x08, 0x00, 0x15, 0x13, 0x00, 0x82, 0x76, 0x65, 0x00, 0x05, 0x04, - 0x00, 0x83, 0x6F, 0x76, 0x65, 0x00, 0x4C, 0x95, 0x08, 0x11, 0xB7, 0x08, - 0x00, 0x08, 0x00, 0x4B, 0xA1, 0x08, 0x0F, 0xA8, 0x08, 0x15, 0xB0, 0x08, - 0x00, 0x06, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x08, 0x05, 0x00, 0x82, - 0x69, 0x65, 0x66, 0x00, 0x05, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x18, - 0x12, 0x09, 0x2C, 0x00, 0x80, 0x64, 0x00, 0x4C, 0xC6, 0x08, 0x11, 0xD0, - 0x08, 0x00, 0x11, 0x12, 0x0A, 0x2C, 0x00, 0x82, 0x69, 0x6E, 0x67, 0x00, - 0x48, 0xDA, 0x08, 0x0C, 0xE3, 0x08, 0x15, 0x39, 0x09, 0x00, 0x0C, 0x05, - 0x00, 0x83, 0x65, 0x69, 0x6E, 0x67, 0x00, 0x48, 0xF6, 0x08, 0x0B, 0x00, - 0x09, 0x0F, 0x0D, 0x09, 0x15, 0x19, 0x09, 0x17, 0x24, 0x09, 0x1C, 0x2E, - 0x09, 0x00, 0x0B, 0x06, 0x04, 0x06, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x00, - 0x17, 0x06, 0x04, 0x10, 0x00, 0x85, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, - 0x00, 0x08, 0x0C, 0x06, 0x00, 0x85, 0x65, 0x69, 0x6C, 0x69, 0x6E, 0x67, - 0x00, 0x18, 0x06, 0x08, 0x15, 0x00, 0x82, 0x72, 0x69, 0x6E, 0x67, 0x00, - 0x0B, 0x2C, 0x00, 0x84, 0x74, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x1C, - 0x11, 0x04, 0x00, 0x83, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x0C, 0x17, 0x16, - 0x00, 0x83, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x46, 0x53, 0x09, 0x08, 0x73, - 0x09, 0x0A, 0x7F, 0x09, 0x16, 0x89, 0x09, 0x17, 0x9B, 0x09, 0x00, 0x4C, - 0x5A, 0x09, 0x15, 0x64, 0x09, 0x00, 0x17, 0x1A, 0x16, 0x00, 0x83, 0x69, - 0x74, 0x63, 0x68, 0x00, 0x04, 0x08, 0x16, 0x04, 0x08, 0x15, 0x00, 0x86, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x00, 0x17, 0x07, 0x11, 0x04, 0x2C, - 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x11, 0x08, 0x15, 0x17, 0x16, - 0x00, 0x80, 0x74, 0x68, 0x00, 0x0C, 0x0F, 0x13, 0x10, 0x12, 0x06, 0x04, - 0x00, 0x86, 0x63, 0x6F, 0x6D, 0x70, 0x6C, 0x69, 0x73, 0x68, 0x00, 0x4A, - 0xA5, 0x09, 0x0C, 0xBD, 0x09, 0x15, 0xC8, 0x09, 0x00, 0x48, 0xAC, 0x09, - 0x0C, 0xB6, 0x09, 0x00, 0x15, 0x17, 0x16, 0x00, 0x82, 0x6E, 0x67, 0x74, - 0x68, 0x00, 0x08, 0x0B, 0x00, 0x81, 0x68, 0x74, 0x00, 0x1A, 0x07, 0x11, - 0x04, 0x05, 0x00, 0x81, 0x64, 0x74, 0x68, 0x00, 0x18, 0x17, 0x2C, 0x00, - 0x83, 0x72, 0x75, 0x74, 0x68, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x2C, 0x00, - 0x81, 0x69, 0x72, 0x00, 0x11, 0x0C, 0x17, 0x0B, 0x00, 0x84, 0x74, 0x68, - 0x69, 0x6E, 0x6B, 0x00, 0x44, 0xFE, 0x09, 0x07, 0x52, 0x0A, 0x08, 0x76, - 0x0A, 0x09, 0xCB, 0x0A, 0x0F, 0xD4, 0x0A, 0x17, 0xF1, 0x0A, 0x18, 0xFA, - 0x0A, 0x00, 0x4C, 0x08, 0x0A, 0x17, 0x13, 0x0A, 0x18, 0x2C, 0x0A, 0x00, - 0x06, 0x13, 0x1C, 0x17, 0x00, 0x83, 0x69, 0x63, 0x61, 0x6C, 0x00, 0x4C, - 0x1A, 0x0A, 0x18, 0x22, 0x0A, 0x00, 0x11, 0x0C, 0x00, 0x81, 0x69, 0x61, - 0x6C, 0x00, 0x15, 0x0C, 0x19, 0x00, 0x83, 0x74, 0x75, 0x61, 0x6C, 0x00, - 0x51, 0x36, 0x0A, 0x15, 0x3F, 0x0A, 0x17, 0x48, 0x0A, 0x00, 0x04, 0x2C, - 0x00, 0x82, 0x6E, 0x75, 0x61, 0x6C, 0x00, 0x18, 0x17, 0x04, 0x11, 0x00, - 0x82, 0x61, 0x6C, 0x00, 0x0C, 0x19, 0x00, 0x83, 0x72, 0x74, 0x75, 0x61, - 0x6C, 0x00, 0x48, 0x59, 0x0A, 0x18, 0x60, 0x0A, 0x00, 0x0C, 0x09, 0x00, - 0x81, 0x6C, 0x64, 0x00, 0x52, 0x67, 0x0A, 0x1A, 0x6D, 0x0A, 0x00, 0x06, - 0x00, 0x81, 0x6C, 0x64, 0x00, 0x12, 0x00, 0x84, 0x77, 0x6F, 0x75, 0x6C, - 0x64, 0x00, 0x4A, 0x83, 0x0A, 0x0F, 0x8B, 0x0A, 0x17, 0xB9, 0x0A, 0x18, - 0xC1, 0x0A, 0x00, 0x11, 0x0C, 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x44, - 0x92, 0x0A, 0x0F, 0xAC, 0x0A, 0x00, 0x15, 0x00, 0x44, 0x9B, 0x0A, 0x15, - 0xA2, 0x0A, 0x00, 0x13, 0x00, 0x81, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x13, - 0x00, 0x84, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x15, 0x15, 0x04, - 0x13, 0x00, 0x85, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x17, 0x0C, 0x0F, - 0x00, 0x81, 0x6C, 0x65, 0x00, 0x07, 0x08, 0x0B, 0x06, 0x16, 0x00, 0x81, - 0x6C, 0x65, 0x00, 0x08, 0x16, 0x1C, 0x10, 0x00, 0x81, 0x6C, 0x66, 0x00, - 0x0C, 0x09, 0x00, 0x4F, 0xDE, 0x0A, 0x18, 0xE8, 0x0A, 0x00, 0x0F, 0x18, - 0x09, 0x00, 0x84, 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x09, 0x00, 0x83, 0x6C, - 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x18, 0x16, 0x08, 0x15, 0x00, 0x81, 0x6C, - 0x74, 0x00, 0x09, 0x17, 0x04, 0x08, 0x15, 0x0A, 0x00, 0x85, 0x61, 0x74, - 0x65, 0x66, 0x75, 0x6C, 0x00, 0x44, 0x13, 0x0B, 0x0F, 0x24, 0x0B, 0x15, - 0x2F, 0x0B, 0x00, 0x15, 0x0A, 0x12, 0x17, 0x06, 0x08, 0x13, 0x16, 0x00, - 0x84, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0x08, 0x05, 0x12, 0x15, - 0x13, 0x00, 0x82, 0x6C, 0x65, 0x6D, 0x00, 0x12, 0x09, 0x12, 0x06, 0x00, - 0x83, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x44, 0x5D, 0x0B, 0x07, 0x85, - 0x0B, 0x08, 0x8E, 0x0B, 0x0A, 0x0C, 0x0C, 0x0C, 0x5F, 0x0C, 0x12, 0x79, - 0x0C, 0x13, 0x15, 0x0D, 0x15, 0x21, 0x0D, 0x16, 0x2C, 0x0D, 0x18, 0x36, - 0x0D, 0x1A, 0x4D, 0x0D, 0x00, 0x0C, 0x00, 0x4A, 0x66, 0x0B, 0x17, 0x6E, - 0x0B, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x51, 0x75, - 0x0B, 0x15, 0x7D, 0x0B, 0x00, 0x12, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, - 0x00, 0x08, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x18, 0x12, 0x09, - 0x2C, 0x00, 0x81, 0x6E, 0x64, 0x00, 0x47, 0xA4, 0x0B, 0x08, 0xAE, 0x0B, - 0x0A, 0xD8, 0x0B, 0x13, 0xE4, 0x0B, 0x15, 0xED, 0x0B, 0x16, 0xFA, 0x0B, - 0x1A, 0x04, 0x0C, 0x00, 0x0F, 0x0C, 0x0B, 0x06, 0x00, 0x81, 0x72, 0x65, - 0x6E, 0x00, 0x57, 0xB5, 0x0B, 0x1A, 0xCE, 0x0B, 0x00, 0x48, 0xBC, 0x0B, - 0x1A, 0xC4, 0x0B, 0x00, 0x05, 0x00, 0x82, 0x77, 0x65, 0x65, 0x6E, 0x00, - 0x08, 0x05, 0x00, 0x84, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, - 0x00, 0x83, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x12, 0x07, 0x1C, 0x0B, - 0x00, 0x83, 0x72, 0x6F, 0x67, 0x65, 0x6E, 0x00, 0x04, 0x0B, 0x2C, 0x00, - 0x81, 0x70, 0x65, 0x6E, 0x00, 0x07, 0x0F, 0x0B, 0x06, 0x00, 0x84, 0x69, - 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x00, 0x12, 0x12, 0x0B, 0x06, 0x00, 0x83, - 0x73, 0x65, 0x6E, 0x00, 0x17, 0x08, 0x05, 0x00, 0x80, 0x65, 0x6E, 0x00, - 0x48, 0x13, 0x0C, 0x0C, 0x1E, 0x0C, 0x00, 0x0C, 0x15, 0x12, 0x09, 0x00, - 0x83, 0x65, 0x69, 0x67, 0x6E, 0x00, 0x4B, 0x31, 0x0C, 0x0F, 0x37, 0x0C, - 0x11, 0x3F, 0x0C, 0x12, 0x48, 0x0C, 0x15, 0x4F, 0x0C, 0x16, 0x56, 0x0C, - 0x00, 0x17, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x0F, 0x04, 0x00, 0x83, 0x69, - 0x67, 0x6E, 0x00, 0x15, 0x04, 0x08, 0x0F, 0x00, 0x81, 0x6E, 0x67, 0x00, - 0x0A, 0x2C, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x17, 0x16, 0x00, 0x81, 0x6E, - 0x67, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x73, 0x69, 0x67, 0x6E, 0x00, 0x4A, - 0x66, 0x0C, 0x17, 0x6E, 0x0C, 0x00, 0x04, 0x2C, 0x00, 0x81, 0x61, 0x69, - 0x6E, 0x00, 0x04, 0x15, 0x08, 0x06, 0x00, 0x83, 0x74, 0x61, 0x69, 0x6E, - 0x00, 0x4C, 0x83, 0x0C, 0x16, 0xFF, 0x0C, 0x17, 0x09, 0x0D, 0x00, 0x46, - 0x8D, 0x0C, 0x16, 0x9A, 0x0C, 0x17, 0xB4, 0x0C, 0x00, 0x0C, 0x16, 0x08, - 0x07, 0x00, 0x85, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x44, 0xA1, - 0x0C, 0x16, 0xAA, 0x0C, 0x00, 0x0C, 0x0F, 0x00, 0x83, 0x69, 0x73, 0x6F, - 0x6E, 0x00, 0x04, 0x06, 0x06, 0x12, 0x00, 0x83, 0x69, 0x6F, 0x6E, 0x00, - 0x47, 0xC4, 0x0C, 0x0C, 0xCE, 0x0C, 0x0F, 0xDD, 0x0C, 0x11, 0xE9, 0x0C, - 0x16, 0xF5, 0x0C, 0x00, 0x07, 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, - 0x6E, 0x00, 0x17, 0x0C, 0x13, 0x08, 0x15, 0x00, 0x86, 0x65, 0x74, 0x69, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x04, 0x08, 0x15, 0x00, 0x85, 0x6C, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x06, 0x18, 0x09, 0x00, 0x85, 0x6E, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x12, 0x13, 0x00, 0x83, 0x69, 0x74, 0x69, - 0x6F, 0x6E, 0x00, 0x0C, 0x19, 0x0C, 0x07, 0x00, 0x81, 0x69, 0x6F, 0x6E, - 0x00, 0x0C, 0x06, 0x04, 0x15, 0x09, 0x00, 0x83, 0x74, 0x69, 0x6F, 0x6E, - 0x00, 0x13, 0x0B, 0x04, 0x00, 0x84, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6E, - 0x00, 0x17, 0x18, 0x08, 0x15, 0x00, 0x83, 0x74, 0x75, 0x72, 0x6E, 0x00, - 0x0A, 0x0C, 0x0B, 0x17, 0x00, 0x82, 0x6E, 0x67, 0x73, 0x00, 0x55, 0x3D, - 0x0D, 0x17, 0x46, 0x0D, 0x00, 0x17, 0x08, 0x15, 0x00, 0x82, 0x75, 0x72, - 0x6E, 0x00, 0x08, 0x15, 0x00, 0x80, 0x72, 0x6E, 0x00, 0x12, 0x0E, 0x11, - 0x18, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x6E, 0x00, 0x47, 0x62, 0x0D, 0x11, - 0x6D, 0x0D, 0x1A, 0x76, 0x0D, 0x00, 0x08, 0x18, 0x16, 0x13, 0x00, 0x83, - 0x65, 0x75, 0x64, 0x6F, 0x00, 0x1A, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, - 0x77, 0x00, 0x4F, 0x7D, 0x0D, 0x11, 0x85, 0x0D, 0x00, 0x0F, 0x12, 0x09, - 0x00, 0x81, 0x6F, 0x77, 0x00, 0x0E, 0x2C, 0x00, 0x81, 0x6F, 0x77, 0x00, - 0x56, 0x93, 0x0D, 0x18, 0x9D, 0x0D, 0x00, 0x04, 0x0B, 0x15, 0x08, 0x13, - 0x00, 0x81, 0x70, 0x73, 0x00, 0x12, 0x12, 0x0F, 0x00, 0x81, 0x6B, 0x75, - 0x70, 0x00, 0x44, 0xC5, 0x0D, 0x08, 0x06, 0x0E, 0x0B, 0x13, 0x0F, 0x0F, - 0x1C, 0x0F, 0x12, 0x2A, 0x0F, 0x13, 0x3B, 0x0F, 0x16, 0x46, 0x0F, 0x17, - 0x4F, 0x0F, 0x18, 0x5B, 0x0F, 0x1C, 0x64, 0x0F, 0x00, 0x4C, 0xCF, 0x0D, - 0x0F, 0xD9, 0x0D, 0x18, 0xFB, 0x0D, 0x00, 0x0F, 0x0C, 0x10, 0x0C, 0x16, - 0x00, 0x82, 0x61, 0x72, 0x00, 0x4C, 0xE0, 0x0D, 0x18, 0xEB, 0x0D, 0x00, - 0x10, 0x10, 0x0C, 0x16, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x72, 0x00, 0x06, - 0x0C, 0x17, 0x04, 0x13, 0x00, 0x86, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6C, - 0x61, 0x72, 0x00, 0x0F, 0x0A, 0x08, 0x15, 0x00, 0x83, 0x75, 0x6C, 0x61, - 0x72, 0x00, 0x44, 0x25, 0x0E, 0x07, 0x2D, 0x0E, 0x0B, 0x3A, 0x0E, 0x0C, - 0x77, 0x0E, 0x0F, 0x91, 0x0E, 0x10, 0x9B, 0x0E, 0x11, 0xA5, 0x0E, 0x12, - 0xD1, 0x0E, 0x17, 0xD9, 0x0E, 0x19, 0xF8, 0x0E, 0x00, 0x0F, 0x06, 0x00, - 0x82, 0x65, 0x61, 0x72, 0x00, 0x11, 0x04, 0x0F, 0x04, 0x06, 0x00, 0x84, - 0x65, 0x6E, 0x64, 0x61, 0x72, 0x00, 0x4A, 0x41, 0x0E, 0x17, 0x4C, 0x0E, - 0x00, 0x0C, 0x08, 0x0B, 0x00, 0x85, 0x69, 0x67, 0x68, 0x65, 0x72, 0x00, - 0x48, 0x56, 0x0E, 0x12, 0x62, 0x0E, 0x18, 0x6E, 0x0E, 0x00, 0x0B, 0x0A, - 0x12, 0x17, 0x00, 0x85, 0x65, 0x74, 0x68, 0x65, 0x72, 0x00, 0x04, 0x11, - 0x00, 0x86, 0x61, 0x6E, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x09, 0x00, - 0x83, 0x72, 0x74, 0x68, 0x65, 0x72, 0x00, 0x4B, 0x7E, 0x0E, 0x0F, 0x86, - 0x0E, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x65, 0x69, 0x72, 0x00, 0x13, 0x10, - 0x12, 0x06, 0x00, 0x83, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x17, 0x0C, 0x09, - 0x00, 0x83, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x10, 0x04, 0x15, 0x0A, 0x2C, - 0x00, 0x81, 0x61, 0x72, 0x00, 0x4C, 0xAC, 0x0E, 0x17, 0xB8, 0x0E, 0x00, - 0x0A, 0x0A, 0x08, 0x05, 0x00, 0x84, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x00, - 0x4C, 0xBF, 0x0E, 0x16, 0xC8, 0x0E, 0x00, 0x12, 0x13, 0x00, 0x83, 0x6E, - 0x74, 0x65, 0x72, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x65, 0x6E, 0x65, 0x72, - 0x00, 0x09, 0x08, 0x05, 0x00, 0x81, 0x72, 0x65, 0x00, 0x4B, 0xE0, 0x0E, - 0x18, 0xEA, 0x0E, 0x00, 0x12, 0x11, 0x04, 0x00, 0x83, 0x74, 0x68, 0x65, - 0x72, 0x00, 0x13, 0x12, 0x10, 0x06, 0x00, 0x86, 0x6F, 0x6D, 0x70, 0x75, - 0x74, 0x65, 0x72, 0x00, 0x48, 0xFF, 0x0E, 0x1A, 0x0A, 0x0F, 0x00, 0x08, - 0x15, 0x08, 0x0B, 0x1A, 0x00, 0x83, 0x76, 0x65, 0x72, 0x00, 0x12, 0x0B, - 0x00, 0x82, 0x65, 0x76, 0x65, 0x72, 0x00, 0x08, 0x17, 0x12, 0x00, 0x82, - 0x68, 0x65, 0x72, 0x00, 0x04, 0x18, 0x06, 0x0C, 0x17, 0x15, 0x04, 0x13, - 0x00, 0x82, 0x6C, 0x61, 0x72, 0x00, 0x17, 0x04, 0x15, 0x08, 0x17, 0x11, - 0x0C, 0x00, 0x87, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x00, 0x17, - 0x0F, 0x0F, 0x18, 0x11, 0x00, 0x82, 0x70, 0x74, 0x72, 0x00, 0x04, 0x08, - 0x1C, 0x2C, 0x00, 0x81, 0x72, 0x73, 0x00, 0x12, 0x04, 0x15, 0x08, 0x13, - 0x12, 0x00, 0x82, 0x74, 0x6F, 0x72, 0x00, 0x06, 0x12, 0x2C, 0x00, 0x81, - 0x63, 0x75, 0x72, 0x00, 0x08, 0x19, 0x08, 0x2C, 0x00, 0x81, 0x72, 0x79, - 0x00, 0x44, 0x83, 0x0F, 0x08, 0xB7, 0x0F, 0x0A, 0x47, 0x10, 0x15, 0x52, - 0x10, 0x16, 0x5D, 0x10, 0x17, 0xF5, 0x10, 0x18, 0xFD, 0x10, 0x00, 0x4B, - 0x90, 0x0F, 0x13, 0x9B, 0x0F, 0x15, 0xA5, 0x0F, 0x1C, 0xAE, 0x0F, 0x00, - 0x13, 0x15, 0x08, 0x13, 0x00, 0x83, 0x68, 0x61, 0x70, 0x73, 0x00, 0x0B, - 0x15, 0x08, 0x13, 0x00, 0x82, 0x61, 0x70, 0x73, 0x00, 0x08, 0x1C, 0x2C, - 0x00, 0x82, 0x61, 0x72, 0x73, 0x00, 0x1A, 0x0F, 0x04, 0x00, 0x82, 0x61, - 0x79, 0x73, 0x00, 0x44, 0xC7, 0x0F, 0x06, 0xDE, 0x0F, 0x0C, 0xE9, 0x0F, - 0x0F, 0x35, 0x10, 0x16, 0x3C, 0x10, 0x00, 0x47, 0xCE, 0x0F, 0x0E, 0xD6, - 0x0F, 0x00, 0x0C, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x73, 0x00, 0x17, 0x00, - 0x83, 0x61, 0x6B, 0x65, 0x73, 0x00, 0x08, 0x07, 0x11, 0x0C, 0x00, 0x83, - 0x69, 0x63, 0x65, 0x73, 0x00, 0x46, 0xF3, 0x0F, 0x15, 0x1A, 0x10, 0x17, - 0x29, 0x10, 0x00, 0x48, 0xFA, 0x0F, 0x0C, 0x04, 0x10, 0x00, 0x07, 0x11, - 0x0C, 0x00, 0x84, 0x69, 0x63, 0x65, 0x73, 0x00, 0x47, 0x0B, 0x10, 0x17, - 0x12, 0x10, 0x00, 0x11, 0x0C, 0x00, 0x82, 0x65, 0x73, 0x00, 0x15, 0x08, - 0x19, 0x00, 0x82, 0x65, 0x73, 0x00, 0x12, 0x16, 0x08, 0x06, 0x06, 0x04, - 0x00, 0x84, 0x73, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x00, 0x0F, 0x0C, 0x05, - 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x04, 0x09, 0x00, - 0x81, 0x73, 0x65, 0x00, 0x12, 0x0B, 0x06, 0x2C, 0x00, 0x82, 0x6F, 0x73, - 0x65, 0x73, 0x00, 0x0C, 0x11, 0x0B, 0x17, 0x00, 0x83, 0x69, 0x6E, 0x67, - 0x73, 0x00, 0x08, 0x04, 0x1C, 0x2C, 0x00, 0x83, 0x65, 0x61, 0x72, 0x73, - 0x00, 0x44, 0x67, 0x10, 0x08, 0x73, 0x10, 0x12, 0xEA, 0x10, 0x00, 0x15, - 0x04, 0x05, 0x10, 0x08, 0x00, 0x82, 0x72, 0x61, 0x73, 0x73, 0x00, 0x46, - 0x80, 0x10, 0x11, 0x98, 0x10, 0x15, 0xB5, 0x10, 0x16, 0xD2, 0x10, 0x00, - 0x46, 0x87, 0x10, 0x18, 0x90, 0x10, 0x00, 0x12, 0x15, 0x13, 0x00, 0x83, - 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x82, 0x63, 0x65, 0x73, 0x73, 0x00, - 0x4C, 0x9F, 0x10, 0x16, 0xAB, 0x10, 0x00, 0x16, 0x16, 0x18, 0x05, 0x00, - 0x85, 0x69, 0x6E, 0x65, 0x73, 0x73, 0x00, 0x18, 0x05, 0x00, 0x83, 0x69, - 0x6E, 0x65, 0x73, 0x73, 0x00, 0x13, 0x00, 0x55, 0xBE, 0x10, 0x18, 0xC9, - 0x10, 0x00, 0x18, 0x16, 0x00, 0x85, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x00, 0x16, 0x00, 0x83, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0xD9, - 0x10, 0x12, 0xE2, 0x10, 0x00, 0x06, 0x18, 0x16, 0x00, 0x83, 0x65, 0x73, - 0x73, 0x00, 0x13, 0x00, 0x82, 0x73, 0x65, 0x73, 0x73, 0x00, 0x15, 0x06, - 0x06, 0x04, 0x00, 0x84, 0x72, 0x6F, 0x73, 0x73, 0x00, 0x15, 0x0C, 0x09, - 0x00, 0x81, 0x73, 0x74, 0x00, 0x52, 0x04, 0x11, 0x16, 0x12, 0x11, 0x00, - 0x0F, 0x12, 0x10, 0x12, 0x11, 0x04, 0x00, 0x84, 0x61, 0x6C, 0x6F, 0x75, - 0x73, 0x00, 0x11, 0x08, 0x06, 0x11, 0x12, 0x06, 0x00, 0x85, 0x73, 0x65, - 0x6E, 0x73, 0x75, 0x73, 0x00, 0x44, 0x46, 0x11, 0x08, 0x64, 0x11, 0x0A, - 0x81, 0x11, 0x0B, 0x8B, 0x11, 0x0C, 0xAF, 0x11, 0x0F, 0xBA, 0x11, 0x10, - 0xC5, 0x11, 0x11, 0xD1, 0x11, 0x12, 0x1F, 0x13, 0x13, 0x59, 0x13, 0x16, - 0x75, 0x13, 0x18, 0x15, 0x14, 0x00, 0x55, 0x4D, 0x11, 0x1A, 0x58, 0x11, - 0x00, 0x08, 0x13, 0x08, 0x16, 0x00, 0x83, 0x61, 0x72, 0x61, 0x74, 0x00, - 0x0B, 0x08, 0x10, 0x12, 0x16, 0x00, 0x83, 0x77, 0x68, 0x61, 0x74, 0x00, - 0x44, 0x6B, 0x11, 0x11, 0x74, 0x11, 0x00, 0x15, 0x0A, 0x2C, 0x00, 0x82, - 0x65, 0x61, 0x74, 0x00, 0x10, 0x11, 0x15, 0x08, 0x19, 0x12, 0x0A, 0x00, - 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0B, 0x18, 0x04, 0x06, 0x00, 0x82, 0x67, - 0x68, 0x74, 0x00, 0x47, 0x95, 0x11, 0x0A, 0x9C, 0x11, 0x0C, 0xA4, 0x11, - 0x00, 0x0C, 0x1A, 0x00, 0x81, 0x74, 0x68, 0x00, 0x11, 0x08, 0x0F, 0x00, - 0x81, 0x74, 0x68, 0x00, 0x0A, 0x11, 0x12, 0x17, 0x00, 0x83, 0x69, 0x67, - 0x68, 0x74, 0x00, 0x17, 0x18, 0x12, 0x05, 0x04, 0x00, 0x81, 0x20, 0x69, - 0x74, 0x00, 0x16, 0x18, 0x08, 0x15, 0x00, 0x83, 0x73, 0x75, 0x6C, 0x74, - 0x00, 0x04, 0x17, 0x15, 0x12, 0x13, 0x10, 0x0C, 0x00, 0x81, 0x6E, 0x74, - 0x00, 0x44, 0xDE, 0x11, 0x08, 0x16, 0x12, 0x15, 0x0C, 0x13, 0x16, 0x17, - 0x13, 0x00, 0x4C, 0xEB, 0x11, 0x11, 0xF6, 0x11, 0x15, 0x01, 0x12, 0x17, - 0x0B, 0x12, 0x00, 0x13, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x82, 0x65, 0x6E, - 0x74, 0x00, 0x0C, 0x10, 0x12, 0x15, 0x13, 0x00, 0x82, 0x65, 0x6E, 0x74, - 0x00, 0x04, 0x13, 0x13, 0x04, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x08, - 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x4C, 0x23, - 0x12, 0x10, 0x44, 0x12, 0x15, 0xA8, 0x12, 0x19, 0x02, 0x13, 0x00, 0x46, - 0x2A, 0x12, 0x13, 0x37, 0x12, 0x00, 0x08, 0x09, 0x09, 0x08, 0x00, 0x85, - 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x06, 0x08, 0x15, 0x00, - 0x85, 0x69, 0x70, 0x69, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x51, 0x12, 0x11, - 0x5D, 0x12, 0x15, 0x7E, 0x12, 0x17, 0x9D, 0x12, 0x00, 0x19, 0x12, 0x0A, - 0x00, 0x83, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x64, 0x12, - 0x15, 0x70, 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x84, 0x72, 0x6E, 0x6D, - 0x65, 0x6E, 0x74, 0x00, 0x12, 0x19, 0x12, 0x0A, 0x00, 0x86, 0x65, 0x72, - 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x85, 0x12, 0x12, 0x90, 0x12, - 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, - 0x19, 0x12, 0x0A, 0x00, 0x85, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, - 0x00, 0x04, 0x17, 0x16, 0x00, 0x83, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x00, - 0x44, 0xB5, 0x12, 0x08, 0xC0, 0x12, 0x09, 0xCC, 0x12, 0x15, 0xD7, 0x12, - 0x00, 0x13, 0x04, 0x00, 0x84, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, - 0x09, 0x0C, 0x07, 0x00, 0x84, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, - 0x09, 0x0C, 0x07, 0x00, 0x83, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x44, - 0xDE, 0x12, 0x08, 0xF6, 0x12, 0x00, 0x13, 0x00, 0x44, 0xE7, 0x12, 0x13, - 0xEF, 0x12, 0x00, 0x85, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x04, - 0x00, 0x83, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x85, 0x66, - 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x0F, 0x08, 0x15, 0x00, 0x82, - 0x61, 0x6E, 0x74, 0x00, 0x08, 0x09, 0x09, 0x0C, 0x07, 0x00, 0x81, 0x65, - 0x6E, 0x74, 0x00, 0x12, 0x06, 0x00, 0x82, 0x6E, 0x73, 0x74, 0x00, 0x45, - 0x2F, 0x13, 0x10, 0x36, 0x13, 0x11, 0x3D, 0x13, 0x15, 0x47, 0x13, 0x16, - 0x50, 0x13, 0x00, 0x04, 0x2C, 0x00, 0x80, 0x75, 0x74, 0x00, 0x0F, 0x04, - 0x00, 0x80, 0x73, 0x74, 0x00, 0x07, 0x0C, 0x07, 0x00, 0x82, 0x20, 0x6E, - 0x6F, 0x74, 0x00, 0x13, 0x08, 0x15, 0x00, 0x82, 0x6F, 0x72, 0x74, 0x00, - 0x10, 0x0F, 0x04, 0x00, 0x82, 0x6F, 0x73, 0x74, 0x00, 0x48, 0x60, 0x13, - 0x1C, 0x6B, 0x13, 0x00, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x83, 0x65, 0x69, - 0x70, 0x74, 0x00, 0x06, 0x11, 0x08, 0x00, 0x82, 0x72, 0x79, 0x70, 0x74, - 0x00, 0x48, 0x8B, 0x13, 0x0A, 0xB4, 0x13, 0x0C, 0xBD, 0x13, 0x10, 0xDA, - 0x13, 0x11, 0xE4, 0x13, 0x12, 0xFF, 0x13, 0x18, 0x0A, 0x14, 0x00, 0x4A, - 0x92, 0x13, 0x15, 0xA9, 0x13, 0x00, 0x4C, 0x99, 0x13, 0x18, 0xA1, 0x13, - 0x00, 0x0B, 0x00, 0x82, 0x68, 0x65, 0x73, 0x74, 0x00, 0x16, 0x00, 0x82, - 0x67, 0x65, 0x73, 0x74, 0x00, 0x17, 0x11, 0x0C, 0x00, 0x83, 0x65, 0x72, - 0x65, 0x73, 0x74, 0x00, 0x15, 0x04, 0x0F, 0x00, 0x81, 0x65, 0x73, 0x74, - 0x00, 0x49, 0xC4, 0x13, 0x11, 0xD0, 0x13, 0x00, 0x08, 0x11, 0x04, 0x10, - 0x00, 0x84, 0x69, 0x66, 0x65, 0x73, 0x74, 0x00, 0x04, 0x0A, 0x04, 0x00, - 0x83, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x12, 0x0F, 0x04, 0x00, 0x83, 0x6D, - 0x6F, 0x73, 0x74, 0x00, 0x44, 0xEB, 0x13, 0x11, 0xF6, 0x13, 0x00, 0x0C, - 0x0A, 0x04, 0x00, 0x84, 0x61, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x0C, 0x04, - 0x0A, 0x04, 0x00, 0x82, 0x73, 0x74, 0x00, 0x0F, 0x10, 0x04, 0x00, 0x84, - 0x6C, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x0D, 0x04, 0x2C, 0x00, 0x83, 0x64, - 0x6A, 0x75, 0x73, 0x74, 0x00, 0x46, 0x1F, 0x14, 0x13, 0x38, 0x14, 0x17, - 0x4F, 0x14, 0x00, 0x48, 0x26, 0x14, 0x15, 0x31, 0x14, 0x00, 0x06, 0x1B, - 0x08, 0x00, 0x84, 0x65, 0x63, 0x75, 0x74, 0x65, 0x00, 0x0C, 0x06, 0x00, - 0x80, 0x69, 0x74, 0x00, 0x57, 0x3F, 0x14, 0x18, 0x47, 0x14, 0x00, 0x11, - 0x0C, 0x00, 0x83, 0x70, 0x75, 0x74, 0x00, 0x12, 0x00, 0x82, 0x74, 0x70, - 0x75, 0x74, 0x00, 0x13, 0x18, 0x12, 0x00, 0x83, 0x74, 0x70, 0x75, 0x74, - 0x00, 0x48, 0x60, 0x14, 0x0C, 0x84, 0x14, 0x00, 0x44, 0x67, 0x14, 0x0C, - 0x6E, 0x14, 0x00, 0x0B, 0x2C, 0x00, 0x81, 0x76, 0x65, 0x00, 0x46, 0x75, - 0x14, 0x08, 0x7D, 0x14, 0x00, 0x08, 0x15, 0x00, 0x82, 0x65, 0x69, 0x76, - 0x00, 0x06, 0x08, 0x15, 0x00, 0x81, 0x76, 0x00, 0x08, 0x0B, 0x06, 0x04, - 0x2C, 0x00, 0x82, 0x69, 0x65, 0x76, 0x65, 0x00, 0x4C, 0x9A, 0x14, 0x11, - 0xA4, 0x14, 0x12, 0xAD, 0x14, 0x00, 0x08, 0x19, 0x08, 0x15, 0x00, 0x82, - 0x69, 0x65, 0x77, 0x00, 0x12, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, 0x77, - 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6C, 0x6F, 0x77, 0x00, 0x44, 0xD2, - 0x14, 0x06, 0xDD, 0x14, 0x08, 0x18, 0x15, 0x0B, 0x22, 0x15, 0x0F, 0x34, - 0x15, 0x11, 0xF9, 0x15, 0x15, 0x03, 0x16, 0x16, 0xA8, 0x16, 0x17, 0xC3, - 0x16, 0x00, 0x11, 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x61, 0x6E, 0x79, - 0x00, 0x44, 0xEA, 0x14, 0x08, 0xF6, 0x14, 0x0C, 0x01, 0x15, 0x13, 0x0C, - 0x15, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, - 0x79, 0x00, 0x18, 0x14, 0x08, 0x15, 0x09, 0x00, 0x81, 0x6E, 0x63, 0x79, - 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x81, 0x73, 0x79, 0x00, - 0x18, 0x15, 0x0E, 0x11, 0x04, 0x05, 0x00, 0x81, 0x74, 0x63, 0x79, 0x00, - 0x17, 0x09, 0x04, 0x16, 0x00, 0x82, 0x65, 0x74, 0x79, 0x00, 0x06, 0x15, - 0x04, 0x15, 0x0C, 0x08, 0x0B, 0x00, 0x87, 0x69, 0x65, 0x72, 0x61, 0x72, - 0x63, 0x68, 0x79, 0x00, 0x44, 0x47, 0x15, 0x0B, 0x8A, 0x15, 0x0E, 0x94, - 0x15, 0x0F, 0x9C, 0x15, 0x12, 0xE4, 0x15, 0x15, 0xEE, 0x15, 0x00, 0x45, - 0x5A, 0x15, 0x08, 0x63, 0x15, 0x0F, 0x69, 0x15, 0x11, 0x72, 0x15, 0x15, - 0x79, 0x15, 0x18, 0x82, 0x15, 0x00, 0x12, 0x15, 0x13, 0x00, 0x81, 0x62, - 0x6C, 0x79, 0x00, 0x15, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x15, 0x00, - 0x83, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x0C, 0x09, 0x00, 0x80, 0x6C, 0x79, - 0x00, 0x08, 0x11, 0x08, 0x0A, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x17, 0x06, - 0x04, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x0A, 0x0C, 0x0F, 0x16, 0x00, 0x81, - 0x74, 0x6C, 0x79, 0x00, 0x0C, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x79, 0x00, - 0x44, 0xA6, 0x15, 0x05, 0xD1, 0x15, 0x08, 0xDA, 0x15, 0x00, 0x56, 0xAD, - 0x15, 0x17, 0xC5, 0x15, 0x00, 0x18, 0x00, 0x6C, 0xB6, 0x15, 0x16, 0xBD, - 0x15, 0x00, 0x83, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x00, 0x84, - 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x06, 0x04, 0x00, 0x85, 0x74, 0x75, - 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x04, 0x05, 0x12, 0x15, 0x13, 0x00, 0x81, - 0x79, 0x00, 0x04, 0x15, 0x00, 0x84, 0x65, 0x61, 0x6C, 0x6C, 0x79, 0x00, - 0x10, 0x12, 0x11, 0x04, 0x00, 0x82, 0x61, 0x6C, 0x79, 0x00, 0x04, 0x10, - 0x0C, 0x15, 0x13, 0x00, 0x81, 0x69, 0x6C, 0x79, 0x00, 0x08, 0x12, 0x10, - 0x2C, 0x00, 0x82, 0x6E, 0x65, 0x79, 0x00, 0x44, 0x13, 0x16, 0x08, 0x7B, - 0x16, 0x12, 0x84, 0x16, 0x17, 0x91, 0x16, 0x19, 0xA0, 0x16, 0x00, 0x45, - 0x23, 0x16, 0x0C, 0x2C, 0x16, 0x0F, 0x39, 0x16, 0x10, 0x55, 0x16, 0x16, - 0x5E, 0x16, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x72, 0x61, 0x72, 0x79, 0x00, - 0x0F, 0x0F, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x84, 0x69, 0x61, 0x72, 0x79, - 0x00, 0x4C, 0x40, 0x16, 0x0F, 0x4A, 0x16, 0x00, 0x1B, 0x18, 0x04, 0x00, - 0x82, 0x69, 0x61, 0x72, 0x79, 0x00, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x83, - 0x69, 0x61, 0x72, 0x79, 0x00, 0x18, 0x16, 0x00, 0x82, 0x6D, 0x61, 0x72, - 0x79, 0x00, 0x08, 0x06, 0x00, 0x46, 0x68, 0x16, 0x08, 0x73, 0x16, 0x00, - 0x08, 0x11, 0x00, 0x85, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x00, 0x11, - 0x00, 0x82, 0x73, 0x61, 0x72, 0x79, 0x00, 0x13, 0x12, 0x15, 0x13, 0x00, - 0x80, 0x74, 0x79, 0x00, 0x0A, 0x04, 0x17, 0x04, 0x06, 0x00, 0x84, 0x65, - 0x67, 0x6F, 0x72, 0x79, 0x00, 0x11, 0x18, 0x06, 0x12, 0x2C, 0x00, 0x86, - 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x72, 0x79, 0x00, 0x08, 0x2C, 0x00, 0x81, - 0x65, 0x72, 0x79, 0x00, 0x04, 0x00, 0x55, 0xB1, 0x16, 0x1A, 0xBC, 0x16, - 0x00, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, - 0x0F, 0x04, 0x00, 0x81, 0x79, 0x73, 0x00, 0x49, 0xCD, 0x16, 0x0F, 0xD5, - 0x16, 0x15, 0xDE, 0x16, 0x00, 0x04, 0x16, 0x00, 0x81, 0x65, 0x74, 0x79, - 0x00, 0x0C, 0x05, 0x04, 0x00, 0x81, 0x69, 0x74, 0x79, 0x00, 0x13, 0x08, - 0x12, 0x15, 0x13, 0x00, 0x84, 0x70, 0x65, 0x72, 0x74, 0x79, 0x00}; + 0x00, 0x82, 0x6F, 0x72, 0x64, 0x00, 0x44, 0x01, 0x03, 0x08, 0x0C, 0x03, + 0x00, 0x1A, 0x12, 0x09, 0x00, 0x83, 0x72, 0x77, 0x61, 0x72, 0x64, 0x00, + 0x47, 0x13, 0x03, 0x0C, 0x1D, 0x03, 0x00, 0x0C, 0x16, 0x11, 0x12, 0x06, + 0x00, 0x80, 0x65, 0x64, 0x00, 0x1A, 0x00, 0x83, 0x65, 0x69, 0x72, 0x64, + 0x00, 0x12, 0x00, 0x4B, 0x2E, 0x03, 0x15, 0x34, 0x03, 0x00, 0x16, 0x00, + 0x80, 0x6C, 0x64, 0x00, 0x04, 0x00, 0x80, 0x6E, 0x64, 0x00, 0x44, 0x68, + 0x03, 0x05, 0x75, 0x03, 0x06, 0xA0, 0x03, 0x07, 0x20, 0x04, 0x08, 0x3C, + 0x04, 0x0A, 0x90, 0x04, 0x0B, 0x08, 0x05, 0x0C, 0x59, 0x05, 0x0F, 0x62, + 0x05, 0x11, 0x24, 0x06, 0x15, 0x30, 0x06, 0x16, 0x9A, 0x06, 0x17, 0x1B, + 0x07, 0x18, 0xF6, 0x07, 0x19, 0x2F, 0x08, 0x00, 0x06, 0x13, 0x16, 0x08, + 0x10, 0x04, 0x11, 0x00, 0x82, 0x61, 0x63, 0x65, 0x00, 0x44, 0x7C, 0x03, + 0x0F, 0x86, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x80, 0x6C, + 0x65, 0x00, 0x44, 0x8D, 0x03, 0x18, 0x98, 0x03, 0x00, 0x0F, 0x0C, 0x04, + 0x19, 0x04, 0x00, 0x82, 0x62, 0x6C, 0x65, 0x00, 0x12, 0x07, 0x00, 0x82, + 0x62, 0x6C, 0x65, 0x00, 0x48, 0xAD, 0x03, 0x0C, 0xB8, 0x03, 0x11, 0xC1, + 0x03, 0x13, 0x13, 0x04, 0x00, 0x15, 0x08, 0x09, 0x08, 0x15, 0x00, 0x81, + 0x6E, 0x63, 0x65, 0x00, 0x08, 0x13, 0x00, 0x83, 0x69, 0x65, 0x63, 0x65, + 0x00, 0x44, 0xCB, 0x03, 0x08, 0xD8, 0x03, 0x18, 0x09, 0x04, 0x00, 0x17, + 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x65, 0x6E, 0x63, 0x65, 0x00, + 0x55, 0xDF, 0x03, 0x17, 0xFE, 0x03, 0x00, 0x08, 0x00, 0x49, 0xE8, 0x03, + 0x0F, 0xF5, 0x03, 0x00, 0x15, 0x2C, 0x00, 0x86, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6E, 0x63, 0x65, 0x00, 0x12, 0x17, 0x00, 0x83, 0x61, 0x6E, 0x63, + 0x65, 0x00, 0x11, 0x0C, 0x04, 0x10, 0x00, 0x81, 0x61, 0x6E, 0x63, 0x65, + 0x00, 0x14, 0x08, 0x16, 0x00, 0x82, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x04, + 0x16, 0x08, 0x10, 0x04, 0x11, 0x00, 0x83, 0x70, 0x61, 0x63, 0x65, 0x00, + 0x0C, 0x15, 0x08, 0x19, 0x00, 0x52, 0x2C, 0x04, 0x19, 0x32, 0x04, 0x00, + 0x82, 0x72, 0x69, 0x64, 0x65, 0x00, 0x12, 0x00, 0x85, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x00, 0x17, 0x00, 0x44, 0x4B, 0x04, 0x0C, 0x56, 0x04, + 0x11, 0x60, 0x04, 0x17, 0x83, 0x04, 0x00, 0x15, 0x04, 0x18, 0x0A, 0x00, + 0x82, 0x6E, 0x74, 0x65, 0x65, 0x00, 0x10, 0x10, 0x12, 0x06, 0x00, 0x81, + 0x74, 0x65, 0x65, 0x00, 0x04, 0x15, 0x00, 0x44, 0x6A, 0x04, 0x18, 0x76, + 0x04, 0x00, 0x0A, 0x00, 0x86, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, 0x65, + 0x65, 0x00, 0x04, 0x0A, 0x00, 0x87, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, + 0x65, 0x65, 0x00, 0x0C, 0x10, 0x12, 0x06, 0x00, 0x84, 0x6D, 0x69, 0x74, + 0x74, 0x65, 0x65, 0x00, 0x44, 0x9A, 0x04, 0x07, 0xDD, 0x04, 0x10, 0xFF, + 0x04, 0x00, 0x4A, 0xA7, 0x04, 0x11, 0xB2, 0x04, 0x16, 0xBB, 0x04, 0x18, + 0xC4, 0x04, 0x00, 0x15, 0x12, 0x10, 0x00, 0x83, 0x74, 0x67, 0x61, 0x67, + 0x65, 0x00, 0x0B, 0x06, 0x00, 0x83, 0x61, 0x6E, 0x67, 0x65, 0x00, 0x08, + 0x10, 0x00, 0x82, 0x73, 0x61, 0x67, 0x65, 0x00, 0x0A, 0x00, 0x6C, 0xCD, + 0x04, 0x04, 0xD3, 0x04, 0x00, 0x83, 0x61, 0x75, 0x67, 0x65, 0x00, 0x0F, + 0x00, 0x84, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x08, 0x0F, 0x00, + 0x44, 0xEA, 0x04, 0x0C, 0xF0, 0x04, 0x0F, 0xF9, 0x04, 0x00, 0x83, 0x6C, + 0x65, 0x67, 0x65, 0x00, 0x19, 0x0C, 0x15, 0x13, 0x00, 0x82, 0x67, 0x65, + 0x00, 0x04, 0x00, 0x82, 0x67, 0x65, 0x00, 0x04, 0x0C, 0x00, 0x83, 0x6D, + 0x61, 0x67, 0x65, 0x00, 0x17, 0x00, 0x47, 0x1A, 0x05, 0x10, 0x24, 0x05, + 0x12, 0x2E, 0x05, 0x16, 0x37, 0x05, 0x17, 0x40, 0x05, 0x00, 0x11, 0x04, + 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12, 0x15, 0x09, 0x00, + 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x20, 0x74, + 0x68, 0x65, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, + 0x44, 0x47, 0x05, 0x18, 0x4F, 0x05, 0x00, 0x2C, 0x00, 0x82, 0x20, 0x74, + 0x68, 0x65, 0x00, 0x12, 0x05, 0x04, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, + 0x00, 0x1D, 0x16, 0x2C, 0x00, 0x82, 0x69, 0x7A, 0x65, 0x00, 0x45, 0x75, + 0x05, 0x0C, 0xE6, 0x05, 0x13, 0xF1, 0x05, 0x16, 0x0D, 0x06, 0x17, 0x15, + 0x06, 0x19, 0x1D, 0x06, 0x00, 0x44, 0x7F, 0x05, 0x0C, 0xCF, 0x05, 0x0F, + 0xDB, 0x05, 0x00, 0x4A, 0x89, 0x05, 0x0C, 0x93, 0x05, 0x0F, 0xB1, 0x05, + 0x00, 0x0C, 0x0F, 0x08, 0x00, 0x83, 0x69, 0x62, 0x6C, 0x65, 0x00, 0x0F, + 0x00, 0x44, 0x9C, 0x05, 0x0C, 0xA7, 0x05, 0x00, 0x19, 0x04, 0x00, 0x85, + 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, 0x19, 0x04, 0x00, 0x84, + 0x61, 0x62, 0x6C, 0x65, 0x00, 0x44, 0xB8, 0x05, 0x0C, 0xC3, 0x05, 0x00, + 0x19, 0x04, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x19, + 0x04, 0x00, 0x85, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, + 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x83, 0x62, 0x6C, 0x65, 0x00, 0x0C, + 0x04, 0x19, 0x04, 0x00, 0x82, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x1A, 0x0B, + 0x2C, 0x00, 0x84, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x00, 0x48, 0xF8, 0x05, + 0x12, 0x02, 0x06, 0x00, 0x12, 0x13, 0x00, 0x84, 0x65, 0x6F, 0x70, 0x6C, + 0x65, 0x00, 0x08, 0x12, 0x13, 0x00, 0x85, 0x65, 0x6F, 0x70, 0x6C, 0x65, + 0x00, 0x04, 0x09, 0x00, 0x82, 0x6C, 0x73, 0x65, 0x00, 0x0C, 0x0F, 0x00, + 0x81, 0x74, 0x6C, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x00, + 0x0C, 0x08, 0x0A, 0x1C, 0x0B, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x65, 0x00, + 0x46, 0x40, 0x06, 0x0C, 0x4A, 0x06, 0x12, 0x56, 0x06, 0x15, 0x7D, 0x06, + 0x18, 0x84, 0x06, 0x00, 0x12, 0x16, 0x2C, 0x00, 0x83, 0x63, 0x6F, 0x72, + 0x65, 0x00, 0x18, 0x14, 0x04, 0x00, 0x84, 0x63, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x00, 0x47, 0x60, 0x06, 0x08, 0x69, 0x06, 0x09, 0x71, 0x06, 0x00, + 0x08, 0x05, 0x00, 0x83, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x05, 0x00, 0x82, + 0x66, 0x6F, 0x72, 0x65, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x00, 0x83, 0x65, + 0x66, 0x6F, 0x72, 0x65, 0x00, 0x08, 0x0B, 0x1A, 0x00, 0x81, 0x65, 0x00, + 0x17, 0x00, 0x6C, 0x8D, 0x06, 0x04, 0x92, 0x06, 0x00, 0x82, 0x72, 0x75, + 0x65, 0x00, 0x10, 0x04, 0x00, 0x82, 0x65, 0x75, 0x72, 0x00, 0x44, 0xAD, + 0x06, 0x08, 0xD1, 0x06, 0x0C, 0xD9, 0x06, 0x0F, 0xE8, 0x06, 0x11, 0xF1, + 0x06, 0x18, 0x0F, 0x07, 0x00, 0x46, 0xB7, 0x06, 0x08, 0xBF, 0x06, 0x0F, + 0xC9, 0x06, 0x00, 0x08, 0x05, 0x00, 0x81, 0x75, 0x73, 0x65, 0x00, 0x05, + 0x2C, 0x00, 0x82, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, 0x09, 0x00, 0x83, + 0x61, 0x6C, 0x73, 0x65, 0x00, 0x08, 0x0B, 0x17, 0x00, 0x82, 0x73, 0x65, + 0x00, 0x06, 0x15, 0x08, 0x06, 0x1B, 0x08, 0x00, 0x86, 0x65, 0x72, 0x63, + 0x69, 0x73, 0x65, 0x00, 0x0C, 0x04, 0x09, 0x00, 0x83, 0x6C, 0x73, 0x65, + 0x00, 0x48, 0xF8, 0x06, 0x12, 0x03, 0x07, 0x00, 0x16, 0x0C, 0x0F, 0x00, + 0x84, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x00, 0x13, 0x08, 0x15, 0x00, 0x84, + 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x00, 0x06, 0x04, 0x08, 0x05, 0x00, + 0x84, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, 0x44, 0x28, 0x07, 0x08, 0xD6, + 0x07, 0x0F, 0xE1, 0x07, 0x19, 0xED, 0x07, 0x00, 0x47, 0x38, 0x07, 0x0A, + 0x5D, 0x07, 0x0F, 0x6A, 0x07, 0x13, 0xAD, 0x07, 0x15, 0xB7, 0x07, 0x00, + 0x12, 0x10, 0x00, 0x50, 0x42, 0x07, 0x12, 0x51, 0x07, 0x00, 0x12, 0x06, + 0x04, 0x00, 0x87, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x64, 0x61, 0x74, 0x65, + 0x00, 0x06, 0x06, 0x04, 0x00, 0x84, 0x6D, 0x6F, 0x64, 0x61, 0x74, 0x65, + 0x00, 0x12, 0x13, 0x12, 0x15, 0x13, 0x00, 0x84, 0x61, 0x67, 0x61, 0x74, + 0x65, 0x00, 0x46, 0x74, 0x07, 0x13, 0x81, 0x07, 0x18, 0x8E, 0x07, 0x00, + 0x18, 0x0F, 0x04, 0x06, 0x00, 0x85, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, + 0x00, 0x10, 0x04, 0x08, 0x17, 0x00, 0x86, 0x6D, 0x70, 0x6C, 0x61, 0x74, + 0x65, 0x00, 0x46, 0x95, 0x07, 0x0F, 0xA2, 0x07, 0x00, 0x18, 0x0F, 0x04, + 0x06, 0x00, 0x86, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x04, 0x06, + 0x00, 0x84, 0x63, 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x07, 0x18, 0x00, + 0x84, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, 0x48, 0xBE, 0x07, 0x18, 0xCB, + 0x07, 0x00, 0x11, 0x04, 0x0A, 0x00, 0x86, 0x65, 0x6E, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x00, 0x06, 0x04, 0x00, 0x84, 0x63, 0x75, 0x72, 0x61, 0x74, + 0x65, 0x00, 0x0F, 0x0F, 0x04, 0x13, 0x00, 0x83, 0x65, 0x74, 0x74, 0x65, + 0x00, 0x04, 0x13, 0x10, 0x08, 0x17, 0x00, 0x83, 0x6C, 0x61, 0x74, 0x65, + 0x00, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x61, 0x74, 0x65, 0x00, 0x4A, 0x00, + 0x08, 0x0C, 0x0C, 0x08, 0x16, 0x16, 0x08, 0x00, 0x08, 0x0F, 0x0F, 0x12, + 0x06, 0x00, 0x82, 0x61, 0x67, 0x75, 0x65, 0x00, 0x14, 0x11, 0x18, 0x00, + 0x83, 0x69, 0x71, 0x75, 0x65, 0x00, 0x44, 0x1D, 0x08, 0x15, 0x25, 0x08, + 0x00, 0x06, 0x2C, 0x00, 0x82, 0x75, 0x73, 0x65, 0x00, 0x08, 0x13, 0x00, + 0x84, 0x75, 0x72, 0x73, 0x75, 0x65, 0x00, 0x4C, 0x36, 0x08, 0x12, 0x5B, + 0x08, 0x00, 0x48, 0x40, 0x08, 0x0B, 0x4A, 0x08, 0x0F, 0x53, 0x08, 0x00, + 0x0F, 0x08, 0x05, 0x00, 0x83, 0x69, 0x65, 0x76, 0x65, 0x00, 0x06, 0x04, + 0x2C, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, 0x08, 0x05, 0x00, 0x81, 0x65, + 0x76, 0x65, 0x00, 0x52, 0x62, 0x08, 0x19, 0x69, 0x08, 0x00, 0x15, 0x13, + 0x00, 0x82, 0x76, 0x65, 0x00, 0x05, 0x04, 0x00, 0x83, 0x6F, 0x76, 0x65, + 0x00, 0x4C, 0x78, 0x08, 0x11, 0x9A, 0x08, 0x00, 0x08, 0x00, 0x4B, 0x84, + 0x08, 0x0F, 0x8B, 0x08, 0x15, 0x93, 0x08, 0x00, 0x06, 0x00, 0x82, 0x69, + 0x65, 0x66, 0x00, 0x08, 0x05, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x05, + 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x18, 0x12, 0x09, 0x2C, 0x00, 0x80, + 0x64, 0x00, 0x4C, 0xA9, 0x08, 0x11, 0xB3, 0x08, 0x00, 0x11, 0x12, 0x0A, + 0x2C, 0x00, 0x82, 0x69, 0x6E, 0x67, 0x00, 0x48, 0xBD, 0x08, 0x0C, 0xC6, + 0x08, 0x15, 0x1C, 0x09, 0x00, 0x0C, 0x05, 0x00, 0x83, 0x65, 0x69, 0x6E, + 0x67, 0x00, 0x48, 0xD9, 0x08, 0x0B, 0xE3, 0x08, 0x0F, 0xF0, 0x08, 0x15, + 0xFC, 0x08, 0x17, 0x07, 0x09, 0x1C, 0x11, 0x09, 0x00, 0x0B, 0x06, 0x04, + 0x06, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x06, 0x04, 0x10, 0x00, + 0x85, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x08, 0x0C, 0x06, 0x00, + 0x85, 0x65, 0x69, 0x6C, 0x69, 0x6E, 0x67, 0x00, 0x18, 0x06, 0x08, 0x15, + 0x00, 0x82, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x0B, 0x2C, 0x00, 0x84, 0x74, + 0x68, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x1C, 0x11, 0x04, 0x00, 0x83, 0x68, + 0x69, 0x6E, 0x67, 0x00, 0x0C, 0x17, 0x16, 0x00, 0x83, 0x72, 0x69, 0x6E, + 0x67, 0x00, 0x46, 0x36, 0x09, 0x08, 0x56, 0x09, 0x0A, 0x62, 0x09, 0x16, + 0x6C, 0x09, 0x17, 0x7E, 0x09, 0x00, 0x4C, 0x3D, 0x09, 0x15, 0x47, 0x09, + 0x00, 0x17, 0x1A, 0x16, 0x00, 0x83, 0x69, 0x74, 0x63, 0x68, 0x00, 0x04, + 0x08, 0x16, 0x04, 0x08, 0x15, 0x00, 0x86, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x00, 0x17, 0x07, 0x11, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, + 0x65, 0x00, 0x11, 0x08, 0x15, 0x17, 0x16, 0x00, 0x80, 0x74, 0x68, 0x00, + 0x0C, 0x0F, 0x13, 0x10, 0x12, 0x06, 0x04, 0x00, 0x86, 0x63, 0x6F, 0x6D, + 0x70, 0x6C, 0x69, 0x73, 0x68, 0x00, 0x4A, 0x88, 0x09, 0x0C, 0xA0, 0x09, + 0x15, 0xAB, 0x09, 0x00, 0x48, 0x8F, 0x09, 0x0C, 0x99, 0x09, 0x00, 0x15, + 0x17, 0x16, 0x00, 0x82, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x08, 0x0B, 0x00, + 0x81, 0x68, 0x74, 0x00, 0x1A, 0x07, 0x11, 0x04, 0x05, 0x00, 0x81, 0x64, + 0x74, 0x68, 0x00, 0x18, 0x17, 0x2C, 0x00, 0x83, 0x72, 0x75, 0x74, 0x68, + 0x00, 0x15, 0x08, 0x0B, 0x17, 0x2C, 0x00, 0x81, 0x69, 0x72, 0x00, 0x11, + 0x0C, 0x17, 0x0B, 0x00, 0x84, 0x74, 0x68, 0x69, 0x6E, 0x6B, 0x00, 0x44, + 0xE1, 0x09, 0x07, 0x35, 0x0A, 0x08, 0x59, 0x0A, 0x09, 0xAE, 0x0A, 0x0F, + 0xB7, 0x0A, 0x17, 0xD4, 0x0A, 0x18, 0xDD, 0x0A, 0x00, 0x4C, 0xEB, 0x09, + 0x17, 0xF6, 0x09, 0x18, 0x0F, 0x0A, 0x00, 0x06, 0x13, 0x1C, 0x17, 0x00, + 0x83, 0x69, 0x63, 0x61, 0x6C, 0x00, 0x4C, 0xFD, 0x09, 0x18, 0x05, 0x0A, + 0x00, 0x11, 0x0C, 0x00, 0x81, 0x69, 0x61, 0x6C, 0x00, 0x15, 0x0C, 0x19, + 0x00, 0x83, 0x74, 0x75, 0x61, 0x6C, 0x00, 0x51, 0x19, 0x0A, 0x15, 0x22, + 0x0A, 0x17, 0x2B, 0x0A, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x6E, 0x75, 0x61, + 0x6C, 0x00, 0x18, 0x17, 0x04, 0x11, 0x00, 0x82, 0x61, 0x6C, 0x00, 0x0C, + 0x19, 0x00, 0x83, 0x72, 0x74, 0x75, 0x61, 0x6C, 0x00, 0x48, 0x3C, 0x0A, + 0x18, 0x43, 0x0A, 0x00, 0x0C, 0x09, 0x00, 0x81, 0x6C, 0x64, 0x00, 0x52, + 0x4A, 0x0A, 0x1A, 0x50, 0x0A, 0x00, 0x06, 0x00, 0x81, 0x6C, 0x64, 0x00, + 0x12, 0x00, 0x84, 0x77, 0x6F, 0x75, 0x6C, 0x64, 0x00, 0x4A, 0x66, 0x0A, + 0x0F, 0x6E, 0x0A, 0x17, 0x9C, 0x0A, 0x18, 0xA4, 0x0A, 0x00, 0x11, 0x0C, + 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x44, 0x75, 0x0A, 0x0F, 0x8F, 0x0A, + 0x00, 0x15, 0x00, 0x44, 0x7E, 0x0A, 0x15, 0x85, 0x0A, 0x00, 0x13, 0x00, + 0x81, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x13, 0x00, 0x84, 0x61, 0x6C, 0x6C, + 0x65, 0x6C, 0x00, 0x04, 0x15, 0x15, 0x04, 0x13, 0x00, 0x85, 0x61, 0x6C, + 0x6C, 0x65, 0x6C, 0x00, 0x17, 0x0C, 0x0F, 0x00, 0x81, 0x6C, 0x65, 0x00, + 0x07, 0x08, 0x0B, 0x06, 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x08, 0x16, + 0x1C, 0x10, 0x00, 0x81, 0x6C, 0x66, 0x00, 0x0C, 0x09, 0x00, 0x4F, 0xC1, + 0x0A, 0x18, 0xCB, 0x0A, 0x00, 0x0F, 0x18, 0x09, 0x00, 0x84, 0x66, 0x69, + 0x6C, 0x6C, 0x00, 0x09, 0x00, 0x83, 0x6C, 0x66, 0x69, 0x6C, 0x6C, 0x00, + 0x18, 0x16, 0x08, 0x15, 0x00, 0x81, 0x6C, 0x74, 0x00, 0x09, 0x17, 0x04, + 0x08, 0x15, 0x0A, 0x00, 0x85, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6C, 0x00, + 0x4F, 0xF3, 0x0A, 0x15, 0xFE, 0x0A, 0x00, 0x08, 0x05, 0x12, 0x15, 0x13, + 0x00, 0x82, 0x6C, 0x65, 0x6D, 0x00, 0x12, 0x09, 0x12, 0x06, 0x00, 0x83, + 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x44, 0x2C, 0x0B, 0x07, 0x54, 0x0B, + 0x08, 0x5D, 0x0B, 0x0A, 0xCC, 0x0B, 0x0C, 0x1F, 0x0C, 0x12, 0x39, 0x0C, + 0x13, 0xD5, 0x0C, 0x15, 0xE1, 0x0C, 0x16, 0xEC, 0x0C, 0x18, 0xF6, 0x0C, + 0x1A, 0x0D, 0x0D, 0x00, 0x0C, 0x00, 0x4A, 0x35, 0x0B, 0x17, 0x3D, 0x0B, + 0x00, 0x04, 0x2C, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x51, 0x44, 0x0B, + 0x15, 0x4C, 0x0B, 0x00, 0x12, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, + 0x08, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x18, 0x12, 0x09, 0x2C, + 0x00, 0x81, 0x6E, 0x64, 0x00, 0x47, 0x70, 0x0B, 0x08, 0x7A, 0x0B, 0x13, + 0xA4, 0x0B, 0x15, 0xAD, 0x0B, 0x16, 0xBA, 0x0B, 0x1A, 0xC4, 0x0B, 0x00, + 0x0F, 0x0C, 0x0B, 0x06, 0x00, 0x81, 0x72, 0x65, 0x6E, 0x00, 0x57, 0x81, + 0x0B, 0x1A, 0x9A, 0x0B, 0x00, 0x48, 0x88, 0x0B, 0x1A, 0x90, 0x0B, 0x00, + 0x05, 0x00, 0x82, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, 0x00, 0x84, + 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, 0x00, 0x83, 0x74, 0x77, + 0x65, 0x65, 0x6E, 0x00, 0x04, 0x0B, 0x2C, 0x00, 0x81, 0x70, 0x65, 0x6E, + 0x00, 0x07, 0x0F, 0x0B, 0x06, 0x00, 0x84, 0x69, 0x6C, 0x64, 0x72, 0x65, + 0x6E, 0x00, 0x12, 0x12, 0x0B, 0x06, 0x00, 0x83, 0x73, 0x65, 0x6E, 0x00, + 0x17, 0x08, 0x05, 0x00, 0x80, 0x65, 0x6E, 0x00, 0x48, 0xD3, 0x0B, 0x0C, + 0xDE, 0x0B, 0x00, 0x0C, 0x15, 0x12, 0x09, 0x00, 0x83, 0x65, 0x69, 0x67, + 0x6E, 0x00, 0x4B, 0xF1, 0x0B, 0x0F, 0xF7, 0x0B, 0x11, 0xFF, 0x0B, 0x12, + 0x08, 0x0C, 0x15, 0x0F, 0x0C, 0x16, 0x16, 0x0C, 0x00, 0x17, 0x00, 0x81, + 0x6E, 0x67, 0x00, 0x0F, 0x04, 0x00, 0x83, 0x69, 0x67, 0x6E, 0x00, 0x15, + 0x04, 0x08, 0x0F, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x0A, 0x2C, 0x00, 0x81, + 0x6E, 0x67, 0x00, 0x17, 0x16, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x04, 0x2C, + 0x00, 0x82, 0x73, 0x69, 0x67, 0x6E, 0x00, 0x4A, 0x26, 0x0C, 0x17, 0x2E, + 0x0C, 0x00, 0x04, 0x2C, 0x00, 0x81, 0x61, 0x69, 0x6E, 0x00, 0x04, 0x15, + 0x08, 0x06, 0x00, 0x83, 0x74, 0x61, 0x69, 0x6E, 0x00, 0x4C, 0x43, 0x0C, + 0x16, 0xBF, 0x0C, 0x17, 0xC9, 0x0C, 0x00, 0x46, 0x4D, 0x0C, 0x16, 0x5A, + 0x0C, 0x17, 0x74, 0x0C, 0x00, 0x0C, 0x16, 0x08, 0x07, 0x00, 0x85, 0x63, + 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x44, 0x61, 0x0C, 0x16, 0x6A, 0x0C, + 0x00, 0x0C, 0x0F, 0x00, 0x83, 0x69, 0x73, 0x6F, 0x6E, 0x00, 0x04, 0x06, + 0x06, 0x12, 0x00, 0x83, 0x69, 0x6F, 0x6E, 0x00, 0x47, 0x84, 0x0C, 0x0C, + 0x8E, 0x0C, 0x0F, 0x9D, 0x0C, 0x11, 0xA9, 0x0C, 0x16, 0xB5, 0x0C, 0x00, + 0x07, 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x17, 0x0C, + 0x13, 0x08, 0x15, 0x00, 0x86, 0x65, 0x74, 0x69, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x04, 0x08, 0x15, 0x00, 0x85, 0x6C, 0x61, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x06, 0x18, 0x09, 0x00, 0x85, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x12, 0x13, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x0C, + 0x19, 0x0C, 0x07, 0x00, 0x81, 0x69, 0x6F, 0x6E, 0x00, 0x0C, 0x06, 0x04, + 0x15, 0x09, 0x00, 0x83, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x13, 0x0B, 0x04, + 0x00, 0x84, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6E, 0x00, 0x17, 0x18, 0x08, + 0x15, 0x00, 0x83, 0x74, 0x75, 0x72, 0x6E, 0x00, 0x0A, 0x0C, 0x0B, 0x17, + 0x00, 0x82, 0x6E, 0x67, 0x73, 0x00, 0x55, 0xFD, 0x0C, 0x17, 0x06, 0x0D, + 0x00, 0x17, 0x08, 0x15, 0x00, 0x82, 0x75, 0x72, 0x6E, 0x00, 0x08, 0x15, + 0x00, 0x80, 0x72, 0x6E, 0x00, 0x12, 0x0E, 0x11, 0x18, 0x00, 0x82, 0x6E, + 0x6F, 0x77, 0x6E, 0x00, 0x47, 0x22, 0x0D, 0x11, 0x2D, 0x0D, 0x1A, 0x36, + 0x0D, 0x00, 0x08, 0x18, 0x16, 0x13, 0x00, 0x83, 0x65, 0x75, 0x64, 0x6F, + 0x00, 0x1A, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x00, 0x4F, 0x3D, + 0x0D, 0x11, 0x45, 0x0D, 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6F, 0x77, + 0x00, 0x0E, 0x2C, 0x00, 0x81, 0x6F, 0x77, 0x00, 0x56, 0x53, 0x0D, 0x18, + 0x5D, 0x0D, 0x00, 0x04, 0x0B, 0x15, 0x08, 0x13, 0x00, 0x81, 0x70, 0x73, + 0x00, 0x12, 0x12, 0x0F, 0x00, 0x81, 0x6B, 0x75, 0x70, 0x00, 0x44, 0x82, + 0x0D, 0x08, 0xC3, 0x0D, 0x0B, 0xBC, 0x0E, 0x0F, 0xC5, 0x0E, 0x12, 0xD3, + 0x0E, 0x16, 0xE4, 0x0E, 0x17, 0xED, 0x0E, 0x18, 0xF9, 0x0E, 0x1C, 0x02, + 0x0F, 0x00, 0x4C, 0x8C, 0x0D, 0x0F, 0x96, 0x0D, 0x18, 0xB8, 0x0D, 0x00, + 0x0F, 0x0C, 0x10, 0x0C, 0x16, 0x00, 0x82, 0x61, 0x72, 0x00, 0x4C, 0x9D, + 0x0D, 0x18, 0xA8, 0x0D, 0x00, 0x10, 0x10, 0x0C, 0x16, 0x00, 0x84, 0x69, + 0x6C, 0x61, 0x72, 0x00, 0x06, 0x0C, 0x17, 0x04, 0x13, 0x00, 0x86, 0x72, + 0x74, 0x69, 0x63, 0x75, 0x6C, 0x61, 0x72, 0x00, 0x0F, 0x0A, 0x08, 0x15, + 0x00, 0x83, 0x75, 0x6C, 0x61, 0x72, 0x00, 0x44, 0xE2, 0x0D, 0x07, 0xEA, + 0x0D, 0x0B, 0xF7, 0x0D, 0x0C, 0x34, 0x0E, 0x0F, 0x4E, 0x0E, 0x10, 0x58, + 0x0E, 0x11, 0x62, 0x0E, 0x12, 0x8E, 0x0E, 0x17, 0x96, 0x0E, 0x19, 0xA1, + 0x0E, 0x00, 0x0F, 0x06, 0x00, 0x82, 0x65, 0x61, 0x72, 0x00, 0x11, 0x04, + 0x0F, 0x04, 0x06, 0x00, 0x84, 0x65, 0x6E, 0x64, 0x61, 0x72, 0x00, 0x4A, + 0xFE, 0x0D, 0x17, 0x09, 0x0E, 0x00, 0x0C, 0x08, 0x0B, 0x00, 0x85, 0x69, + 0x67, 0x68, 0x65, 0x72, 0x00, 0x48, 0x13, 0x0E, 0x12, 0x1F, 0x0E, 0x18, + 0x2B, 0x0E, 0x00, 0x0B, 0x0A, 0x12, 0x17, 0x00, 0x85, 0x65, 0x74, 0x68, + 0x65, 0x72, 0x00, 0x04, 0x11, 0x00, 0x86, 0x61, 0x6E, 0x6F, 0x74, 0x68, + 0x65, 0x72, 0x00, 0x09, 0x00, 0x83, 0x72, 0x74, 0x68, 0x65, 0x72, 0x00, + 0x4B, 0x3B, 0x0E, 0x0F, 0x43, 0x0E, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x65, + 0x69, 0x72, 0x00, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x69, 0x6C, 0x65, + 0x72, 0x00, 0x17, 0x0C, 0x09, 0x00, 0x83, 0x6C, 0x74, 0x65, 0x72, 0x00, + 0x10, 0x04, 0x15, 0x0A, 0x2C, 0x00, 0x81, 0x61, 0x72, 0x00, 0x4C, 0x69, + 0x0E, 0x17, 0x75, 0x0E, 0x00, 0x0A, 0x0A, 0x08, 0x05, 0x00, 0x84, 0x69, + 0x6E, 0x6E, 0x65, 0x72, 0x00, 0x4C, 0x7C, 0x0E, 0x16, 0x85, 0x0E, 0x00, + 0x12, 0x13, 0x00, 0x83, 0x6E, 0x74, 0x65, 0x72, 0x00, 0x0C, 0x0F, 0x00, + 0x82, 0x65, 0x6E, 0x65, 0x72, 0x00, 0x09, 0x08, 0x05, 0x00, 0x81, 0x72, + 0x65, 0x00, 0x0B, 0x12, 0x11, 0x04, 0x00, 0x83, 0x74, 0x68, 0x65, 0x72, + 0x00, 0x48, 0xA8, 0x0E, 0x1A, 0xB3, 0x0E, 0x00, 0x08, 0x15, 0x08, 0x0B, + 0x1A, 0x00, 0x83, 0x76, 0x65, 0x72, 0x00, 0x12, 0x0B, 0x00, 0x82, 0x65, + 0x76, 0x65, 0x72, 0x00, 0x08, 0x17, 0x12, 0x00, 0x82, 0x68, 0x65, 0x72, + 0x00, 0x04, 0x18, 0x06, 0x0C, 0x17, 0x15, 0x04, 0x13, 0x00, 0x82, 0x6C, + 0x61, 0x72, 0x00, 0x17, 0x04, 0x15, 0x08, 0x17, 0x11, 0x0C, 0x00, 0x87, + 0x74, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x00, 0x04, 0x08, 0x1C, 0x2C, + 0x00, 0x81, 0x72, 0x73, 0x00, 0x12, 0x04, 0x15, 0x08, 0x13, 0x12, 0x00, + 0x82, 0x74, 0x6F, 0x72, 0x00, 0x06, 0x12, 0x2C, 0x00, 0x81, 0x63, 0x75, + 0x72, 0x00, 0x08, 0x19, 0x08, 0x2C, 0x00, 0x81, 0x72, 0x79, 0x00, 0x44, + 0x21, 0x0F, 0x08, 0x55, 0x0F, 0x0A, 0xE5, 0x0F, 0x15, 0xF0, 0x0F, 0x16, + 0xFB, 0x0F, 0x17, 0x93, 0x10, 0x18, 0x9B, 0x10, 0x00, 0x4B, 0x2E, 0x0F, + 0x13, 0x39, 0x0F, 0x15, 0x43, 0x0F, 0x1C, 0x4C, 0x0F, 0x00, 0x13, 0x15, + 0x08, 0x13, 0x00, 0x83, 0x68, 0x61, 0x70, 0x73, 0x00, 0x0B, 0x15, 0x08, + 0x13, 0x00, 0x82, 0x61, 0x70, 0x73, 0x00, 0x08, 0x1C, 0x2C, 0x00, 0x82, + 0x61, 0x72, 0x73, 0x00, 0x1A, 0x0F, 0x04, 0x00, 0x82, 0x61, 0x79, 0x73, + 0x00, 0x44, 0x65, 0x0F, 0x06, 0x7C, 0x0F, 0x0C, 0x87, 0x0F, 0x0F, 0xD3, + 0x0F, 0x16, 0xDA, 0x0F, 0x00, 0x47, 0x6C, 0x0F, 0x0E, 0x74, 0x0F, 0x00, + 0x0C, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x73, 0x00, 0x17, 0x00, 0x83, 0x61, + 0x6B, 0x65, 0x73, 0x00, 0x08, 0x07, 0x11, 0x0C, 0x00, 0x83, 0x69, 0x63, + 0x65, 0x73, 0x00, 0x46, 0x91, 0x0F, 0x15, 0xB8, 0x0F, 0x17, 0xC7, 0x0F, + 0x00, 0x48, 0x98, 0x0F, 0x0C, 0xA2, 0x0F, 0x00, 0x07, 0x11, 0x0C, 0x00, + 0x84, 0x69, 0x63, 0x65, 0x73, 0x00, 0x47, 0xA9, 0x0F, 0x17, 0xB0, 0x0F, + 0x00, 0x11, 0x0C, 0x00, 0x82, 0x65, 0x73, 0x00, 0x15, 0x08, 0x19, 0x00, + 0x82, 0x65, 0x73, 0x00, 0x12, 0x16, 0x08, 0x06, 0x06, 0x04, 0x00, 0x84, + 0x73, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x00, 0x0F, 0x0C, 0x05, 0x04, 0x00, + 0x83, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x04, 0x09, 0x00, 0x81, 0x73, + 0x65, 0x00, 0x12, 0x0B, 0x06, 0x2C, 0x00, 0x82, 0x6F, 0x73, 0x65, 0x73, + 0x00, 0x0C, 0x11, 0x0B, 0x17, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x73, 0x00, + 0x08, 0x04, 0x1C, 0x2C, 0x00, 0x83, 0x65, 0x61, 0x72, 0x73, 0x00, 0x44, + 0x05, 0x10, 0x08, 0x11, 0x10, 0x12, 0x88, 0x10, 0x00, 0x15, 0x04, 0x05, + 0x10, 0x08, 0x00, 0x82, 0x72, 0x61, 0x73, 0x73, 0x00, 0x46, 0x1E, 0x10, + 0x11, 0x36, 0x10, 0x15, 0x53, 0x10, 0x16, 0x70, 0x10, 0x00, 0x46, 0x25, + 0x10, 0x18, 0x2E, 0x10, 0x00, 0x12, 0x15, 0x13, 0x00, 0x83, 0x65, 0x73, + 0x73, 0x00, 0x16, 0x00, 0x82, 0x63, 0x65, 0x73, 0x73, 0x00, 0x4C, 0x3D, + 0x10, 0x16, 0x49, 0x10, 0x00, 0x16, 0x16, 0x18, 0x05, 0x00, 0x85, 0x69, + 0x6E, 0x65, 0x73, 0x73, 0x00, 0x18, 0x05, 0x00, 0x83, 0x69, 0x6E, 0x65, + 0x73, 0x73, 0x00, 0x13, 0x00, 0x55, 0x5C, 0x10, 0x18, 0x67, 0x10, 0x00, + 0x18, 0x16, 0x00, 0x85, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x16, + 0x00, 0x83, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0x77, 0x10, 0x12, + 0x80, 0x10, 0x00, 0x06, 0x18, 0x16, 0x00, 0x83, 0x65, 0x73, 0x73, 0x00, + 0x13, 0x00, 0x82, 0x73, 0x65, 0x73, 0x73, 0x00, 0x15, 0x06, 0x06, 0x04, + 0x00, 0x84, 0x72, 0x6F, 0x73, 0x73, 0x00, 0x15, 0x0C, 0x09, 0x00, 0x81, + 0x73, 0x74, 0x00, 0x52, 0xA2, 0x10, 0x16, 0xB0, 0x10, 0x00, 0x0F, 0x12, + 0x10, 0x12, 0x11, 0x04, 0x00, 0x84, 0x61, 0x6C, 0x6F, 0x75, 0x73, 0x00, + 0x11, 0x08, 0x06, 0x11, 0x12, 0x06, 0x00, 0x85, 0x73, 0x65, 0x6E, 0x73, + 0x75, 0x73, 0x00, 0x44, 0xE4, 0x10, 0x08, 0xF1, 0x10, 0x0A, 0x0E, 0x11, + 0x0B, 0x18, 0x11, 0x0C, 0x3C, 0x11, 0x0F, 0x47, 0x11, 0x10, 0x52, 0x11, + 0x11, 0x5E, 0x11, 0x12, 0xAC, 0x12, 0x13, 0xE6, 0x12, 0x16, 0x02, 0x13, + 0x18, 0xA2, 0x13, 0x00, 0x1A, 0x0B, 0x08, 0x10, 0x12, 0x16, 0x00, 0x83, + 0x77, 0x68, 0x61, 0x74, 0x00, 0x44, 0xF8, 0x10, 0x11, 0x01, 0x11, 0x00, + 0x15, 0x0A, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x74, 0x00, 0x10, 0x11, 0x15, + 0x08, 0x19, 0x12, 0x0A, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0B, 0x18, + 0x04, 0x06, 0x00, 0x82, 0x67, 0x68, 0x74, 0x00, 0x47, 0x22, 0x11, 0x0A, + 0x29, 0x11, 0x0C, 0x31, 0x11, 0x00, 0x0C, 0x1A, 0x00, 0x81, 0x74, 0x68, + 0x00, 0x11, 0x08, 0x0F, 0x00, 0x81, 0x74, 0x68, 0x00, 0x0A, 0x11, 0x12, + 0x17, 0x00, 0x83, 0x69, 0x67, 0x68, 0x74, 0x00, 0x17, 0x18, 0x12, 0x05, + 0x04, 0x00, 0x81, 0x20, 0x69, 0x74, 0x00, 0x16, 0x18, 0x08, 0x15, 0x00, + 0x83, 0x73, 0x75, 0x6C, 0x74, 0x00, 0x04, 0x17, 0x15, 0x12, 0x13, 0x10, + 0x0C, 0x00, 0x81, 0x6E, 0x74, 0x00, 0x44, 0x6B, 0x11, 0x08, 0xA3, 0x11, + 0x15, 0x99, 0x12, 0x16, 0xA4, 0x12, 0x00, 0x4C, 0x78, 0x11, 0x11, 0x83, + 0x11, 0x15, 0x8E, 0x11, 0x17, 0x98, 0x11, 0x00, 0x13, 0x0C, 0x06, 0x08, + 0x15, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0C, 0x10, 0x12, 0x15, 0x13, + 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x13, 0x13, 0x04, 0x00, 0x82, + 0x65, 0x6E, 0x74, 0x00, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x65, + 0x6E, 0x74, 0x00, 0x4C, 0xB0, 0x11, 0x10, 0xD1, 0x11, 0x15, 0x35, 0x12, + 0x19, 0x8F, 0x12, 0x00, 0x46, 0xB7, 0x11, 0x13, 0xC4, 0x11, 0x00, 0x08, + 0x09, 0x09, 0x08, 0x00, 0x85, 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x00, + 0x08, 0x06, 0x08, 0x15, 0x00, 0x85, 0x69, 0x70, 0x69, 0x65, 0x6E, 0x74, + 0x00, 0x48, 0xDE, 0x11, 0x11, 0xEA, 0x11, 0x15, 0x0B, 0x12, 0x17, 0x2A, + 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x72, 0x6E, 0x6D, 0x65, 0x6E, + 0x74, 0x00, 0x48, 0xF1, 0x11, 0x15, 0xFD, 0x11, 0x00, 0x19, 0x12, 0x0A, + 0x00, 0x84, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x12, 0x19, 0x12, + 0x0A, 0x00, 0x86, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, + 0x12, 0x12, 0x12, 0x1D, 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x6E, + 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x85, 0x65, 0x72, + 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x04, 0x17, 0x16, 0x00, 0x83, 0x65, + 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x44, 0x42, 0x12, 0x08, 0x4D, 0x12, 0x09, + 0x59, 0x12, 0x15, 0x64, 0x12, 0x00, 0x13, 0x04, 0x00, 0x84, 0x70, 0x61, + 0x72, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x84, 0x66, 0x65, + 0x72, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x83, 0x65, 0x72, + 0x65, 0x6E, 0x74, 0x00, 0x44, 0x6B, 0x12, 0x08, 0x83, 0x12, 0x00, 0x13, + 0x00, 0x44, 0x74, 0x12, 0x13, 0x7C, 0x12, 0x00, 0x85, 0x70, 0x61, 0x72, + 0x65, 0x6E, 0x74, 0x00, 0x04, 0x00, 0x83, 0x65, 0x6E, 0x74, 0x00, 0x09, + 0x0C, 0x07, 0x00, 0x85, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x08, + 0x0F, 0x08, 0x15, 0x00, 0x82, 0x61, 0x6E, 0x74, 0x00, 0x08, 0x09, 0x09, + 0x0C, 0x07, 0x00, 0x81, 0x65, 0x6E, 0x74, 0x00, 0x12, 0x06, 0x00, 0x82, + 0x6E, 0x73, 0x74, 0x00, 0x45, 0xBC, 0x12, 0x10, 0xC3, 0x12, 0x11, 0xCA, + 0x12, 0x15, 0xD4, 0x12, 0x16, 0xDD, 0x12, 0x00, 0x04, 0x2C, 0x00, 0x80, + 0x75, 0x74, 0x00, 0x0F, 0x04, 0x00, 0x80, 0x73, 0x74, 0x00, 0x07, 0x0C, + 0x07, 0x00, 0x82, 0x20, 0x6E, 0x6F, 0x74, 0x00, 0x13, 0x08, 0x15, 0x00, + 0x82, 0x6F, 0x72, 0x74, 0x00, 0x10, 0x0F, 0x04, 0x00, 0x82, 0x6F, 0x73, + 0x74, 0x00, 0x48, 0xED, 0x12, 0x1C, 0xF8, 0x12, 0x00, 0x0C, 0x06, 0x08, + 0x15, 0x00, 0x83, 0x65, 0x69, 0x70, 0x74, 0x00, 0x06, 0x11, 0x08, 0x00, + 0x82, 0x72, 0x79, 0x70, 0x74, 0x00, 0x48, 0x18, 0x13, 0x0A, 0x41, 0x13, + 0x0C, 0x4A, 0x13, 0x10, 0x67, 0x13, 0x11, 0x71, 0x13, 0x12, 0x8C, 0x13, + 0x18, 0x97, 0x13, 0x00, 0x4A, 0x1F, 0x13, 0x15, 0x36, 0x13, 0x00, 0x4C, + 0x26, 0x13, 0x18, 0x2E, 0x13, 0x00, 0x0B, 0x00, 0x82, 0x68, 0x65, 0x73, + 0x74, 0x00, 0x16, 0x00, 0x82, 0x67, 0x65, 0x73, 0x74, 0x00, 0x17, 0x11, + 0x0C, 0x00, 0x83, 0x65, 0x72, 0x65, 0x73, 0x74, 0x00, 0x15, 0x04, 0x0F, + 0x00, 0x81, 0x65, 0x73, 0x74, 0x00, 0x49, 0x51, 0x13, 0x11, 0x5D, 0x13, + 0x00, 0x08, 0x11, 0x04, 0x10, 0x00, 0x84, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x00, 0x04, 0x0A, 0x04, 0x00, 0x83, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x12, + 0x0F, 0x04, 0x00, 0x83, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x44, 0x78, 0x13, + 0x11, 0x83, 0x13, 0x00, 0x0C, 0x0A, 0x04, 0x00, 0x84, 0x61, 0x69, 0x6E, + 0x73, 0x74, 0x00, 0x0C, 0x04, 0x0A, 0x04, 0x00, 0x82, 0x73, 0x74, 0x00, + 0x0F, 0x10, 0x04, 0x00, 0x84, 0x6C, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x0D, + 0x04, 0x2C, 0x00, 0x83, 0x64, 0x6A, 0x75, 0x73, 0x74, 0x00, 0x46, 0xAC, + 0x13, 0x13, 0xC5, 0x13, 0x17, 0xDC, 0x13, 0x00, 0x48, 0xB3, 0x13, 0x15, + 0xBE, 0x13, 0x00, 0x06, 0x1B, 0x08, 0x00, 0x84, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x00, 0x0C, 0x06, 0x00, 0x80, 0x69, 0x74, 0x00, 0x57, 0xCC, 0x13, + 0x18, 0xD4, 0x13, 0x00, 0x11, 0x0C, 0x00, 0x83, 0x70, 0x75, 0x74, 0x00, + 0x12, 0x00, 0x82, 0x74, 0x70, 0x75, 0x74, 0x00, 0x13, 0x18, 0x12, 0x00, + 0x83, 0x74, 0x70, 0x75, 0x74, 0x00, 0x48, 0xED, 0x13, 0x0C, 0x11, 0x14, + 0x00, 0x44, 0xF4, 0x13, 0x0C, 0xFB, 0x13, 0x00, 0x0B, 0x2C, 0x00, 0x81, + 0x76, 0x65, 0x00, 0x46, 0x02, 0x14, 0x08, 0x0A, 0x14, 0x00, 0x08, 0x15, + 0x00, 0x82, 0x65, 0x69, 0x76, 0x00, 0x06, 0x08, 0x15, 0x00, 0x81, 0x76, + 0x00, 0x08, 0x0B, 0x06, 0x04, 0x2C, 0x00, 0x82, 0x69, 0x65, 0x76, 0x65, + 0x00, 0x4C, 0x27, 0x14, 0x11, 0x31, 0x14, 0x12, 0x3A, 0x14, 0x00, 0x08, + 0x19, 0x08, 0x15, 0x00, 0x82, 0x69, 0x65, 0x77, 0x00, 0x12, 0x0E, 0x2C, + 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6C, + 0x6F, 0x77, 0x00, 0x44, 0x5F, 0x14, 0x06, 0x6A, 0x14, 0x08, 0xA5, 0x14, + 0x0B, 0xAF, 0x14, 0x0F, 0xC1, 0x14, 0x11, 0x86, 0x15, 0x15, 0x90, 0x15, + 0x16, 0x06, 0x16, 0x17, 0x21, 0x16, 0x00, 0x11, 0x13, 0x10, 0x12, 0x06, + 0x00, 0x82, 0x61, 0x6E, 0x79, 0x00, 0x44, 0x77, 0x14, 0x08, 0x83, 0x14, + 0x0C, 0x8E, 0x14, 0x13, 0x99, 0x14, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, + 0x0B, 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, 0x18, 0x14, 0x08, 0x15, 0x09, + 0x00, 0x81, 0x6E, 0x63, 0x79, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, + 0x00, 0x81, 0x73, 0x79, 0x00, 0x18, 0x15, 0x0E, 0x11, 0x04, 0x05, 0x00, + 0x81, 0x74, 0x63, 0x79, 0x00, 0x17, 0x09, 0x04, 0x16, 0x00, 0x82, 0x65, + 0x74, 0x79, 0x00, 0x06, 0x15, 0x04, 0x15, 0x0C, 0x08, 0x0B, 0x00, 0x87, + 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x00, 0x44, 0xD4, 0x14, + 0x0B, 0x17, 0x15, 0x0E, 0x21, 0x15, 0x0F, 0x29, 0x15, 0x12, 0x71, 0x15, + 0x15, 0x7B, 0x15, 0x00, 0x45, 0xE7, 0x14, 0x08, 0xF0, 0x14, 0x0F, 0xF6, + 0x14, 0x11, 0xFF, 0x14, 0x15, 0x06, 0x15, 0x18, 0x0F, 0x15, 0x00, 0x12, + 0x15, 0x13, 0x00, 0x81, 0x62, 0x6C, 0x79, 0x00, 0x15, 0x00, 0x80, 0x6C, + 0x79, 0x00, 0x08, 0x15, 0x00, 0x83, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x0C, + 0x09, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x11, 0x08, 0x0A, 0x00, 0x80, + 0x6C, 0x79, 0x00, 0x17, 0x06, 0x04, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x0A, + 0x0C, 0x0F, 0x16, 0x00, 0x81, 0x74, 0x6C, 0x79, 0x00, 0x0C, 0x0F, 0x00, + 0x81, 0x65, 0x6C, 0x79, 0x00, 0x44, 0x33, 0x15, 0x05, 0x5E, 0x15, 0x08, + 0x67, 0x15, 0x00, 0x56, 0x3A, 0x15, 0x17, 0x52, 0x15, 0x00, 0x18, 0x00, + 0x6C, 0x43, 0x15, 0x16, 0x4A, 0x15, 0x00, 0x83, 0x75, 0x61, 0x6C, 0x6C, + 0x79, 0x00, 0x18, 0x00, 0x84, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x06, + 0x04, 0x00, 0x85, 0x74, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x04, 0x05, + 0x12, 0x15, 0x13, 0x00, 0x81, 0x79, 0x00, 0x04, 0x15, 0x00, 0x84, 0x65, + 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x10, 0x12, 0x11, 0x04, 0x00, 0x82, 0x61, + 0x6C, 0x79, 0x00, 0x04, 0x10, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x69, 0x6C, + 0x79, 0x00, 0x08, 0x12, 0x10, 0x2C, 0x00, 0x82, 0x6E, 0x65, 0x79, 0x00, + 0x44, 0xA0, 0x15, 0x08, 0xD9, 0x15, 0x12, 0xE2, 0x15, 0x17, 0xEF, 0x15, + 0x19, 0xFE, 0x15, 0x00, 0x45, 0xAA, 0x15, 0x10, 0xB3, 0x15, 0x16, 0xBC, + 0x15, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x72, 0x61, 0x72, 0x79, 0x00, 0x18, + 0x16, 0x00, 0x82, 0x6D, 0x61, 0x72, 0x79, 0x00, 0x08, 0x06, 0x00, 0x46, + 0xC6, 0x15, 0x08, 0xD1, 0x15, 0x00, 0x08, 0x11, 0x00, 0x85, 0x65, 0x73, + 0x73, 0x61, 0x72, 0x79, 0x00, 0x11, 0x00, 0x82, 0x73, 0x61, 0x72, 0x79, + 0x00, 0x13, 0x12, 0x15, 0x13, 0x00, 0x80, 0x74, 0x79, 0x00, 0x0A, 0x04, + 0x17, 0x04, 0x06, 0x00, 0x84, 0x65, 0x67, 0x6F, 0x72, 0x79, 0x00, 0x11, + 0x18, 0x06, 0x12, 0x2C, 0x00, 0x86, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x72, + 0x79, 0x00, 0x08, 0x2C, 0x00, 0x81, 0x65, 0x72, 0x79, 0x00, 0x04, 0x00, + 0x55, 0x0F, 0x16, 0x1A, 0x1A, 0x16, 0x00, 0x06, 0x12, 0x13, 0x1C, 0x0B, + 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, 0x0F, 0x04, 0x00, 0x81, 0x79, 0x73, + 0x00, 0x49, 0x2B, 0x16, 0x0F, 0x33, 0x16, 0x15, 0x3C, 0x16, 0x00, 0x04, + 0x16, 0x00, 0x81, 0x65, 0x74, 0x79, 0x00, 0x0C, 0x05, 0x04, 0x00, 0x81, + 0x69, 0x74, 0x79, 0x00, 0x13, 0x08, 0x12, 0x15, 0x13, 0x00, 0x84, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x00, +}; diff --git a/jack/autocorrect_dict.txt b/jack/autocorrect_dict.txt index 135bb64..547ad56 100644 --- a/jack/autocorrect_dict.txt +++ b/jack/autocorrect_dict.txt @@ -1,4 +1,4 @@ -# Copyright 2024 [email protected] +# Copyright 2025 [email protected] # SPDX-License-Identifier: GPL-2.0-or-later :theri -> their @@ -120,9 +120,6 @@ aparrent -> apparent apparant -> apparent apparrent -> apparent asthetic -> aesthetic -auxilary -> auxiliary -auxillary -> auxiliary -auxilliary -> auxiliary bankrupcy -> bankruptcy busness -> business bussiness -> business @@ -177,8 +174,6 @@ relevent -> relevant repitition -> repetition safty -> safety saftey -> safety -seperat -> separat -spectogram -> spectrogram symetric -> symmetric tolerence -> tolerance cacheing -> caching @@ -197,7 +192,6 @@ interator -> iterator looup -> lookup namesapce -> namespace namespcae -> namespace -nulltpr -> nullptr operaotr -> operator overide -> override ovveride -> override @@ -237,7 +231,6 @@ fromthe -> from the :aslo: -> also :casue -> cause :choses -> chooses -:gaurd -> guard :haev -> have :hapen -> happen :idaes -> ideas @@ -299,7 +292,6 @@ cheif -> chief cieling -> ceiling circut -> circuit clasic -> classic -cmoputer -> computer coform -> conform comming: -> coming considerd -> considered @@ -330,7 +322,6 @@ greatful -> grateful heigher -> higher higest -> highest howver -> however -hydogen -> hydrogen importamt -> important inclued -> include insted -> instead @@ -388,7 +379,6 @@ supress -> suppress surpress -> suppress thresold -> threshold tongiht -> tonight -tranpose -> transpose typcial -> typical udpate -> update ususally -> usually diff --git a/jack/color.c b/jack/color.c index 4d833f3..9728d99 100644 --- a/jack/color.c +++ b/jack/color.c @@ -1,101 +1,110 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "color.h" #include <lib/lib8tion/lib8tion.h> -#define FORCE_REFERENCE(var) __asm__ volatile("" : : "r"(var)) -#define FASTLED_SCALE8_FIXED 1 +#define K255 255 +#define K171 171 +#define K170 170 +#define K85 85 + +// Adapted from https://fastled.io/docs/hsv2rgb_8cpp_source.html +// void hsv2rgb_rainbow() function RGB rgb_matrix_hsv_to_rgb(const HSV hsv) { - const uint8_t Y1 = 1, Y2 = 0, G_2 = 1, Gscale = 0, hue = hsv.h, sat = hsv.s; - uint8_t val = hsv.v, offset = hue & 0x1F, offset8 = offset; - { -#ifdef __AVR__ - offset8 <<= 1; - __asm__ volatile(""); - offset8 <<= 1; - __asm__ volatile(""); - offset8 <<= 1; -#else - offset8 <<= 3; -#endif - } - uint8_t third = scale8(offset8, (256 / 3)), r, g, b; + // Yellow has a higher inherent brightness than + // any other color; 'pure' yellow is perceived to + // be 93% as bright as white. In order to make + // yellow appear the correct relative brightness, + // it has to be rendered brighter than all other + // colors. + const uint8_t hue = hsv.h; + const uint8_t sat = hsv.s; + uint8_t val = hsv.v; + + // offset8 = (hue [0..31]) * 8 + uint8_t offset8 = hue & 0x1F; + offset8 <<= 3; + + uint8_t third = scale8(offset8, (256 / 3)); // max = 85 + uint8_t r, g, b; if (!(hue & 0x80)) { + // 0XX if (!(hue & 0x40)) { + // 00X + // section 0-1 if (!(hue & 0x20)) { - r = 255 - third; + // 000 + // case 0: // R -> O + r = K255 - third; g = third; b = 0; - FORCE_REFERENCE(b); } else { - if (Y1) { - r = 171; - g = 85 + third; - b = 0; - FORCE_REFERENCE(b); - } - if (Y2) { - r = 170 + third; - uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); - g = 85 + twothirds; - b = 0; - FORCE_REFERENCE(b); - } + // 001 + // case 1: // O -> Y + r = K171; + g = K85 + third; + b = 0; } } else { + // 01X + // section 2-3 if (!(hue & 0x20)) { - if (Y1) { - uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); - r = 171 - twothirds; - g = 170 + third; - b = 0; - FORCE_REFERENCE(b); - } - if (Y2) { - r = 255 - offset8; - g = 255; - b = 0; - FORCE_REFERENCE(b); - } + // 010 + // case 2: // Y -> G + // uint8_t twothirds = (third << 1); + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170 + r = K171 - twothirds; + g = K170 + third; + b = 0; } else { + // 011 + // case 3: // G -> A r = 0; - FORCE_REFERENCE(r); - g = 255 - third; + g = K255 - third; b = third; } } } else { + // section 4-7 + // 1XX if (!(hue & 0x40)) { + // 10X if (!(hue & 0x20)) { + // 100 + // case 4: // A -> B r = 0; - FORCE_REFERENCE(r); - uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); - g = 171 - twothirds; - b = 85 + twothirds; + // uint8_t twothirds = (third << 1); + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170 + g = K171 - twothirds; // K170? + b = K85 + twothirds; } else { + // 101 + // case 5: // B -> P r = third; g = 0; - FORCE_REFERENCE(g); - b = 255 - third; + b = K255 - third; } } else { if (!(hue & 0x20)) { - r = 85 + third; + // 110 + // case 6: // P -- K + r = K85 + third; g = 0; - FORCE_REFERENCE(g); - b = 171 - third; + b = K171 - third; } else { - r = 170 + third; + // 111 + // case 7: // K -> R + r = K170 + third; g = 0; - FORCE_REFERENCE(g); - b = 85 - third; + b = K85 - third; } } } - if (G_2) - g = g >> 1; - if (Gscale) - g = scale8_video_LEAVING_R1_DIRTY(g, Gscale); + // This is one of the good places to scale the green down, + // although the client can scale green down as well. + g >>= 1; + // Scale down colors if we're desaturated at all + // and add the brightness_floor to r, g, and b. if (sat != 255) { if (sat == 0) { r = 255; @@ -105,27 +114,26 @@ RGB rgb_matrix_hsv_to_rgb(const HSV hsv) { uint8_t desat = 255 - sat; desat = scale8_video(desat, desat); uint8_t satscale = 255 - desat; - r = scale8_LEAVING_R1_DIRTY(r, satscale); - g = scale8_LEAVING_R1_DIRTY(g, satscale); - b = scale8_LEAVING_R1_DIRTY(b, satscale); - cleanup_R1(); + r = scale8(r, satscale); + g = scale8(g, satscale); + b = scale8(b, satscale); uint8_t brightness_floor = desat; r += brightness_floor; g += brightness_floor; b += brightness_floor; } } + // Now scale everything down if we're at value < 255. if (val != 255) { - val = scale8_video_LEAVING_R1_DIRTY(val, val); + val = scale8_video(val, val); if (val == 0) { r = 0; g = 0; b = 0; } else { - r = scale8_LEAVING_R1_DIRTY(r, val); - g = scale8_LEAVING_R1_DIRTY(g, val); - b = scale8_LEAVING_R1_DIRTY(b, val); - cleanup_R1(); + r = scale8(r, val); + g = scale8(g, val); + b = scale8(b, val); } } return (RGB){.r = r, .g = g, .b = b}; diff --git a/jack/combos.def b/jack/combos.def index 53934f1..e3a44f4 100644 --- a/jack/combos.def +++ b/jack/combos.def @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later // name output keys diff --git a/jack/combos.h b/jack/combos.h deleted file mode 100644 index 27e7a7c..0000000 --- a/jack/combos.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define CMB(name, action, ...) name, -enum combos { -#include "combos.def" -}; -#undef CMB - -#define CMB(name, action, ...) \ - uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END}; -#include "combos.def" -#undef CMB - -#define CMB(name, action, ...) [name] = COMBO(name##_combo, action), -combo_t key_combos[] = { -#include "combos.def" -}; -#undef CMB diff --git a/jack/config.h b/jack/config.h index 2b47028..72347f8 100644 --- a/jack/config.h +++ b/jack/config.h @@ -1,15 +1,17 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #define TAPPING_TERM_PER_KEY #define TAPPING_TERM 140 -#define FORCE_NKRO #define BOTH_SHIFTS_TURNS_ON_CAPS_WORD #define COMBO_TERM 40 #define NO_ACTION_ONESHOT #define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX #define ENABLE_COMPILE_KEYCODE +#define LAYER_STATE_8BIT +#undef LOCKING_SUPPORT_ENABLE +#undef LOCKING_RESYNC_ENABLE #undef MANUFACTURER #define MANUFACTURER "jacks" @@ -33,19 +35,55 @@ #ifdef RGB_MATRIX_ENABLE #define RGB_MATRIX_SLEEP #define RGB_MATRIX_TIMEOUT 300000 -#undef RGB_MATRIX_DEFAULT_MODE -#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_ALPHAS_MODS -#define ENABLE_RGB_MATRIX_ALPHAS_MODS -#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT -#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL -#define ENABLE_RGB_MATRIX_RAINDROPS -#define ENABLE_RGB_MATRIX_FRAMEBUFFER_EFFECTS -#define ENABLE_RGB_MATRIX_TYPING_HEATMAP -#define ENABLE_RGB_MATRIX_KEYPRESSES -#define ENABLE_RGB_MATRIX_SOLID_REACTIVE -#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH -#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS -#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS #define RGB_MATRIX_KEYPRESSES -#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define PALETTEFX_ENABLE_ALL_EFFECTS +#define PALETTEFX_ENABLE_ALL_PALETTES +#undef ENABLE_RGB_MATRIX_ALPHAS_MODS +#undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN +#undef ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +#undef ENABLE_RGB_MATRIX_BREATHING +#undef ENABLE_RGB_MATRIX_BAND_SAT +#undef ENABLE_RGB_MATRIX_BAND_VAL +#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT +#undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL +#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT +#undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL +#undef ENABLE_RGB_MATRIX_CYCLE_ALL +#undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +#undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN +#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN +#undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL +#undef ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON +#undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL +#undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL +#undef ENABLE_RGB_MATRIX_DUAL_BEACON +#undef ENABLE_RGB_MATRIX_RAINBOW_BEACON +#undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS +#undef ENABLE_RGB_MATRIX_FLOWER_BLOOMING +#undef ENABLE_RGB_MATRIX_RAINDROPS +#undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +#undef ENABLE_RGB_MATRIX_HUE_BREATHING +#undef ENABLE_RGB_MATRIX_HUE_PENDULUM +#undef ENABLE_RGB_MATRIX_HUE_WAVE +#undef ENABLE_RGB_MATRIX_PIXEL_FRACTAL +#undef ENABLE_RGB_MATRIX_PIXEL_FLOW +#undef ENABLE_RGB_MATRIX_PIXEL_RAIN +#undef ENABLE_RGB_MATRIX_TYPING_HEATMAP +#undef ENABLE_RGB_MATRIX_DIGITAL_RAIN +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS +#undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS +#undef ENABLE_RGB_MATRIX_SPLASH +#undef ENABLE_RGB_MATRIX_MULTISPLASH +#undef ENABLE_RGB_MATRIX_SOLID_SPLASH +#undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +#undef ENABLE_RGB_MATRIX_STARLIGHT +#undef ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE +#undef ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT +#undef ENABLE_RGB_MATRIX_RIVERFLOW #endif diff --git a/jack/dict.h b/jack/dict.h deleted file mode 100644 index c7a27f4..0000000 --- a/jack/dict.h +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2024 [email protected] -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#define NUM_WORDS 1000 - -const char *dict[NUM_WORDS] = { - "the", "of", "to", "and", "a", - "in", "is", "it", "you", "that", - "he", "was", "for", "on", "are", - "with", "as", "I", "his", "they", - "be", "at", "one", "have", "this", - "from", "or", "had", "by", "not", - "word", "but", "what", "some", "we", - "can", "out", "other", "were", "all", - "there", "when", "up", "use", "your", - "how", "said", "an", "each", "she", - "which", "do", "their", "time", "if", - "will", "way", "about", "many", "then", - "them", "write", "would", "like", "so", - "these", "her", "long", "make", "thing", - "see", "him", "two", "has", "look", - "more", "day", "could", "go", "come", - "did", "number", "sound", "no", "most", - "people", "my", "over", "know", "water", - "than", "call", "first", "who", "may", - "down", "side", "been", "now", "find", - "any", "new", "work", "part", "take", - "get", "place", "made", "live", "where", - "after", "back", "little", "only", "round", - "man", "year", "came", "show", "every", - "good", "me", "give", "our", "under", - "name", "very", "through", "just", "form", - "sentence", "great", "think", "say", "help", - "low", "line", "differ", "turn", "cause", - "much", "mean", "before", "move", "right", - "boy", "old", "too", "same", "tell", - "does", "set", "three", "want", "air", - "well", "also", "play", "small", "end", - "put", "home", "read", "hand", "port", - "large", "spell", "add", "even", "land", - "here", "must", "big", "high", "such", - "follow", "act", "why", "ask", "men", - "change", "went", "light", "kind", "off", - "need", "house", "picture", "try", "us", - "again", "animal", "point", "mother", "world", - "near", "build", "self", "earth", "father", - "head", "stand", "own", "page", "should", - "country", "found", "answer", "school", "grow", - "study", "still", "learn", "plant", "cover", - "food", "sun", "four", "between", "state", - "keep", "eye", "never", "last", "let", - "thought", "city", "tree", "cross", "farm", - "hard", "start", "might", "story", "saw", - "far", "sea", "draw", "left", "late", - "run", "don't", "while", "press", "close", - "night", "real", "life", "few", "north", - "open", "seem", "together", "next", "white", - "children", "begin", "got", "walk", "example", - "ease", "paper", "group", "always", "music", - "those", "both", "mark", "often", "letter", - "until", "mile", "river", "car", "feet", - "care", "second", "book", "carry", "took", - "science", "eat", "room", "friend", "began", - "idea", "fish", "mountain", "stop", "once", - "base", "hear", "horse", "cut", "sure", - "watch", "color", "face", "wood", "main", - "enough", "plain", "girl", "usual", "young", - "ready", "above", "ever", "red", "list", - "though", "feel", "talk", "bird", "soon", - "body", "dog", "family", "direct", "pose", - "leave", "song", "measure", "door", "product", - "black", "short", "numeral", "class", "wind", - "question", "happen", "complete", "ship", "area", - "half", "rock", "order", "fire", "south", - "problem", "piece", "told", "knew", "pass", - "since", "top", "whole", "king", "space", - "heard", "best", "hour", "better", "true", - "during", "hundred", "five", "remember", "step", - "early", "hold", "west", "ground", "interest", - "reach", "fast", "verb", "sing", "listen", - "six", "table", "travel", "less", "morning", - "ten", "simple", "several", "vowel", "toward", - "war", "lay", "against", "pattern", "slow", - "center", "love", "person", "money", "serve", - "appear", "road", "map", "rain", "rule", - "govern", "pull", "cold", "notice", "voice", - "unit", "power", "town", "fine", "certain", - "fly", "fall", "lead", "cry", "dark", - "machine", "note", "wait", "plan", "figure", - "star", "box", "noun", "field", "rest", - "correct", "able", "pound", "done", "beauty", - "drive", "stood", "contain", "front", "teach", - "week", "final", "gave", "green", "oh", - "quick", "develop", "ocean", "warm", "free", - "minute", "strong", "special", "mind", "behind", - "clear", "tail", "produce", "fact", "street", - "inch", "multiply", "nothing", "course", "stay", - "wheel", "full", "force", "blue", "object", - "decide", "surface", "deep", "moon", "island", - "foot", "system", "busy", "test", "record", - "boat", "common", "gold", "possible", "plane", - "stead", "dry", "wonder", "laugh", "thousand", - "ago", "ran", "check", "game", "shape", - "equate", "hot", "miss", "brought", "heat", - "snow", "tire", "bring", "yes", "distant", - "fill", "east", "paint", "language", "among", - "grand", "ball", "yet", "wave", "drop", - "heart", "am", "present", "heavy", "dance", - "engine", "position", "arm", "wide", "sail", - "material", "size", "vary", "settle", "speak", - "weight", "general", "ice", "matter", "circle", - "pair", "include", "divide", "syllable", "felt", - "perhaps", "pick", "sudden", "count", "square", - "reason", "length", "represent", "art", "subject", - "region", "energy", "hunt", "probable", "bed", - "brother", "egg", "ride", "cell", "believe", - "fraction", "forest", "sit", "race", "window", - "store", "summer", "train", "sleep", "prove", - "lone", "leg", "exercise", "wall", "catch", - "mount", "wish", "sky", "board", "joy", - "winter", "sat", "written", "wild", "instrument", - "kept", "glass", "grass", "cow", "job", - "edge", "sign", "visit", "past", "soft", - "fun", "bright", "gas", "weather", "month", - "million", "bear", "finish", "happy", "hope", - "flower", "clothe", "strange", "gone", "jump", - "baby", "eight", "village", "meet", "root", - "buy", "raise", "solve", "metal", "whether", - "push", "seven", "paragraph", "third", "shall", - "held", "hair", "describe", "cook", "floor", - "either", "result", "burn", "hill", "safe", - "cat", "century", "consider", "type", "law", - "bit", "coast", "copy", "phrase", "silent", - "tall", "sand", "soil", "roll", "temperature", - "finger", "industry", "value", "fight", "lie", - "beat", "excite", "natural", "view", "sense", - "ear", "else", "quite", "broke", "case", - "middle", "kill", "son", "lake", "moment", - "scale", "loud", "spring", "observe", "child", - "straight", "consonant", "nation", "dictionary", "milk", - "speed", "method", "organ", "pay", "age", - "section", "dress", "cloud", "surprise", "quiet", - "stone", "tiny", "climb", "cool", "design", - "poor", "lot", "experiment", "bottom", "key", - "iron", "single", "stick", "flat", "twenty", - "skin", "smile", "crease", "hole", "trade", - "melody", "trip", "office", "receive", "row", - "mouth", "exact", "symbol", "die", "least", - "trouble", "shout", "except", "wrote", "seed", - "tone", "join", "suggest", "clean", "break", - "lady", "yard", "rise", "bad", "blow", - "oil", "blood", "touch", "grew", "cent", - "mix", "team", "wire", "cost", "lost", - "brown", "wear", "garden", "equal", "sent", - "choose", "fell", "fit", "flow", "fair", - "bank", "collect", "save", "control", "decimal", - "gentle", "woman", "captain", "practice", "separate", - "difficult", "doctor", "please", "protect", "noon", - "whose", "locate", "ring", "character", "insect", - "caught", "period", "indicate", "radio", "spoke", - "atom", "human", "history", "effect", "electric", - "expect", "crop", "modern", "element", "hit", - "student", "corner", "party", "supply", "bone", - "rail", "imagine", "provide", "agree", "thus", - "capital", "won't", "chair", "danger", "fruit", - "rich", "thick", "soldier", "process", "operate", - "guess", "necessary", "sharp", "wing", "create", - "neighbor", "wash", "bat", "rather", "crowd", - "corn", "compare", "poem", "string", "bell", - "depend", "meat", "rub", "tube", "famous", - "dollar", "stream", "fear", "sight", "thin", - "triangle", "planet", "hurry", "chief", "colony", - "clock", "mine", "tie", "enter", "major", - "fresh", "search", "send", "yellow", "gun", - "allow", "print", "dead", "spot", "desert", - "suit", "current", "lift", "rose", "continue", - "block", "chart", "hat", "sell", "success", - "company", "subtract", "event", "particular", "deal", - "swim", "term", "opposite", "wife", "shoe", - "shoulder", "spread", "arrange", "camp", "invent", - "cotton", "born", "determine", "quart", "nine", - "truck", "noise", "level", "chance", "gather", - "shop", "stretch", "throw", "shine", "property", - "column", "molecule", "select", "wrong", "gray", - "repeat", "require", "broad", "prepare", "salt", - "nose", "plural", "anger", "claim", "continent", - "oxygen", "sugar", "death", "pretty", "skill", - "women", "season", "solution", "magnet", "silver", - "thank", "branch", "match", "suffix", "especially", - "fig", "afraid", "huge", "sister", "steel", - "discuss", "forward", "similar", "guide", "experience", - "score", "apple", "bought", "led", "pitch", - "coat", "mass", "card", "band", "rope", - "slip", "win", "dream", "evening", "condition", - "feed", "tool", "total", "basic", "smell", - "valley", "nor", "double", "seat", "arrive", - "master", "track", "parent", "shore", "division", - "sheet", "substance", "favor", "connect", "post", - "spend", "chord", "fat", "glad", "original", - "share", "station", "dad", "bread", "charge", - "proper", "bar", "offer", "segment", "slave", - "duck", "instant", "market", "degree", "populate", - "chick", "dear", "enemy", "reply", "drink", - "occur", "support", "speech", "nature", "range", - "steam", "motion", "path", "liquid", "log", - "meant", "quotient", "teeth", "shell", "neck"}; diff --git a/jack/introspection.c b/jack/introspection.c new file mode 100644 index 0000000..86f453b --- /dev/null +++ b/jack/introspection.c @@ -0,0 +1,33 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" + +#ifdef TAP_DANCE_ENABLE +tap_dance_action_t tap_dance_actions[] = { + [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins), + [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv), + [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset), + [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR), + [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC), +}; +#endif + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}}, + [_LOWER] = {{XRGB_SAI, XRGB_SAD}, {XRGB_HUI, XRGB_HUD}}, + [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}}; +#endif + +#ifdef COMBO_ENABLE +#define CMB(name, action, ...) \ + uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END}; +#include "combos.def" +#undef CMB + +#define CMB(name, action, ...) [name] = COMBO(name##_combo, action), +combo_t key_combos[] = { +#include "combos.def" +}; +#undef CMB +#endif diff --git a/jack/jack.c b/jack/jack.c index b876fb1..274a011 100644 --- a/jack/jack.c +++ b/jack/jack.c @@ -1,15 +1,6 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" -#include "combos.h" - -tap_dance_action_t tap_dance_actions[] = { - [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins), - [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv), - [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset), - [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR), - [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC), -}; #if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) #include "transactions.h" @@ -21,97 +12,78 @@ void keylogger_sync(uint8_t initiator2target_buffer_size, if (initiator2target_buffer_size == 5) memcpy(&keylog_str, initiator2target_buffer, initiator2target_buffer_size); } +#endif +__attribute__((weak)) void housekeeping_task_keymap(void) {} void housekeeping_task_user(void) { +#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) if (is_keyboard_master()) { static uint32_t last_sync; bool needs_sync = false; static char tmp_keylog[5] = {0}; - if (memcmp(&keylog_str, &tmp_keylog, 5)) { + if (memcmp(&keylog_str, &tmp_keylog, sizeof(tmp_keylog))) { needs_sync = true; - memcpy(&tmp_keylog, &keylog_str, 5); + memcpy(&tmp_keylog, &keylog_str, sizeof(tmp_keylog)); } if (timer_elapsed32(last_sync) > 250) needs_sync = true; - if (needs_sync) { - if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, 5, &keylog_str)) + if (needs_sync) + if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, sizeof(tmp_keylog), + &keylog_str)) last_sync = timer_read32(); - } } -} #endif + housekeeping_task_keymap(); +} +__attribute__((weak)) void keyboard_post_init_keymap(void) {} void keyboard_post_init_user(void) { #if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) transaction_register_rpc(RPC_ID_USER_KEYLOG_STR, keylogger_sync); #endif +#ifdef CUSTOM_TAP_CODE_ENABLE + tap_code_buffer_init(); +#endif #ifdef RGBLIGHT_ENABLE rgblight_enable_noeeprom(); rgblight_sethsv_noeeprom(HSV_CYAN); rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); -#elif RGB_MATRIX_ENABLE +#endif +#ifdef RGB_MATRIX_ENABLE rgb_matrix_enable_noeeprom(); rgb_matrix_sethsv_noeeprom(HSV_CYAN); rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); #endif -#ifdef CONSOLE_ENABLE - debug_keyboard = true; - debug_enable = true; - debug_matrix = true; - debug_mouse = true; -#endif #ifdef AUTOCORRECT_ENABLE if (!autocorrect_is_enabled()) autocorrect_enable(); #endif + keyboard_post_init_keymap(); } -bool shutdown_user(bool jump_to_bootloader) { -#ifdef OLED_ENABLE - oled_render_boot(jump_to_bootloader); +void matrix_scan_user(void) { +#ifdef CUSTOM_TAP_CODE_ENABLE + process_tap_code_buffer(); #endif - return true; } -#ifdef ENCODER_MAP_ENABLE -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}}, - [_LOWER] = {{RGB_SAI, RGB_SAD}, {RGB_HUI, RGB_HUD}}, - [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}}; +#ifndef MAGIC_ENABLE +uint16_t keycode_config(uint16_t keycode) { return keycode; } +uint8_t mod_config(uint8_t mod) { return mod; } #endif -#ifdef POINTING_DEVICE_ENABLE -static bool scrolling = false; -layer_state_t layer_state_set_user(layer_state_t state) { - switch (get_highest_layer(state)) { - case _LOWER: - scrolling = true; -#ifdef POINTING_DEVICE_DRIVER_pimoroni_trackball - pimoroni_trackball_set_cpi(0.1); -#else - pointing_device_set_cpi(64); -#endif - break; - default: - if (scrolling) { - scrolling = false; -#ifdef POINTING_DEVICE_DRIVER_pimoroni_trackball - pimoroni_trackball_set_cpi(1); -#else - pointing_device_set_cpi(1024); +#ifdef RP2040_MATH_IN_ROM +typedef void (*init_fn)(void); +extern init_fn __preinit_array_base__; +extern init_fn __preinit_array_end__; #endif - } - } - return state; -} -report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { - if (scrolling) { - mouse_report.h = mouse_report.x; - mouse_report.v = -mouse_report.y; - mouse_report.x = 0; - mouse_report.y = 0; - } - return mouse_report; -} +__attribute__((weak)) void keyboard_pre_init_keymap(void) {} +void keyboard_pre_init_user(void) { +#ifdef RP2040_MATH_IN_ROM + for (init_fn *func = &__preinit_array_base__; func < &__preinit_array_end__; + func++) + (*func)(); #endif + keyboard_pre_init_keymap(); +} diff --git a/jack/jack.h b/jack/jack.h index 742b6d1..3d3b1c9 100644 --- a/jack/jack.h +++ b/jack/jack.h @@ -1,55 +1,66 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include QMK_KEYBOARD_H -#ifdef OLED_ENABLE -#include "oled.h" -#endif enum layers { _BASE, _LOWER, _RAISE }; enum tapdances { EM_DASH_MINS, PLY_NXT_PRV, PASTE_RAISE, CBRACKET, SBRACKET }; -enum sw_state { NONE, SELECTED, WORD, FIRST_LINE, LINE }; - enum custom_keycodes { UPDIR = QK_USER, - NUKE, - SELWORD, + REMOVE, M_JIGGLE, - TABLE1, - TABLE2, - KC_NOMODE, - KC_WIDE, - KC_SCRIPT, - KC_BLOCKS, - KC_REGIONAL, - KC_AUSSIE, - KC_ZALGO, - KC_SUPER, - RWORD + UC_NOMODE, + UC_WIDE, + UC_SCRIPT, + UC_BLOCKS, + UC_REGIONAL, + UC_AUSSIE, + UC_ZALGO, + UC_SUPER }; -#ifdef UNICODE_COMMON_ENABLE -bool process_record_unicode(uint16_t keycode, keyrecord_t *record); - -enum unicode_mode { - NOMODE, - WIDE, - SCRIPT, - BLOCKS, - REGIONAL, - AUSSIE, - ZALGO, - SUPER +#define CMB(name, action, ...) name, +enum combos { +#include "combos.def" }; -#endif +#undef CMB +bool process_record_unicode(uint16_t keycode, keyrecord_t *record); +bool process_record_taps(uint16_t keycode, keyrecord_t *record); +extern uint8_t extract_mod_bits(uint16_t code); +void tap_code_buffer_init(void); +void tap_code_register(uint8_t code, uint8_t mods, uint16_t delay, + bool register_tap); +void process_tap_code_buffer(void); +void tap_string(const char *str); + +#ifdef TAP_DANCE_ENABLE void td_reset(tap_dance_state_t *state, void *user_data); void em_dash_mins(tap_dance_state_t *state, void *user_data); void ply_nxt_prv(tap_dance_state_t *state, void *user_data); void raise_paste(tap_dance_state_t *state, void *user_data); +#endif + +void oled_timer_reset(void); +void anim_frame(uint16_t size, char const action[][size]); +void wpm_graph(void); +void felix_dog(void); +void layer_anim(void); +void layer_status(void); +void render_mod_status(void); +void add_keylog(uint16_t keycode, keyrecord_t *record); +void render_keylog(void); +void render_wpm(void); +void render_scan_rate(void); + +void keyboard_pre_init_keymap(void); +void keyboard_post_init_keymap(void); +void housekeeping_task_keymap(void); +bool oled_task_keymap(void); +#define KEYLOG_LEN 5 #define PNP TD(PLY_NXT_PRV) #define PSTRSE TD(PASTE_RAISE) #define ESCLWR LT(_LOWER, KC_ESC) @@ -98,16 +109,17 @@ void raise_paste(tap_dance_state_t *state, void *user_data); #define ___LOWER1___ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 #define ___LOWER2___ HRML(KC_EXLM, KC_AT, KC_HASH, KC_DLR), KC_PERC, KC_CIRC, HRMR(KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN) -#define ___LOWER3___ KC_VOLD, KC_TAB, KC_CAPS, SELWORD, KC_GRV, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU -#define ___LOWER4___ _______, _______, _______, _______, NUKE, _______ +#define ___LOWER3___ KC_VOLD, KC_TAB, KC_CAPS, REMOVE, KC_GRV, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU +#define ___LOWER4___ _______, _______, _______, _______, _______, _______ -#define ___RAISE1___ XRGB_TOG, XRGB_NXT, XRGB_HUI, XRGB_SAI, XRGB_VAI, KC_NOMODE, KC_SCRIPT, KC_BLOCKS, KC_REGIONAL, QK_MAKE -#define ___RAISE2___ M_JIGGLE, XRGB_PRV, XRGB_HUD, XRGB_SAD, XRGB_VAD, KC_WIDE, KC_AUSSIE, KC_ZALGO, KC_SUPER, QK_BOOT -#define ___RAISE3___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 -#define ___RAISE4___ _______, RWORD, _______, _______, _______, _______ +#define ___RAISE1___ XRGB_TOG, XRGB_NXT, XRGB_HUI, XRGB_SAI, XRGB_VAI, UC_NOMODE, UC_SCRIPT, UC_BLOCKS, UC_REGIONAL, QK_MAKE +#define ___RAISE2___ M_JIGGLE, XRGB_PRV, XRGB_HUD, XRGB_SAD, XRGB_VAD, UC_WIDE, UC_AUSSIE, UC_ZALGO, UC_SUPER, QK_BOOT +#define ___RAISE3___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 +#define ___RAISE4___ _______, _______, _______, _______, _______, _______ // clang-format on #define LAYOUT_jack_60_ts(...) LAYOUT_60_ansi_tsangan(__VA_ARGS__) #define LAYOUT_jack_3x6(...) LAYOUT_split_3x6_3(__VA_ARGS__) +#define LAYOUT_jack_sp(...) LAYOUT_split_space(__VA_ARGS__) #define LAYOUT_jack_all(...) LAYOUT_all(__VA_ARGS__) #define LAYOUT_jack(...) LAYOUT(__VA_ARGS__) diff --git a/jack/oled.c b/jack/oled.c index 7b975e0..ec52705 100644 --- a/jack/oled.c +++ b/jack/oled.c @@ -1,15 +1,16 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later -#include "oled.h" #include "jack.h" +#include "oled.h" uint32_t oled_timer = 0; char keylog_str[KEYLOG_LEN + 1] = {0}; +extern uint8_t oled_buffer[OLED_MATRIX_SIZE]; +extern OLED_BLOCK_TYPE oled_dirty; void oled_timer_reset(void) { oled_timer = timer_read32(); } __attribute__((weak)) bool oled_task_keymap(void) { return true; } - bool oled_task_user(void) { if (is_keyboard_master()) { if (timer_elapsed32(oled_timer) > 300000) { @@ -220,18 +221,3 @@ void render_scan_rate(void) { oled_write_ln(get_u16_str(get_matrix_scan_rate(), ' '), false); } #endif - -void oled_render_boot(bool jump_to_bootloader) { - oled_clear(); - static const char PROGMEM qmk_logo[16] = {0x80, 0x81, 0x82, 0x83, 0x84, - 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, - 0xC0, 0xC1, 0xC2, 0xC3, 0xC4}; - oled_write(qmk_logo, false); - oled_set_cursor(0, 4); - oled_write(qmk_logo, false); - oled_set_cursor(0, 8); - oled_write(qmk_logo, false); - oled_set_cursor(0, 12); - oled_write(qmk_logo, false); - oled_render_dirty(true); -} diff --git a/jack/oled.h b/jack/oled.h index 6e33143..b959cc6 100644 --- a/jack/oled.h +++ b/jack/oled.h @@ -1,25 +1,6 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include "quantum.h" - -#define KEYLOG_LEN 5 -extern uint8_t oled_buffer[OLED_MATRIX_SIZE]; -extern OLED_BLOCK_TYPE oled_dirty; - -void oled_timer_reset(void); -bool oled_task_keymap(void); -void anim_frame(uint16_t size, char const action[][size]); -void wpm_graph(void); -void felix_dog(void); -void layer_anim(void); -void layer_status(void); -void render_mod_status(void); -void add_keylog(uint16_t keycode, keyrecord_t *record); -void render_keylog(void); -void render_wpm(void); -void render_scan_rate(void); -void oled_render_boot(bool jump_to_bootloader); static const char PROGMEM code_to_name[256] = { ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', @@ -43,7 +24,8 @@ static const char PROGMEM code_to_name[256] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 'C', 'S', 'A', 'G', 'C', 'S', 'A', 'G', ' ', ' ', ' ', ' ', ' ', 24, 26, 24, 25, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 24, 25, 27, - 26, ' ', ' ', ' '}; + 26, ' ', ' ', ' ', +}; static const char PROGMEM felix_sit[][96] = { { @@ -157,440 +139,444 @@ static const char PROGMEM felix_sneak[][96] = { static const char PROGMEM tap_num[][520] = { { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, - 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0, 0, 0x80, 0x80, 0xc0, 0x30, 0x0c, + 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x00, 0x00, 0x80, 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x04, 0x06, 0x09, 0x24, 0x24, 0x18, 0x80, - 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, 0, 0x01, 0x01, 0x01, - 0, 0, 0, 0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x8f, 0x48, 0xc4, - 0x84, 0x88, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0x80, + 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x8f, 0x48, 0xc4, + 0x84, 0x88, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x80, 0x80, 0x40, 0xc0, 0x30, 0x08, 0x44, 0x84, 0x02, 0x02, 0x01, 0x01, 0x78, - 0x28, 0x11, 0x21, 0x42, 0x06, 0x05, 0x08, 0x90, 0x60, 0x80, 0, 0, - 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, 0, 0x80, 0x40, 0x40, + 0x28, 0x11, 0x21, 0x42, 0x06, 0x05, 0x08, 0x90, 0x60, 0x80, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x8c, 0x08, 0x18, 0x14, 0x24, 0x7a, 0x46, 0x81, - 0, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x41, 0x44, 0x24, 0x23, 0x10, + 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x41, 0x44, 0x24, 0x23, 0x10, 0x10, 0x08, 0x88, 0x84, 0x43, 0x5c, 0x20, 0x20, 0x10, 0x10, 0x20, 0x20, - 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0x18, 0x27, 0x40, 0x80, - 0, 0, 0, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, + 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x18, 0x27, 0x40, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0xc2, 0x21, 0x11, 0x10, 0x08, 0x0b, 0x05, 0x66, 0x42, 0x82, 0x04, 0x04, 0x08, 0x18, 0x14, 0x2c, 0x43, 0x80, 0x04, 0x08, 0x10, 0x20, 0x41, 0x80, 0x80, 0x8f, 0x44, 0x44, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0xe0, 0x18, 0x06, 0x01, 0x08, 0x10, - 0x20, 0x40, 0x80, 0, 0, 0, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, - 0x12, 0x0c, 0x70, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0x04, 0x08, - 0x10, 0x20, 0x40, 0x40, 0x20, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, + 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, + 0x12, 0x0c, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x40, 0x20, 0x60, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, 0x8e, 0x70, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0xc8, 0x24, - 0x24, 0x42, 0x82, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, - 0, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, 0, 0x01, - 0x01, 0x01, 0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, - 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0x24, 0x42, 0x82, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x80, 0x70, 0x0c, 0x03, 0, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x70, 0x0c, 0x03, 0x00, 0x04, 0x08, 0x10, 0x20, 0x41, 0x80, 0x80, 0x81, 0x46, 0x40, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x50, 0x60, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x40, 0xc0, 0x30, 0x08, 0x44, 0x84, 0x02, 0x02, 0x11, 0x19, 0x24, 0x90, 0x91, 0x61, 0x03, - 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0, 0, 0, 0x01, 0x01, 0x01, - 0, 0, 0x80, 0x60, 0x10, 0x88, 0x08, 0x04, 0x04, 0x23, 0x12, 0x71, - 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0, 0, 0, - 0, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0, 0, 0x1e, - 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, + 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x80, 0x60, 0x10, 0x88, 0x08, 0x04, 0x04, 0x23, 0x12, 0x71, + 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x00, 0x00, 0x1e, + 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0xc2, 0x21, 0x11, 0x10, 0x08, 0x0b, 0x45, 0x26, 0x22, 0xc2, 0x04, 0x04, 0x0c, 0x1e, 0x11, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x11, 0x09, 0x08, 0x04, 0x04, 0x02, 0x82, 0x81, 0x40, 0x47, 0x38, 0x20, 0x10, 0x10, 0x20, 0x20, - 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x02, 0x06, 0x09, 0x10, 0x20, - 0x40, 0x80, 0, 0, 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, + 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x02, 0x06, 0x09, 0x10, 0x20, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x08, 0x08, 0x07, 0x64, 0x42, 0x82, 0x04, 0x04, 0x08, 0x10, 0x1c, 0x23, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x23, 0x11, 0x11, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x80, 0x40, 0x40, 0xe0, 0x18, 0x06, 0x01, 0x08, 0x10, - 0x20, 0x40, 0x80, 0, 0, 0, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, - 0x12, 0x0c, 0x70, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x10, 0x08, 0x68, 0x9c, 0x03, 0, 0, 0x01, 0x02, + 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, + 0x12, 0x0c, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x10, 0x08, 0x68, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x40, 0x40, 0xa0, 0xa0, 0xd0, - 0x90, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0, 0, 0x01, - 0x01, 0x03, 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0, 0, 0, 0x01, - 0x01, 0x01, 0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, - 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0x90, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x01, 0x03, 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x60, 0x9c, 0x03, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, - 0x8e, 0x70, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0, 0xc0, 0x30, 0x0c, + 0x8e, 0x70, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0x00, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x04, 0x06, 0x09, 0x24, 0x24, 0x18, 0x80, - 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, 0x02, 0x04, 0x04, 0x04, + 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x01, 0x02, 0x04, 0x04, 0x04, 0x02, 0x02, 0x81, 0x61, 0x10, 0x88, 0x08, 0x04, 0x05, 0x22, 0x12, 0x71, - 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0x80, - 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0, 0, 0x1e, - 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, - 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, 0xc0, 0x20, 0x10, 0x10, + 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x80, + 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0x00, 0x00, 0x1e, + 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0xc0, 0x20, 0x10, 0x10, 0x08, 0x08, 0x47, 0x24, 0x22, 0xc2, 0x04, 0x04, 0x08, 0x1e, 0x11, 0x20, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x11, 0x09, 0x08, 0x04, - 0x04, 0x02, 0x02, 0x01, 0, 0x07, 0xf8, 0x80, 0x40, 0x40, 0x80, 0x80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0x06, 0x09, 0x10, 0x20, - 0x40, 0x80, 0, 0, 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, - 0, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x0c, 0x08, 0x10, 0x10, - 0x28, 0x68, 0x5c, 0x83, 0, 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x04, 0x02, 0x02, 0x01, 0x00, 0x07, 0xf8, 0x80, 0x40, 0x40, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x06, 0x09, 0x10, 0x20, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x00, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x0c, 0x08, 0x10, 0x10, + 0x28, 0x68, 0x5c, 0x83, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x23, 0x11, 0x11, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, 0x8e, 0x70, 0x60, 0x20, 0x20, 0x40, 0x40, 0xc0, 0xa0, 0x60, 0x18, 0x04, 0x22, 0x42, - 0x81, 0x01, 0, 0, 0, 0, 0x20, 0, 0x01, 0x02, 0x82, 0x84, - 0x48, 0x30, 0xc0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x10, 0x08, 0x88, 0x74, 0x0c, 0x03, 0, 0x04, 0x08, + 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x02, 0x82, 0x84, + 0x48, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x10, 0x08, 0x88, 0x74, 0x0c, 0x03, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x81, 0x82, 0x44, 0x40, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x50, 0x60, 0x20, 0x20, 0x10, 0x10, 0x08, 0xc8, 0x24, - 0x24, 0x42, 0x82, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, - 0, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, 0x02, 0x04, - 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0, 0, 0, 0, 0x81, 0x9e, - 0x60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0x24, 0x42, 0x82, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0x00, 0x01, 0x02, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x81, 0x9e, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}; static const char PROGMEM tap_sym[][650] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x40, - 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, - 0x08, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x50, 0x40, 0x80, - 0, 0, 0, 0, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0xd0, - 0x10, 0x11, 0x21, 0x20, 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, - 0x20, 0x20, 0x21, 0x12, 0x1c, 0xf0, 0x10, 0x18, 0x08, 0x08, 0, 0, - 0x01, 0x01, 0x02, 0x04, 0x08, 0x30, 0xc0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0x80, 0xc0, 0xc0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x20, 0x10, - 0x08, 0x04, 0x02, 0x81, 0x01, 0, 0, 0x40, 0x80, 0, 0x80, 0, - 0, 0, 0, 0x18, 0x24, 0x24, 0x24, 0x18, 0, 0xc0, 0x30, 0x0e, - 0x80, 0x40, 0x40, 0x80, 0, 0, 0, 0, 0xc0, 0x20, 0x20, 0x20, - 0x40, 0x40, 0x40, 0x20, 0x18, 0, 0, 0, 0x01, 0x82, 0x44, 0x78, - 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x02, 0x02, - 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x81, 0x81, 0x81, 0x82, 0x02, 0x02, 0x02, 0x04, - 0x04, 0x08, 0x0b, 0x10, 0x10, 0x20, 0x60, 0x20, 0x30, 0x18, 0x0c, 0x04, - 0x03, 0x01, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0xfe, 0x01, 0, 0, 0, 0x08, 0x88, 0x85, - 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0xc4, 0, 0, 0, - 0, 0, 0, 0x18, 0x07, 0, 0, 0, 0x03, 0x04, 0x04, 0x04, - 0x03, 0, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0xc0, - 0x20, 0x10, 0x0c, 0x02, 0x01, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x60, 0x30, 0x10, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x10, 0x30, 0x40, 0x80, 0, 0x0e, 0x03, 0x01, - 0x01, 0, 0xe0, 0x30, 0x19, 0x07, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x3f, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x03, 0x04, 0x08, 0x10, 0x20, 0x20, 0xc0, 0, 0, 0, 0x01, - 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x10, - 0x10, 0x10, 0x10, 0x08, 0x08, 0x34, 0xcf, 0, 0, 0, 0, 0, - 0x3e, 0x63, 0xc1, 0xc1, 0xbe, 0x80, 0, 0, 0, 0, 0, 0, - 0x80, 0, 0, 0x1f, 0x20, 0x40, 0xc0, 0x8e, 0x11, 0x19, 0x0e, 0x03, - 0x86, 0x84, 0xc6, 0x63, 0, 0, 0, 0, 0, 0, 0x01, 0x06, - 0, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0xc0, 0x20, 0x18, 0x07, 0x01, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x03, 0, 0x02, 0x02, 0x01, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0x03, 0, - 0, 0, 0x01, 0x03, 0, 0, 0, 0, 0x03, 0, 0, 0, - 0, 0, 0, 0, 0x01, 0x01, 0x01, 0x01, 0x01, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0}, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, + 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, + 0x08, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x50, 0x40, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0xd0, + 0x10, 0x11, 0x21, 0x20, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x20, 0x21, 0x12, 0x1c, 0xf0, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00, + 0x01, 0x01, 0x02, 0x04, 0x08, 0x30, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x81, 0x01, 0x00, 0x00, 0x40, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0x18, 0x00, 0xc0, 0x30, 0x0e, + 0x80, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x20, 0x20, + 0x40, 0x40, 0x40, 0x20, 0x18, 0x00, 0x00, 0x00, 0x01, 0x82, 0x44, 0x78, + 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x81, 0x81, 0x81, 0x82, 0x02, 0x02, 0x02, 0x04, + 0x04, 0x08, 0x0b, 0x10, 0x10, 0x20, 0x60, 0x20, 0x30, 0x18, 0x0c, 0x04, + 0x03, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x08, 0x88, 0x85, + 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0xc4, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x07, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0x20, 0x10, 0x0c, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x30, 0x10, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x10, 0x30, 0x40, 0x80, 0x00, 0x0e, 0x03, 0x01, + 0x01, 0x00, 0xe0, 0x30, 0x19, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x08, 0x10, 0x20, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x10, + 0x10, 0x10, 0x10, 0x08, 0x08, 0x34, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x63, 0xc1, 0xc1, 0xbe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x1f, 0x20, 0x40, 0xc0, 0x8e, 0x11, 0x19, 0x0e, 0x03, + 0x86, 0x84, 0xc6, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x20, 0x18, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x18, 0x14, 0x14, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x60, 0x80, 0x80, 0x80, 0, 0, - 0, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0x50, 0x90, 0x11, 0x11, - 0x20, 0x20, 0x40, 0xc0, 0, 0, 0, 0, 0, 0x10, 0x10, 0x10, - 0x09, 0x0e, 0x78, 0x88, 0x04, 0x04, 0x04, 0, 0, 0, 0, 0, - 0x01, 0x02, 0x0c, 0xf0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x20, 0x10, - 0x08, 0x08, 0x04, 0x82, 0x01, 0x01, 0, 0x40, 0x80, 0, 0x80, 0x80, - 0, 0, 0, 0x30, 0x48, 0x48, 0x48, 0x30, 0, 0x80, 0x60, 0x18, - 0x04, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, - 0x80, 0, 0, 0x80, 0xe0, 0x01, 0x01, 0x02, 0x06, 0x08, 0x10, 0xe0, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x60, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0x50, 0x90, 0x11, 0x11, + 0x20, 0x20, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, + 0x09, 0x0e, 0x78, 0x88, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x0c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x20, 0x10, + 0x08, 0x08, 0x04, 0x82, 0x01, 0x01, 0x00, 0x40, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x30, 0x00, 0x80, 0x60, 0x18, + 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x80, 0xe0, 0x01, 0x01, 0x02, 0x06, 0x08, 0x10, 0xe0, 0x10, 0x20, 0x20, 0x20, 0x20, 0x21, 0x16, 0x18, 0x30, 0x50, 0x08, 0x08, - 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - 0, 0, 0, 0, 0, 0, 0x80, 0x40, 0x30, 0x0c, 0x02, 0x01, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0x08, 0x8c, 0xc5, - 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0x84, 0x04, 0, 0, - 0, 0, 0, 0x30, 0x0e, 0x01, 0, 0, 0x07, 0x09, 0x08, 0x09, - 0x06, 0, 0, 0, 0x07, 0, 0, 0, 0x01, 0x01, 0x01, 0x01, - 0, 0, 0, 0, 0, 0x80, 0x70, 0x0f, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0x04, 0x02, - 0x02, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0x03, 0x04, 0x08, 0x10, 0x20, 0xe0, 0, 0, 0, 0, 0x81, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x30, 0x0c, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x8c, 0xc5, + 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0x84, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x07, 0x09, 0x08, 0x09, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x70, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x04, 0x02, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x04, 0x08, 0x10, 0x20, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x0a, 0x06, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x18, 0x60, 0x80, 0, 0, - 0, 0, 0x80, 0x78, 0x07, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x03, 0, 0x02, 0x02, 0x01, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0, 0, 0x03, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x18, 0x60, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }, { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0x80, 0x40, 0x40, 0x20, 0x10, - 0x10, 0x08, 0x04, 0, 0x02, 0x01, 0x01, 0x01, 0, 0, 0, 0, - 0, 0x80, 0x80, 0xe0, 0x80, 0xe0, 0, 0, 0, 0, 0, 0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x20, 0x10, + 0x10, 0x08, 0x04, 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x80, 0xe0, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x22, 0x21, 0x21, 0x23, 0x2c, 0x30, 0x70, 0x51, 0x91, 0x10, 0x10, - 0x10, 0x20, 0x60, 0x80, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x04, - 0x07, 0x3c, 0xc4, 0x04, 0x04, 0x02, 0x02, 0, 0, 0, 0, 0, - 0x01, 0x07, 0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0xf0, 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x06, 0x18, 0x20, 0xc0, 0, 0, 0, 0x05, 0x06, 0x03, - 0x01, 0x07, 0x01, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, + 0x10, 0x20, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x04, + 0x07, 0x3c, 0xc4, 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x18, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x05, 0x06, 0x03, + 0x01, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x20, 0x20, 0x20, 0x21, 0x16, 0x1c, 0x38, 0x68, 0x04, 0x07, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0x80, 0xc0, 0x20, 0x30, 0x0c, 0x07, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0f, 0x30, 0x40, - 0x40, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x01, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x7e, 0x02, 0x01, - 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x30, 0x0c, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x30, 0x40, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7e, 0x02, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, - 0x01, 0x01, 0, 0, 0, 0x01, 0x03, 0x04, 0x18, 0x30, 0x40, 0x80, - 0, 0, 0, 0xc0, 0x3f, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0x01, 0x03, 0, 0x02, 0x01, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x18, 0x30, 0x40, 0x80, + 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }}; static const char PROGMEM tap_sys[][520] = { - {0x01, 0x80, 0x60, 0x10, 0x48, 0x08, 0x24, 0x04, 0x14, 0x84, 0x14, 0x04, - 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0, 0x04, 0, 0x80, 0x60, 0x10, - 0x08, 0x08, 0x04, 0x44, 0x84, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x60, - 0x82, 0, 0, 0, 0, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, - 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0xc1, 0x81, 0x81, 0x81, - 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0, 0, 0, - 0x10, 0, 0, 0, 0, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, - 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x20, 0x40, 0x84, 0, 0, 0, 0, 0x04, 0, 0x1f, 0x60, 0x85, - 0x10, 0x40, 0, 0x80, 0x06, 0x07, 0, 0, 0, 0, 0x82, 0x60, - 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, - 0x93, 0x5c, 0x10, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0xc1, 0x02, 0x0c, 0x70, 0x80, 0, 0, - 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, 0x38, 0x06, 0x01, 0x80, - 0x70, 0x0c, 0x02, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc1, 0x02, 0x0c, - 0x70, 0x80, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, - 0x38, 0x06, 0x01, 0x80, 0xff, 0, 0, 0, 0, 0, 0, 0xf0, - 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0xc0, 0x30, 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0x03, - 0x0c, 0xf0, 0x04, 0, 0x80, 0x80, 0x88, 0x80, 0x81, 0x81, 0x02, 0x02, - 0x12, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0, 0x08, 0, 0, - 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, - 0x01, 0x01, 0, 0, 0x80, 0x80, 0, 0x01, 0, 0, 0, 0, - 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, 0xa0, 0x18, 0x07, 0x80, - 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, 0, 0, 0, 0, - 0, 0, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, - 0xa0, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, - 0xff, 0, 0, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, - 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x52, 0x92, 0x13, 0x12, 0x12, 0xf2, - 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, - 0x1f, 0x12, 0x99, 0x14, 0x12, 0x1f, 0, 0x04, 0, 0, 0x1f, 0x10, - 0x10, 0x10, 0x10, 0x1f, 0, 0, 0x40, 0, 0x1f, 0x10, 0x10, 0x10, - 0x10, 0x1f, 0, 0, 0, 0x40, 0x0d, 0x0d, 0, 0x0c, 0x0c, 0, - 0x01, 0x01, 0, 0, 0, 0x40, 0, 0, 0x1f, 0x20, 0x40, 0x40, - 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, - 0x42, 0x42, 0x42, 0x41, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0, 0x08, - 0, 0, 0, 0, 0, 0, 0x40, 0x01, 0x02, 0x04, 0x04, 0x08, - 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x44, - 0x02, 0x01, 0, 0, 0, 0, 0x20, 0}, + { + 0x01, 0x80, 0x60, 0x10, 0x48, 0x08, 0x24, 0x04, 0x14, 0x84, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0x00, 0x00, 0x04, 0x00, 0x80, 0x60, 0x10, + 0x08, 0x08, 0x04, 0x44, 0x84, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x60, + 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, + 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0xc1, 0x81, 0x81, 0x81, + 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1f, 0x60, 0x85, + 0x10, 0x40, 0x00, 0x80, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x93, 0x5c, 0x10, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x02, 0x0c, 0x70, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, 0x38, 0x06, 0x01, 0x80, + 0x70, 0x0c, 0x02, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc1, 0x02, 0x0c, + 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, + 0x38, 0x06, 0x01, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x30, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x0c, 0xf0, 0x04, 0x00, 0x80, 0x80, 0x88, 0x80, 0x81, 0x81, 0x02, 0x02, + 0x12, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x00, 0x08, 0x00, 0x00, + 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, + 0x01, 0x01, 0x00, 0x00, 0x80, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, 0xa0, 0x18, 0x07, 0x80, + 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, + 0xa0, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x52, 0x92, 0x13, 0x12, 0x12, 0xf2, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0x00, 0x00, + 0x1f, 0x12, 0x99, 0x14, 0x12, 0x1f, 0x00, 0x04, 0x00, 0x00, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x40, 0x00, 0x1f, 0x10, 0x10, 0x10, + 0x10, 0x1f, 0x00, 0x00, 0x00, 0x40, 0x0d, 0x0d, 0x00, 0x0c, 0x0c, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, + 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, + 0x42, 0x42, 0x42, 0x41, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x44, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + }, { 0x04, 0x80, 0x60, 0x10, 0x48, 0x08, 0xa4, 0x04, 0x14, 0x04, 0x14, 0x04, - 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0x04, 0, 0, 0x80, 0x60, 0x10, + 0x28, 0x88, 0x10, 0x60, 0x80, 0x00, 0x04, 0x00, 0x00, 0x80, 0x60, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0xc4, 0x04, 0x08, 0x08, 0x10, 0x60, - 0x80, 0x02, 0, 0, 0x04, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xfc, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0x41, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0, 0, 0x40, - 0, 0, 0x02, 0, 0, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x84, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x20, 0x42, 0x80, 0, 0, 0x10, 0, 0, 0, 0x1f, 0x60, 0x85, - 0x10, 0x40, 0, 0x81, 0x06, 0x06, 0, 0, 0, 0, 0x82, 0x60, - 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, - 0x50, 0x9e, 0x11, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0xc0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, 0x38, 0x06, 0x01, 0, - 0, 0, 0, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, - 0x38, 0x06, 0x01, 0, 0xff, 0, 0, 0, 0, 0, 0, 0xf0, - 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x1e, - 0xe0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, - 0x0c, 0xf0, 0, 0, 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, - 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x88, 0, 0, 0, 0, + 0x20, 0x42, 0x80, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x85, + 0x10, 0x40, 0x00, 0x81, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x50, 0x9e, 0x11, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, 0x38, 0x06, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0xc0, + 0x38, 0x06, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1e, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x0c, 0xf0, 0x00, 0x00, 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, + 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x88, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x88, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, - 0x01, 0x81, 0x80, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, + 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0x80, - 0x40, 0x30, 0x0e, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, - 0x20, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0, 0, 0, 0, - 0xff, 0, 0x02, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x40, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, + 0x20, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x60, 0x90, 0x08, 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x12, 0x92, 0x53, 0x92, 0x12, 0xf2, - 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, - 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0, 0x80, 0, 0, 0x1f, 0x10, - 0x10, 0x10, 0x10, 0x1f, 0, 0, 0, 0, 0x1f, 0x1f, 0x1f, 0x1f, - 0x1f, 0x1f, 0, 0, 0, 0x40, 0x01, 0x01, 0x80, 0x0d, 0x0d, 0, - 0x0c, 0x0c, 0, 0, 0, 0, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0x00, 0x00, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x80, 0x00, 0x00, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x40, 0x01, 0x01, 0x80, 0x0d, 0x0d, 0x00, + 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0, 0, - 0, 0, 0x08, 0, 0, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x04, - 0x02, 0x01, 0, 0, 0x04, 0, 0, 0, + 0x02, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, }, { - 0, 0x80, 0x60, 0x14, 0x48, 0x08, 0x24, 0x04, 0x14, 0x04, 0x14, 0x04, - 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0, 0x08, 0, 0x80, 0x60, 0x10, + 0x00, 0x80, 0x60, 0x14, 0x48, 0x08, 0x24, 0x04, 0x14, 0x04, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0x00, 0x00, 0x08, 0x00, 0x80, 0x60, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x88, 0x10, 0x60, - 0x80, 0, 0, 0x04, 0, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x80, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x21, 0x21, 0x41, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x22, 0xfc, 0, 0, 0x10, - 0, 0, 0, 0, 0x02, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x22, 0xfc, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, - 0x20, 0x40, 0x80, 0, 0x04, 0, 0, 0, 0, 0x1f, 0x60, 0x85, - 0x10, 0x44, 0x04, 0x84, 0x06, 0x06, 0, 0, 0, 0, 0x82, 0x60, - 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, - 0x10, 0x18, 0x14, 0x22, 0x21, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x03, 0x1c, 0xe0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0, - 0, 0, 0, 0, 0xff, 0, 0, 0, 0x08, 0, 0, 0xf0, - 0x0c, 0x03, 0, 0, 0, 0, 0x01, 0x06, 0x08, 0x30, 0x40, 0x80, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, - 0x0c, 0xf0, 0, 0, 0x80, 0x80, 0x80, 0x90, 0x81, 0x81, 0x02, 0x12, - 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0, 0, 0x08, 0, + 0x20, 0x40, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x85, + 0x10, 0x44, 0x04, 0x84, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x82, 0x60, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x10, 0x18, 0x14, 0x22, 0x21, 0x40, 0x80, 0x60, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xf0, + 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x30, 0x40, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x0c, 0xf0, 0x00, 0x00, 0x80, 0x80, 0x80, 0x90, 0x81, 0x81, 0x02, 0x12, + 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x00, 0x00, 0x08, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0a, - 0x01, 0x81, 0x80, 0, 0x80, 0x80, 0x08, 0, 0, 0, 0x01, 0, - 0xff, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0x07, 0x18, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, - 0x20, 0x18, 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0xff, 0, 0, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x01, 0x81, 0x80, 0x00, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xff, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, + 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x60, 0x90, 0x08, 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x12, 0x13, 0x12, 0x92, 0x52, 0xf2, - 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, - 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0, 0, 0x80, 0, 0x1f, 0x10, - 0x16, 0x16, 0x10, 0x1f, 0, 0, 0, 0, 0x1f, 0x10, 0x10, 0x10, - 0x50, 0x1f, 0, 0, 0, 0, 0x0c, 0x0c, 0, 0x01, 0x01, 0, - 0x0d, 0x0d, 0, 0, 0x40, 0, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0x00, 0x00, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x80, 0x00, 0x1f, 0x10, + 0x16, 0x16, 0x10, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, + 0x50, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x01, 0x01, 0x00, + 0x0d, 0x0d, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, - 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0x80, 0, - 0, 0, 0, 0, 0x08, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x04, - 0x02, 0x01, 0x10, 0, 0, 0, 0, 0, + 0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}; diff --git a/jack/oledfont.h b/jack/oledfont.h index 209f143..575829b 100644 --- a/jack/oledfont.h +++ b/jack/oledfont.h @@ -1,4 +1,4 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "progmem.h" diff --git a/jack/picosdk_math.mk b/jack/picosdk_math.mk new file mode 100644 index 0000000..82f18a3 --- /dev/null +++ b/jack/picosdk_math.mk @@ -0,0 +1,153 @@ +OPT_DEFS += -DPICO_DOUBLE_IN_RAM=1 \ + -DPICO_FLOAT_IN_RAM=1 + +# bit +SRC += $(PICOSDKROOT)/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S +EXTRALDFLAGS += \ + -Wl,--wrap=__clzsi2 \ + -Wl,--wrap=__clzdi2 \ + -Wl,--wrap=__ctzsi2 \ + -Wl,--wrap=__ctzdi2 \ + -Wl,--wrap=__popcountsi2 \ + -Wl,--wrap=__popcountdi2 + +# double +VPATH += $(PICOSDKROOT)/src/rp2_common/pico_double/include +SRC += \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_aeabi.S \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_init_rom.c \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_math.c \ + $(PICOSDKROOT)/src/rp2_common/pico_double/double_v1_rom_shim.S +EXTRALDFLAGS += \ + -Wl,--wrap=__aeabi_dadd \ + -Wl,--wrap=__aeabi_ddiv \ + -Wl,--wrap=__aeabi_dmul \ + -Wl,--wrap=__aeabi_drsub \ + -Wl,--wrap=__aeabi_dsub \ + -Wl,--wrap=__aeabi_cdcmpeq \ + -Wl,--wrap=__aeabi_cdrcmple \ + -Wl,--wrap=__aeabi_cdcmple \ + -Wl,--wrap=__aeabi_dcmpeq \ + -Wl,--wrap=__aeabi_dcmplt \ + -Wl,--wrap=__aeabi_dcmple \ + -Wl,--wrap=__aeabi_dcmpge \ + -Wl,--wrap=__aeabi_dcmpgt \ + -Wl,--wrap=__aeabi_dcmpun \ + -Wl,--wrap=__aeabi_i2d \ + -Wl,--wrap=__aeabi_l2d \ + -Wl,--wrap=__aeabi_ui2d \ + -Wl,--wrap=__aeabi_ul2d \ + -Wl,--wrap=__aeabi_d2iz \ + -Wl,--wrap=__aeabi_d2lz \ + -Wl,--wrap=__aeabi_d2uiz \ + -Wl,--wrap=__aeabi_d2ulz \ + -Wl,--wrap=__aeabi_d2f \ + -Wl,--wrap=sqrt \ + -Wl,--wrap=cos \ + -Wl,--wrap=sin \ + -Wl,--wrap=tan \ + -Wl,--wrap=atan2 \ + -Wl,--wrap=exp \ + -Wl,--wrap=log \ + -Wl,--wrap=ldexp \ + -Wl,--wrap=copysign \ + -Wl,--wrap=trunc \ + -Wl,--wrap=floor \ + -Wl,--wrap=ceil \ + -Wl,--wrap=round \ + -Wl,--wrap=sincos \ + -Wl,--wrap=asin \ + -Wl,--wrap=acos \ + -Wl,--wrap=atan \ + -Wl,--wrap=sinh \ + -Wl,--wrap=cosh \ + -Wl,--wrap=tanh \ + -Wl,--wrap=asinh \ + -Wl,--wrap=acosh \ + -Wl,--wrap=atanh \ + -Wl,--wrap=exp2 \ + -Wl,--wrap=log2 \ + -Wl,--wrap=exp10 \ + -Wl,--wrap=log10 \ + -Wl,--wrap=pow \ + -Wl,--wrap=powint \ + -Wl,--wrap=hypot \ + -Wl,--wrap=cbrt \ + -Wl,--wrap=fmod \ + -Wl,--wrap=drem \ + -Wl,--wrap=remainder \ + -Wl,--wrap=remquo \ + -Wl,--wrap=expm1 \ + -Wl,--wrap=log1p \ + -Wl,--wrap=fma + +# float +VPATH += $(PICOSDKROOT)/src/rp2_common/pico_float/include +SRC += \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_aeabi.S \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_init_rom.c \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_math.c \ + $(PICOSDKROOT)/src/rp2_common/pico_float/float_v1_rom_shim.S + +EXTRALDFLAGS += \ + -Wl,--wrap=__aeabi_fadd \ + -Wl,--wrap=__aeabi_fdiv \ + -Wl,--wrap=__aeabi_fmul \ + -Wl,--wrap=__aeabi_frsub \ + -Wl,--wrap=__aeabi_fsub \ + -Wl,--wrap=__aeabi_cfcmpeq \ + -Wl,--wrap=__aeabi_cfrcmple \ + -Wl,--wrap=__aeabi_cfcmple \ + -Wl,--wrap=__aeabi_fcmpeq \ + -Wl,--wrap=__aeabi_fcmplt \ + -Wl,--wrap=__aeabi_fcmple \ + -Wl,--wrap=__aeabi_fcmpge \ + -Wl,--wrap=__aeabi_fcmpgt \ + -Wl,--wrap=__aeabi_fcmpun \ + -Wl,--wrap=__aeabi_i2f \ + -Wl,--wrap=__aeabi_l2f \ + -Wl,--wrap=__aeabi_ui2f \ + -Wl,--wrap=__aeabi_ul2f \ + -Wl,--wrap=__aeabi_f2iz \ + -Wl,--wrap=__aeabi_f2lz \ + -Wl,--wrap=__aeabi_f2uiz \ + -Wl,--wrap=__aeabi_f2ulz \ + -Wl,--wrap=__aeabi_f2d \ + -Wl,--wrap=sqrtf \ + -Wl,--wrap=cosf \ + -Wl,--wrap=sinf \ + -Wl,--wrap=tanf \ + -Wl,--wrap=atan2f \ + -Wl,--wrap=expf \ + -Wl,--wrap=logf \ + -Wl,--wrap=ldexpf \ + -Wl,--wrap=copysignf \ + -Wl,--wrap=truncf \ + -Wl,--wrap=floorf \ + -Wl,--wrap=ceilf \ + -Wl,--wrap=roundf \ + -Wl,--wrap=sincosf \ + -Wl,--wrap=asinf \ + -Wl,--wrap=acosf \ + -Wl,--wrap=atanf \ + -Wl,--wrap=sinhf \ + -Wl,--wrap=coshf \ + -Wl,--wrap=tanhf \ + -Wl,--wrap=asinhf \ + -Wl,--wrap=acoshf \ + -Wl,--wrap=atanhf \ + -Wl,--wrap=exp2f \ + -Wl,--wrap=log2f \ + -Wl,--wrap=exp10f \ + -Wl,--wrap=log10f \ + -Wl,--wrap=powf \ + -Wl,--wrap=powintf \ + -Wl,--wrap=hypotf \ + -Wl,--wrap=cbrtf \ + -Wl,--wrap=fmodf \ + -Wl,--wrap=dremf \ + -Wl,--wrap=remainderf \ + -Wl,--wrap=remquof \ + -Wl,--wrap=expm1f \ + -Wl,--wrap=log1pf \ + -Wl,--wrap=fmaf diff --git a/jack/post_rules.mk b/jack/post_rules.mk new file mode 100644 index 0000000..fb10049 --- /dev/null +++ b/jack/post_rules.mk @@ -0,0 +1,14 @@ +ifeq ($(MCU_SERIES), RP2040) + include picosdk_math.mk +endif + +ifeq ($(strip $(RP2040_MATH_IN_ROM)), yes) + OPT_DEFS += -DRP2040_MATH_IN_ROM + MCU_LDSCRIPT = RP2040_FLASH_TIMECRIT_ROM_MATH +endif + +ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes) + OPT_DEFS += -DMOUSE_JIGGLE_ENABLE + MOUSEKEY_ENABLE = yes + DEFERRED_EXEC_ENABLE = yes +endif diff --git a/jack/raw.py b/jack/raw.py deleted file mode 100644 index 994a92c..0000000 --- a/jack/raw.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2024 [email protected] -# SPDX-License-Identifier: GPL-2.0-or-later -import hid -import sys -import psutil -import math -import time -import datetime - -vendor_id = 0x6A73 -product_id = 0x6B62 -usage_page = 0xFF60 -usage = 0x61 - - -def get_raw_hid_interface(): - device_interfaces = hid.enumerate(vendor_id, product_id) - raw_hid_interfaces = [ - i - for i in device_interfaces - if i["usage_page"] == usage_page and i["usage"] == usage - ] - if len(raw_hid_interfaces) == 0: - return None - interface = hid.Device(path=raw_hid_interfaces[0]["path"]) - return interface - - -def send_packet(data): - interface = get_raw_hid_interface() - if interface is None: - print("no device found") - sys.exit(1) - request_data = [0x00] * 32 - request_data[1 : len(data) + 1] = data - request_packet = bytes(request_data) - try: - interface.write(request_packet) - finally: - interface.close() - - -if __name__ == "__main__": - while True: - time.sleep(30) - cpu_temp = psutil.sensors_temperatures()["gigabyte_wmi"][2] - cur_hour = datetime.datetime.now().strftime("%H") - cur_minute = datetime.datetime.now().strftime("%M") - send_packet([math.trunc(cpu_temp.current), int(cur_hour), int(cur_minute)]) diff --git a/jack/rgb_matrix_user.inc b/jack/rgb_matrix_user.inc new file mode 100644 index 0000000..2ff9e95 --- /dev/null +++ b/jack/rgb_matrix_user.inc @@ -0,0 +1,835 @@ +// Copyright 2025 Google LLC +// SPDX-License-Identifier: Apache-2.0 +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_GRADIENT_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_GRADIENT) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_FLOW_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_FLOW) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_RIPPLE_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_RIPPLE) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_SPARKLE) +#endif +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_VORTEX_ENABLE) +RGB_MATRIX_EFFECT(PALETTEFX_VORTEX) +#endif +#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) && \ + (defined(PALETTEFX_ENABLE_ALL_EFFECTS) || \ + defined(PALETTEFX_REACTIVE_ENABLE)) +RGB_MATRIX_EFFECT(PALETTEFX_REACTIVE) +#endif + +#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +/////////////////////////////////////////////////////////////////////////////// +// PaletteFx function definitions +/////////////////////////////////////////////////////////////////////////////// + +/** Gets the selected palette. */ +static const uint16_t *palettefx_get_palette_data(void); + +/** + * @brief Computes the interpolated HSV palette color at 0 <= x < 256. + * + * Looks up and linearly interpolates `palette` at 0 <= x < 256. The color + * saturation and value are scaled according to rgb_matrix_config. + * + * @note `palette` must point to a PROGMEM address. + * + * @param palette Pointer to PROGMEM of a size-16 table of HSV16 colors. + * @param x Palette lookup position, a value in 0-255. + * @return HSV color. + */ +static hsv_t palettefx_interp_color(const uint16_t *palette, uint8_t x); + +/** Gets the color data for the selected palette. */ +static const uint16_t *palettefx_get_palette_data(void); + +/** + * @brief Compute a scaled 16-bit time that wraps smoothly. + * + * Computes `timer` scaled by `scale`, returning the result as a uint16. + * Generally, the scaled time would have a discontinuity every ~65 seconds when + * `timer` wraps 16-bit range. This is corrected for to wrap smoothly mod 2^16. + * + * @param timer A 32-bit timer. + * @param scale Scale value in 0-255. + * @return Scaled time. + */ +inline static uint16_t palettefx_scaled_time(uint32_t timer, uint8_t scale); + +/////////////////////////////////////////////////////////////////////////////// +// PaletteFx effects +/////////////////////////////////////////////////////////////////////////////// + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_GRADIENT_ENABLE) +// "Gradient" static effect. This is essentially a palette-colored version of +// RGB_MATRIX_GRADIENT_UP_DOWN. A vertically-sloping gradient is made, with the +// highest color on the top keys of keyboard and the lowest color at the bottom. +static bool PALETTEFX_GRADIENT(effect_params_t *params) { + // On first call, compute and cache the slope of the gradient. + static uint8_t gradient_slope = 0; + if (!gradient_slope) { + uint8_t y_max = 64; // To avoid overflow below, x_max must be at least 64. + for (uint8_t i = 0; i < RGB_MATRIX_LED_COUNT; ++i) { + if (g_led_config.point[i].y > y_max) { + y_max = g_led_config.point[i].y; + } + } + // Compute the quotient `255 / y_max` with 6 fractional bits and rounding. + gradient_slope = (64 * 255 + y_max / 2) / y_max; + } + + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const uint8_t y = g_led_config.point[i].y; + const uint8_t value = 255 - (((uint16_t)y * (uint16_t)gradient_slope) >> 6); + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_FLOW_ENABLE) +// "Flow" animated effect. Draws moving wave patterns mimicking the appearance +// of flowing liquid. For interesting variety of patterns, space coordinates are +// slowly rotated and a function of several sine waves is evaluated. +static bool PALETTEFX_FLOW(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint16_t time = + palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 8); + // Compute rotation coefficients with 7 fractional bits. + const int8_t rot_c = cos8(time / 4) - 128; + const int8_t rot_s = sin8(time / 4) - 128; + const uint8_t omega = 32 + sin8(time) / 4; + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const uint8_t x = g_led_config.point[i].x; + const uint8_t y = g_led_config.point[i].y; + + // Rotate (x, y) by the 2x2 rotation matrix described by rot_c, rot_s. + const uint8_t x1 = (uint8_t)((((int16_t)rot_c) * ((int16_t)x)) / 128) - + (uint8_t)((((int16_t)rot_s) * ((int16_t)y)) / 128); + const uint8_t y1 = (uint8_t)((((int16_t)rot_s) * ((int16_t)x)) / 128) + + (uint8_t)((((int16_t)rot_c) * ((int16_t)y)) / 128); + + uint8_t value = scale8(sin8(x1 - 2 * time), omega) + y1 + time / 4; + // Evaluate `sawtooth(value)`. + value = 2 * ((value <= 127) ? value : (255 - value)); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_RIPPLE_ENABLE) +// "Ripple" animated effect. Draws circular rings emanating from random points, +// simulating water drops falling in a quiet pool. +static bool PALETTEFX_RIPPLE(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + + // Each instance of this struct represents one water drop. For efficiency, at + // most 3 drops are active at any time. + static struct { + uint16_t time; + uint8_t x; + uint8_t y; + uint8_t amplitude; + uint8_t scale; + uint8_t phase; + } drops[3]; + static uint32_t drop_timer = 0; + static uint8_t drops_tail = 0; + + if (params->iter == 0) { + if (params->init) { + for (uint8_t j = 0; j < 3; ++j) { + drops[j].amplitude = 0; + } + drop_timer = g_rgb_timer; + } + + if (drops[drops_tail].amplitude == 0 && + timer_expired32(g_rgb_timer, drop_timer)) { + // Spawn a new drop, located at a random LED. + const uint8_t i = random8_max(RGB_MATRIX_LED_COUNT); + drops[drops_tail].time = (uint16_t)g_rgb_timer; + drops[drops_tail].x = g_led_config.point[i].x; + drops[drops_tail].y = g_led_config.point[i].y; + drops[drops_tail].amplitude = 1; + ++drops_tail; + if (drops_tail == 3) { + drops_tail = 0; + } + drop_timer = g_rgb_timer + 1000; + } + + uint8_t amplitude(uint8_t t) { // Drop amplitude as a function of time. + if (t <= 55) { + return (t < 32) ? (3 + 5 * t) : 192; + } else { + t = (((uint16_t)(255 - t)) * UINT16_C(123)) >> 7; + return scale8(t, t); + } + } + + for (uint8_t j = 0; j < 3; ++j) { + if (drops[j].amplitude == 0) { + continue; + } + const uint16_t tick = scale16by8(g_rgb_timer - drops[j].time, + 1 + rgb_matrix_config.speed / 4); + if (tick < 4 * 255) { + const uint8_t t = (uint8_t)(tick / 4); + drops[j].amplitude = amplitude(t); + drops[j].scale = 255 / (1 + t / 2); + drops[j].phase = (uint8_t)tick; + } else { + drops[j].amplitude = 0; // Animation for this drop is complete. + } + } + } + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + int16_t value = 128; + + for (uint8_t j = 0; j < 3; ++j) { + if (drops[j].amplitude == 0) { + continue; + } + + const uint8_t x = abs8((g_led_config.point[i].x - drops[j].x) / 2); + const uint8_t y = abs8((g_led_config.point[i].y - drops[j].y) / 2); + const uint8_t r = sqrt16(x * x + y * y); + const uint16_t r_scaled = (uint16_t)r * (uint16_t)drops[j].scale; + + if (r_scaled < 255) { + // The drop is made from a radial sine wave modulated by a smooth bump + // to localize its spatial extent. + const uint8_t bump = scale8(ease8InOutApprox(255 - (uint8_t)r_scaled), + drops[j].amplitude); + const int8_t wave = (int16_t)cos8(8 * r - drops[j].phase) - 128; + value += ((int16_t)wave * (int16_t)bump) / 128; + } + } + + // Clip `value` to 0-255 range. + if (value < 0) { + value = 0; + } + if (value > 255) { + value = 255; + } + rgb_t rgb = + rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, (uint8_t)value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE) +// "Sparkle" effect. Each LED is animated by a sine wave with pseudorandom +// phase, so that the matrix "sparkles." All the LED sines are modulated by a +// global amplitude factor, which varies by a slower sine wave, so that the +// matrix as a whole periodically brightens and dims. +static bool PALETTEFX_SPARKLE(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint8_t time = + palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 8); + const uint8_t amplitude = 128 + sin8(time) / 2; + uint16_t rand_state = 1 + params->iter; + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + // Multiplicative congruential generator for a random phase for each LED. + rand_state *= UINT16_C(36563); + const uint8_t phase = (uint8_t)(rand_state >> 8); + + const uint8_t value = scale8(sin8(2 * time + phase), amplitude); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(PALETTEFX_ENABLE_ALL_EFFECTS) || defined(PALETTEFX_SPARKLE_ENABLE) +// "Vortex" animated effect. LEDs are animated according to a polar function +// with the appearance of a spinning vortex centered on k_rgb_matrix_center. +static bool PALETTEFX_VORTEX(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint16_t time = + palettefx_scaled_time(g_rgb_timer, 1 + rgb_matrix_config.speed / 4); + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + const int16_t x = g_led_config.point[i].x - k_rgb_matrix_center.x; + const int16_t y = g_led_config.point[i].y - k_rgb_matrix_center.y; + uint8_t value = sin8(atan2_8(y, x) + time - sqrt16(x * x + y * y) / 2); + + rgb_t rgb = rgb_matrix_hsv_to_rgb(palettefx_interp_color(palette, value)); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) && \ + (defined(PALETTEFX_ENABLE_ALL_EFFECTS) || \ + defined(PALETTEFX_REACTIVE_ENABLE)) +// Reactive animated effect. This effect is "reactive," it responds to key +// presses. For each key press, LEDs near the key change momentarily. +static bool PALETTEFX_REACTIVE(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + const uint16_t *palette = palettefx_get_palette_data(); + const uint8_t count = g_last_hit_tracker.count; + + uint8_t amplitude(uint8_t t) { // Bump amplitude as a function of time. + if (t <= 55) { + return (t < 32) ? (4 + 8 * t) : 255; + } else { + t = (((uint16_t)(255 - t)) * UINT16_C(164)) >> 7; + return scale8(t, t); + } + } + + uint8_t hit_amplitude[LED_HITS_TO_REMEMBER] = {0}; + for (uint8_t j = 0; j < count; ++j) { + const uint16_t tick = + scale16by8(g_last_hit_tracker.tick[j], 1 + rgb_matrix_config.speed / 4); + if (tick <= 255) { + hit_amplitude[j] = amplitude((uint8_t)tick); + } + } + + for (uint8_t i = led_min; i < led_max; ++i) { + RGB_MATRIX_TEST_LED_FLAGS(); + uint8_t value = 0; + + for (uint8_t j = 0; j < count; ++j) { + if (hit_amplitude[j] == 0) { + continue; + } + + uint8_t dx = + abs8((g_led_config.point[i].x - g_last_hit_tracker.x[j]) / 2); + uint8_t dy = + abs8((g_led_config.point[i].y - g_last_hit_tracker.y[j]) / 2); + if (dx < 21 && dy < 21) { + const uint16_t dist_sqr = dx * dx + dy * dy; + if (dist_sqr < 21 * 21) { // Accumulate a radial bump for each hit. + const uint8_t dist = sqrt16(dist_sqr); + value = qadd8(value, scale8(255 - 12 * dist, hit_amplitude[j])); + // Early loop exit where the value has saturated. + if (value == 255) { + break; + } + } + } + } + + hsv_t hsv = palettefx_interp_color(palette, value); + if (value < 32) { // Make the background dark regardless of palette. + hsv.v = scale8(hsv.v, 64 + 6 * value); + } + + const rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv); + rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b); + } + return rgb_matrix_check_finished_leds(led_max); +} +#endif + +/////////////////////////////////////////////////////////////////////////////// +// PaletteFx implementation +/////////////////////////////////////////////////////////////////////////////// + +/** + * @brief 16-bit HSV color. + * + * Represents a color with a 16-bit value in hue-saturation-value (HSV) space. + * Components are packed as: + * + * - Hue: lowest 8 bits. + * - Saturation: middle 4 bits. + * - Value: highest 4 bits. + */ +#define HSV16(h, s, v) ((((v) >> 4) << 12) | (((s) >> 4) << 8) | ((h) & 0xff)) + +/** Unpacks 16-bit HSV color to hsv_t. */ +static hsv_t unpack_hsv16(uint16_t hsv16) { + return (hsv_t){ + .h = (uint8_t)hsv16, + .s = ((uint8_t)(hsv16 >> 8) & 0x0f) * 17, + .v = ((uint8_t)(hsv16 >> 12) & 0x0f) * 17, + }; +} + +/** PaletteFx palette color data. */ +static const uint16_t palettefx_palettes[][16] PROGMEM = { +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_AFTERBURN_ENABLE) + // "Afterburn" palette. + { + HSV16(139, 255, 85), + HSV16(134, 255, 85), + HSV16(131, 255, 102), + HSV16(128, 255, 102), + HSV16(127, 187, 102), + HSV16(125, 119, 102), + HSV16(124, 51, 102), + HSV16(125, 0, 119), + HSV16(15, 17, 119), + HSV16(17, 51, 153), + HSV16(18, 102, 170), + HSV16(19, 153, 204), + HSV16(21, 187, 238), + HSV16(23, 238, 255), + HSV16(26, 255, 255), + HSV16(30, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_AMBER_ENABLE) + // "Amber" palette. + { + HSV16(5, 187, 170), + HSV16(15, 221, 170), + HSV16(22, 238, 187), + HSV16(23, 238, 187), + HSV16(25, 255, 204), + HSV16(27, 255, 221), + HSV16(29, 255, 238), + HSV16(29, 255, 255), + HSV16(28, 187, 255), + HSV16(30, 68, 255), + HSV16(32, 34, 255), + HSV16(32, 34, 255), + HSV16(26, 119, 255), + HSV16(24, 238, 255), + HSV16(21, 221, 255), + HSV16(16, 204, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_BADWOLF_ENABLE) + // "Bad Wolf" palette. Inspired by the Bad Wolf theme by Steve Losh, which + // is + // distributed under MIT/X11 license. + // https://github.com/sjl/badwolf/tree/61d75affa51d40213d671edc9c8ff83992d7fd6f + { + HSV16(14, 34, 0), + HSV16(245, 255, 255), + HSV16(245, 255, 255), + HSV16(245, 255, 255), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(24, 17, 136), + HSV16(28, 0, 255), + HSV16(24, 17, 136), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + HSV16(14, 34, 0), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_CARNIVAL_ENABLE) + // "Carnival" palette. + { + HSV16(132, 255, 85), + HSV16(121, 187, 85), + HSV16(108, 170, 102), + HSV16(90, 153, 119), + HSV16(70, 187, 136), + HSV16(57, 255, 153), + HSV16(50, 255, 187), + HSV16(44, 255, 204), + HSV16(39, 255, 238), + HSV16(32, 255, 255), + HSV16(27, 255, 255), + HSV16(22, 255, 255), + HSV16(18, 255, 255), + HSV16(8, 221, 238), + HSV16(252, 204, 238), + HSV16(241, 255, 221), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_CLASSIC_ENABLE) + // "Classic" palette. + { + HSV16(150, 255, 85), + HSV16(151, 238, 119), + HSV16(160, 136, 119), + HSV16(176, 102, 136), + HSV16(193, 85, 136), + HSV16(216, 85, 136), + HSV16(234, 102, 153), + HSV16(247, 119, 187), + HSV16(3, 153, 204), + HSV16(10, 204, 221), + HSV16(15, 255, 255), + HSV16(18, 255, 255), + HSV16(23, 255, 255), + HSV16(24, 204, 255), + HSV16(25, 136, 255), + HSV16(26, 85, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_DRACULA_ENABLE) + // "Dracula" palette. Inspired by the Dracula theme by Zeno Rocha, which is + // distributed under MIT license. + // https://github.com/dracula/dracula-theme/tree/ac4dc82dab2a3c35e5cac0cd80c97fbf4c2ca986 + { + HSV16(165, 153, 119), + HSV16(167, 153, 136), + HSV16(170, 170, 187), + HSV16(173, 170, 221), + HSV16(177, 170, 238), + HSV16(183, 170, 255), + HSV16(190, 170, 255), + HSV16(200, 153, 255), + HSV16(216, 153, 255), + HSV16(230, 170, 255), + HSV16(2, 153, 255), + HSV16(29, 153, 238), + HSV16(44, 255, 255), + HSV16(53, 238, 255), + HSV16(63, 238, 238), + HSV16(85, 238, 238), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_GROOVY_ENABLE) + // "Groovy" palette. Inspired by the Gruvbox theme by Pavel Pertsev, which + // is + // distributed under MIT/X11 license. + // https://github.com/morhetz/gruvbox/tree/f1ecde848f0cdba877acb0c740320568252cc482 + { + HSV16(26, 136, 187), + HSV16(23, 85, 102), + HSV16(21, 85, 85), + HSV16(21, 85, 85), + HSV16(21, 85, 85), + HSV16(17, 102, 102), + HSV16(5, 204, 255), + HSV16(4, 255, 255), + HSV16(4, 255, 255), + HSV16(7, 204, 255), + HSV16(23, 136, 187), + HSV16(26, 136, 187), + HSV16(28, 136, 187), + HSV16(50, 238, 238), + HSV16(54, 255, 238), + HSV16(54, 255, 238), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_NOTPINK_ENABLE) + // "Not Pink" palette. + { + HSV16(9, 255, 153), + HSV16(3, 221, 187), + HSV16(252, 204, 187), + HSV16(248, 204, 187), + HSV16(247, 187, 204), + HSV16(245, 187, 238), + HSV16(244, 170, 255), + HSV16(245, 153, 255), + HSV16(252, 102, 255), + HSV16(16, 68, 255), + HSV16(40, 34, 255), + HSV16(32, 51, 255), + HSV16(6, 85, 255), + HSV16(248, 136, 255), + HSV16(247, 187, 255), + HSV16(249, 221, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_PHOSPHOR_ENABLE) + // "Phosphor" palette. + { + HSV16(116, 102, 34), + HSV16(113, 170, 51), + HSV16(113, 255, 68), + HSV16(110, 255, 68), + HSV16(109, 255, 85), + HSV16(105, 255, 102), + HSV16(95, 238, 102), + HSV16(85, 238, 119), + HSV16(84, 255, 136), + HSV16(84, 255, 153), + HSV16(83, 255, 187), + HSV16(80, 238, 204), + HSV16(69, 221, 238), + HSV16(46, 204, 255), + HSV16(42, 153, 255), + HSV16(40, 102, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_POLARIZED_ENABLE) + // "Polarized" palette. Inspired by the Solarized theme by Ethan Schoonover, + // which is distributed under MIT license. + // https://github.com/altercation/solarized/tree/62f656a02f93c5190a8753159e34b385588d5ff3 + { + HSV16(139, 255, 68), + HSV16(139, 221, 85), + HSV16(139, 204, 102), + HSV16(138, 204, 119), + HSV16(137, 204, 136), + HSV16(137, 187, 170), + HSV16(137, 153, 187), + HSV16(132, 170, 187), + HSV16(126, 187, 238), + HSV16(124, 102, 255), + HSV16(124, 102, 255), + HSV16(124, 187, 255), + HSV16(130, 170, 204), + HSV16(137, 153, 187), + HSV16(137, 153, 204), + HSV16(137, 136, 221), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_ROSEGOLD_ENABLE) + // "Rose Gold" palette. + { + HSV16(246, 255, 204), + HSV16(250, 238, 221), + HSV16(253, 221, 238), + HSV16(1, 221, 255), + HSV16(6, 221, 255), + HSV16(12, 221, 255), + HSV16(18, 204, 255), + HSV16(22, 170, 255), + HSV16(20, 204, 255), + HSV16(17, 221, 255), + HSV16(12, 221, 255), + HSV16(7, 221, 255), + HSV16(255, 204, 255), + HSV16(248, 204, 255), + HSV16(241, 238, 255), + HSV16(235, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_SPORT_ENABLE) + // "Sport" palette. + { + HSV16(156, 102, 51), + HSV16(155, 102, 68), + HSV16(155, 102, 68), + HSV16(154, 102, 68), + HSV16(155, 102, 85), + HSV16(156, 85, 102), + HSV16(158, 68, 119), + HSV16(159, 51, 136), + HSV16(158, 17, 153), + HSV16(130, 0, 170), + HSV16(49, 17, 204), + HSV16(42, 51, 238), + HSV16(39, 85, 255), + HSV16(37, 119, 255), + HSV16(36, 170, 255), + HSV16(36, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_SYNTHWAVE_ENABLE) + // "Synthwave" palette. + { + HSV16(170, 221, 119), + HSV16(180, 221, 153), + HSV16(196, 238, 153), + HSV16(209, 255, 153), + HSV16(220, 255, 170), + HSV16(227, 255, 204), + HSV16(233, 255, 238), + HSV16(245, 204, 255), + HSV16(3, 170, 255), + HSV16(13, 187, 255), + HSV16(21, 204, 255), + HSV16(28, 221, 255), + HSV16(43, 255, 255), + HSV16(42, 255, 255), + HSV16(68, 68, 255), + HSV16(132, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_THERMAL_ENABLE) + // "Thermal" palette. + { + HSV16(7, 0, 17), + HSV16(8, 0, 17), + HSV16(12, 0, 34), + HSV16(13, 0, 51), + HSV16(15, 17, 51), + HSV16(16, 17, 68), + HSV16(20, 34, 85), + HSV16(95, 0, 102), + HSV16(126, 85, 119), + HSV16(112, 85, 153), + HSV16(54, 136, 187), + HSV16(39, 238, 221), + HSV16(33, 255, 255), + HSV16(25, 238, 255), + HSV16(13, 238, 255), + HSV16(5, 238, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || defined(PALETTEFX_VIRIDIS_ENABLE) + // "Viridis" palette. Inspired by the Viridis colormap by Stefan van der + // Walt + // and Nathaniel Smith, which is distributed under CC0 license. + // https://github.com/BIDS/colormap/blob/bc549477db0c12b54a5928087552ad2cf274980f/colormaps.py + { + HSV16(204, 221, 102), + HSV16(194, 187, 119), + HSV16(183, 153, 136), + HSV16(169, 119, 153), + HSV16(155, 153, 153), + HSV16(145, 170, 153), + HSV16(137, 187, 153), + HSV16(130, 204, 153), + HSV16(123, 221, 153), + HSV16(117, 221, 170), + HSV16(108, 187, 187), + HSV16(93, 153, 204), + HSV16(71, 170, 221), + HSV16(56, 221, 221), + HSV16(46, 255, 238), + HSV16(39, 255, 255), + }, +#endif +#if defined(PALETTEFX_ENABLE_ALL_PALETTES) || \ + defined(PALETTEFX_WATERMELON_ENABLE) + // "Watermelon" palette. + { + HSV16(67, 255, 102), + HSV16(55, 255, 153), + HSV16(47, 255, 204), + HSV16(48, 136, 238), + HSV16(48, 68, 255), + HSV16(45, 34, 255), + HSV16(39, 34, 255), + HSV16(17, 85, 255), + HSV16(8, 187, 255), + HSV16(1, 255, 255), + HSV16(2, 238, 255), + HSV16(2, 238, 255), + HSV16(0, 238, 255), + HSV16(253, 255, 238), + HSV16(254, 255, 238), + HSV16(255, 255, 221), + }, +#endif +#if __has_include("palettefx_user.inc") // Include user palettes if present. +#include "palettefx_user.inc" +#endif +}; +/** Number of palettes. User palettes, if any, are included in the count. */ +#define NUM_PALETTEFX_PALETTES \ + (sizeof(palettefx_palettes) / sizeof(*palettefx_palettes)) + +// Validate at compile time that `1 <= NUM_PALETTEFX_PALETTES <= 32`. The upper +// limit is due to using RGB Matrix's hue config to select palettes. +_Static_assert( + NUM_PALETTEFX_PALETTES >= 1, + "palettefx: No palettes are enabled. To fix: enable all built-in palettes " + "by adding in config.h `#define PALETTE_ENABLE_ALL_PALETTES`, or enable at " + "least one with `#define PALETTE_<name>_ENABLE`, or define at least one " + "custom palette in palettefx_user.inc."); +_Static_assert( + NUM_PALETTEFX_PALETTES <= 256 / RGB_MATRIX_HUE_STEP, + "palettefx: Too many palettes. Up to 32 (= 256 / RGB_MATRIX_HUE_STEP) " + "palettes are supported. Otherwise, some palettes would be unreachable."); + +/** Gets the index of the selected palette. */ +static uint8_t palettefx_get_palette(void) { + uint8_t i = + (rgb_matrix_get_hue() / RGB_MATRIX_HUE_STEP) % NUM_PALETTEFX_PALETTES; + + if (256 % (RGB_MATRIX_HUE_STEP * NUM_PALETTEFX_PALETTES) != 0) { + // Hue wraps mod 256. If NUM_PALETTEFX_PALETTES is not a power of 2, modulo + // 256 wraps would jump, and adjustment is needed to cycle as desired: + // + // * If the hue is a step or less from 256, assume it has wrapped down + // from 0 and the last palette is selected. + // * Otherwise, i = ((hue / step) % NUM_PALETTEFX_PALETTES) is used. If + // 256 - 2 * step <= hue < 256 - step, hue is set to (step * i). + hsv_t hsv = rgb_matrix_get_hsv(); + if (hsv.h >= 256 - 2 * RGB_MATRIX_HUE_STEP) { + if (hsv.h >= 256 - RGB_MATRIX_HUE_STEP) { + i = NUM_PALETTEFX_PALETTES - 1; + hsv.h = RGB_MATRIX_HUE_STEP * + ((256 / (RGB_MATRIX_HUE_STEP * NUM_PALETTEFX_PALETTES)) * + NUM_PALETTEFX_PALETTES - + 1); + } else { + i %= NUM_PALETTEFX_PALETTES; + hsv.h = RGB_MATRIX_HUE_STEP * i; + } + rgb_matrix_sethsv_noeeprom(hsv.h, hsv.s, hsv.v); + } + } + + return i; +} + +static const uint16_t *palettefx_get_palette_data(void) { + return palettefx_palettes[palettefx_get_palette()]; +} + +static hsv_t palettefx_interp_color(const uint16_t *palette, uint8_t x) { + // Clamp `x` to [8, 247] and subtract 8, mapping to the range [0, 239]. + x = (x <= 8) ? 0 : ((x < 247) ? (x - 8) : 239); + // Get index into the palette, 0 <= i <= 14. + const uint8_t i = x >> 4; + // Fractional position between i and (i + 1). + const uint8_t frac = x << 4; + + // Look up palette colors at i and (i + 1). + hsv_t a = unpack_hsv16(pgm_read_word(&palette[i])); + hsv_t b = unpack_hsv16(pgm_read_word(&palette[i + 1])); + + // Linearly interpolate in HSV, accounting for wrapping in hue. + const uint8_t hue_wrap = 128 & (a.h >= b.h ? (a.h - b.h) : (b.h - a.h)); + return (hsv_t){ + .h = lerp8by8(a.h ^ hue_wrap, b.h ^ hue_wrap, frac) ^ hue_wrap, + .s = scale8(lerp8by8(a.s, b.s, frac), rgb_matrix_config.hsv.s), + .v = scale8(lerp8by8(a.v, b.v, frac), rgb_matrix_config.hsv.v), + }; +} + +static uint16_t palettefx_scaled_time(uint32_t timer, uint8_t scale) { + static uint16_t wrap_correction = 0; + static uint8_t last_high_byte = 0; + const uint8_t high_byte = (uint8_t)(timer >> 16); + + if (last_high_byte != high_byte) { + last_high_byte = high_byte; + wrap_correction += ((uint16_t)scale) << 8; + } + + return scale16by8(timer, scale) + wrap_correction; +} + +#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/jack/rules.mk b/jack/rules.mk index f75ba4d..71ddad7 100644 --- a/jack/rules.mk +++ b/jack/rules.mk @@ -1,50 +1,49 @@ LTO_ENABLE = yes TOP_SYMBOLS = yes -NRKO_ENABLE = yes -COMBO_ENABLE = yes MAGIC_ENABLE = no +COMBO_ENABLE = yes +COMMAND_ENABLE = no +CONSOLE_ENABLE = no UNICODE_COMMON = yes +GRAVE_ESC_ENABLE = no EXTRAKEY_ENABLE = yes BOOTMAGIC_ENABLE = yes CAPS_WORD_ENABLE = yes TAP_DANCE_ENABLE = yes +SPACE_CADET_ENABLE = no AUTOCORRECT_ENABLE = yes MOUSE_JIGGLE_ENABLE = yes +CUSTOM_TAP_CODE_ENABLE = no DEBOUNCE_TYPE = asym_eager_defer_pk AVR_CFLAGS += -mrelax -INTROSPECTION_KEYMAP_C = jack.c +INTROSPECTION_KEYMAP_C = introspection.c -SRC += tapping.c +SRC += $(USER_PATH)/jack.c $(USER_PATH)/tapping.c ifeq ($(strip $(OLED_ENABLE)), yes) - SRC += oled.c + SRC += $(USER_PATH)/oled.c WPM_ENABLE = yes endif ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) - SRC += color.c + RGB_MATRIX_CUSTOM_USER = yes + SRC += $(USER_PATH)/color.c endif ifeq ($(strip $(UNICODE_COMMON)), yes) UNICODE_ENABLE = no - SRC += unicode.c -endif - -ifeq ($(PLATFORM), CHIBIOS) - RANDWORD = yes - EXTRAFLAGS += -Os -endif - -ifneq ($(findstring Gentoo, $(shell arm-none-eabi-gcc --version)),) - EXTRAFLAGS += -U_FORTIFY_SOURCE + SRC += $(USER_PATH)/unicode.c endif -ifeq ($(strip $(RANDWORD)), yes) - OPT_DEFS += -DRANDWORD +ifeq ($(strip $(CUSTOM_TAP_CODE_ENABLE)), yes) + OPT_DEFS += -DCUSTOM_TAP_CODE_ENABLE + SRC += $(USER_PATH)tap_code.c endif -ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes) - OPT_DEFS += -DMOUSE_JIGGLE_ENABLE - MOUSEKEY_ENABLE = yes - DEFERRED_EXEC_ENABLE = yes +ifeq ($(PLATFORM), CHIBIOS) + ifeq ($(MCU_SERIES), RP2040) + RP2040_MATH_IN_ROM = no + PROGRAM_CMD = doas picotool load $(BUILD_DIR)/$(TARGET).uf2 + endif + EXTRAFLAGS += -O3 endif diff --git a/jack/tap_code.c b/jack/tap_code.c new file mode 100644 index 0000000..a430200 --- /dev/null +++ b/jack/tap_code.c @@ -0,0 +1,159 @@ +// Copyright 2025 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" + +#define TAP_CODE_BUFFER_SIZE 32 +#define NEXT_TAP_CODE_POS(p) p = ((p + 1) & (TAP_CODE_BUFFER_SIZE - 1)) + +#define CHECK_REGISTERED_MT(keycode) \ + (keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX && \ + (get_mods() & ((keycode & 0x0F00) >> 8))) + +#define PGM_LOADBIT(mem, pos) \ + ((pgm_read_byte(&((mem)[(pos) / 8])) >> ((pos) % 8)) & 1) + +typedef struct { + uint8_t code; + uint8_t mods; + uint16_t delay; + bool register_tap; +} tap_code_buffer; + +tap_code_buffer tap_codes[TAP_CODE_BUFFER_SIZE] = {0}; +static uint16_t process_pos = 0, queue_pos = 0; +static fast_timer_t process_timer = 0; + +void tap_code_buffer_init(void) { memset(&tap_codes, 0, sizeof(tap_codes)); } + +void tap_code_register(uint8_t code, uint8_t mods, uint16_t delay, + bool register_tap) { + if (code && !delay) { + if (mods) + register_mods(mods); + register_code(code); + unregister_code(code); + if (mods) + unregister_mods(mods); + return; + } + if (tap_codes[queue_pos].code) { + if (!process_timer) + process_tap_code_buffer(); + while (timer_elapsed_fast(process_timer) < tap_codes[process_pos].delay) + wait_ms(1); + process_tap_code_buffer(); + } + tap_codes[queue_pos].code = code; + tap_codes[queue_pos].mods = mods; + tap_codes[queue_pos].delay = delay; + tap_codes[queue_pos].register_tap = register_tap; + NEXT_TAP_CODE_POS(queue_pos); +} + +void process_tap_code_buffer(void) { + if (tap_codes[process_pos].code) { + if (!process_timer) { + if (tap_codes[process_pos].register_tap) { + if (tap_codes[process_pos].mods) { + add_weak_mods(tap_codes[process_pos].mods); + } + register_code(tap_codes[process_pos].code); + } + process_timer = timer_read_fast(); + } else if (timer_elapsed_fast(process_timer) >= + tap_codes[process_pos].delay) { + del_weak_mods(tap_codes[process_pos].mods); + unregister_code(tap_codes[process_pos].code); + tap_codes[process_pos].code = 0; + tap_codes[process_pos].mods = 0; + tap_codes[process_pos].delay = 0; + tap_codes[process_pos].register_tap = false; + process_timer = 0; + NEXT_TAP_CODE_POS(process_pos); + } + } +} + +void tap_code(uint8_t code) { + tap_code_register(code, 0, TAP_CODE_DELAY, true); +} + +void tap_code_chord(uint8_t code) { + register_code(code); + tap_code_register(code, 0, TAP_CODE_DELAY, false); +} + +void tap_code_delay(uint8_t code, uint16_t delay) { + tap_code_register(code, 0, delay, true); +} + +void tap_code16(uint16_t code) { + tap_code_register((uint8_t)code, extract_mod_bits(code), TAP_CODE_DELAY, + true); +} + +bool process_record_taps(uint16_t keycode, keyrecord_t *record) { + static fast_timer_t prev_interrupt = 0, prev_key_down = 0; + switch (keycode) { + case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: + case QK_MOD_TAP ... QK_MOD_TAP_MAX: + if (record->event.pressed && + ((timer_elapsed_fast(prev_interrupt) < TAPPING_TERM) || + (timer_elapsed_fast(prev_key_down) < 200) || + CHECK_REGISTERED_MT(keycode))) { + tap_code_chord(keycode & 0xFF); + record->tap.count = 0xF; + prev_interrupt = timer_read_fast(); + return false; + } + if (record->tap.count == 0xF) + return false; + if (record->tap.count > 1 && (keycode == ESCLWR || keycode == RSEBSP)) { + if (record->event.pressed) { + register_code(keycode & 0xFF); + return false; + } else { + unregister_code(keycode & 0xFF); + return false; + } + } + if (record->tap.count && record->event.pressed) { + if (keycode >= QK_MOD_TAP || keycode == ESCLWR || keycode == RSEBSP) + tap_code_chord(keycode & 0xFF); + else + tap_code(keycode & 0xFF); + return false; + } else if (record->tap.interrupted && + (keycode >= QK_MOD_TAP || keycode == ESCLWR || + keycode == RSEBSP)) { + tap_code_chord(keycode & 0xFF); + prev_interrupt = timer_read_fast(); + return false; + } + default: + if (record->event.pressed) + prev_key_down = timer_read_fast(); + break; + } + return true; +} + +extern const uint8_t ascii_to_shift_lut[16]; +extern const uint8_t ascii_to_keycode_lut[128]; + +void tap_char(char ascii_code) { + uint8_t keycode = pgm_read_byte(&ascii_to_keycode_lut[(uint8_t)ascii_code]); + bool shifted = PGM_LOADBIT(ascii_to_shift_lut, (uint8_t)ascii_code); + tap_code_register(keycode, shifted ? MOD_BIT(KC_LSFT) : 0, TAP_CODE_DELAY, + true); +} + +void tap_string(const char *str) { + while (1) { + char ascii_code = pgm_read_byte(str); + if (!ascii_code) + break; + tap_char(ascii_code); + ++str; + } +} diff --git a/jack/tapping.c b/jack/tapping.c index 91690d5..d58b70b 100644 --- a/jack/tapping.c +++ b/jack/tapping.c @@ -1,9 +1,9 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" -#ifdef RANDWORD -#include "dict.h" -uint16_t word = 0; + +#ifndef CUSTOM_TAP_CODE_ENABLE +#define tap_string send_string_P #endif #define INTERCEPT_MOD_TAP(mod, keycode) \ @@ -14,64 +14,6 @@ uint16_t word = 0; } \ break; -static uint8_t select_word_state = NONE; - -bool process_select_word(uint16_t keycode, keyrecord_t *record) { - if (keycode == KC_LSFT || keycode == KC_RSFT) - return true; - if (keycode == SELWORD && record->event.pressed) { - const bool shifted = get_mods() & MOD_MASK_SHIFT; - if (!shifted) { - set_mods(MOD_BIT(KC_LCTL)); - if (select_word_state == NONE) { - send_keyboard_report(); - tap_code(KC_RGHT); - tap_code(KC_LEFT); - } - register_mods(MOD_BIT(KC_LSFT)); - register_code(KC_RGHT); - select_word_state = WORD; - } else { - if (select_word_state == NONE) { - clear_mods(); - send_keyboard_report(); - tap_code(KC_HOME); - register_mods(MOD_BIT(KC_LSFT)); - tap_code(KC_END); - set_mods(get_mods()); - select_word_state = FIRST_LINE; - } else { - register_code(KC_DOWN); - select_word_state = LINE; - } - } - return false; - } - switch (select_word_state) { - case WORD: - unregister_code(KC_RGHT); - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - select_word_state = SELECTED; - break; - case FIRST_LINE: - select_word_state = SELECTED; - break; - case LINE: - unregister_code(KC_DOWN); - select_word_state = SELECTED; - break; - case SELECTED: - if (keycode == KC_ESC) { - tap_code(KC_RGHT); - select_word_state = NONE; - return false; - } - default: - select_word_state = NONE; - } - return true; -} - uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case LWRSPC: @@ -88,6 +30,7 @@ uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { } } +#ifdef TAP_DANCE_ENABLE void td_reset(tap_dance_state_t *state, void *user_data) { clear_keyboard(); layer_clear(); @@ -128,14 +71,17 @@ void raise_paste(tap_dance_state_t *state, void *user_data) { else if (state->count == 1) tap_code16(C(S(KC_V))); } +#endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef UNICODE_COMMON_ENABLE if (!process_record_unicode(keycode, record)) return false; #endif - if (!process_select_word(keycode, record)) +#ifdef CUSTOM_TAP_CODE_ENABLE + if (!process_record_taps(keycode, record)) return false; +#endif #ifdef OLED_ENABLE if (record->event.pressed) { oled_timer_reset(); @@ -170,12 +116,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case UPDIR: if (record->event.pressed) - SEND_STRING("../"); + tap_string(PSTR("../")); break; - case NUKE: + case REMOVE: if (record->event.pressed) { - tap_code16(C(KC_A)); - SEND_STRING("\b```suggestion\n```"); + tap_string(PSTR("```suggestion\n```")); + tap_code(KC_UP); + tap_code(KC_UP); + tap_code(KC_ENT); + tap_code(KC_UP); } break; INTERCEPT_MOD_TAP(LALT_T, KC_EXLM) @@ -186,15 +135,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { INTERCEPT_MOD_TAP(RCTL_T, KC_ASTR) INTERCEPT_MOD_TAP(RGUI_T, KC_LPRN) INTERCEPT_MOD_TAP(RALT_T, KC_RPRN) - case RWORD: -#ifdef RANDWORD - word = rand() % NUM_WORDS; - if (record->event.pressed) { - send_string(dict[word]); - tap_code(KC_SPC); - } -#endif - break; } return true; } diff --git a/jack/unicode.c b/jack/unicode.c index 74c0ccc..a07a862 100644 --- a/jack/unicode.c +++ b/jack/unicode.c @@ -1,7 +1,18 @@ -// Copyright 2024 [email protected] +// Copyright 2025 [email protected] // SPDX-License-Identifier: GPL-2.0-or-later #include "jack.h" +enum unicode_mode { + NOMODE, + WIDE, + SCRIPT, + BLOCKS, + REGIONAL, + AUSSIE, + ZALGO, + SUPER +}; + uint8_t typing_mode = NOMODE; typedef uint32_t (*translator_function_t)(bool is_shifted, uint32_t keycode); @@ -157,7 +168,7 @@ DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_super, ); bool process_record_aussie(uint16_t keycode, keyrecord_t *record) { - bool is_shifted = (get_mods()) & MOD_MASK_SHIFT; + bool is_shifted = (get_mods())&MOD_MASK_SHIFT; if ((KC_A <= keycode) && (keycode <= KC_0)) { if (record->event.pressed) if (!process_record_glyph_replacement(keycode, record, @@ -222,20 +233,10 @@ bool process_record_zalgo(uint16_t keycode, keyrecord_t *record) { bool process_record_unicode(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case TABLE1: - if (record->event.pressed) { - send_unicode_string("┬──┬ ノ( ゜-゜ノ)"); - } - break; - case TABLE2: - if (record->event.pressed) { - send_unicode_string("(╯°□°)╯︵┻━┻"); - } - break; - case KC_NOMODE ... KC_SUPER: + case UC_NOMODE ... UC_SUPER: if (record->event.pressed) { - if (typing_mode != keycode - KC_NOMODE) - typing_mode = keycode - KC_NOMODE; + if (typing_mode != keycode - UC_NOMODE) + typing_mode = keycode - UC_NOMODE; else typing_mode = NOMODE; } |